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/02/18 09:13:36 UTC

svn commit: r1731015 - in /webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl: common/ common/builder/ common/serializer/push/ common/serializer/push/sax/ common/serializer/push/stax/ mixin/ stream/ stream/stax/

Author: veithen
Date: Thu Feb 18 08:13:36 2016
New Revision: 1731015

URL: http://svn.apache.org/viewvc?rev=1731015&view=rev
Log:
Simplify OMDataSource serialization and promote code reuse.

Removed:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/ContentHandlerXMLStreamWriter.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXExceptionWrapper.java
Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java Thu Feb 18 08:13:36 2016
@@ -20,14 +20,12 @@ package org.apache.axiom.om.impl.common;
 
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
-import org.apache.axiom.om.impl.stream.StreamException;
 import org.apache.axiom.om.impl.stream.XmlHandler;
 
 public final  class SAXResultContentHandler implements XmlHandler {
@@ -119,11 +117,4 @@ public final  class SAXResultContentHand
             throw new UnsupportedOperationException();
         }
     }
-
-    @Override
-    public void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource)
-            throws StreamException {
-        // TODO
-        throw new UnsupportedOperationException();
-    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java Thu Feb 18 08:13:36 2016
@@ -30,8 +30,6 @@ import org.apache.axiom.core.Builder;
 import org.apache.axiom.core.CoreNode;
 import org.apache.axiom.core.CoreParentNode;
 import org.apache.axiom.core.NodeFactory;
-import org.apache.axiom.om.OMDataSource;
-import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.om.impl.common.OMNamespaceImpl;
@@ -268,20 +266,4 @@ public final class BuilderHandler implem
         target = null;
         done = true;
     }
-
-    @Override
-    public void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource) throws StreamException {
-        Class<? extends AxiomElement> elementType = model.determineElementType(target, depth+1, namespaceURI, localName);
-        Class<? extends AxiomSourcedElement> sourcedElementType;
-        if (elementType == AxiomElement.class) {
-            sourcedElementType = AxiomSourcedElement.class;
-        } else if (AxiomSourcedElement.class.isAssignableFrom(elementType)) {
-            sourcedElementType = elementType.asSubclass(AxiomSourcedElement.class);
-        } else {
-            throw new OMException("Cannot build an OMSourcedElement where a " + elementType.getName() + " is expected");
-        }
-        AxiomSourcedElement element = nodeFactory.createNode(sourcedElementType);
-        element.init(localName, new OMNamespaceImpl(namespaceURI, null), dataSource);
-        addChild(element);
-    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java Thu Feb 18 08:13:36 2016
@@ -19,20 +19,15 @@
 package org.apache.axiom.om.impl.common.serializer.push;
 
 import javax.activation.DataHandler;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.axiom.core.CoreElement;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.om.DeferredParsingException;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMSerializable;
-import org.apache.axiom.om.impl.common.builder.StAXHelper;
-import org.apache.axiom.om.impl.common.util.OMDataSourceUtil;
 import org.apache.axiom.om.impl.intf.TextContent;
 import org.apache.axiom.om.impl.stream.StreamException;
 import org.apache.axiom.om.impl.stream.XmlHandler;
@@ -77,44 +72,6 @@ public abstract class SerializerImpl imp
         return handler;
     }
 
