// // Copyright (c)1998-2011 Pearson Education, Inc. or its affiliate(s). // All rights reserved. // package openadk.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; /** * Wraps an XMLStreamReader and reads only the current element and it's children * @author Andrew Elmhorst * @version 2.1 * */ public class XMLNodeReader implements XMLStreamReader { /** * The underlying reader that is being read from */ private XMLStreamReader fReader; /** * The current element depth in the source document, relative to the * start position. For each child start element, this will be incremented and then * decremented for each end element. When it reaches zero, reading of the * node is complete * * The special value of -99 means that next() has not yet been called; */ private int fDepth = -99; /** * Creates a new instance of an XMLNodeReader * @param wrappedReader An XMLStreamReader position on an XML Start Tag * @throws XMLStreamException If the XML Reader is not position on a start tag */ public XMLNodeReader( XMLStreamReader wrappedReader ) throws XMLStreamException { if(wrappedReader.getEventType() != XMLStreamReader.START_ELEMENT ){ throw new XMLStreamException( "XMLStreamReader must be position on the Start Element." ); } fReader = wrappedReader; } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#close() */ public void close() throws XMLStreamException { // Do nothing } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributeCount() */ public int getAttributeCount() { return fReader.getAttributeCount(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributeLocalName(int) */ public String getAttributeLocalName(int arg0) { return fReader.getAttributeLocalName( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributeName(int) */ public QName getAttributeName(int arg0) { return fReader.getAttributeName( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributeNamespace(int) */ public String getAttributeNamespace(int arg0) { return fReader.getAttributeNamespace( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributePrefix(int) */ public String getAttributePrefix(int arg0) { return fReader.getAttributePrefix( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributeType(int) */ public String getAttributeType(int arg0) { return fReader.getAttributeType( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributeValue(int) */ public String getAttributeValue(int arg0) { return fReader.getAttributeValue( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getAttributeValue(java.lang.String, java.lang.String) */ public String getAttributeValue(String arg0, String arg1) { return fReader.getAttributeValue( arg0, arg1 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getCharacterEncodingScheme() */ public String getCharacterEncodingScheme() { return fReader.getCharacterEncodingScheme(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getElementText() */ public String getElementText() throws XMLStreamException { return fReader.getElementText(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getEncoding() */ public String getEncoding() { return fReader.getEncoding(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getEventType() */ public int getEventType() { return fReader.getEventType(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getLocalName() */ public String getLocalName() { return fReader.getLocalName(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getLocation() */ public Location getLocation() { return fReader.getLocation(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getName() */ public QName getName() { return fReader.getName(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getNamespaceContext() */ public NamespaceContext getNamespaceContext() { return fReader.getNamespaceContext(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getNamespaceCount() */ public int getNamespaceCount() { return fReader.getNamespaceCount(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getNamespacePrefix(int) */ public String getNamespacePrefix(int arg0) { return fReader.getNamespacePrefix( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getNamespaceURI() */ public String getNamespaceURI() { return fReader.getNamespaceURI(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getNamespaceURI(java.lang.String) */ public String getNamespaceURI(String arg0) { return fReader.getNamespaceURI( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getNamespaceURI(int) */ public String getNamespaceURI(int arg0) { return fReader.getNamespaceURI( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getPIData() */ public String getPIData() { return fReader.getPIData(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getPITarget() */ public String getPITarget() { return fReader.getPITarget(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getPrefix() */ public String getPrefix() { return fReader.getPrefix(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getProperty(java.lang.String) */ public Object getProperty(String arg0) throws IllegalArgumentException { return fReader.getProperty( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getText() */ public String getText() { return fReader.getText(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getTextCharacters() */ public char[] getTextCharacters() { return fReader.getTextCharacters(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getTextCharacters(int, char[], int, int) */ public int getTextCharacters(int arg0, char[] arg1, int arg2, int arg3) throws XMLStreamException { return fReader.getTextCharacters( arg0, arg1, arg2, arg3 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getTextLength() */ public int getTextLength() { return fReader.getTextLength(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getTextStart() */ public int getTextStart() { return fReader.getTextStart(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#getVersion() */ public String getVersion() { return fReader.getVersion(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#hasName() */ public boolean hasName() { return fReader.hasName(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#hasNext() */ public boolean hasNext() throws XMLStreamException { return fReader.hasNext() && (fDepth > 0 || fDepth == -99 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#hasText() */ public boolean hasText() { return fReader.hasText(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#isAttributeSpecified(int) */ public boolean isAttributeSpecified(int arg0) { return fReader.isAttributeSpecified( arg0 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#isCharacters() */ public boolean isCharacters() { return fReader.isCharacters(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#isEndElement() */ public boolean isEndElement() { return fReader.isEndElement(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#isStandalone() */ public boolean isStandalone() { return fReader.isStandalone(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#isStartElement() */ public boolean isStartElement() { return fReader.isStartElement(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#isWhiteSpace() */ public boolean isWhiteSpace() { return fReader.isWhiteSpace(); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#next() */ public int next() throws XMLStreamException { if( fDepth == -99 ){ fDepth = 1; return XMLStreamReader.START_ELEMENT; } int eventType = fReader.next(); return evaluateNext( eventType ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#nextTag() */ public int nextTag() throws XMLStreamException { if( fDepth == -99 ){ fDepth = 1; return XMLStreamReader.START_ELEMENT; } int eventType = fReader.nextTag(); return evaluateNext( eventType ); } /** * Evaluates the event type returned by the underlying reader. * @param nextEventType * @return * @throws XMLStreamException */ private int evaluateNext( int nextEventType ) throws XMLStreamException{ switch (nextEventType ){ case XMLStreamReader.START_ELEMENT: fDepth++; break; case XMLStreamReader.END_ELEMENT: fDepth--; break; } if( fDepth < 1){ // Advance the cursor to the next start element, but return that we're done fReader.nextTag(); return XMLStreamReader.END_DOCUMENT; } return nextEventType; } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#require(int, java.lang.String, java.lang.String) */ public void require(int arg0, String arg1, String arg2) throws XMLStreamException { fReader.require( arg0, arg1, arg2 ); } /* (non-Javadoc) * @see javax.xml.stream.XMLStreamReader#standaloneSet() */ public boolean standaloneSet() { return fReader.standaloneSet(); } }