Home | History | Annotate | Download | only in jaxp
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one
      3  * or more contributor license agreements. See the NOTICE file
      4  * distributed with this work for additional information
      5  * regarding copyright ownership. The ASF licenses this file
      6  * to you under the Apache License, Version 2.0 (the  "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *     http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 // $Id: JAXPPrefixResolver.java 468655 2006-10-28 07:12:06Z minchau $
     19 
     20 package org.apache.xpath.jaxp;
     21 
     22 import org.w3c.dom.Node;
     23 import org.w3c.dom.NamedNodeMap;
     24 import org.apache.xml.utils.PrefixResolver;
     25 
     26 import javax.xml.namespace.NamespaceContext;
     27 
     28 /**
     29  * <meta name="usage" content="general"/>
     30  * This class implements a Default PrefixResolver which
     31  * can be used to perform prefix-to-namespace lookup
     32  * for the XPath object.
     33  * This class delegates the resolution to the passed NamespaceContext
     34  */
     35 public class JAXPPrefixResolver implements PrefixResolver
     36 {
     37 
     38     private NamespaceContext namespaceContext;
     39 
     40 
     41     public JAXPPrefixResolver ( NamespaceContext nsContext ) {
     42         this.namespaceContext = nsContext;
     43     }
     44 
     45 
     46     public String getNamespaceForPrefix( String prefix ) {
     47         return namespaceContext.getNamespaceURI( prefix );
     48     }
     49 
     50     /**
     51      * Return the base identifier.
     52      *
     53      * @return null
     54      */
     55     public String getBaseIdentifier() {
     56         return null;
     57     }
     58 
     59     /**
     60      * @see PrefixResolver#handlesNullPrefixes()
     61      */
     62     public boolean handlesNullPrefixes() {
     63         return false;
     64     }
     65 
     66 
     67     /**
     68      * The URI for the XML namespace.
     69      * (Duplicate of that found in org.apache.xpath.XPathContext).
     70      */
     71 
     72     public static final String S_XMLNAMESPACEURI =
     73         "http://www.w3.org/XML/1998/namespace";
     74 
     75 
     76     /**
     77      * Given a prefix and a Context Node, get the corresponding namespace.
     78      * Warning: This will not work correctly if namespaceContext
     79      * is an attribute node.
     80      * @param prefix Prefix to resolve.
     81      * @param namespaceContext Node from which to start searching for a
     82      * xmlns attribute that binds a prefix to a namespace.
     83      * @return Namespace that prefix resolves to, or null if prefix
     84      * is not bound.
     85      */
     86     public String getNamespaceForPrefix(String prefix,
     87                                       org.w3c.dom.Node namespaceContext) {
     88         Node parent = namespaceContext;
     89         String namespace = null;
     90 
     91         if (prefix.equals("xml")) {
     92             namespace = S_XMLNAMESPACEURI;
     93         } else {
     94             int type;
     95 
     96             while ((null != parent) && (null == namespace)
     97                 && (((type = parent.getNodeType()) == Node.ELEMENT_NODE)
     98                     || (type == Node.ENTITY_REFERENCE_NODE))) {
     99 
    100                 if (type == Node.ELEMENT_NODE) {
    101                     NamedNodeMap nnm = parent.getAttributes();
    102 
    103                     for (int i = 0; i < nnm.getLength(); i++) {
    104                         Node attr = nnm.item(i);
    105                         String aname = attr.getNodeName();
    106                         boolean isPrefix = aname.startsWith("xmlns:");
    107 
    108                         if (isPrefix || aname.equals("xmlns")) {
    109                             int index = aname.indexOf(':');
    110                             String p =isPrefix ?aname.substring(index + 1) :"";
    111 
    112                             if (p.equals(prefix)) {
    113                                 namespace = attr.getNodeValue();
    114                                 break;
    115                             }
    116                         }
    117                     }
    118                 }
    119 
    120                 parent = parent.getParentNode();
    121             }
    122         }
    123         return namespace;
    124     }
    125 
    126 }
    127 
    128