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 2013/05/18 21:13:43 UTC

svn commit: r1484163 - in /webservices/axiom/trunk/modules: axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ axiom-testsuite/src/main/java/org/apache/axiom/ts/om/ axiom-testsuite/src/main/java/org/apache/axiom/ts/om/docu...

Author: veithen
Date: Sat May 18 19:13:42 2013
New Revision: 1484163

URL: http://svn.apache.org/r1484163
Log:
Correctly handle the CharacterDataReader extension in PullSerializer.

Added:
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/NullCharacterDataReader.java   (with props)
    webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/document/sr/TestCharacterDataReaderFromParser.java   (with props)
Modified:
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/EndDocumentState.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/Navigator.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java
    webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.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/AbstractWrapper.java?rev=1484163&r1=1484162&r2=1484163&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java Sat May 18 19:13:42 2013
@@ -18,11 +18,15 @@
  */
 package org.apache.axiom.om.impl.common.serializer.pull;
 
+import java.io.IOException;
+import java.io.Writer;
+
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.ext.stax.CharacterDataReader;
 import org.apache.axiom.ext.stax.DTDReader;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.OMDataSource;
@@ -32,7 +36,7 @@ import org.apache.axiom.util.stax.XMLStr
  * Base class for {@link PullSerializerState} implementations that wrap an {@link XMLStreamReader}.
  */
 //TODO: what about the close() method?
-abstract class AbstractWrapper extends PullSerializerState {
+abstract class AbstractWrapper extends PullSerializerState implements CharacterDataReader {
     protected final XMLStreamReader reader;
     private final PullSerializer serializer;
     private int depth;
@@ -49,6 +53,12 @@ abstract class AbstractWrapper extends P
      */
     private DataHandlerReader dataHandlerReader;
 
+    /**
+     * The {@link CharacterDataReader} extension of the reader, or <code>null</code> if the extension
+     * has not yet been retrieved.
+     */
+    private CharacterDataReader characterDataReader;
+
     AbstractWrapper(PullSerializer serializer, XMLStreamReader reader, int startDepth) {
         this.reader = reader;
         this.serializer = serializer;
@@ -79,6 +89,24 @@ abstract class AbstractWrapper extends P
         return dataHandlerReader;
     }
 
+    final CharacterDataReader getCharacterDataReader() {
+        if (characterDataReader == null) {
+            try {
+                characterDataReader = (CharacterDataReader)reader.getProperty(CharacterDataReader.PROPERTY);
+            } catch (IllegalArgumentException ex) {
+                // Continue
+            }
+            if (characterDataReader == null) {
+                characterDataReader = this;
+            }
+        }
+        return characterDataReader;
+    }
+
+    public final void writeTextTo(Writer writer) throws XMLStreamException, IOException {
+        writer.write(reader.getText());
+    }
+
     final int getEventType() {
         return reader.getEventType();
     }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.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/ClosedState.java?rev=1484163&r1=1484162&r2=1484163&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java Sat May 18 19:13:42 2013
@@ -22,6 +22,7 @@ import javax.xml.namespace.NamespaceCont
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
 
+import org.apache.axiom.ext.stax.CharacterDataReader;
 import org.apache.axiom.ext.stax.DTDReader;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.OMDataSource;
@@ -39,6 +40,10 @@ final class ClosedState extends PullSeri
         return NullDataHandlerReader.INSTANCE;
     }
 
+    CharacterDataReader getCharacterDataReader() {
+        return NullCharacterDataReader.INSTANCE;
+    }
+
     void close() throws XMLStreamException {
         // no-op
     }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/EndDocumentState.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/EndDocumentState.java?rev=1484163&r1=1484162&r2=1484163&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/EndDocumentState.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/EndDocumentState.java Sat May 18 19:13:42 2013
@@ -26,6 +26,7 @@ import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.ext.stax.CharacterDataReader;
 import org.apache.axiom.ext.stax.DTDReader;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.OMDataSource;
@@ -44,6 +45,10 @@ final class EndDocumentState extends Pul
         return NullDataHandlerReader.INSTANCE;
     }
 
+    CharacterDataReader getCharacterDataReader() {
+        return NullCharacterDataReader.INSTANCE;
+    }
+
     int getEventType() {
         return XMLStreamReader.END_DOCUMENT;
     }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/Navigator.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/Navigator.java?rev=1484163&r1=1484162&r2=1484163&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/Navigator.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/Navigator.java Sat May 18 19:13:42 2013
