| /* |
| * 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 org.apache.axis2.jaxws.message.util; |
| |
| import javax.xml.namespace.NamespaceContext; |
| import javax.xml.namespace.QName; |
| import javax.xml.stream.Location; |
| import javax.xml.stream.XMLStreamException; |
| import javax.xml.stream.XMLStreamReader; |
| import java.util.Stack; |
| |
| /** |
| * StackableReader A StackableStreamReader provides an additional method push(XMLStreamReader) |
| * <p/> |
| * You can call push(...) to add a new XMLStreamReader. The next event will use the pushed stream |
| * reader. After the XMLStreamReader is consumed, it is automatically popped off of the stack. |
| * <p/> |
| * Note the information returned by the StackableReader is only applicable for the topmost |
| * XMLStreamReader. For example the NamespaceContext that is returned is not a combination of all |
| * the namespace contexts on the stack. |
| */ |
| public class StackableReader implements XMLStreamReader { |
| |
| Stack<XMLStreamReader> stack = new Stack<XMLStreamReader>(); |
| XMLStreamReader current = null; |
| |
| /** |
| * Create a stackable reader with the initial reader |
| * |
| * @param first |
| */ |
| public StackableReader(XMLStreamReader first) { |
| current = first; |
| } |
| |
| /** |
| * Push a new StreamReader |
| * |
| * @param streamReader |
| */ |
| public void push(XMLStreamReader streamReader) throws XMLStreamException { |
| // Push the current reader if it is not consumed |
| if (current != null && |
| current.hasNext()) { |
| stack.push(current); |
| } |
| current = streamReader; |
| } |
| |
| public void close() throws XMLStreamException { |
| current.close(); |
| } |
| |
| public int getAttributeCount() { |
| return current.getAttributeCount(); |
| } |
| |
| public String getAttributeLocalName(int arg0) { |
| return current.getAttributeLocalName(arg0); |
| } |
| |
| public QName getAttributeName(int arg0) { |
| return current.getAttributeName(arg0); |
| } |
| |
| public String getAttributeNamespace(int arg0) { |
| return current.getAttributeNamespace(arg0); |
| } |
| |
| public String getAttributePrefix(int arg0) { |
| return current.getAttributePrefix(arg0); |
| } |
| |
| public String getAttributeType(int arg0) { |
| return current.getAttributeType(arg0); |
| } |
| |
| public String getAttributeValue(int arg0) { |
| return current.getAttributeValue(arg0); |
| } |
| |
| public String getAttributeValue(String arg0, String arg1) { |
| return current.getAttributeValue(arg0, arg1); |
| } |
| |
| public String getCharacterEncodingScheme() { |
| return current.getCharacterEncodingScheme(); |
| } |
| |
| public String getElementText() throws XMLStreamException { |
| return current.getElementText(); |
| } |
| |
| public String getEncoding() { |
| return current.getEncoding(); |
| } |
| |
| public int getEventType() { |
| return current.getEventType(); |
| } |
| |
| public String getLocalName() { |
| return current.getLocalName(); |
| } |
| |
| public Location getLocation() { |
| return current.getLocation(); |
| } |
| |
| public QName getName() { |
| return current.getName(); |
| } |
| |
| public NamespaceContext getNamespaceContext() { |
| return current.getNamespaceContext(); |
| } |
| |
| public int getNamespaceCount() { |
| return current.getNamespaceCount(); |
| } |
| |
| public String getNamespacePrefix(int arg0) { |
| return current.getNamespacePrefix(arg0); |
| } |
| |
| public String getNamespaceURI() { |
| return current.getNamespaceURI(); |
| } |
| |
| public String getNamespaceURI(int arg0) { |
| return current.getNamespaceURI(arg0); |
| } |
| |
| public String getNamespaceURI(String arg0) { |
| return current.getNamespaceURI(arg0); |
| } |
| |
| public String getPIData() { |
| return current.getPIData(); |
| } |
| |
| public String getPITarget() { |
| return current.getPITarget(); |
| } |
| |
| public String getPrefix() { |
| return current.getPrefix(); |
| } |
| |
| public Object getProperty(String arg0) throws IllegalArgumentException { |
| return current.getProperty(arg0); |
| } |
| |
| public String getText() { |
| return current.getText(); |
| } |
| |
| public char[] getTextCharacters() { |
| return current.getTextCharacters(); |
| } |
| |
| public int getTextCharacters(int arg0, char[] arg1, int arg2, int arg3) |
| throws XMLStreamException { |
| return current.getTextCharacters(arg0, arg1, arg2, arg3); |
| } |
| |
| public int getTextLength() { |
| return current.getTextLength(); |
| } |
| |
| public int getTextStart() { |
| return current.getTextStart(); |
| } |
| |
| public String getVersion() { |
| return current.getVersion(); |
| } |
| |
| public boolean hasName() { |
| return current.hasName(); |
| } |
| |
| public boolean hasNext() throws XMLStreamException { |
| // This code assumes that the stack only contains readers that are not consumed |
| if (!current.hasNext() && |
| !stack.isEmpty()) { |
| return stack.peek().hasNext(); |
| } |
| return current.hasNext(); |
| } |
| |
| public boolean hasText() { |
| return current.hasText(); |
| } |
| |
| public boolean isAttributeSpecified(int arg0) { |
| return current.isAttributeSpecified(arg0); |
| } |
| |
| public boolean isCharacters() { |
| return current.isCharacters(); |
| } |
| |
| public boolean isEndElement() { |
| return current.isEndElement(); |
| } |
| |
| public boolean isStandalone() { |
| return current.isStandalone(); |
| } |
| |
| public boolean isStartElement() { |
| return current.isStartElement(); |
| } |
| |
| public boolean isWhiteSpace() { |
| return current.isWhiteSpace(); |
| } |
| |
| public int next() throws XMLStreamException { |
| // Only next is allowed to pop the stack |
| if (!current.hasNext() && |
| !stack.isEmpty()) { |
| current = stack.pop(); |
| } |
| // The assumption is that the event on the stream reader was processed |
| // prior to pushing a new xmlstreamreader. thus we proceed to the next |
| // event in all cases |
| int tag = current.next(); |
| |
| // Skip start document and end document events for |
| // stacked stream readers |
| if ((tag == this.START_DOCUMENT || |
| tag == this.END_DOCUMENT) && |
| !stack.isEmpty()) { |
| tag = next(); |
| } |
| |
| return tag; |
| } |
| |
| public int nextTag() throws XMLStreamException { |
| if (!current.hasNext() && |
| !stack.isEmpty()) { |
| return stack.peek().nextTag(); |
| } |
| return current.nextTag(); |
| } |
| |
| public void require(int arg0, String arg1, String arg2) throws XMLStreamException { |
| current.require(arg0, arg1, arg2); |
| } |
| |
| public boolean standaloneSet() { |
| return current.standaloneSet(); |
| } |
| |
| |
| } |