-    /**
-     * Serialize the given data source.
-     * 
-     * @param dataSource
-     *            the data source to serialize
-     * @throws StreamException
-     *             if an error occurs while writing the data
-     * @throws DeferredParsingException
-     *             if an error occurs while reading from the data source
-     */
-    public final void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource) throws StreamException {
-        // Note: if we can't determine the type (push/pull) of the OMDataSource, we
-        // default to push
-        if (OMDataSourceUtil.isPullDataSource(dataSource)) {
-            try {
-                XMLStreamReader reader = dataSource.getReader();
-                StAXHelper helper = new StAXHelper(reader, this);
-                while (helper.lookahead() != XMLStreamReader.START_ELEMENT) {
-                    helper.parserNext();
-                }
-                int depth = 0;
-                do {
-                    switch (helper.next()) {
-                        case XMLStreamReader.START_ELEMENT: depth++; break;
-                        case XMLStreamReader.END_ELEMENT: depth--; break;
-                    }
-                } while (depth > 0);
-                reader.close();
-            } catch (XMLStreamException ex) {
-                // XMLStreamExceptions occurring while _writing_ are wrapped in an OutputException.
-                // Therefore, if we get here, there must have been a problem while _reading_.
-                throw new DeferredParsingException(ex);
-            }
-        } else {
-            serializePushOMDataSource(dataSource);
-        }
-    }
-    
     public final void processCharacterData(Object data, boolean ignorable) throws StreamException {
         if (data instanceof TextContent) {
             TextContent textContent = (TextContent)data;
@@ -208,20 +165,5 @@ public abstract class SerializerImpl imp
 
     protected abstract void writeDataHandler(DataHandlerProvider dataHandlerProvider, String contentID, boolean optimize) throws StreamException;
 
-    /**
-     * Serialize the given data source using {@link OMDataSource#serialize(XMLStreamWriter)}. The
-     * implementation must construct an appropriate {@link XMLStreamWriter} instance to pass to that
-     * method and wrap any {@link XMLStreamException} that may be thrown in an
-     * {@link StreamException} or {@link DeferredParsingException}.
-     * 
-     * @param dataSource
-     *            the data source to serialize
-     * @throws StreamException
-     *             if an error occurs while writing the data
-     * @throws DeferredParsingException
-     *             if an error occurs while reading from the data source
-     */
-    protected abstract void serializePushOMDataSource(OMDataSource dataSource) throws StreamException;
-    
     public abstract void endDocument() throws StreamException;
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java Thu Feb 18 08:13:36 2016
@@ -21,11 +21,8 @@ package org.apache.axiom.om.impl.common.
 import java.io.IOException;
 
 import javax.activation.DataHandler;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.impl.common.serializer.push.SerializerImpl;
 import org.apache.axiom.om.impl.stream.StreamException;
@@ -192,25 +189,9 @@ public class SAXSerializer extends Seria
 
     public void writeDataHandler(DataHandlerProvider dataHandlerProvider, String contentID,
             boolean optimize) throws StreamException {
-        // TODO
-        throw new UnsupportedOperationException();
-    }
-
-    protected void serializePushOMDataSource(OMDataSource dataSource) throws StreamException {
         try {
-            XMLStreamWriter writer = new ContentHandlerXMLStreamWriter(helper, contentHandler, lexicalHandler, nsContext);
-            if (startDocumentWritten) {
-                dataSource.serialize(writer);
-            } else {
-                contentHandler.startDocument();
-                dataSource.serialize(writer);
-                contentHandler.endDocument();
-            }
-        } catch (SAXException ex) {
-            throw new StreamException(ex);
-        } catch (SAXExceptionWrapper ex) {
-            throw new StreamException(ex.getCause());
-        } catch (XMLStreamException ex) {
+            writeDataHandler(dataHandlerProvider.getDataHandler(), contentID, optimize);
+        } catch (IOException ex) {
             throw new StreamException(ex);
         }
     }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java Thu Feb 18 08:13:36 2016
@@ -22,7 +22,6 @@ import java.io.IOException;
 
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
-import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMSerializable;
@@ -52,15 +51,8 @@ public class StAXSerializer extends Seri
         return buildHandler(root, true, false);
     }
     
-    protected void serializePushOMDataSource(OMDataSource dataSource) throws StreamException {
-        try {
-            dataSource.serialize(writer);
-        } catch (XMLStreamException ex) {
-            // We cannot really differentiate between exceptions thrown by the XMLStreamWriter
-            // and exceptions thrown by the data source itself. We wrap all XMLStreamExceptions
-            // as OutputExceptions.
-            throw new StreamException(ex);
-        }
+    public XMLStreamWriter getWriter() {
+        return writer;
     }
 
     @Override

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj Thu Feb 18 08:13:36 2016
@@ -22,6 +22,7 @@ import org.apache.axiom.core.Builder;
 import org.apache.axiom.core.ClonePolicy;
 import org.apache.axiom.core.CoreElement;
 import org.apache.axiom.core.CoreNode;
+import org.apache.axiom.om.DeferredParsingException;
 import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMDataSourceExt;
@@ -36,11 +37,14 @@ import org.apache.axiom.om.impl.common.O
 import org.apache.axiom.om.impl.common.builder.PlainXMLModel;
 import org.apache.axiom.om.impl.common.builder.PushBuilder;
 import org.apache.axiom.om.impl.common.builder.PushOMDataSourceInput;
+import org.apache.axiom.om.impl.common.builder.StAXHelper;
 import org.apache.axiom.om.impl.common.builder.StAXOMBuilder;
+import org.apache.axiom.om.impl.common.serializer.push.stax.StAXSerializer;
 import org.apache.axiom.om.impl.common.util.OMDataSourceUtil;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
 import org.apache.axiom.om.impl.stream.StreamException;
 import org.apache.axiom.om.impl.stream.XmlHandler;
+import org.apache.axiom.om.impl.stream.XmlHandlerWrapper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -411,9 +415,43 @@ public aspect AxiomSourcedElementSupport
         } else if (cache&& OMDataSourceUtil.isDestructiveWrite(dataSource)) {
             forceExpand();
             defaultInternalSerialize(handler, format, true);
+        // Note: if we can't determine the type (push/pull) of the OMDataSource, we
+        // default to push
+        // TODO: the serializer ignores namespaceURI and localName
+        } else if (OMDataSourceUtil.isPullDataSource(dataSource)) {
+            try {
+                XMLStreamReader reader = dataSource.getReader();
+                StAXHelper helper = new StAXHelper(reader, handler);
+                while (helper.lookahead() != XMLStreamReader.START_ELEMENT) {
+                    helper.parserNext();
+                }
+                int depth = 0;
+                do {
+                    switch (helper.next()) {
+                        case XMLStreamReader.START_ELEMENT: depth++; break;
+                        case XMLStreamReader.END_ELEMENT: depth--; break;
+                    }
+                } while (depth > 0);
+                reader.close();
+            } catch (XMLStreamException ex) {
+                // XMLStreamExceptions occurring while _writing_ are wrapped in an OutputException.
+                // Therefore, if we get here, there must have been a problem while _reading_.
+                throw new DeferredParsingException(ex);
+            }
         } else {
-            // TODO: the serializer ignores namespaceURI and localName
-            handler.processOMDataSource(null, null, dataSource);
+            XmlHandler unwrappedHandler = handler;
+            while (unwrappedHandler instanceof XmlHandlerWrapper) {
+                unwrappedHandler = ((XmlHandlerWrapper)unwrappedHandler).getParent();
+            }
+            if (unwrappedHandler instanceof StAXSerializer) {
+                try {
+                    dataSource.serialize(((StAXSerializer)unwrappedHandler).getWriter());
+                } catch (XMLStreamException ex) {
+                    throw new StreamException(ex);
+                }
+            } else {
+                new PushOMDataSourceInput(this, dataSource).createReader(handler).proceed();
+            }
         }
     }
 

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java Thu Feb 18 08:13:36 2016
@@ -18,8 +18,6 @@
  */
 package org.apache.axiom.om.impl.stream;
 
