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


Reply via email to