1 /* 2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. 3 * @LastModified: Oct 2017 4 */ 5 /* 6 * Licensed to the Apache Software Foundation (ASF) under one or more 7 * contributor license agreements. See the NOTICE file distributed with 8 * this work for additional information regarding copyright ownership. 9 * The ASF licenses this file to You under the Apache License, Version 2.0 10 * (the "License"); you may not use this file except in compliance with 11 * the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 */ 21 22 package com.sun.org.apache.xerces.internal.util; 23 24 25 import com.sun.org.apache.xerces.internal.xni.NamespaceContext; 26 import java.util.Collections; 27 import java.util.Enumeration; 28 import java.util.List; 29 import java.util.TreeSet; 30 import java.util.Vector; 31 import javax.xml.XMLConstants; 32 33 /** 34 * <p>A read-only XNI wrapper around a JAXP NamespaceContext.</p> 35 * 36 * @author Michael Glavassevich, IBM 37 * 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 49 public JAXPNamespaceContextWrapper(SymbolTable symbolTable) { 50 setSymbolTable(symbolTable); 51 } 52 53 public void setNamespaceContext(javax.xml.namespace.NamespaceContext context) { 54 fNamespaceContext = context; 55 } 56 57 public javax.xml.namespace.NamespaceContext getNamespaceContext() { 58 return fNamespaceContext; 59 } 60 61 public void setSymbolTable(SymbolTable symbolTable) { 62 fSymbolTable = symbolTable; 63 } 64 65 public SymbolTable getSymbolTable() { 66 return fSymbolTable; 67 } 68 69 public void setDeclaredPrefixes(List<String> prefixes) { 70 fPrefixes = prefixes; 71 } 72 73 public List<String> getDeclaredPrefixes() { 74 return fPrefixes; 75 } 76 77 /* 78 * NamespaceContext methods 79 */ 80 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 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 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 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 125 public void popContext() { 126 fAllPrefixes.setSize(fContext[fCurrentContext--]); 127 } 128 129 public boolean declarePrefix(String prefix, String uri) { 130 return true; 131 } 132 133 public int getDeclaredPrefixCount() { 134 return (fPrefixes != null) ? fPrefixes.size() : 0; 135 } 136 137 public String getDeclaredPrefixAt(int index) { 138 return fPrefixes.get(index); 139 } 140 141 public void reset() { 142 fCurrentContext = 0; 143 fContext[fCurrentContext] = 0; 144 fAllPrefixes.clear(); 145 } 146 147 } // JAXPNamespaceContextWrapper