|
|
|
|
|
*/ |
|
/* |
|
* Licensed to the Apache Software Foundation (ASF) under one |
|
* or more contributor license agreements. See the NOTICE file |
|
* distributed with this work for additional information |
|
* regarding copyright ownership. The ASF licenses this file |
|
* to you under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
package com.sun.org.apache.xml.internal.serializer.dom3; |
|
|
|
import java.util.Enumeration; |
|
import java.util.NoSuchElementException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class NamespaceSupport { |
|
|
|
static final String PREFIX_XML = "xml".intern(); |
|
|
|
static final String PREFIX_XMLNS = "xmlns".intern(); |
|
|
|
|
|
|
|
|
|
*/ |
|
public final static String XML_URI = "http://www.w3.org/XML/1998/namespace".intern(); |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public final static String XMLNS_URI = "http://www.w3.org/2000/xmlns/".intern(); |
|
|
|
// |
|
// Data |
|
// |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
protected String[] fNamespace = new String[16 * 2]; |
|
|
|
|
|
protected int fNamespaceSize; |
|
|
|
// NOTE: The constructor depends on the initial context size |
|
// being at least 1. -Ac |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
protected int[] fContext = new int[8]; |
|
|
|
|
|
protected int fCurrentContext; |
|
|
|
protected String[] fPrefixes = new String[16]; |
|
|
|
// |
|
// Constructors |
|
// |
|
|
|
|
|
public NamespaceSupport() { |
|
} // <init>() |
|
|
|
// |
|
// Public methods |
|
// |
|
|
|
|
|
|
|
*/ |
|
public void reset() { |
|
|
|
|
|
fNamespaceSize = 0; |
|
fCurrentContext = 0; |
|
fContext[fCurrentContext] = fNamespaceSize; |
|
|
|
|
|
fNamespace[fNamespaceSize++] = PREFIX_XML; |
|
fNamespace[fNamespaceSize++] = XML_URI; |
|
|
|
fNamespace[fNamespaceSize++] = PREFIX_XMLNS; |
|
fNamespace[fNamespaceSize++] = XMLNS_URI; |
|
++fCurrentContext; |
|
|
|
} // reset(SymbolTable) |
|
|
|
|
|
|
|
|
|
*/ |
|
public void pushContext() { |
|
|
|
|
|
if (fCurrentContext + 1 == fContext.length) { |
|
int[] contextarray = new int[fContext.length * 2]; |
|
System.arraycopy(fContext, 0, contextarray, 0, fContext.length); |
|
fContext = contextarray; |
|
} |
|
|
|
|
|
fContext[++fCurrentContext] = fNamespaceSize; |
|
|
|
} // pushContext() |
|
|
|
|
|
|
|
|
|
*/ |
|
public void popContext() { |
|
fNamespaceSize = fContext[fCurrentContext--]; |
|
} // popContext() |
|
|
|
|
|
|
|
*/ |
|
public boolean declarePrefix(String prefix, String uri) { |
|
|
|
if (prefix == PREFIX_XML || prefix == PREFIX_XMLNS) { |
|
return false; |
|
} |
|
|
|
|
|
for (int i = fNamespaceSize; i > fContext[fCurrentContext]; i -= 2) { |
|
|
|
if (fNamespace[i - 2].equals(prefix) ) { |
|
// REVISIT: [Q] Should the new binding override the |
|
// previously declared binding or should it |
|
// it be ignored? -Ac |
|
// NOTE: The SAX2 "NamespaceSupport" helper allows |
|
// re-bindings with the new binding overwriting |
|
|
|
fNamespace[i - 1] = uri; |
|
return true; |
|
} |
|
} |
|
|
|
|
|
if (fNamespaceSize == fNamespace.length) { |
|
String[] namespacearray = new String[fNamespaceSize * 2]; |
|
System.arraycopy(fNamespace, 0, namespacearray, 0, fNamespaceSize); |
|
fNamespace = namespacearray; |
|
} |
|
|
|
|
|
fNamespace[fNamespaceSize++] = prefix; |
|
fNamespace[fNamespaceSize++] = uri; |
|
|
|
return true; |
|
|
|
} // declarePrefix(String,String):boolean |
|
|
|
|
|
|
|
*/ |
|
public String getURI(String prefix) { |
|
|
|
|
|
for (int i = fNamespaceSize; i > 0; i -= 2) { |
|
|
|
if (fNamespace[i - 2].equals(prefix) ) { |
|
return fNamespace[i - 1]; |
|
} |
|
} |
|
|
|
|
|
return null; |
|
|
|
} // getURI(String):String |
|
|
|
|
|
|
|
|
|
*/ |
|
public String getPrefix(String uri) { |
|
|
|
|
|
for (int i = fNamespaceSize; i > 0; i -= 2) { |
|
|
|
if (fNamespace[i - 1].equals(uri) ) { |
|
|
|
if (getURI(fNamespace[i - 2]).equals(uri) ) |
|
return fNamespace[i - 2]; |
|
} |
|
} |
|
|
|
|
|
return null; |
|
|
|
} // getPrefix(String):String |
|
|
|
|
|
|
|
|
|
*/ |
|
public int getDeclaredPrefixCount() { |
|
return (fNamespaceSize - fContext[fCurrentContext]) / 2; |
|
} // getDeclaredPrefixCount():int |
|
|
|
|
|
|
|
*/ |
|
public String getDeclaredPrefixAt(int index) { |
|
return fNamespace[fContext[fCurrentContext] + index * 2]; |
|
} // getDeclaredPrefixAt(int):String |
|
|
|
|
|
|
|
*/ |
|
public Enumeration<String> getAllPrefixes() { |
|
int count = 0; |
|
if (fPrefixes.length < (fNamespace.length/2)) { |
|
|
|
String[] prefixes = new String[fNamespaceSize]; |
|
fPrefixes = prefixes; |
|
} |
|
String prefix = null; |
|
boolean unique = true; |
|
for (int i = 2; i < (fNamespaceSize-2); i += 2) { |
|
prefix = fNamespace[i + 2]; |
|
for (int k=0;k<count;k++){ |
|
if (fPrefixes[k]==prefix){ |
|
unique = false; |
|
break; |
|
} |
|
} |
|
if (unique){ |
|
fPrefixes[count++] = prefix; |
|
} |
|
unique = true; |
|
} |
|
return new Prefixes(fPrefixes, count); |
|
} |
|
|
|
protected final class Prefixes implements Enumeration<String> { |
|
private String[] prefixes; |
|
private int counter = 0; |
|
private int size = 0; |
|
|
|
|
|
|
|
*/ |
|
public Prefixes(String [] prefixes, int size) { |
|
this.prefixes = prefixes; |
|
this.size = size; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public boolean hasMoreElements() { |
|
return (counter< size); |
|
} |
|
|
|
|
|
|
|
*/ |
|
public String nextElement() { |
|
if (counter< size){ |
|
return fPrefixes[counter++]; |
|
} |
|
throw new NoSuchElementException("Illegal access to Namespace prefixes enumeration."); |
|
} |
|
|
|
public String toString(){ |
|
StringBuilder buf = new StringBuilder(); |
|
for (int i=0;i<size;i++){ |
|
buf.append(prefixes[i]); |
|
buf.append(" "); |
|
} |
|
|
|
return buf.toString(); |
|
} |
|
|
|
} |
|
|
|
} // class NamespaceSupport |