-import org.apache.axiom.om.OMDataSource;
-
 public interface XmlHandler {
     void startDocument(String inputEncoding, String xmlVersion, String xmlEncoding, boolean standalone) throws StreamException;
     
@@ -47,6 +45,4 @@ public interface XmlHandler {
     void processCDATASection(String content) throws StreamException;
     
     void processEntityReference(String name, String replacementText) throws StreamException;
-    
-    void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource) throws StreamException;
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java Thu Feb 18 08:13:36 2016
@@ -18,8 +18,6 @@
  */
 package org.apache.axiom.om.impl.stream;
 
-import org.apache.axiom.om.OMDataSource;
-
 public class XmlHandlerWrapper implements XmlHandler {
     private final XmlHandler parent;
 
@@ -27,6 +25,10 @@ public class XmlHandlerWrapper implement
         this.parent = parent;
     }
 
+    public final XmlHandler getParent() {
+        return parent;
+    }
+
     public void startDocument(String inputEncoding, String xmlVersion, String xmlEncoding,
             boolean standalone) throws StreamException {
         parent.startDocument(inputEncoding, xmlVersion, xmlEncoding, standalone);
@@ -84,9 +86,4 @@ public class XmlHandlerWrapper implement
     public void processEntityReference(String name, String replacementText) throws StreamException {
         parent.processEntityReference(name, replacementText);
     }
-
-    public void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource)
-            throws StreamException {
-        parent.processOMDataSource(namespaceURI, localName, dataSource);
-    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java?rev=1731015&r1=1731014&r2=1731015&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java Thu Feb 18 08:13:36 2016
@@ -97,6 +97,7 @@ public class XmlHandlerStreamWriter exte
     }
 
     protected void doWriteStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
+        finishStartElement();
         try {
             handler.startElement(normalize(namespaceURI), localName, normalize(prefix));
         } catch (StreamException ex) {
@@ -110,6 +111,7 @@ public class XmlHandlerStreamWriter exte
     }
 
     protected void doWriteEndElement() throws XMLStreamException {
+        finishStartElement();
         try {
             handler.endElement();
         } catch (StreamException ex) {