~vcs-imports/xena/trunk

« back to all changes in this revision

Viewing changes to ext/src/xalan-j_2_7_1/src/org/apache/xpath/jaxp/JAXPPrefixResolver.java

  • Committer: matthewoliver
  • Date: 2009-12-10 03:18:07 UTC
  • Revision ID: vcs-imports@canonical.com-20091210031807-l086qguzdlljtkl9
Merged Xena Testing into Xena Stable for the Xena 5 release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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,v 1.2 2009/12/10 03:18:50 matthewoliver Exp $
 
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