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 2016/04/18 21:56:32 UTC

svn commit: r1739812 - in /webservices/axiom/trunk/testing/xml-truth/src: main/java/org/apache/axiom/truth/xml/ site/markdown/ test/java/org/apache/axiom/truth/xml/

Author: veithen
Date: Mon Apr 18 19:56:32 2016
New Revision: 1739812

URL: http://svn.apache.org/viewvc?rev=1739812&view=rev
Log:
Add support for XMLStreamReader objects to xml-truth.

Added:
    webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/Parsable.java   (with props)
    webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLStreamReaderProvider.java   (with props)
    webservices/axiom/trunk/testing/xml-truth/src/test/java/org/apache/axiom/truth/xml/StAXTraverserTest.java   (with props)
Modified:
    webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java
    webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java
    webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLTruth.java
    webservices/axiom/trunk/testing/xml-truth/src/site/markdown/index.md.vm

Added: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/Parsable.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/Parsable.java?rev=1739812&view=auto
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/Parsable.java (added)
+++ webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/Parsable.java Mon Apr 18 19:56:32 2016
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.truth.xml;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import com.ctc.wstx.api.WstxInputProperties;
+import com.ctc.wstx.stax.WstxInputFactory;
+
+abstract class Parsable extends XMLStreamReaderProvider {
+
+    @Override
+    final XMLStreamReader getXMLStreamReader(boolean expandEntityReferences) throws XMLStreamException {
+        WstxInputFactory factory = new WstxInputFactory();
+        factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.valueOf(expandEntityReferences));
+        factory.setProperty(WstxInputFactory.P_AUTO_CLOSE_INPUT, Boolean.TRUE);
+        factory.setProperty(WstxInputFactory.P_REPORT_PROLOG_WHITESPACE, Boolean.TRUE);
+        factory.setProperty(WstxInputFactory.P_REPORT_CDATA, Boolean.TRUE);
+        factory.setProperty(WstxInputProperties.P_MIN_TEXT_SEGMENT, Integer.MAX_VALUE);
+        return createXMLStreamReader(factory);
+    }
+    
+    abstract XMLStreamReader createXMLStreamReader(XMLInputFactory factory) throws XMLStreamException;
+}

