You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ve...@apache.org on 2009/03/15 18:35:09 UTC
svn commit: r754700 [2/2] - in
/webservices/commons/trunk/modules/axiom/modules:
axiom-api/src/main/java/org/apache/axiom/om/impl/
axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/
axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java?rev=754700&r1=754699&r2=754700&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java Sun Mar 15 17:35:09 2009
@@ -19,173 +19,14 @@
package org.apache.axiom.om.impl.llom;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Stack;
-
-import javax.activation.DataHandler;
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.namespace.QName;
-import javax.xml.stream.Location;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-
-import org.apache.axiom.om.OMAttachmentAccessor;
-import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMComment;
-import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMDocument;
import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMNamespace;
-import org.apache.axiom.om.OMNode;
-import org.apache.axiom.om.OMSourcedElement;
-import org.apache.axiom.om.OMText;
import org.apache.axiom.om.OMXMLParserWrapper;
-import org.apache.axiom.om.OMXMLStreamReader;
-import org.apache.axiom.om.impl.EmptyOMLocation;
-import org.apache.axiom.om.impl.OMNavigator;
-import org.apache.axiom.om.impl.builder.StAXBuilder;
-import org.apache.axiom.om.impl.exception.OMStreamingException;
-import org.apache.axiom.om.impl.util.NamespaceContextImpl;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
/**
- * Note - This class also implements the streaming constants interface to get access to the StAX
- * constants.
+ * Empty subclass of {@link org.apache.axiom.om.impl.OMStAXWrapper} to keep compatibility
+ * with existing code.
*/
-public class OMStAXWrapper
- implements OMXMLStreamReader, XMLStreamConstants {
-
- private static final Log log = LogFactory.getLog(OMStAXWrapper.class);
- private static boolean DEBUG_ENABLED = log.isDebugEnabled();
-
- /** Field navigator */
- private OMNavigator navigator;
-
- /** Field builder */
- private OMXMLParserWrapper builder;
-
- /** Field parser */
- private XMLStreamReader parser;
- private boolean _isClosed = false; // Indicate if parser is closed
- private boolean _releaseParserOnClose = false; // Defaults to legacy behavior, which is keep the reference
-
- /** Field rootNode */
- private OMNode rootNode;
-
- /** Field isFirst */
- private boolean isFirst = true;
-
- // Navigable means the output should be taken from the navigator.
- // As soon as the navigator returns a null navigable will be reset
- // to false and the subsequent events will be taken from the builder
- // or the parser directly.
-
- /** Field NAVIGABLE */
- private static final short NAVIGABLE = 0;
- private static final short SWITCH_AT_NEXT = 1;
- private static final short COMPLETED = 2;
- private static final short SWITCHED = 3;
- private static final short DOCUMENT_COMPLETE = 4;
-
- // Variables used to build an xop:include representation
- private final static QName XOP_INCLUDE =
- new QName("http://www.w3.org/2004/08/xop/include", "Include", "xop");
- private OMElement xopInclude = null;
- private OMText xopIncludeText = null;
- private boolean xopIncludeStart = false;
-
- /** Field state */
- private short state;
-
- /** Field currentEvent Default set to START_DOCUMENT */
- private int currentEvent = START_DOCUMENT;
-
- // SwitchingAllowed is set to false by default.
- // This means that unless the user explicitly states
- // that he wants things not to be cached, everything will
- // be cached.
-
- /** Field switchingAllowed */
- boolean switchingAllowed = false;
-
- // namespaceURI interning
- // default is false because most XMLStreamReader implementations don't do interning
- // due to performance impacts
- boolean namespaceURIInterning = false;
-
- /** Field elementStack */
- private Stack nodeStack = null;
-
- // keeps the next event. The parser actually keeps one step ahead to
- // detect the end of navigation. (at the end of the stream the navigator
- // returns a null
-
- /** Field nextNode */
- private OMNode nextNode = null;
-
- // holder for the current node. Needs this to generate events from the
- // current node
-
- /** Field currentNode */
- private OMNode currentNode = null;
-
- // needs this to refer to the last known node
-
- /** Field lastNode */
- private OMNode lastNode = null;
-
- /** Track depth to ensure we stop generating events when we are done with the root node. */
- int depth = 0;
-
- private boolean needToThrowEndDocument = false;
-
- /**
- * If true then TEXT events are constructed for the MTOM attachment
- * If false, an <xop:Include href="cid:xxxxx"/> event is constructed and
- * the consumer must call getDataHandler(cid) to access the datahandler.
- */
- private boolean inlineMTOM = true;
-
- /**
- * Method setAllowSwitching.
- *
- * @param b
- */
- public void setAllowSwitching(boolean b) {
- this.switchingAllowed = b;
- }
-
- /**
- * Method isAllowSwitching.
- *
- * @return Returns boolean.
- */
- public boolean isAllowSwitching() {
- return switchingAllowed;
- }
-
- /**
- * Set namespace uri interning
- * @param b
- */
- public void setNamespaceURIInterning(boolean b) {
- this.namespaceURIInterning = b;
- }
-
- /**
- * @return if namespace uri interning
- */
- public boolean isNamespaceURIInterning() {
- return this.namespaceURIInterning;
- }
-
-
+public class OMStAXWrapper extends org.apache.axiom.om.impl.OMStAXWrapper {
/**
* When constructing the OMStaxWrapper, the creator must produce the builder (an instance of the
* OMXMLparserWrapper of the input) and the Element Node to start parsing. The wrapper will
@@ -196,7 +37,7 @@
* @param startNode
*/
public OMStAXWrapper(OMXMLParserWrapper builder, OMElement startNode) {
- this(builder, startNode, false);
+ super(builder, startNode);
}
/**
@@ -208,1359 +49,6 @@
*/
public OMStAXWrapper(OMXMLParserWrapper builder, OMElement startNode,
boolean cache) {
-
- // create a navigator
- this.navigator = new OMNavigator(startNode);
- this.builder = builder;
- this.rootNode = startNode;
- if (rootNode != null && rootNode.getParent() != null &&
- rootNode.getParent() instanceof OMDocument) {
- needToThrowEndDocument = true;
- }
-
- // initiate the next and current nodes
- // Note - navigator is written in such a way that it first
- // returns the starting node at the first call to it
- // Note - for OMSourcedElements, temporarily set caching
- // to get the initial navigator nodes
- boolean resetCache = false;
- try {
- if (startNode instanceof OMSourcedElement &&
- !cache && builder != null) {
- if (!builder.isCache()) {
- resetCache = true;
- }
- builder.setCache(true); // bootstrap the navigator
-
- }
- } catch(Throwable t) {}
-
- currentNode = navigator.next();
- updateNextNode();
- if (resetCache) {
- builder.setCache(cache);
- }
- switchingAllowed = !cache;
- }
-
- /**
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getPrefix()
- */
- public String getPrefix() {
- String returnStr = null;
- if (parser != null) {
- returnStr = parser.getPrefix();
- } else {
- if ((currentEvent == START_ELEMENT)
- || (currentEvent == END_ELEMENT)) {
- OMNamespace ns = ((OMElement) getNode()).getNamespace();
- returnStr = (ns == null) ? null : ns.getPrefix();
- }
- }
- return returnStr;
- }
-
- /**
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getNamespaceURI()
- */
- public String getNamespaceURI() {
- String returnStr = null;
- if (parser != null) {
- returnStr = parser.getNamespaceURI();
- } else {
- if ((currentEvent == START_ELEMENT)
- || (currentEvent == END_ELEMENT)
- || (currentEvent == NAMESPACE)) {
- OMNamespace ns = ((OMElement) getNode()).getNamespace();
- returnStr = (ns == null) ? null : ns.getNamespaceURI();
- }
- }
-
- // By default most parsers don't intern the namespace.
- // Unfortunately the property to detect interning on the delegate parsers is hard to detect.
- // Woodstox has a proprietary property on the XMLInputFactory.
- // IBM has a proprietary property on the XMLStreamReader.
- // For now only force the interning if requested.
- if (this.isNamespaceURIInterning()) {
- returnStr = (returnStr != null) ? returnStr.intern() : null;
- }
- return returnStr;
- }
-
- /**
- * @return Returns boolean.
- * @see javax.xml.stream.XMLStreamReader#hasName()
- */
- public boolean hasName() {
- if (parser != null) {
- return parser.hasName();
- } else {
- return ((currentEvent == START_ELEMENT)
- || (currentEvent == END_ELEMENT));
- }
- }
-
- /**
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getLocalName()
- */
- public String getLocalName() {
- String returnStr = null;
- if (parser != null) {
- returnStr = parser.getLocalName();
- } else {
- if ((currentEvent == START_ELEMENT)
- || (currentEvent == END_ELEMENT)
- || (currentEvent == ENTITY_REFERENCE)) {
- returnStr = ((OMElement) getNode()).getLocalName();
- }
- }
- return returnStr;
- }
-
- /**
- * @return Returns QName.
- * @see javax.xml.stream.XMLStreamReader#getName()
- */
- public QName getName() {
- QName returnName = null;
- if (parser != null) {
- returnName = parser.getName();
- } else {
- if ((currentEvent == START_ELEMENT)
- || (currentEvent == END_ELEMENT)) {
- returnName = getQName((OMElement) getNode());
- }
- }
- return returnName;
- }
-
- /**
- * @return Returns boolean.
- * @see javax.xml.stream.XMLStreamReader#hasText()
- */
- public boolean hasText() {
- return ((currentEvent == CHARACTERS) || (currentEvent == DTD)
- || (currentEvent == CDATA)
- || (currentEvent == ENTITY_REFERENCE)
- || (currentEvent == COMMENT) || (currentEvent == SPACE));
- }
-
- /**
- * @return Returns int.
- * @see javax.xml.stream.XMLStreamReader#getTextLength()
- */
- public int getTextLength() {
- if (parser != null) {
- return parser.getTextLength();
- } else {
- String text = getTextFromNode();
- return text == null ? 0 : text.length();
- }
- }
-
- /**
- * @return Returns int.
- * @see javax.xml.stream.XMLStreamReader#getTextStart()
- */
- public int getTextStart() {
- if (parser != null) {
- return parser.getTextStart();
- } else {
- // getTextCharacters always returns a new char array and the start
- // index is therefore always 0
- return 0;
- }
- }
-
- /**
- * @param sourceStart
- * @param target
- * @param targetStart
- * @param length
- * @return Returns int.
- * @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 {
- if (parser != null) {
- try {
- return parser.getTextCharacters(sourceStart, target, targetStart, length);
- } catch (XMLStreamException e) {
- throw new OMStreamingException(e);
- }
- } else {
- String text = getTextFromNode();
- if (text != null) {
- int copied = Math.min(length, text.length()-sourceStart);
- text.getChars(sourceStart, sourceStart + copied, target, targetStart);
- return copied;
- } else {
- return 0;
- }
- }
- }
-
- /**
- * @return Returns char[].
- * @see javax.xml.stream.XMLStreamReader#getTextCharacters()
- */
- public char[] getTextCharacters() {
- if (parser != null) {
- return parser.getTextCharacters();
- } else {
- String text = getTextFromNode();
- return text == null ? null : text.toCharArray();
- }
- }
-
- /**
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getText()
- */
- public String getText() {
- if (parser != null) {
- return parser.getText();
- } else {
- return getTextFromNode();
- }
- }
-
- private String getTextFromNode() {
- if (hasText()) {
- OMNode node = getNode();
- if (node instanceof OMText) {
- return ((OMText)node).getText();
- } else if (node instanceof OMComment) {
- return ((OMComment)node).getValue();
- }
- }
- return null;
- }
-
- /**
- * @return Returns int.
- * @see javax.xml.stream.XMLStreamReader#getEventType()
- */
-
- // todo this should be improved
- public int getEventType() {
- return currentEvent;
- }
-
- /**
- * @param i
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getNamespaceURI
- */
- public String getNamespaceURI(int i) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getNamespaceURI(i);
- } else {
- if (isStartElement() || isEndElement()
- || (currentEvent == NAMESPACE)) {
- OMNamespace ns = (OMNamespace) getItemFromIterator(
- ((OMElement) getNode()).getAllDeclaredNamespaces(), i);
- returnString = (ns == null) ? null : ns.getNamespaceURI();
- }
- }
-
- /*
- The following line is necessary to overcome an issue where the empty
- namespace URI returning null rather than the empty string. Our resolution
- is to return "" if the return is actually null
-
- Note that this is not the case for getNamespaceURI(prefix) method
- where the contract clearly specifies that the return may be null
-
- */
- if (returnString == null) returnString = "";
-
- return returnString;
- }
-
- /**
- * @param i
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getNamespacePrefix
- */
- public String getNamespacePrefix(int i) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getNamespacePrefix(i);
- } else {
- if (isStartElement() || isEndElement()
- || (currentEvent == NAMESPACE)) {
- OMNamespace ns = (OMNamespace) getItemFromIterator(
- ((OMElement) getNode()).getAllDeclaredNamespaces(), i);
- returnString = (ns == null) ? null : ns.getPrefix();
- }
- }
- return returnString;
- }
-
- /**
- * @return Returns int.
- * @see javax.xml.stream.XMLStreamReader#getNamespaceCount()
- */
- public int getNamespaceCount() {
- int returnCount = 0;
- if (parser != null) {
- returnCount = parser.getNamespaceCount();
- } else {
- if (isStartElement() || isEndElement()
- || (currentEvent == NAMESPACE)) {
- returnCount = getCount(((OMElement) getNode())
- .getAllDeclaredNamespaces());
- }
- }
- return returnCount;
- }
-
- /**
- * @param i
- * @return Returns boolean.
- * @see javax.xml.stream.XMLStreamReader#isAttributeSpecified
- */
- public boolean isAttributeSpecified(int i) {
- boolean returnValue = false;
- if (parser != null) {
- returnValue = parser.isAttributeSpecified(i);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
-
- // theres nothing to be returned here
- } else {
- throw new IllegalStateException(
- "attribute type accessed in illegal event!");
- }
- }
- return returnValue;
- }
-
- /**
- * @param i
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getAttributeValue
- */
- public String getAttributeValue(int i) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getAttributeValue(i);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- OMAttribute attrib = getAttribute((OMElement) getNode(), i);
- if (attrib != null) {
- returnString = attrib.getAttributeValue();
- }
- } else {
- throw new IllegalStateException(
- "attribute type accessed in illegal event!");
- }
- }
- return returnString;
- }
-
- /**
- * @param i
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getAttributeType
- */
- public String getAttributeType(int i) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getAttributeType(i);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- OMAttribute attrib = getAttribute((OMElement) getNode(), i);
- if (attrib != null) {
- returnString = attrib.getAttributeType();
- }
-
- } else {
- throw new IllegalStateException(
- "attribute type accessed in illegal event!");
- }
- }
- return returnString;
- }
-
- /**
- * @param i
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getAttributePrefix
- */
- public String getAttributePrefix(int i) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getAttributePrefix(i);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- OMAttribute attrib = getAttribute((OMElement) getNode(), i);
- if (attrib != null) {
- OMNamespace nameSpace = attrib.getNamespace();
- if (nameSpace != null) {
- returnString = nameSpace.getPrefix();
- }
- }
- } else {
- throw new IllegalStateException(
- "attribute prefix accessed in illegal event!");
- }
- }
- return returnString;
- }
-
- /**
- * @param i
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getAttributeLocalName
- */
- public String getAttributeLocalName(int i) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getAttributeLocalName(i);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- OMAttribute attrib = getAttribute((OMElement) getNode(), i);
- if (attrib != null) {
- returnString = attrib.getLocalName();
- }
- } else {
- throw new IllegalStateException(
- "attribute localName accessed in illegal event!");
- }
- }
- return returnString;
- }
-
- /**
- * @param i
- * @return Returns String.
- * @see javax.xml.stream.XMLStreamReader#getAttributeNamespace
- */
- public String getAttributeNamespace(int i) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getAttributeNamespace(i);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- OMAttribute attrib = getAttribute((OMElement) getNode(), i);
- if (attrib != null) {
- OMNamespace nameSpace = attrib.getNamespace();
- if (nameSpace != null) {
- returnString = nameSpace.getNamespaceURI();
- }
- }
- } else {
- throw new IllegalStateException(
- "attribute nameSpace accessed in illegal event!");
- }
- }
- return returnString;
- }
-
- /**
- * @param i
- * @return Returns QName.
- * @see javax.xml.stream.XMLStreamReader#getAttributeName
- */
- public QName getAttributeName(int i) {
- QName returnQName = null;
- if (parser != null) {
- returnQName = parser.getAttributeName(i);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- returnQName = getAttribute((OMElement) getNode(), i).getQName();
- } else {
- throw new IllegalStateException(
- "attribute count accessed in illegal event!");
- }
- }
- return returnQName;
- }
-
- /**
- * @return Returns int.
- * @see javax.xml.stream.XMLStreamReader#getAttributeCount
- */
- public int getAttributeCount() {
- int returnCount = 0;
- if (parser != null) {
- returnCount = parser.getAttributeCount();
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- OMElement elt = (OMElement) getNode();
- returnCount = getCount(elt.getAllAttributes());
- } else {
- throw new IllegalStateException(
- "attribute count accessed in illegal event (" +
- currentEvent + ")!");
- }
- }
- return returnCount;
- }
-
- // todo
-
- /**
- * Method getAttributeValue.
- *
- * @param s
- * @param s1
- * @return Returns String.
- */
- public String getAttributeValue(String s, String s1) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getAttributeValue(s, s1);
- } else {
- if (isStartElement() || (currentEvent == ATTRIBUTE)) {
- QName qname = new QName(s, s1);
- OMAttribute attrib = ((OMElement) getNode()).getAttribute(qname);
- if (attrib != null) {
- returnString = attrib.getAttributeValue();
- }
- } else {
- throw new IllegalStateException(
- "attribute type accessed in illegal event!");
- }
- }
- return returnString;
- }
-
- /**
- * Method isWhiteSpace.
- *
- * @return Returns boolean.
- */
- public boolean isWhiteSpace() {
- boolean b;
- if (parser != null) {
- b = parser.isWhiteSpace();
- } else {
- b = (currentEvent == SPACE);
- }
- return b;
- }
-
- /**
- * Method isCharacters.
- *
- * @return Returns boolean.
- */
- public boolean isCharacters() {
- boolean b;
- if (parser != null) {
- b = parser.isCharacters();
- } else {
- b = (currentEvent == CHARACTERS);
- }
- return b;
- }
-
- /**
- * Method isEndElement.
- *
- * @return Returns boolean.
- */
- public boolean isEndElement() {
- boolean b;
- if (parser != null) {
- b = parser.isEndElement();
- } else {
- b = (currentEvent == END_ELEMENT);
- }
- return b;
- }
-
- /**
- * @param i
- * @param s
- * @param s1
- * @throws XMLStreamException
- * @see javax.xml.stream.XMLStreamReader#require(int, String, String)
- */
- public void require(int i, String s, String s1) throws XMLStreamException {
- throw new XMLStreamException();
- }
-
- /**
- * Method isStartElement.
- *
- * @return Returns boolean.
- */
- public boolean isStartElement() {
- boolean b;
- if (parser != null) {
- b = parser.isStartElement();
- } else {
- b = (currentEvent == START_ELEMENT);
- }
- return b;
- }
-
- /**
- * Method getNamespaceURI.
- *
- * @param prefix
- * @return Returns String.
- */
- public String getNamespaceURI(String prefix) {
- String returnString = null;
- if (parser != null) {
- returnString = parser.getNamespaceURI(prefix);
- } else {
- if (isStartElement() || isEndElement()
- || (currentEvent == NAMESPACE)) {
-
- if (rootNode instanceof OMElement) {
- OMNamespace namespaceURI =
- ((OMElement) rootNode).findNamespaceURI(prefix);
- return namespaceURI != null ? namespaceURI.getNamespaceURI() : null;
- }
- }
- }
- return returnString;
- }
-
- /**
- * Method close.
- *
- * @throws XMLStreamException
- */
- public void close() throws XMLStreamException {
-
- // If there is a builder, it controls its parser
- if (builder != null && builder instanceof StAXBuilder) {
- StAXBuilder staxBuilder = (StAXBuilder) builder;
- staxBuilder.close();
- parser = null;
- } else {
- if (parser != null) {
- try {
- if (!isClosed()) {
- parser.close();
- }
- } finally {
- _isClosed = true;
- // Release the parser so that it can be GC'd or reused.
- if (_releaseParserOnClose) {
- parser = null;
- }
- }
- }
- }
- }
-
- /**
- * Method hasNext.
- *
- * @return Returns boolean.
- * @throws XMLStreamException
- */
- public boolean hasNext() throws XMLStreamException {
- if (needToThrowEndDocument) {
- return !(state == DOCUMENT_COMPLETE);
- } else {
- return (state != COMPLETED && currentEvent != END_DOCUMENT);
- }
- }
-
- /**
- * Returns the next tag.
- *
- * @return Returns int.
- * @throws org.apache.axiom.om.impl.exception.OMStreamingException
- *
- * @throws XMLStreamException
- */
- public int nextTag() throws XMLStreamException {
- int eventType = next();
- while ((eventType == XMLStreamConstants.CHARACTERS && isWhiteSpace()) // skip whitespace
- || (eventType == XMLStreamConstants.CDATA && isWhiteSpace()) // skip whitespace
- || eventType == XMLStreamConstants.SPACE
- || eventType == XMLStreamConstants.PROCESSING_INSTRUCTION
- || eventType == XMLStreamConstants.COMMENT) {
- eventType = next();
- }
- if (eventType != XMLStreamConstants.START_ELEMENT &&
- eventType != XMLStreamConstants.END_ELEMENT) {
- throw new XMLStreamException("expected start or end tag", getLocation());
- }
- return eventType;
- }
-
- /**
- * @return Returns String.
- * @throws XMLStreamException
- * @see javax.xml.stream.XMLStreamReader#getElementText()
- */
- public String getElementText() throws XMLStreamException {
- if (parser != null) {
- try {
- return parser.getElementText();
- } catch (XMLStreamException e) {
- throw new OMStreamingException(e);
- }
- } else {
- ///////////////////////////////////////////////////////
- //// Code block directly from the API documentation ///
- if (getEventType() != XMLStreamConstants.START_ELEMENT) {
- throw new XMLStreamException(
- "parser must be on START_ELEMENT to read next text", getLocation());
- }
- int eventType = next();
- StringBuffer content = new StringBuffer();
- while (eventType != XMLStreamConstants.END_ELEMENT) {
- if (eventType == XMLStreamConstants.CHARACTERS
- || eventType == XMLStreamConstants.CDATA
- || eventType == XMLStreamConstants.SPACE
- || eventType == XMLStreamConstants.ENTITY_REFERENCE) {
- content.append(getText());
- } else if (eventType == XMLStreamConstants.PROCESSING_INSTRUCTION
- || eventType == XMLStreamConstants.COMMENT) {
- // skipping
- } else if (eventType == XMLStreamConstants.END_DOCUMENT) {
- throw new XMLStreamException(
- "unexpected end of document when reading element text content");
- } else if (eventType == XMLStreamConstants.START_ELEMENT) {
- throw new XMLStreamException(
- "element text content may not contain START_ELEMENT");
- } else {
- throw new XMLStreamException(
- "Unexpected event type " + eventType, getLocation());
- }
- eventType = next();
- }
- return content.toString();
- ///////////////////////////////////////////////////////////////
- }
-
- }
-
- /**
- * Method next.
- *
- * @return Returns int.
- * @throws XMLStreamException
- */
- public int next() throws XMLStreamException {
- switch (state) {
- case DOCUMENT_COMPLETE:
- throw new XMLStreamException("End of the document reached");
- case COMPLETED:
- state = DOCUMENT_COMPLETE;
- currentEvent = END_DOCUMENT;
- break;
- case SWITCH_AT_NEXT:
- state = SWITCHED;
-
- // load the parser
- try {
- parser = (XMLStreamReader) builder.getParser();
- } catch (Exception e) {
- throw new XMLStreamException("problem accessing the parser. " + e.getMessage(),
- e);
- }
-
- // We should throw an END_DOCUMENT
- if ((currentEvent == START_DOCUMENT)
- && (currentEvent == parser.getEventType())) {
- currentEvent = parser.next();
- } else {
- currentEvent = parser.getEventType();
- }
- updateCompleteStatus();
- break;
- case NAVIGABLE:
- currentEvent = generateEvents(currentNode);
- updateCompleteStatus();
- updateLastNode();
- break;
- case SWITCHED:
- if (parser.hasNext()) {
- currentEvent = parser.next();
- }
- updateCompleteStatus();
- break;
- default:
- throw new OMStreamingException("unsuppported state!");
- }
- return currentEvent;
- }
-
- /**
- * Method getProperty.
- *
- * @param s
- * @return Returns Object.
- * @throws IllegalArgumentException
- */
- public Object getProperty(String s) throws IllegalArgumentException {
- if (OMConstants.IS_DATA_HANDLERS_AWARE.equals(s)) {
- return Boolean.TRUE;
- }
- if (OMConstants.IS_BINARY.equals(s)) {
- if (getNode() instanceof OMText) {
- OMText text = (OMText) getNode();
- return new Boolean(text.isBinary());
- }
- return Boolean.FALSE;
- } else if (OMConstants.DATA_HANDLER.equals(s)) {
- if (getNode() instanceof OMText) {
- OMText text = (OMText) getNode();
- if (text.isBinary())
- return text.getDataHandler();
- }
- }
- // Per spec, throw IllegalArgumentException
- if (s == null) {
- throw new IllegalArgumentException();
- }
- if (parser != null) {
- return parser.getProperty(s);
- }
- // Delegate to the builder's parser.
- if (builder != null && builder instanceof StAXBuilder) {
- StAXBuilder staxBuilder = (StAXBuilder) builder;
- if (!staxBuilder.isClosed()) {
- // If the parser was closed by something other
- // than the builder, an IllegalStateException is
- // thrown. For now, return null as this is unexpected
- // by the caller.
- try {
- return ((StAXBuilder) builder).getReaderProperty(s);
- } catch (IllegalStateException ise) {
- return null;
- }
- }
- }
- return null;
- }
-
- /**
- * This is a very important method. It keeps the navigator one step ahead and pushes it one
- * event ahead. If the nextNode is null then navigable is set to false. At the same time the
- * parser and builder are set up for the upcoming event generation.
- *
- * @throws XMLStreamException
- */
- private void updateLastNode() throws XMLStreamException {
- // Detect XOP:Include element and don't advance if processing
- // the end tag.
- if (xopInclude != null &&
- xopIncludeText == currentNode &&
- xopIncludeStart) {
- lastNode = xopIncludeText;
- return;
- }
-
- lastNode = currentNode;
- currentNode = nextNode;
- try {
- updateNextNode();
- } catch (Exception e) {
- throw new XMLStreamException(e);
- }
- }
-
- /** Method updateNextNode. */
- private void updateNextNode() {
- if (navigator.isNavigable()) {
- nextNode = navigator.next();
- } else {
- if (!switchingAllowed) {
- if (navigator.isCompleted() || builder == null || builder.isCompleted()) {
- nextNode = null;
- if (DEBUG_ENABLED) {
- if (builder == null || builder.isCompleted()) {
- log.debug("Builder is complete. Next node is set to null.");
- }
- }
- } else {
- builder.next();
- navigator.step();
- nextNode = navigator.next();
- }
- } else {
- //at this point check whether the navigator is done
- //if the navigator is done then we are fine and can directly
- // jump to the complete state ?
- if (navigator.isCompleted()) {
- nextNode = null;
- } else {
- // reset caching (the default is ON so it was not needed in the
- // earlier case!
- if (builder != null) {
- builder.setCache(false);
- }
- state = SWITCH_AT_NEXT;
- }
- }
- }
- }
-
- /** Method updateCompleteStatus. */
- private void updateCompleteStatus() {
- if (state == NAVIGABLE) {
- if (rootNode == currentNode) {
- if (isFirst) {
- isFirst = false;
- } else {
- state = COMPLETED;
- }
- }
- } else {
- if (state == SWITCHED) {
- //this is a potential place for bugs
- //we have to test if the root node of this parser
- //has the same name for this test
- if (currentEvent == START_ELEMENT &&
- (parser.getLocalName().equals(((OMElement)rootNode).getLocalName()))) {
- ++depth;
- } else if (currentEvent == END_ELEMENT &&
- (parser.getLocalName().equals(((OMElement)rootNode).getLocalName())) ) {
- --depth;
- if (depth < 0) {
- state = COMPLETED;
- }
- }
- }
- state = (currentEvent == END_DOCUMENT)
- ? DOCUMENT_COMPLETE
- : state;
- }
- }
-
- /**
- * Method getNamespaceContext.
- *
- * @return Returns NamespaceContext.
- */
- public NamespaceContext getNamespaceContext() {
- if (state==SWITCHED){
- return parser.getNamespaceContext();
- }
- Map m = getAllNamespaces(getNode());
- if (getNode() != lastNode) {
- // Handle situation involving substituted node.
- m.putAll(getAllNamespaces(lastNode));
- }
- return new NamespaceContextImpl(m);
- }
-
- /**
- * Method getEncoding.
- *
- * @return Returns String.
- */
- public String getEncoding() {
- return null;
- }
-
- /**
- * Method getLocation.
- *
- * @return Returns Location.
- */
- public Location getLocation() {
- return new EmptyOMLocation();
- }
-
- /**
- * Method getVersion.
- *
- * @return Returns String.
- */
- public String getVersion() {
- return "1.0"; // todo put the constant
- }
-
- /**
- * Method isStandalone.
- *
- * @return Returns boolean.
- */
- public boolean isStandalone() {
- return true;
- }
-
- /**
- * Method standaloneSet.
- *
- * @return Returns boolean.
- */
- public boolean standaloneSet() {
- return false;
- }
-
- /**
- * Method getCharacterEncodingScheme.
- *
- * @return Returns String.
- */
- public String getCharacterEncodingScheme() {
- if(builder != null) {
- return builder.getCharacterEncoding();
- }
- return "utf-8";
- }
-
- /**
- * Method getPITarget.
- *
- * @return Returns String.
- */
- public String getPITarget() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Method getPIData.
- *
- * @return Returns String.
- */
- public String getPIData() {
- throw new UnsupportedOperationException();
- }
-
- /*
- *
- * ################################################################
- * Generator methods for the OMNodes returned by the navigator
- * ################################################################
- *
- */
-
- /**
- * Method generateEvents.
- *
- * @param node
- * @return Returns int.
- */
- private int generateEvents(OMNode node) {
- int returnEvent;
- if (node == null) {
- if (log.isDebugEnabled()) {
- log.debug("Node is null...returning END_DOCUMENT");
- }
- returnEvent = END_DOCUMENT;
- return returnEvent;
- }
- int nodeType = node.getType();
- switch (nodeType) {
- case OMNode.ELEMENT_NODE:
- OMElement element = (OMElement) node;
- returnEvent = generateElementEvents(element);
- break;
- case OMNode.TEXT_NODE:
- case OMNode.SPACE_NODE:
- returnEvent = generateTextEvents(node);
- break;
- case OMNode.COMMENT_NODE:
- returnEvent = generateCommentEvents();
- break;
- case OMNode.CDATA_SECTION_NODE:
- returnEvent = generateCdataEvents();
- break;
- default :
- throw new OMStreamingException("Encountered node with unknown node type "
- + nodeType);
- }
- return returnEvent;
- }
-
- /**
- * Method generateElementEvents.
- *
- * @param elt
- * @return Returns int.
- */
- private int generateElementEvents(OMElement elt) {
- if (nodeStack == null) {
- nodeStack = new Stack();
- }
- int returnValue = START_ELEMENT;
- if (!nodeStack.isEmpty() && nodeStack.peek().equals(elt)) {
- returnValue = END_ELEMENT;
- nodeStack.pop();
- } else {
- nodeStack.push(elt);
- }
- return returnValue;
- }
-
- /**
- * Method generateTextEvents.
- *
- * @return Returns int.
- */
- private int generateTextEvents(OMNode node) {
- if (!isInlineMTOM()) {
- // If this is an optimized MTOM text node
- // then simulate an XOP_INCLUDE element.
- if (node instanceof OMText) {
- OMText text = (OMText) node;
- if (text.isOptimized()) {
-
- if (nodeStack == null) {
- nodeStack = new Stack();
- }
-
- if (!nodeStack.isEmpty() && nodeStack.peek().equals(text)) {
- // Process the end tag of the XOP:Include
- nodeStack.pop();
- xopIncludeStart = false;
- return END_ELEMENT;
- } else {
-
- // Create an XOPInclude element to represent this node
- xopIncludeText = text;
- xopInclude = node.getOMFactory().createOMElement(XOP_INCLUDE);
- String cid = text.getContentID();
- xopInclude.addAttribute("href", "cid:" + cid, null);
- xopIncludeStart = true;
- nodeStack.push(text);
- return START_ELEMENT;
- }
- }
- }
- }
- return CHARACTERS;
- }
-
- /**
- * @return the node to use for the current event
- */
- private OMNode getNode() {
- // This method returns the node used to construct
- // the current event (lastNode).
- // In some cases a new node is substitued (i.e. an XOPInclude element)
- if (lastNode == xopIncludeText) {
- return xopInclude;
- }
- return lastNode;
- }
-
- /**
- * Method generateCommentEvents.
- *
- * @return Returns int.
- * @noinspection SameReturnValue
- */
- private int generateCommentEvents() {
- return COMMENT;
- }
-
- /**
- * Method generateCdataEvents.
- *
- * @return Returns int.
- */
- private int generateCdataEvents() {
- return CDATA;
- }
-
- /*
- * ####################################################################
- * Other helper methods
- * ####################################################################
- */
-
- /**
- * helper method getCount.
- *
- * @param it
- * @return Returns int.
- */
- private int getCount(Iterator it) {
- int count = 0;
- if (it != null) {
- while (it.hasNext()) {
- it.next();
- count++;
- }
- }
- return count;
- }
-
- /**
- * Helper method getItemFromIterator.
- *
- * @param it
- * @param index
- * @return Returns Object.
- */
- private Object getItemFromIterator(Iterator it, int index) {
- int count = 0;
- Object returnObject = null;
- boolean found = false;
- if (it != null) {
- while (it.hasNext()) {
- returnObject = it.next();
- if (index == count++) {
- found = true;
- break;
- }
- }
- }
- if (found) {
- return returnObject;
- } else {
- return null;
- }
- }
-
- /**
- * Helper method getQName.
- *
- * @param element
- * @return Returns QName.
- */
- private QName getQName(OMElement element) {
- QName returnName;
- OMNamespace ns = element.getNamespace();
- String localPart = element.getLocalName();
- if (ns != null) {
- String prefix = ns.getPrefix();
- String uri = ns.getNamespaceURI();
- if ((prefix == null) || prefix.equals("")) {
- returnName = new QName(uri, localPart);
- } else {
- returnName = new QName(uri, localPart, prefix);
- }
- } else {
- returnName = new QName(localPart);
- }
- return returnName;
- }
-
- /**
- * @param elt
- * @param index
- * @return Returns OMAttribute.
- */
- private OMAttribute getAttribute(OMElement elt, int index) {
- OMAttribute returnAttrib = null;
- if (elt != null) {
- returnAttrib = (OMAttribute) getItemFromIterator(
- elt.getAllAttributes(), index);
- }
- return returnAttrib;
- }
-
- public void setParser(XMLStreamReader parser) {
- this.parser = parser;
- }
-
- private Map getAllNamespaces(OMNode contextNode) {
- if (!(contextNode instanceof OMContainer &&
- contextNode instanceof OMElement)) {
- return new HashMap();
- }
- Map nsMap = new LinkedHashMap();
- for (OMContainer context = (OMContainer) contextNode;
- context != null && !(context instanceof OMDocument);
- context = ((OMElement) context).getParent()) {
- OMElement element = (OMElement) context;
- Iterator i = element.getAllDeclaredNamespaces();
- while (i != null && i.hasNext()) {
- addNamespaceToMap((OMNamespace) i.next(), nsMap);
- }
- if (element.getNamespace() != null) {
- addNamespaceToMap(element.getNamespace(), nsMap);
- }
- for (Iterator iter = element.getAllAttributes();
- iter != null && iter.hasNext();) {
- OMAttribute attr = (OMAttribute) iter.next();
- if (attr.getNamespace() != null) {
- addNamespaceToMap(attr.getNamespace(), nsMap);
- }
- }
- }
- return nsMap;
- }
-
- private void addNamespaceToMap(OMNamespace ns, Map map) {
- if (map.get(ns.getPrefix()) == null) {
- map.put(ns.getPrefix(), ns.getNamespaceURI());
- }
- }
-
- public OMXMLParserWrapper getBuilder() {
- return builder;
- }
-
- /**
- * @return if parser is closed
- */
- public boolean isClosed() {
-
- // If there is a builder, the builder owns the parser
- // and knows the isClosed status
- if (builder != null && builder instanceof StAXBuilder) {
- return ((StAXBuilder) builder).isClosed();
- } else {
- return _isClosed;
- }
- }
-
- /**
- * Indicate if the parser resource should be release when closed.
- * @param value boolean
- */
- public void releaseParserOnClose(boolean value) {
- // if there is a StAXBuilder, it owns the parser
- // and controls the releaseOnClose status
- if (builder != null && builder instanceof StAXBuilder) {
- ((StAXBuilder) builder).releaseParserOnClose(value);
- if (isClosed() && value) {
- parser = null;
- }
- return;
- } else {
- // Release parser if already closed
- if (isClosed() && value) {
- parser = null;
- }
- _releaseParserOnClose = value;
- }
-
- }
-
- public DataHandler getDataHandler(String blobcid) {
- DataHandler dh = null;
- // The datahandler may be part of the attachments map of the builder
- if (builder != null &&
- builder instanceof OMAttachmentAccessor) {
- dh = ((OMAttachmentAccessor) builder).getDataHandler(blobcid);
- }
-
- // Or the datahandler might be part of the current optimized text node
- if (dh == null &&
- lastNode != null &&
- lastNode instanceof OMText) {
- OMText text = (OMText) lastNode;
- if (text.isOptimized() &&
- blobcid.equals("cid:" + text.getContentID())) {
- dh = (DataHandler) text.getDataHandler();
- }
- }
-
- return dh;
- }
-
- public boolean isInlineMTOM() {
- return inlineMTOM;
-
- }
-
- public void setInlineMTOM(boolean value) {
- inlineMTOM = value;
+ super(builder, startNode, cache);
}
}