@@ -58,7 +58,6 @@ import org.apache.axiom.om.impl.builder.
 import org.apache.axiom.om.impl.common.IContainer;
 import org.apache.axiom.om.impl.common.OMDataSourceUtil;
 import org.apache.axiom.util.namespace.MapBasedNamespaceContext;
-import org.apache.axiom.util.stax.XMLStreamReaderUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -159,6 +158,10 @@ final class Navigator extends PullSerial
         return this;
     }
 
+    CharacterDataReader getCharacterDataReader() {
+        return this;
+    }
+
     String getPrefix() {
         if ((currentEvent == START_ELEMENT)
                 || (currentEvent == END_ELEMENT)) {
@@ -275,27 +278,23 @@ final class Navigator extends PullSerial
     }
 
     public void writeTextTo(Writer writer) throws XMLStreamException, IOException {
-        if (parser != null) {
-            XMLStreamReaderUtils.writeTextTo(parser, writer);
-        } else {
-            switch (currentEvent) {
-                case CHARACTERS:
-                case CDATA:
-                case SPACE:
-                    OMText text = (OMText)node;
-                    if (text.isCharacters()) {
-                        writer.write(text.getTextCharacters());
-                    } else {
-                        // TODO: we should cover the binary case in an optimized way
-                        writer.write(text.getText());
-                    }
-                    break;
-                case COMMENT:
-                    writer.write(((OMComment)node).getValue());
-                    break;
-                default:
-                    throw new IllegalStateException();
-            }
+        switch (currentEvent) {
+            case CHARACTERS:
+            case CDATA:
+            case SPACE:
+                OMText text = (OMText)node;
+                if (text.isCharacters()) {
+                    writer.write(text.getTextCharacters());
+                } else {
+                    // TODO: we should cover the binary case in an optimized way
+                    writer.write(text.getText());
+                }
+                break;
+            case COMMENT:
+                writer.write(((OMComment)node).getValue());
+                break;
+            default:
+                throw new IllegalStateException();
         }
     }
 
@@ -697,10 +696,6 @@ final class Navigator extends PullSerial
     }
 
     Object getProperty(String s) throws IllegalArgumentException {
-        // TODO: CharacterDataReader extension needs to be handled in PullSerializer
-        if (CharacterDataReader.PROPERTY.equals(s)) {
-            return this;
-        }
         if (parser != null) {
             return parser.getProperty(s);
         }

Added: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/NullCharacterDataReader.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/NullCharacterDataReader.java?rev=1484163&view=auto
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/NullCharacterDataReader.java (added)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/NullCharacterDataReader.java Sat May 18 19:13:42 2013
@@ -0,0 +1,36 @@
+/*
+ * 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.om.impl.common.serializer.pull;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.axiom.ext.stax.CharacterDataReader;
+
+final class NullCharacterDataReader implements CharacterDataReader {
+    static final NullCharacterDataReader INSTANCE = new NullCharacterDataReader();
+    
+    private NullCharacterDataReader() {}
+
+    public void writeTextTo(Writer writer) throws XMLStreamException, IOException {
+        throw new IllegalStateException();
+    }
+}

Propchange: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/NullCharacterDataReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.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/PullSerializer.java?rev=1484163&r1=1484162&r2=1484163&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java Sat May 18 19:13:42 2013
@@ -18,12 +18,16 @@
  */
 package org.apache.axiom.om.impl.common.serializer.pull;
 
+import java.io.IOException;
+import java.io.Writer;
+
 import javax.activation.DataHandler;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.ext.stax.CharacterDataReader;
 import org.apache.axiom.ext.stax.DTDReader;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
@@ -36,7 +40,7 @@ import org.apache.axiom.util.stax.XMLStr
 /**
  * {@link XMLStreamReader} implementation that generates events from a given Axiom tree.
  */
-public final class PullSerializer extends AbstractXMLStreamReader implements DataHandlerReader, DTDReader {
+public final class PullSerializer extends AbstractXMLStreamReader implements DataHandlerReader, DTDReader, CharacterDataReader {
     /**
      * The current state of the serializer.
      */
@@ -142,7 +146,7 @@ public final class PullSerializer extend
         Object value = XMLStreamReaderUtils.processGetProperty(this, name);
         if (value != null) {
             return value;
-        } else if (DTDReader.PROPERTY.equals(name)) {
+        } else if (DTDReader.PROPERTY.equals(name) || CharacterDataReader.PROPERTY.equals(name)) {
             return this;
         } else {
             return state.getProperty(name);
@@ -314,4 +318,8 @@ public final class PullSerializer extend
     public String getSystemId() {
         return state.getDTDReader().getSystemId();
     }
+
+    public void writeTextTo(Writer writer) throws XMLStreamException, IOException {
+        state.getCharacterDataReader().writeTextTo(writer);
+    }
 }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.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/PullSerializerState.java?rev=1484163&r1=1484162&r2=1484163&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java Sat May 18 19:13:42 2013
@@ -24,6 +24,7 @@ import javax.xml.stream.XMLStreamConstan
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.ext.stax.CharacterDataReader;
 import org.apache.axiom.ext.stax.DTDReader;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.OMDataSource;
@@ -60,6 +61,13 @@ abstract class PullSerializerState {
      */
     abstract DataHandlerReader getDataHandlerReader();
     
+    /**
+     * Get the {@link CharacterDataReader} extension.
+     * 
+     * @return the {@link CharacterDataReader} extension; must not be <code>null</code>
+     */
+    abstract CharacterDataReader getCharacterDataReader();
+    
     abstract int getEventType();
 
     abstract boolean hasNext() throws XMLStreamException;

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=1484163&r1=1484162&r2=1484163&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 Sat May 18 19:13:42 2013
@@ -159,6 +159,8 @@ public class OMTestSuiteBuilder extends 
         addTest(new org.apache.axiom.ts.om.document.TestSetOMDocumentElementNew(metaFactory));
         addTest(new org.apache.axiom.ts.om.document.TestSetOMDocumentElementNull(metaFactory));
         addTest(new org.apache.axiom.ts.om.document.TestSetOMDocumentElementReplace(metaFactory));
+        addTest(new org.apache.axiom.ts.om.document.sr.TestCharacterDataReaderFromParser(metaFactory, true));
+        addTest(new org.apache.axiom.ts.om.document.sr.TestCharacterDataReaderFromParser(metaFactory, false));
         addTest(new org.apache.axiom.ts.om.document.sr.TestDTDReader(metaFactory));
         addTest(new org.apache.axiom.ts.om.document.sr.TestDTDReaderFromParser(metaFactory, false, true));
         addTest(new org.apache.axiom.ts.om.document.sr.TestDTDReaderFromParser(metaFactory, true, true));

Added: webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/document/sr/TestCharacterDataReaderFromParser.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/document/sr/TestCharacterDataReaderFromParser.java?rev=1484163&view=auto
==============================================================================
--- webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/document/sr/TestCharacterDataReaderFromParser.java (added)
+++ webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/document/sr/TestCharacterDataReaderFromParser.java Sat May 18 19:13:42 2013
@@ -0,0 +1,60 @@
+/*
+ * 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.ts.om.document.sr;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.ext.stax.CharacterDataReader;
+import org.apache.axiom.ext.stax.DTDReader;
+import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMDocument;
+import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.OMXMLBuilderFactory;
+import org.apache.axiom.ts.AxiomTestCase;
+
+/**
+ * Tests that the {@link CharacterDataReader} returned by {@link OMContainer#getXMLStreamReader()} for
+ * an OM tree created by a builder correctly implements the {@link DTDReader} extension.
+ */
+public class TestCharacterDataReaderFromParser extends AxiomTestCase {
+    private final boolean cache;
+    
+    public TestCharacterDataReaderFromParser(OMMetaFactory metaFactory, boolean cache) {
+        super(metaFactory);
+        this.cache = cache;
+        addTestParameter("cache", cache);
+    }
+
+    protected void runTest() throws Throwable {
+        String text = "This is a test for the CharacterDataReader extension";
+        OMDocument doc = OMXMLBuilderFactory.createOMBuilder(metaFactory.getOMFactory(), new StringReader("<root>" + text + "</root>")).getDocument();
+        XMLStreamReader reader = doc.getXMLStreamReader(cache);
+        CharacterDataReader cdataReader = (CharacterDataReader)reader.getProperty(CharacterDataReader.PROPERTY);
+        assertNotNull(cdataReader);
+        assertEquals(XMLStreamReader.START_ELEMENT, reader.next());
+        StringWriter sw = new StringWriter();
+        while (reader.next() == XMLStreamReader.CHARACTERS) {
+            cdataReader.writeTextTo(sw);
+        }
+        assertEquals(text, sw.toString());
+    }
+}

Propchange: webservices/axiom/trunk/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/document/sr/TestCharacterDataReaderFromParser.java
------------------------------------------------------------------------------
    svn:eol-style = native