You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2012/12/30 14:04:17 UTC

svn commit: r1426927 - in /webservices/commons/trunk/modules/axiom/modules: axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/ axiom-testsuite/src/main/java/org/apache/axiom/ts/om/ axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sour...

Author: veithen
Date: Sun Dec 30 13:04:17 2012
New Revision: 1426927

URL: http://svn.apache.org/viewvc?rev=1426927&view=rev
Log:
Expanded the code coverage generated by TestSerializeToXMLWriterFromReader and fixed an issue that caused OMSourcedElement#getXMLStreamReaderWithoutCaching to unnecessarily build nodes. This also sheds some light on AXIOM-201 and AXIOM-431.

Modified:
    webservices/commons/trunk/modules/axiom/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java
    webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
    webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestSerializeToXMLWriterFromReader.java

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java?rev=1426927&r1=1426926&r2=1426927&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java Sun Dec 30 13:04:17 2012
@@ -44,7 +44,7 @@ public class OMNavigator {
     // root, the traversal is terminated
 
     /** Field root */
-    private OMSerializable root;
+    private OMContainer root;
 
     /** Field backtracked */
     private boolean backtracked;
@@ -61,30 +61,17 @@ public class OMNavigator {
     // be considered as an interior node or a leaf node.
     private boolean isDataSourceALeaf = false;
 
-    /** Constructor OMNavigator. */
-    public OMNavigator() {
-    }
-
     /**
      * Constructor OMNavigator.
      *
      * @param node
      */
-    public OMNavigator(OMSerializable node) {
-        init(node);
-    }
-
-    /**
-     * Method init.
-     *
-     * @param node
-     */
-    public void init(OMSerializable node) {
+    public OMNavigator(OMContainer node) {
         next = node;
         root = node;
         backtracked = false;
     }
-    
+
     /**
      * Indicate if an OMSourcedElement with a OMDataSource
      * should be considered as an interior element node or as
@@ -194,7 +181,8 @@ public class OMNavigator {
      * @return first child or null
      */
     private OMNode _getFirstChild(OMContainer node) {
-        if (isOMSourcedElement(node)) {
+        // TODO: We have a problem if the tree has parts constructed by different builders; this is related to AXIOM-201 and AXIOM-431
+        if (node.getBuilder() != root.getBuilder()) {
             OMNode first = node.getFirstOMChild();
             OMNode sibling = first;
             while (sibling != null) {

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java?rev=1426927&r1=1426926&r2=1426927&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java Sun Dec 30 13:04:17 2012
@@ -461,7 +461,14 @@ public class OMTestSuiteBuilder extends 
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToWriter(metaFactory));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriter(metaFactory));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriterEmbedded(metaFactory));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriterFromReader(metaFactory));
+            for (int expand = 0; expand <= 2; expand++) {
+                for (int count = 1; count <= 2; count++) {
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriterFromReader(metaFactory, false, false, expand, count));
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriterFromReader(metaFactory, false, true, expand, count));
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriterFromReader(metaFactory, true, false, expand, count));
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriterFromReader(metaFactory, true, true, expand, count));
+                }
+            }
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestSerializeToXMLWriterFromReaderEmbedded(metaFactory));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestSetDataSource(metaFactory));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestSetDataSourceOnAlreadyExpandedElement(metaFactory));

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestSerializeToXMLWriterFromReader.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestSerializeToXMLWriterFromReader.java?rev=1426927&r1=1426926&r2=1426927&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestSerializeToXMLWriterFromReader.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestSerializeToXMLWriterFromReader.java Sun Dec 30 13:04:17 2012
@@ -19,49 +19,89 @@
 package org.apache.axiom.ts.om.sourcedelement;
 
 import java.io.StringWriter;
-import java.util.Iterator;
 
-import javax.xml.stream.XMLStreamWriter;
-
-import org.apache.axiom.om.OMDocument;
+import org.apache.axiom.om.OMDataSource;
+import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMSourcedElement;
 import org.apache.axiom.om.OMXMLBuilderFactory;
 import org.apache.axiom.om.OMXMLParserWrapper;
