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/05/15 13:23:29 UTC

svn commit: r1743903 - in /webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream: ds/ stax/ xop/

Author: veithen
Date: Sun May 15 13:23:28 2016
New Revision: 1743903

URL: http://svn.apache.org/viewvc?rev=1743903&view=rev
Log:
Reimplement the XOP encoder using the internal stream API.

Added:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java
      - copied, changed from r1742842, webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPConstants.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java   (with props)
Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceReader.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/MTOMXMLStreamWriterImpl.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/XmlHandlerStreamWriter.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceReader.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceReader.java?rev=1743903&r1=1743902&r2=1743903&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceReader.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceReader.java Sun May 15 13:23:28 2016
@@ -47,7 +47,7 @@ final class PushOMDataSourceReader imple
     @Override
     public boolean proceed() throws StreamException {
         try {
-            XMLStreamWriter writer = new XmlHandlerStreamWriter(handler);
+            XMLStreamWriter writer = new XmlHandlerStreamWriter(handler, null);
             // Seed the namespace context with the namespace context from the parent
             OMContainer parent = root.getParent();
             if (parent instanceof OMElement) {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/MTOMXMLStreamWriterImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/MTOMXMLStreamWriterImpl.java?rev=1743903&r1=1743902&r2=1743903&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/MTOMXMLStreamWriterImpl.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/stax/MTOMXMLStreamWriterImpl.java Sun May 15 13:23:28 2016
@@ -31,6 +31,7 @@ import javax.xml.stream.XMLStreamExcepti
 import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.axiom.attachments.lifecycle.DataHandlerExt;
+import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.serializer.SerializerXmlHandler;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
@@ -39,13 +40,13 @@ import org.apache.axiom.om.OMOutputForma
 import org.apache.axiom.om.OMText;
 import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
 import org.apache.axiom.om.impl.OMMultipartWriter;
+import org.apache.axiom.om.impl.stream.xop.XOPEncodingFilterHandler;
 import org.apache.axiom.om.util.CommonUtils;
 import org.apache.axiom.om.util.XMLStreamWriterFilter;
 import org.apache.axiom.util.io.IOUtils;
 import org.apache.axiom.util.stax.XMLStreamWriterUtils;
 import org.apache.axiom.util.stax.xop.ContentIDGenerator;
 import org.apache.axiom.util.stax.xop.OptimizationPolicy;
-import org.apache.axiom.util.stax.xop.XOPEncodingStreamWriter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -79,6 +80,7 @@ public class MTOMXMLStreamWriterImpl ext
     private OMOutputFormat format;
     private final OptimizationPolicy optimizationPolicy;
     private final boolean preserveAttachments;
+    private final XOPEncodingFilterHandler encoder;
     
     // State variables
     private boolean isEndDocument = false; // has endElement been called
@@ -98,6 +100,7 @@ public class MTOMXMLStreamWriterImpl ext
         preserveAttachments = true;
         multipartWriter = null;
         rootPartOutputStream = null;
+        encoder = null;
     }
 
     public MTOMXMLStreamWriterImpl(XMLStreamWriter xmlWriter) {
@@ -156,18 +159,24 @@ public class MTOMXMLStreamWriterImpl ext
             rootPartOutputStream = outStream;
         }
         
-        xmlWriter = new XmlHandlerStreamWriter(new SerializerXmlHandler(rootPartOutputStream, encoding));
-
+        SerializerXmlHandler serializer = new SerializerXmlHandler(rootPartOutputStream, encoding);
+        XmlHandler handler;
+        
         if (format.isOptimized()) {
             ContentIDGenerator contentIDGenerator = new ContentIDGenerator() {
                 public String generateContentID(String existingContentID) {
                     return existingContentID != null ? existingContentID : getNextContentId();
                 }
             };
-            xmlWriter = new XOPEncodingStreamWriter(xmlWriter,
-                    contentIDGenerator, optimizationPolicy);
+            encoder = new XOPEncodingFilterHandler(serializer, contentIDGenerator, optimizationPolicy);
+            handler = encoder;
+        } else {
+            encoder = null;
+            handler = serializer;
         }
         
+        xmlWriter = new XmlHandlerStreamWriter(handler, serializer);
+
         xmlStreamWriterFilter = format.getXmlStreamWriterFilter();
         if (xmlStreamWriterFilter != null) {
             if (log.isDebugEnabled()) {
@@ -241,7 +250,6 @@ public class MTOMXMLStreamWriterImpl ext
             try {
                 rootPartOutputStream.close();
                 // First write the attachments added properly through the DataHandlerWriter extension
-                XOPEncodingStreamWriter encoder = (XOPEncodingStreamWriter)xmlWriter;
                 for (String contentID : encoder.getContentIDs()) {
                     DataHandler dataHandler = encoder.getDataHandler(contentID);
                     if (preserveAttachments || !(dataHandler instanceof DataHandlerExt)) {

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=1743903&r1=1743902&r2=1743903&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 Sun May 15 13:23:28 2016
@@ -35,10 +35,12 @@ import org.apache.axiom.util.stax.Abstra
 
 public class XmlHandlerStreamWriter extends AbstractXMLStreamWriter implements DataHandlerWriter {
     private final XmlHandler handler;
+    private final SerializerXmlHandler serializer;
     private boolean inStartElement;
 
-    public XmlHandlerStreamWriter(XmlHandler handler) {
+    public XmlHandlerStreamWriter(XmlHandler handler, SerializerXmlHandler serializer) {
         this.handler = handler;
+        this.serializer = serializer;
     }
     
     private static String normalize(String s) {
@@ -95,9 +97,9 @@ public class XmlHandlerStreamWriter exte
     }
 
     protected void doWriteDTD(String dtd) throws XMLStreamException {
-        if (handler instanceof SerializerXmlHandler) {
+        if (serializer != null) {
             try {
-                ((SerializerXmlHandler)handler).writeRaw(dtd, UnmappableCharacterHandler.CONVERT_TO_CHARACTER_REFERENCE);
+                serializer.writeRaw(dtd, UnmappableCharacterHandler.CONVERT_TO_CHARACTER_REFERENCE);
             } catch (StreamException ex) {
                 throw toXMLStreamException(ex);
             }
@@ -234,9 +236,9 @@ public class XmlHandlerStreamWriter exte
     }
 
     public void flush() throws XMLStreamException {
-        if (handler instanceof SerializerXmlHandler) {
+        if (serializer != null) {
             try {
-                ((SerializerXmlHandler)handler).flushBuffer();
+                serializer.flushBuffer();
             } catch (StreamException ex) {
                 throw toXMLStreamException(ex);
             }

Copied: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java (from r1742842, webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPConstants.java)
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java?p2=webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java&p1=webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPConstants.java&r1=1742842&r2=1743903&rev=1743903&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPConstants.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java Sun May 15 13:23:28 2016
@@ -16,21 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-package org.apache.axiom.util.stax.xop;
-
-import javax.xml.namespace.QName;
+package org.apache.axiom.om.impl.stream.xop;
 
 /**
- * Interface defining constants used by {@link XOPDecodingStreamReader} and
- * {@link XOPEncodingStreamReader}.
- * <p>
- * For internal use only.
+ * Interface defining constants used by {@link XOPDecodingFilterHandler} and
+ * {@link XOPEncodingFilterHandler}.
  */
 interface XOPConstants {
     String INCLUDE = "Include";
     String NAMESPACE_URI = "http://www.w3.org/2004/08/xop/include";
     String DEFAULT_PREFIX = "xop";
-    QName INCLUDE_QNAME = new QName(NAMESPACE_URI, INCLUDE, DEFAULT_PREFIX);
     String HREF = "href";
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java?rev=1743903&r1=1743902&r2=1743903&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java Sun May 15 13:23:28 2016
@@ -83,8 +83,8 @@ final class XOPDecodingFilterHandler ext
     @Override
     public void startElement(String namespaceURI, String localName, String prefix)
             throws StreamException {
-        if (localName.equals("Include")
-                && namespaceURI.equals("http://www.w3.org/2004/08/xop/include")) {
+        if (localName.equals(XOPConstants.INCLUDE)
+                && namespaceURI.equals(XOPConstants.NAMESPACE_URI)) {
             if (state == State.AFTER_START_ELEMENT) {
                 state = State.IN_XOP_INCLUDE;
             } else {
@@ -115,7 +115,7 @@ final class XOPDecodingFilterHandler ext
     public void processAttribute(String namespaceURI, String localName, String prefix, String value,
             String type, boolean specified) throws StreamException {
         if (state == State.IN_XOP_INCLUDE) {
-            if (namespaceURI.isEmpty() && localName.equals("href")) {
+            if (namespaceURI.isEmpty() && localName.equals(XOPConstants.HREF)) {
                 if (!value.startsWith("cid:")) {
                     throw new StreamException("Expected href attribute containing a URL in the cid scheme");
                 }

Added: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java?rev=1743903&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java (added)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java Sun May 15 13:23:28 2016
@@ -0,0 +1,104 @@
+/*
+ * 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.stream.xop;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.activation.DataHandler;
+
+import org.apache.axiom.core.stream.StreamException;
+import org.apache.axiom.core.stream.XmlHandler;
+import org.apache.axiom.core.stream.XmlHandlerWrapper;
+import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.om.impl.intf.TextContent;
+import org.apache.axiom.util.stax.xop.ContentIDGenerator;
+import org.apache.axiom.util.stax.xop.OptimizationPolicy;
+import org.apache.axiom.util.stax.xop.XOPUtils;
+
+public final class XOPEncodingFilterHandler extends XmlHandlerWrapper {
+    private final Map<String,Object> dataHandlerObjects = new LinkedHashMap<String,Object>();
+    private final ContentIDGenerator contentIDGenerator;
+    private final OptimizationPolicy optimizationPolicy;
+
+    public XOPEncodingFilterHandler(XmlHandler parent, ContentIDGenerator contentIDGenerator,
+            OptimizationPolicy optimizationPolicy) {
+        super(parent);
+        this.contentIDGenerator = contentIDGenerator;
+        this.optimizationPolicy = optimizationPolicy;
+    }
+
+    /**
+     * Get the set of content IDs referenced in <tt>xop:Include</tt> element information items
+     * produced by this wrapper.
+     * 
+     * @return The set of content IDs in their order of appearance in the infoset. If no
+     *         <tt>xop:Include</tt> element information items have been produced yet, an empty
+     *         set will be returned.
+     */
+    public Set<String> getContentIDs() {
+        return Collections.unmodifiableSet(dataHandlerObjects.keySet());
+    }
+
+    public DataHandler getDataHandler(String contentID) throws IOException {
+        Object dataHandlerObject = dataHandlerObjects.get(contentID);
+        if (dataHandlerObject == null) {
+            throw new IllegalArgumentException("No DataHandler object found for content ID '" +
+                    contentID + "'");
+        } else if (dataHandlerObject instanceof DataHandler) {
+            return (DataHandler)dataHandlerObject;
+        } else {
+            return ((DataHandlerProvider)dataHandlerObject).getDataHandler();
+        }
+    }
+
+    @Override
+    public void processCharacterData(Object data, boolean ignorable) throws StreamException {
+        if (data instanceof TextContent) {
+            TextContent textContent = (TextContent)data;
+            if (textContent.isBinary()) {
+                Object dataHandlerObject = textContent.getDataHandlerObject();
+                boolean optimize;
+                try {
+                    if (dataHandlerObject instanceof DataHandlerProvider) {
+                        optimize = optimizationPolicy.isOptimized((DataHandlerProvider)dataHandlerObject, textContent.isOptimize());
+                    } else {
+                        optimize = optimizationPolicy.isOptimized((DataHandler)dataHandlerObject, textContent.isOptimize());
+                    }
+                } catch (IOException ex) {
+                    throw new StreamException(ex);
+                }
+                if (optimize) {
+                    String contentID = contentIDGenerator.generateContentID(textContent.getContentID());
+                    dataHandlerObjects.put(contentID, dataHandlerObject);
+                    super.startElement(XOPConstants.NAMESPACE_URI, XOPConstants.INCLUDE, XOPConstants.DEFAULT_PREFIX);
+                    super.processNamespaceDeclaration(XOPConstants.DEFAULT_PREFIX, XOPConstants.NAMESPACE_URI);
+                    super.processAttribute("", XOPConstants.HREF, "", XOPUtils.getURLForContentID(contentID), "CDATA", true);
+                    super.attributesCompleted();
+                    super.endElement();
+                    return;
+                }
+            }
+        }
+        super.processCharacterData(data, ignorable);
+    }
+}

Propchange: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native