blob: e0a3262cee6277b32a823320458cbdc72736eecb [file] [log] [blame]
package org.apache.axis2.databinding.utils.reader;
import org.apache.axis2.util.ArrayStack;
import javax.xml.namespace.NamespaceContext;
import java.util.Iterator;
import java.util.ArrayList;
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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.
*/
public class ADBNamespaceContext implements NamespaceContext {
private NamespaceContext parentNsContext;
public NamespaceContext getParentNsContext() {
return parentNsContext;
}
public void setParentNsContext(NamespaceContext parentNsContext) {
this.parentNsContext = parentNsContext;
}
//Keep two arraylists for the prefixes and namespaces. They should be in sync
//since the index of the entry will be used to relate them
//use the minimum initial capacity to let things handle memory better
private ArrayStack prefixStack = new ArrayStack();
private ArrayStack uriStack = new ArrayStack();
/**
* Register a namespace in this context
* @param prefix
* @param uri
*/
public void pushNamespace(String prefix,String uri){
prefixStack.push(prefix);
uriStack.push(uri);
}
/**
* Pop a namespace
*/
public void popNamespace(){
prefixStack.pop();
uriStack.pop();
}
public String getNamespaceURI(String prefix) {
//do the corrections as per the javadoc
if (prefixStack.contains(prefix)){
int index = prefixStack.indexOf(prefix);
return (String)uriStack.get(index);
}
if (parentNsContext!=null){
return parentNsContext.getPrefix(prefix);
}
return null;
}
public String getPrefix(String uri) {
//do the corrections as per the javadoc
int index = uriStack.indexOf(uri);
if (index != -1){
return (String)prefixStack.get(index);
}
if (parentNsContext!=null){
return parentNsContext.getPrefix(uri);
}
return null;
}
public Iterator getPrefixes(String uri) {
//create an arraylist that contains the relevant prefixes
String[] uris = (String[])uriStack.toArray(new String[uriStack.size()]);
ArrayList tempList = new ArrayList();
for (int i = 0; i < uris.length; i++) {
if (uris[i].equals(uri)){
tempList.add(prefixStack.get(i));
//we assume that array conversion preserves the order
}
}
//by now all the relevant prefixes are collected
//make a new iterator and provide a wrapper iterator to
//obey the contract on the API
return new WrappingIterator(tempList.iterator());
}
private class WrappingIterator implements Iterator{
private Iterator containedIterator = null;
public WrappingIterator(Iterator containedIterator) {
this.containedIterator = containedIterator;
}
public Iterator getContainedIterator() {
return containedIterator;
}
public void setContainedIterator(Iterator containedIterator) {
this.containedIterator = containedIterator;
}
/**
* As per the contract on the API of Namespace context
* the returned iterator should be immutable
*/
public void remove() {
throw new UnsupportedOperationException();
}
public boolean hasNext() {
return containedIterator.hasNext();
}
public Object next() {
return containedIterator.next();
}
}
}