001    /**
002     * Copyright 2005-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.ken.util;
017    
018    import java.util.ArrayList;
019    import java.util.Iterator;
020    import java.util.List;
021    
022    import javax.xml.namespace.NamespaceContext;
023    
024    import org.apache.log4j.Logger;
025    import org.w3c.dom.Document;
026    
027    /**
028     * XPath NamespaceContext implementation that delegates all lookups to a DOM Document,
029     * which supplies all prefix/NS mappings defined in the doc.
030     * @author Kuali Rice Team (rice.collab@kuali.org)
031     */
032    public class DocumentNamespaceContext implements NamespaceContext {
033        private static final Logger LOG = Logger.getLogger(DocumentNamespaceContext.class);
034    
035        // the DOM Document
036        private final Document doc;
037    
038        /**
039         * Constructs a DocumentNamespaceContext.java.
040         * @param doc
041         */
042        public DocumentNamespaceContext(Document doc) {
043            this.doc = doc;
044        }
045    
046        /**
047         * @see javax.xml.namespace.NamespaceContext#getNamespaceURI(java.lang.String)
048         */
049        public String getNamespaceURI(String prefix) {
050            LOG.debug("getNamespaceURI(" + prefix + ")");
051            if (prefix == null) {
052                throw new IllegalArgumentException("The prefix cannot be null.");
053            }
054            if (prefix.length() == 0) {
055                return doc.lookupNamespaceURI(null);
056            }
057            return doc.lookupNamespaceURI(prefix);
058        }
059    
060        /**
061         * @see javax.xml.namespace.NamespaceContext#getPrefix(java.lang.String)
062         */
063        public String getPrefix(String namespaceURI) {
064            LOG.debug("getPrefix(" + namespaceURI + ")");
065            if (namespaceURI == null) {
066                throw new IllegalArgumentException("The namespace uri cannot be null.");
067            }
068            return doc.lookupPrefix(namespaceURI);
069        }
070    
071        /**
072         * @see javax.xml.namespace.NamespaceContext#getPrefixes(java.lang.String)
073         */
074        public Iterator getPrefixes(String namespaceURI) {
075            LOG.debug("getPrefixes(" + namespaceURI + ")");
076            if (namespaceURI == null) {
077                throw new IllegalArgumentException("The namespace uri cannot be null.");
078            }
079            List<String> list = new ArrayList<String>(1);
080            String s = getPrefix(namespaceURI);
081            if (s != null) {
082                list.add(s);
083            }
084            return list.iterator();
085        }
086    }