Propchange: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/Parsable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java?rev=1739812&r1=1739811&r2=1739812&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java (original)
+++ webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java Mon Apr 18 19:56:32 2016
@@ -34,41 +34,67 @@ import com.google.common.base.Strings;
 
 final class StAXTraverser implements Traverser {
     private final XMLStreamReader reader;
+    private int depth;
+    private boolean atStart;
 
     StAXTraverser(XMLStreamReader reader) {
         this.reader = reader;
+        switch (reader.getEventType()) {
+            case XMLStreamReader.START_DOCUMENT:
+                depth = -1;
+                break;
+            case XMLStreamReader.START_ELEMENT:
+                depth = 0;
+                atStart = true;
+                break;
+            default:
+                throw new IllegalStateException("The reader must be positioned at a START_DOCUMENT or START_ELEMENT event");
+        }
     }
     
     @Override
     public Event next() throws TraverserException {
         try {
-            if (reader.hasNext()) {
-                switch (reader.next()) {
-                    case XMLStreamReader.DTD:
-                        return Event.DOCUMENT_TYPE;
-                    case XMLStreamReader.START_ELEMENT:
-                        return Event.START_ELEMENT;
-                    case XMLStreamReader.END_ELEMENT:
-                        return Event.END_ELEMENT;
-                    case XMLStreamReader.CHARACTERS:
-                        return Event.TEXT;
-                    case XMLStreamReader.SPACE:
-                        return Event.WHITESPACE;
-                    case XMLStreamReader.ENTITY_REFERENCE:
-                        return Event.ENTITY_REFERENCE;
-                    case XMLStreamReader.COMMENT:
-                        return Event.COMMENT;
-                    case XMLStreamReader.CDATA:
-                        return Event.CDATA_SECTION;
-                    case XMLStreamReader.PROCESSING_INSTRUCTION:
-                        return Event.PROCESSING_INSTRUCTION;
-                    case XMLStreamReader.END_DOCUMENT:
-                        return null;
-                    default:
-                        throw new IllegalStateException();
+            int event;
+            if (depth == 0) {
+                if (atStart) {
+                    atStart = false;
+                    event = XMLStreamReader.START_ELEMENT;
+                } else {
+                    event = XMLStreamReader.END_DOCUMENT;
                 }
             } else {
-                return null;
+                event = reader.hasNext() ? reader.next() : XMLStreamReader.END_DOCUMENT;
+            }
+            switch (event) {
+                case XMLStreamReader.DTD:
+                    return Event.DOCUMENT_TYPE;
+                case XMLStreamReader.START_ELEMENT:
+                    if (depth != -1) {
+                        depth++;
+                    }
+                    return Event.START_ELEMENT;
+                case XMLStreamReader.END_ELEMENT:
+                    if (depth != -1) {
+                        depth--;
+                    }
+                    return Event.END_ELEMENT;
+                case XMLStreamReader.CHARACTERS:
+                    return Event.TEXT;
+                case XMLStreamReader.SPACE:
+                    return Event.WHITESPACE;
+                case XMLStreamReader.ENTITY_REFERENCE:
+                    return Event.ENTITY_REFERENCE;
+                case XMLStreamReader.COMMENT:
+                    return Event.COMMENT;
+                case XMLStreamReader.CDATA:
+                    return Event.CDATA_SECTION;
+                case XMLStreamReader.PROCESSING_INSTRUCTION:
+                    return Event.PROCESSING_INSTRUCTION;
+                case XMLStreamReader.END_DOCUMENT:
+                    return null;
+                default:
+                    throw new IllegalStateException();
             }
         } catch (XMLStreamException ex) {
             throw new TraverserException(ex);

Modified: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java?rev=1739812&r1=1739811&r2=1739812&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java (original)
+++ webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXXML.java Mon Apr 18 19:56:32 2016
@@ -18,37 +18,30 @@
  */
 package org.apache.axiom.truth.xml;
 
-import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
 
 import org.apache.axiom.truth.xml.spi.Traverser;
 import org.apache.axiom.truth.xml.spi.TraverserException;
 import org.apache.axiom.truth.xml.spi.XML;
 
-import com.ctc.wstx.api.WstxInputProperties;
-import com.ctc.wstx.stax.WstxInputFactory;
+final class StAXXML implements XML {
+    private XMLStreamReaderProvider xmlStreamReaderProvider;
+    
+    StAXXML(XMLStreamReaderProvider xmlStreamReaderProvider) {
+        this.xmlStreamReaderProvider = xmlStreamReaderProvider;
+    }
 
-abstract class StAXXML implements XML {
     @Override
     public boolean isReportingElementContentWhitespace() {
         return true;
     }
 
     @Override
-    public final Traverser createTraverser(boolean expandEntityReferences) throws TraverserException {
-        WstxInputFactory factory = new WstxInputFactory();
-        factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.valueOf(expandEntityReferences));
-        factory.setProperty(WstxInputFactory.P_AUTO_CLOSE_INPUT, Boolean.TRUE);
-        factory.setProperty(WstxInputFactory.P_REPORT_PROLOG_WHITESPACE, Boolean.TRUE);
-        factory.setProperty(WstxInputFactory.P_REPORT_CDATA, Boolean.TRUE);
-        factory.setProperty(WstxInputProperties.P_MIN_TEXT_SEGMENT, Integer.MAX_VALUE);
+    public Traverser createTraverser(boolean expandEntityReferences) throws TraverserException {
         try {
-            return new StAXTraverser(createXMLStreamReader(factory));
+            return new StAXTraverser(xmlStreamReaderProvider.getXMLStreamReader(expandEntityReferences));
         } catch (XMLStreamException ex) {
             throw new TraverserException(ex);
         }
     }
-    
-    abstract XMLStreamReader createXMLStreamReader(XMLInputFactory factory) throws XMLStreamException;
 }

Added: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLStreamReaderProvider.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLStreamReaderProvider.java?rev=1739812&view=auto
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLStreamReaderProvider.java (added)
+++ webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLStreamReaderProvider.java Mon Apr 18 19:56:32 2016
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.truth.xml;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+abstract class XMLStreamReaderProvider {
+    abstract XMLStreamReader getXMLStreamReader(boolean expandEntityReferences) throws XMLStreamException;
+}

Propchange: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLStreamReaderProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLTruth.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLTruth.java?rev=1739812&r1=1739811&r2=1739812&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLTruth.java (original)
+++ webservices/axiom/trunk/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLTruth.java Mon Apr 18 19:56:32 2016
@@ -78,12 +78,12 @@ public final class XMLTruth {
 
             @Override
             public XML createXML(final InputStream in) {
-                return new StAXXML() {
+                return new StAXXML(new Parsable() {
                     @Override
                     XMLStreamReader createXMLStreamReader(XMLInputFactory factory) throws XMLStreamException {
                         return factory.createXMLStreamReader(in);
                     }
-                };
+                });
             }
         });
         factories.add(new XMLFactory<Reader>() {
@@ -94,12 +94,12 @@ public final class XMLTruth {
 
             @Override
             public XML createXML(final Reader reader) {
-                return new StAXXML() {
+                return new StAXXML(new Parsable() {
                     @Override
                     XMLStreamReader createXMLStreamReader(XMLInputFactory factory) throws XMLStreamException {
                         return factory.createXMLStreamReader(reader);
                     }
-                };
+                });
             }
         });
         factories.add(new XMLFactory<StreamSource>() {
@@ -110,12 +110,12 @@ public final class XMLTruth {
 
             @Override
             public XML createXML(final StreamSource source) {
-                return new StAXXML() {
+                return new StAXXML(new Parsable() {
                     @Override
                     XMLStreamReader createXMLStreamReader(XMLInputFactory factory) throws XMLStreamException {
                         return factory.createXMLStreamReader(source);
                     }
-                };
+                });
             }
         });
         factories.add(new XMLFactory<InputSource>() {
@@ -189,6 +189,25 @@ public final class XMLTruth {
                 return new DOMXML(element);
             }
         });
+        factories.add(new XMLFactory<XMLStreamReader>() {
+            @Override
+            public Class<XMLStreamReader> getExpectedType() {
+                return XMLStreamReader.class;
+            }
+
+            @Override
+            public XML createXML(final XMLStreamReader source) {
+                return new StAXXML(new XMLStreamReaderProvider() {
+                    @Override
+                    XMLStreamReader getXMLStreamReader(boolean expandEntityReferences) throws XMLStreamException {
+                        if (expandEntityReferences) {
+                            throw new UnsupportedOperationException("Can't expand entity references on a user supplied XMLStreamReader");
+                        }
+                        return source;
+                    }
+                });
+            }
+        });
         for (XMLFactory<?> factory : ServiceLoader.load(
                 XMLFactory.class, XMLTruth.class.getClassLoader())) {
             factories.add(factory);
@@ -235,7 +254,7 @@ public final class XMLTruth {
             }
         }
         if (factory == null) {
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("No XMLFactory found for type " + object.getClass().getName());
         } else {
             return createXML0(factory, object);
         }

Modified: webservices/axiom/trunk/testing/xml-truth/src/site/markdown/index.md.vm
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/site/markdown/index.md.vm?rev=1739812&r1=1739811&r2=1739812&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/site/markdown/index.md.vm (original)
+++ webservices/axiom/trunk/testing/xml-truth/src/site/markdown/index.md.vm Mon Apr 18 19:56:32 2016
@@ -42,6 +42,8 @@ supported:
 
 *   `java.net.URL`
 
+*   `javax.xml.stream.XMLStreamReader`
+
 By default, comparison is strict. E.g. the following assertion would fail:
 
     assertAbout(xml()).that("<p:a xmlns:p='urn:ns'/>").hasSameContentAs("<a xmlns='urn:ns'/>");

Added: webservices/axiom/trunk/testing/xml-truth/src/test/java/org/apache/axiom/truth/xml/StAXTraverserTest.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/xml-truth/src/test/java/org/apache/axiom/truth/xml/StAXTraverserTest.java?rev=1739812&view=auto
==============================================================================
--- webservices/axiom/trunk/testing/xml-truth/src/test/java/org/apache/axiom/truth/xml/StAXTraverserTest.java (added)
+++ webservices/axiom/trunk/testing/xml-truth/src/test/java/org/apache/axiom/truth/xml/StAXTraverserTest.java Mon Apr 18 19:56:32 2016
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.truth.xml;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.io.StringReader;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.truth.xml.spi.Event;
+import org.apache.axiom.truth.xml.spi.Traverser;
+import org.junit.Test;
+
+public class StAXTraverserTest {
+    @Test
+    public void testFragment() throws Exception {
+        XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(
+                new StringReader("<root><a><b/></a></root>"));
+        reader.next();
+        reader.next();
+        Traverser t = new StAXTraverser(reader);
+        assertThat(t.next()).isEqualTo(Event.START_ELEMENT);
+        assertThat(t.getQName()).isEqualTo(new QName("a"));
+        assertThat(t.next()).isEqualTo(Event.START_ELEMENT);
+        assertThat(t.getQName()).isEqualTo(new QName("b"));
+        assertThat(t.next()).isEqualTo(Event.END_ELEMENT);
+        assertThat(t.next()).isEqualTo(Event.END_ELEMENT);
+        assertThat(t.next()).isNull();
+    }
+}

Propchange: webservices/axiom/trunk/testing/xml-truth/src/test/java/org/apache/axiom/truth/xml/StAXTraverserTest.java
------------------------------------------------------------------------------
    svn:eol-style = native