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; } }