Author: veithen
Date: Sat Mar 14 09:31:52 2009
New Revision: 753622
URL: http://svn.apache.org/viewvc?rev=753622&view=rev
Log:
* DOMStAXWrapper: Track depth to ensure we stop generating events when we are
done with the root node. Change initially introduced in OMStAXWrapper in
r359259.
* Added unit test for this issue.
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DOMStAXWrapper.java
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java?rev=753622&r1=753621&r2=753622&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java
Sat Mar 14 09:31:52 2009
@@ -137,4 +137,28 @@
String elementText = xmlStreamReader.getElementText();
assertEquals("this is a TEXTthis is a TEXT block 2", elementText);
}
+
+ private void testNonRootElement(boolean cache) throws Exception {
+ OMElement root = AXIOMUtil.stringToOM(omMetaFactory.getOMFactory(),
+ "<a><b><c/></b></a>");
+ OMElement child = (OMElement)root.getFirstOMChild();
+ XMLStreamReader stream = cache ? child.getXMLStreamReader()
+ : child.getXMLStreamReaderWithoutCaching();
+ assertEquals(XMLStreamReader.START_DOCUMENT, stream.getEventType());
+ assertEquals(XMLStreamReader.START_ELEMENT, stream.next());
+ assertEquals("b", stream.getLocalName());
+ assertEquals(XMLStreamReader.START_ELEMENT, stream.next());
+ assertEquals("c", stream.getLocalName());
+ assertEquals(XMLStreamReader.END_ELEMENT, stream.next());
+ assertEquals(XMLStreamReader.END_ELEMENT, stream.next());
+ assertEquals(XMLStreamReader.END_DOCUMENT, stream.next());
+ }
+
+ public void testNonRootElementWithCaching() throws Exception {
+ testNonRootElement(true);
+ }
+
+ public void testNonRootElementWithoutCaching() throws Exception {
+ testNonRootElement(false);
+ }
}
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DOMStAXWrapper.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DOMStAXWrapper.java?rev=753622&r1=753621&r2=753622&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DOMStAXWrapper.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DOMStAXWrapper.java
Sat Mar 14 09:31:52 2009
@@ -117,6 +117,9 @@
/** 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;
/**
@@ -982,6 +985,21 @@
}
}
} 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;
}
}