1 /*
2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3  */
4 /*
5  * Licensed to the Apache Software Foundation (ASF) under one or more
6  * contributor license agreements.  See the NOTICE file distributed with
7  * this work for additional information regarding copyright ownership.
8  * The ASF licenses this file to You under the Apache License, Version 2.0
9  * (the "License"); you may not use this file except in compliance with
10  * the License.  You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 package com.sun.org.apache.xerces.internal.util;
22 
23 
24 import com.sun.org.apache.xerces.internal.xni.NamespaceContext;
25 import java.util.Collections;
26 import java.util.Enumeration;
27 import java.util.List;
28 import java.util.TreeSet;
29 import java.util.Vector;
30 import javax.xml.XMLConstants;
31 
32 /**
33  * <p>A read-only XNI wrapper around a JAXP NamespaceContext.</p>
34  *
35  * @author Michael Glavassevich, IBM
36  *
37  * @LastModified: Oct 2017
38  */
39 public final class JAXPNamespaceContextWrapper implements NamespaceContext {
40 
41     private javax.xml.namespace.NamespaceContext fNamespaceContext;
42     private SymbolTable fSymbolTable;
43     private List<String> fPrefixes;
44     private final Vector<String> fAllPrefixes = new Vector<>();
45 
46     private int[] fContext = new int[8];
47     private int fCurrentContext;
48 
JAXPNamespaceContextWrapper(SymbolTable symbolTable)49     public JAXPNamespaceContextWrapper(SymbolTable symbolTable) {
50         setSymbolTable(symbolTable);
51     }
52 
setNamespaceContext(javax.xml.namespace.NamespaceContext context)53     public void setNamespaceContext(javax.xml.namespace.NamespaceContext context) {
54         fNamespaceContext = context;
55     }
56 
getNamespaceContext()57     public javax.xml.namespace.NamespaceContext getNamespaceContext() {
58         return fNamespaceContext;
59     }
60 
setSymbolTable(SymbolTable symbolTable)61     public void setSymbolTable(SymbolTable symbolTable) {
62         fSymbolTable = symbolTable;
63     }
64 
getSymbolTable()65     public SymbolTable getSymbolTable() {
66         return fSymbolTable;
67     }
68 
setDeclaredPrefixes(List<String> prefixes)69     public void setDeclaredPrefixes(List<String> prefixes) {
70         fPrefixes = prefixes;
71     }
72 
getDeclaredPrefixes()73     public List<String> getDeclaredPrefixes() {
74         return fPrefixes;
75     }
76 
77     /*
78      * NamespaceContext methods
79      */
80 
getURI(String prefix)81     public String getURI(String prefix) {
82         if (fNamespaceContext != null) {
83             String uri = fNamespaceContext.getNamespaceURI(prefix);
84             if (uri != null && !XMLConstants.NULL_NS_URI.equals(uri)) {
85                 return (fSymbolTable != null) ? fSymbolTable.addSymbol(uri) : uri.intern();
86             }
87         }
88         return null;
89     }
90 
getPrefix(String uri)91     public String getPrefix(String uri) {
92         if (fNamespaceContext != null) {
93             if (uri == null) {
94                 uri = XMLConstants.NULL_NS_URI;
95             }
96             String prefix = fNamespaceContext.getPrefix(uri);
97             if (prefix == null) {
98                 prefix = XMLConstants.DEFAULT_NS_PREFIX;
99             }
100             return (fSymbolTable != null) ? fSymbolTable.addSymbol(prefix) : prefix.intern();
101         }
102         return null;
103     }
104 
getAllPrefixes()105     public Enumeration<String> getAllPrefixes() {
106         // There may be duplicate prefixes in the list so we
107         // first transfer them to a set to ensure uniqueness.
108         return Collections.enumeration(new TreeSet<String>(fAllPrefixes));
109     }
110 
pushContext()111     public void pushContext() {
112         // extend the array, if necessary
113         if (fCurrentContext + 1 == fContext.length) {
114             int[] contextarray = new int[fContext.length * 2];
115             System.arraycopy(fContext, 0, contextarray, 0, fContext.length);
116             fContext = contextarray;
117         }
118         // push context
119         fContext[++fCurrentContext] = fAllPrefixes.size();
120         if (fPrefixes != null) {
121             fAllPrefixes.addAll(fPrefixes);
122         }
123     }
124 
popContext()125     public void popContext() {
126         fAllPrefixes.setSize(fContext[fCurrentContext--]);
127     }
128 
declarePrefix(String prefix, String uri)129     public boolean declarePrefix(String prefix, String uri) {
130         return true;
131     }
132 
getDeclaredPrefixCount()133     public int getDeclaredPrefixCount() {
134         return (fPrefixes != null) ? fPrefixes.size() : 0;
135     }
136 
getDeclaredPrefixAt(int index)137     public String getDeclaredPrefixAt(int index) {
138         return fPrefixes.get(index);
139     }
140 
reset()141     public void reset() {
142         fCurrentContext = 0;
143         fContext[fCurrentContext] = 0;
144         fAllPrefixes.clear();
145     }
146 
147 } // JAXPNamespaceContextWrapper
148