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