/* * RHQ Management Platform * Copyright (C) 2005-2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.sync; import java.util.NoSuchElementException; 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; /** * A decorator implementation of the {@link XMLStreamReader} interface to * support safe reading from the export stream by multiple "parties". * <p> * This implementation works with the assumption that each of its users will * read the XML data fully contained within another tag. * <p> * The instantiator of this class will create a new instance of this class * when it encounters a tag that it wants the "user" to read from. The instantiator * creates a new ExportReader and passes it over to the user. It is guaranteed * that the user cannot read past the end tag (to the user, it appears she reached the * end of the document). When the ExportReader reaches the "end" of document, the * wrapped XML stream will have read the end tag of the start tag that the instantiator * first encountered. The current state of the wrapped XML reader will therefore be * END_ELEMENT. * * @author Lukas Krejci */ public class ExportReader implements XMLStreamReader { private XMLStreamReader reader; private int depth; public ExportReader(XMLStreamReader reader) { this.reader = reader; } /** * @param name * @return * @throws IllegalArgumentException * @see javax.xml.stream.XMLStreamReader#getProperty(java.lang.String) */ public Object getProperty(String name) throws IllegalArgumentException { return reader.getProperty(name); } /** * @return * @throws XMLStreamException * @see javax.xml.stream.XMLStreamReader#next() */ public int next() throws XMLStreamException { int ret = reader.next(); switch (ret) { case XMLStreamReader.START_ELEMENT: ++depth; break; case XMLStreamReader.END_ELEMENT: if (depth >= 0) { --depth; } else { return XMLStreamReader.END_DOCUMENT; } break; } return ret; } /** * @param type * @param namespaceURI * @param localName * @throws XMLStreamException * @see javax.xml.stream.XMLStreamReader#require(int, java.lang.String, java.lang.String) */ public void require(int type, String namespaceURI, String localName) throws XMLStreamException { reader.require(type, namespaceURI, localName); } /** * @return * @throws XMLStreamException * @see javax.xml.stream.XMLStreamReader#getElementText() */ public String getElementText() throws XMLStreamException { return reader.getElementText(); } /** * @return * @throws XMLStreamException * @see javax.xml.stream.XMLStreamReader#nextTag() */ public int nextTag() throws XMLStreamException { int ret = reader.nextTag(); switch (ret) { case XMLStreamReader.START_ELEMENT: ++depth; break; case XMLStreamReader.END_ELEMENT: if (depth > 0) { --depth; } else { throw new NoSuchElementException("End of the export segment reached."); } } return ret; } /** * @return * @throws XMLStreamException * @see javax.xml.stream.XMLStreamReader#hasNext() */ public boolean hasNext() throws XMLStreamException { if (depth < 0 && reader.isEndElement()) { return false; } else { return reader.hasNext(); } } /** * @throws XMLStreamException * @see javax.xml.stream.XMLStreamReader#close() */ public void close() throws XMLStreamException { throw new XMLStreamException("Illegal operation on export segment."); } /** * @param prefix * @return * @see javax.xml.stream.XMLStreamReader#getNamespaceURI(java.lang.String) */ public String getNamespaceURI(String prefix) { return reader.getNamespaceURI(prefix); } /** * @return * @see javax.xml.stream.XMLStreamReader#isStartElement() */ public boolean isStartElement() { return reader.isStartElement(); } /** * @return * @see javax.xml.stream.XMLStreamReader#isEndElement() */ public boolean isEndElement() { if (depth == 0 && reader.isEndElement()) { return false; } else { return reader.isEndElement(); } } /** * @return * @see javax.xml.stream.XMLStreamReader#isCharacters() */ public boolean isCharacters() { return reader.isCharacters(); } /** * @return * @see javax.xml.stream.XMLStreamReader#isWhiteSpace() */ public boolean isWhiteSpace() { return reader.isWhiteSpace(); } /** * @param namespaceURI * @param localName * @return * @see javax.xml.stream.XMLStreamReader#getAttributeValue(java.lang.String, java.lang.String) */ public String getAttributeValue(String namespaceURI, String localName) { return reader.getAttributeValue(namespaceURI, localName); } /** * @return * @see javax.xml.stream.XMLStreamReader#getAttributeCount() */ public int getAttributeCount() { return reader.getAttributeCount(); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getAttributeName(int) */ public QName getAttributeName(int index) { return reader.getAttributeName(index); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getAttributeNamespace(int) */ public String getAttributeNamespace(int index) { return reader.getAttributeNamespace(index); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getAttributeLocalName(int) */ public String getAttributeLocalName(int index) { return reader.getAttributeLocalName(index); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getAttributePrefix(int) */ public String getAttributePrefix(int index) { return reader.getAttributePrefix(index); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getAttributeType(int) */ public String getAttributeType(int index) { return reader.getAttributeType(index); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getAttributeValue(int) */ public String getAttributeValue(int index) { return reader.getAttributeValue(index); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#isAttributeSpecified(int) */ public boolean isAttributeSpecified(int index) { return reader.isAttributeSpecified(index); } /** * @return * @see javax.xml.stream.XMLStreamReader#getNamespaceCount() */ public int getNamespaceCount() { return reader.getNamespaceCount(); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getNamespacePrefix(int) */ public String getNamespacePrefix(int index) { return reader.getNamespacePrefix(index); } /** * @param index * @return * @see javax.xml.stream.XMLStreamReader#getNamespaceURI(int) */ public String getNamespaceURI(int index) { return reader.getNamespaceURI(index); } /** * @return * @see javax.xml.stream.XMLStreamReader#getNamespaceContext() */ public NamespaceContext getNamespaceContext() { return reader.getNamespaceContext(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getEventType() */ public int getEventType() { if (depth == 0 && reader.isEndElement()) { return XMLStreamReader.END_DOCUMENT; } else { return reader.getEventType(); } } /** * @return * @see javax.xml.stream.XMLStreamReader#getText() */ public String getText() { return reader.getText(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getTextCharacters() */ public char[] getTextCharacters() { return reader.getTextCharacters(); } /** * @param sourceStart * @param target * @param targetStart * @param length * @return * @throws XMLStreamException * @see javax.xml.stream.XMLStreamReader#getTextCharacters(int, char[], int, int) */ public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException { return reader.getTextCharacters(sourceStart, target, targetStart, length); } /** * @return * @see javax.xml.stream.XMLStreamReader#getTextStart() */ public int getTextStart() { return reader.getTextStart(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getTextLength() */ public int getTextLength() { return reader.getTextLength(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getEncoding() */ public String getEncoding() { return reader.getEncoding(); } /** * @return * @see javax.xml.stream.XMLStreamReader#hasText() */ public boolean hasText() { return reader.hasText(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getLocation() */ public Location getLocation() { return reader.getLocation(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getName() */ public QName getName() { return reader.getName(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getLocalName() */ public String getLocalName() { return reader.getLocalName(); } /** * @return * @see javax.xml.stream.XMLStreamReader#hasName() */ public boolean hasName() { return reader.hasName(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getNamespaceURI() */ public String getNamespaceURI() { return reader.getNamespaceURI(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getPrefix() */ public String getPrefix() { return reader.getPrefix(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getVersion() */ public String getVersion() { return reader.getVersion(); } /** * @return * @see javax.xml.stream.XMLStreamReader#isStandalone() */ public boolean isStandalone() { return reader.isStandalone(); } /** * @return * @see javax.xml.stream.XMLStreamReader#standaloneSet() */ public boolean standaloneSet() { return reader.standaloneSet(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getCharacterEncodingScheme() */ public String getCharacterEncodingScheme() { return reader.getCharacterEncodingScheme(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getPITarget() */ public String getPITarget() { return reader.getPITarget(); } /** * @return * @see javax.xml.stream.XMLStreamReader#getPIData() */ public String getPIData() { return reader.getPIData(); } }