Author: veithen
Date: Sun May 12 11:54:47 2013
New Revision: 1481531

URL: http://svn.apache.org/r1481531
Log:
AXIOM-288: Fixed an issue with the getElementText method of the XMLStreamReader 
returned by getXMLStreamReaderWithoutCaching that occurs if the reader needs to 
switch to pull-through mode in the middle of the element.

Modified:
    
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/StreamSwitch.java
    
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java
    
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
    
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetElementTextFromParser.java

Modified: 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/StreamSwitch.java
URL: 
http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/StreamSwitch.java?rev=1481531&r1=1481530&r2=1481531&view=diff
==============================================================================
--- 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/StreamSwitch.java
 (original)
+++ 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/StreamSwitch.java
 Sun May 12 11:54:47 2013
@@ -67,4 +67,44 @@ final class StreamSwitch extends StreamR
         }
         return eventType;
     }
+
+    public String getElementText() throws XMLStreamException {
+        // getElementText is tricky for the same reasons as nextTag.
+        String text = super.getElementText();
+        if (text != null) {
+            return text;
+        } 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();
+            ///////////////////////////////////////////////////////////////
+        }
+    }
 }

Modified: 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java
URL: 
http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java?rev=1481531&r1=1481530&r2=1481531&view=diff
==============================================================================
--- 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java
 (original)
+++ 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java
 Sun May 12 11:54:47 2013
@@ -699,13 +699,8 @@ class SwitchingWrapper extends AbstractX
     }
 
     public String getElementText() throws XMLStreamException {
-        if (parser != null) {
-            String elementText = parser.getElementText();
-            currentEvent = END_ELEMENT;
-            return elementText;
-        } else {
-            return super.getElementText();
-        }
+        // Let StreamSwitch handle this method
+        return null;
     }
 
     /**

Modified: 
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
URL: 
http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java?rev=1481531&r1=1481530&r2=1481531&view=diff
==============================================================================
--- 
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
 (original)
+++ 
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
 Sun May 12 11:54:47 2013
@@ -350,8 +350,10 @@ public class OMTestSuiteBuilder extends 
         addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetElementText(metaFactory));
         for (int i=0; i<builderFactories.length; i++) {
             BuilderFactory bf = builderFactories[i];
-            addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetElementTextFromParser(metaFactory, bf, 
true));
-            addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetElementTextFromParser(metaFactory, bf, 
false));
+            addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetElementTextFromParser(metaFactory, bf, 
true, 0));
+            for (int build=0; build<6; build++) {
+                addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetElementTextFromParser(metaFactory, bf, 
false, build));
+            }
         }
         addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetNamespaceContext(metaFactory, true));
         addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetNamespaceContext(metaFactory, false));

Modified: 
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetElementTextFromParser.java
URL: 
http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetElementTextFromParser.java?rev=1481531&r1=1481530&r2=1481531&view=diff
==============================================================================
--- 
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetElementTextFromParser.java
 (original)
+++ 
webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetElementTextFromParser.java
 Sun May 12 11:54:47 2013
@@ -19,9 +19,11 @@
 package org.apache.axiom.ts.om.element.sr;
 
 import java.io.StringReader;
+import java.util.Iterator;
 
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMXMLParserWrapper;
@@ -32,13 +34,24 @@ import org.xml.sax.InputSource;
 public class TestGetElementTextFromParser extends AxiomTestCase {
     private final BuilderFactory builderFactory;
     private final boolean cache;
+    private final int build;
     
-    public TestGetElementTextFromParser(OMMetaFactory metaFactory, 
BuilderFactory builderFactory, boolean cache) {
+    /**
+     * Constructor.
+     * 
+     * @param metaFactory
+     * @param builderFactory
+     * @param cache
+     * @param build the number of descendants that should be built before 
calling {@link OMContainer#getXMLStreamReader(boolean)}
+     */
+    public TestGetElementTextFromParser(OMMetaFactory metaFactory, 
BuilderFactory builderFactory, boolean cache, int build) {
         super(metaFactory);
         this.builderFactory = builderFactory;
         this.cache = cache;
+        this.build = build;
         builderFactory.addTestParameters(this);
         addTestParameter("cache", Boolean.toString(cache));
+        addTestParameter("build", String.valueOf(build));
     }
 
     protected void runTest() throws Throwable {
@@ -49,6 +62,14 @@ public class TestGetElementTextFromParse
                 new StringReader("<a><b>AB<!--comment text-->CD</b></a>")));
         OMElement element = builder.getDocumentElement();
         
+        // Build a certain number of descendants. This is used to test 
scenarios where the XMLStreamReader
+        // needs to switch to pull through mode in the middle of the element 
from which we attempt to
+        // get the text.
+        Iterator it = element.getDescendants(true);
+        for (int i=0; i<build; i++) {
+            it.next();
+        }
+        
         XMLStreamReader reader = element.getXMLStreamReader(cache);
         assertEquals(XMLStreamReader.START_ELEMENT, reader.next());
         assertEquals(XMLStreamReader.START_ELEMENT, reader.next());


Reply via email to