-import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axiom.ts.AxiomTestCase;
+import org.custommonkey.xmlunit.XMLAssert;
 
 /**
- * Tests OMSourcedElement getReader support
+ * Tests {@link OMSourcedElement#getXMLStreamReader(boolean)}.
  */
 public class TestSerializeToXMLWriterFromReader extends AxiomTestCase {
-    public TestSerializeToXMLWriterFromReader(OMMetaFactory metaFactory) {
+    private final boolean destructive;
+    private final boolean cache;
+    private final int expand;
+    private final int count;
+    
+    /**
+     * Constructor.
+     * 
+     * @param metaFactory
+     *            the meta factory for the implementation to be tested
+     * @param destructive
+     *            determines if the {@link OMDataSource} is destructive or not
+     * @param cache
+     *            the argument to be passed to {@link OMSourcedElement#getXMLStreamReader(boolean)}
+     * @param expand
+     *            determines if and how the sourced element should be expanded before calling
+     *            {@link OMSourcedElement#getXMLStreamReader(boolean)}: 0 = don't expand; 1 =
+     *            expand; 2 = expand and build
+     * @param count
+     *            the number of times {@link OMSourcedElement#getXMLStreamReader(boolean)} will be
+     *            called; the only meaningful values are 1 and 2
+     */
+    public TestSerializeToXMLWriterFromReader(OMMetaFactory metaFactory, boolean destructive, boolean cache, int expand, int count) {
         super(metaFactory);
+        this.destructive = destructive;
+        this.cache = cache;
+        this.expand = expand;
+        this.count = count;
+        addTestProperty("destructive", String.valueOf(destructive));
+        addTestProperty("cache", String.valueOf(cache));
+        addTestProperty("expand", String.valueOf(expand));
+        addTestProperty("count", String.valueOf(count));
     }
 
     protected void runTest() throws Throwable {
-        OMSourcedElement element = TestDocument.DOCUMENT1.createOMSourcedElement(metaFactory.getOMFactory(), false);
-        StringWriter writer = new StringWriter();
-        XMLStreamWriter xmlwriter = StAXUtils.createXMLStreamWriter(writer);
-
-        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXOMBuilder(
-                metaFactory.getOMFactory(), element.getXMLStreamReader());
-        OMDocument omDocument = builder.getDocument();
-        Iterator it = omDocument.getChildren();
-        while (it.hasNext()) {
-            OMNode omNode = (OMNode) it.next();
-            // TODO: quick fix required because OMChildrenIterator#next() no longer builds the node
-            omNode.getNextOMSibling();
-            omNode.serializeAndConsume(xmlwriter);
+        OMFactory factory = metaFactory.getOMFactory();
+        OMSourcedElement element = TestDocument.DOCUMENT1.createOMSourcedElement(factory, destructive);
+        if (expand != 0) {
+            element.getFirstOMChild();
+        }
+        if (expand == 2) {
+            element.build();
+        }
+        for (int iteration=0; iteration<count; iteration++) {
+            boolean expectException = iteration != 0 && expand != 2 && !cache && (destructive || expand == 1);
+            StringWriter writer = new StringWriter();
+            try {
+                OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXOMBuilder(factory, element.getXMLStreamReader(cache));
+                builder.getDocument().serialize(writer);
+                if (expectException) {
+                    fail("Expected exception");
+                }
+            } catch (Exception ex) {
+                if (!expectException) {
+                    throw ex;
+                } else {
+                    continue;
+                }
+            }
+            XMLAssert.assertXMLEqual(TestDocument.DOCUMENT1.getContent(), writer.toString());
+            // If the underlying OMDataSource is non destructive, the expansion status should not have been
+            // changed by the call to getXMLStreamReader. If it is destructive and caching is enabled, then
+            // the sourced element should be expanded.
+            if (expand != 0 || (destructive && cache)) {
+                assertTrue(element.isExpanded());
+                assertEquals(expand == 2 || (expand == 1 && cache) || (expand == 0 && destructive && cache), element.isComplete());
+            } else {
+                assertFalse(element.isExpanded());
+            }
         }
-
-        xmlwriter.flush();
-        String result = writer.toString();
-
-        // We can't test for equivalence because the underlying OMSourceElement is 
-        // changed as it is serialized.  So I am testing for an internal value.
-        assertTrue("Serialized text error" + result, result.indexOf("1930110111") > 0);
-        assertFalse("Element expansion when serializing", element.isExpanded());
     }
 }