001    package net.sourceforge.jeuclid.elements.support;
002    
003    import java.util.Collections;
004    import java.util.Iterator;
005    
006    import javax.annotation.Nonnull;
007    import javax.annotation.Nullable;
008    import javax.xml.XMLConstants;
009    import javax.xml.namespace.NamespaceContext;
010    
011    /**
012     * Chainable implementation of a {@link NamespaceContext}.
013     *
014     * @version $Revision: f5d68b2c52ae $
015     */
016    public class NamespaceContextAdder implements NamespaceContext {
017    
018        private final String namespacePrefix;
019        private final String namespaceURI;
020        private final NamespaceContext delegateContext;
021    
022        /**
023         * Create a new NamespaceAdder. The delegate context will be called if the
024         * namespace to be checked is not the namespace given in this adder. If the
025         * delegate is null, default values will be returned.
026         *
027         * @param ns
028         *            namespace prefix.
029         * @param nsuri
030         *            namespace URI
031         * @param delegate
032         *            delegate {@link NamespaceContext}
033         */
034        public NamespaceContextAdder(@Nonnull final String ns,
035                @Nonnull final String nsuri,
036                @Nullable final NamespaceContext delegate) {
037            this.namespacePrefix = ns;
038            this.namespaceURI = nsuri;
039            this.delegateContext = delegate;
040        }
041    
042        /** {@inheritDoc} */
043        public String getNamespaceURI(final String prefix) {
044            String retVal;
045            if (this.namespacePrefix.equals(prefix)) {
046                retVal = this.namespaceURI;
047            } else if (this.delegateContext == null) {
048                retVal = XMLConstants.NULL_NS_URI;
049            } else {
050                retVal = this.delegateContext.getNamespaceURI(prefix);
051            }
052            return retVal;
053        }
054    
055        /** {@inheritDoc} */
056        public String getPrefix(final String uri) {
057            String retVal;
058            if (this.namespaceURI.equals(uri)) {
059                retVal = this.namespacePrefix;
060            } else if (this.delegateContext == null) {
061                retVal = "";
062            } else {
063                retVal = this.delegateContext.getPrefix(uri);
064            }
065            return retVal;
066        }
067    
068        /** {@inheritDoc} */
069        @SuppressWarnings("unchecked")
070        public Iterator<String> getPrefixes(final String uri) {
071            Iterator<String> retVal;
072            if (this.namespaceURI.equals(uri)) {
073                retVal = Collections.singleton(this.namespacePrefix).iterator();
074            } else if (this.delegateContext == null) {
075                retVal = Collections.EMPTY_LIST.iterator();
076            } else {
077                retVal = this.delegateContext.getPrefixes(uri);
078            }
079            return retVal;
080        }
081    
082    }