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/25 19:18:48 UTC

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

Author: veithen
Date: Wed May 25 19:18:47 2016
New Revision: 1745531

URL: http://svn.apache.org/viewvc?rev=1745531&view=rev
Log:
Move the XOP encoding/decoding logic to the core stream API.

Added:
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java
      - copied, changed from r1745390, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java
      - copied, changed from r1745392, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/CompletionListener.java
      - copied, changed from r1745390, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/CompletionListener.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/XOPConstants.java
      - copied, changed from r1745390, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java
Removed:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/CompletionListener.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java
Modified:
    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/xop/XOPDecodingFilterHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java

Copied: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java (from r1745390, 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/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java?p2=webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java&p1=webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java&r1=1745390&r2=1745531&rev=1745531&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/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java Wed May 25 19:18:47 2016
@@ -16,41 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.om.impl.stream.xop;
+package org.apache.axiom.core.stream.xop;
 
-import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 
-import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
 
 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.mime.MimePartProvider;
-import org.apache.axiom.om.impl.intf.TextContent;
-
-final class XOPDecodingFilterHandler extends XmlHandlerWrapper {
-    private static class DataHandlerProviderImpl implements DataHandlerProvider {
-        private final MimePartProvider mimePartProvider;
-        private final String contentID;
-        
-        public DataHandlerProviderImpl(MimePartProvider mimePartProvider, String contentID) {
-            this.mimePartProvider = mimePartProvider;
-            this.contentID = contentID;
-        }
-
-        public boolean isLoaded() {
-            return mimePartProvider.isLoaded(contentID);
-        }
-
-        public DataHandler getDataHandler() throws IOException {
-            return mimePartProvider.getDataHandler(contentID);
-        }
-    }
 
+public abstract class AbstractXOPDecodingFilterHandler extends XmlHandlerWrapper {
     private static final String SOLE_CHILD_MSG =
             "Expected xop:Include as the sole child of an element information item (see section " +
             "3.2 of http://www.w3.org/TR/xop10/)";
@@ -59,15 +36,15 @@ final class XOPDecodingFilterHandler ext
         AFTER_START_ELEMENT, CONTENT_SEEN, IN_XOP_INCLUDE, AFTER_XOP_INCLUDE
     }
 
-    private final MimePartProvider mimePartProvider;
     private State state = State.CONTENT_SEEN;
     private String contentID;
 
-    XOPDecodingFilterHandler(XmlHandler parent, MimePartProvider mimePartProvider) {
+    public AbstractXOPDecodingFilterHandler(XmlHandler parent) {
         super(parent);
-        this.mimePartProvider = mimePartProvider;
     }
 
+    protected abstract Object buildCharacterData(String contentID) throws StreamException;
+
     private void inContent() throws StreamException {
         switch (state) {
             case IN_XOP_INCLUDE:
@@ -102,7 +79,7 @@ final class XOPDecodingFilterHandler ext
             if (contentID == null) {
                 throw new StreamException("No href attribute found on xop:Include element");
             }
-            super.processCharacterData(new TextContent(contentID, new DataHandlerProviderImpl(mimePartProvider, contentID), true), false);
+            super.processCharacterData(buildCharacterData(contentID), false);
             contentID = null;
             state = State.AFTER_XOP_INCLUDE;
         } else {

Copied: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java (from r1745392, 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/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java?p2=webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java&p1=webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java&r1=1745392&r2=1745531&rev=1745531&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java Wed May 25 19:18:47 2016
@@ -16,105 +16,67 @@
  * 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;
+package org.apache.axiom.core.stream.xop;
 
 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 abstract class AbstractXOPEncodingFilterHandler extends XmlHandlerWrapper {
     private final CompletionListener completionListener;
 
-    public XOPEncodingFilterHandler(XmlHandler parent, ContentIDGenerator contentIDGenerator,
-            OptimizationPolicy optimizationPolicy, CompletionListener completionListener) {
+    public AbstractXOPEncodingFilterHandler(XmlHandler parent, CompletionListener completionListener) {
         super(parent);
-        this.contentIDGenerator = contentIDGenerator;
-        this.optimizationPolicy = optimizationPolicy;
         this.completionListener = completionListener;
     }
 
-    public String prepareDataHandler(DataHandler dataHandler) {
-        boolean doOptimize;
-        try {
-            doOptimize = optimizationPolicy.isOptimized(dataHandler, true);
-        } catch (IOException ex) {
-            doOptimize = true;
-        }
-        if (doOptimize) {
-            String contentID = contentIDGenerator.generateContentID(null);
-            dataHandlerObjects.put(contentID, dataHandler);
-            return contentID;
-        } else {
-            return null;
-        }
-    }
+    protected abstract String processCharacterData(Object data) throws StreamException;
 
     /**
-     * Get the set of content IDs referenced in <tt>xop:Include</tt> element information items
-     * produced by this wrapper.
+     * Build a cid URL from the given content ID as described in RFC2392.
+     * <p>
+     * Note that this implementation only encodes the percent character (replacing it by "%25"). The
+     * reason is given by the following quotes from RFC3986:
+     * <blockquote>
+     * If a reserved character is
+     * found in a URI component and no delimiting role is known for that character, then it must be
+     * interpreted as representing the data octet corresponding to that character's encoding in
+     * US-ASCII. [...]
+     * <p>
+     * Under normal circumstances, the only time when octets within a URI are percent-encoded is
+     * during the process of producing the URI from its component parts. This is when an
+     * implementation determines which of the reserved characters are to be used as subcomponent
+     * delimiters and which can be safely used as data. [...]
+     * <p>
+     * Because the percent ("%") character serves as the indicator for percent-encoded octets, it
+     * must be percent-encoded as "%25" for that octet to be used as data within a URI.
+     * </blockquote>
+     * <p>
+     * Since RFC2392 doesn't define any subcomponents for the cid scheme and since RFC2045 specifies
+     * that only US-ASCII characters are allowed in content IDs, the percent character (which is
+     * specifically allowed by RFC2045) is the only character that needs URL encoding.
+     * <p>
+     * Another reason to strictly limit the set of characters to be encoded is that some
+     * applications fail to decode cid URLs correctly if they contain percent encoded octets.
      * 
-     * @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.
+     * @param contentID the content ID (without enclosing angle brackets)
+     * @return the corresponding URL in the cid scheme
      */
-    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();
-        }
+    private static String getURLForContentID(String contentID) {
+        return "cid:" + contentID.replaceAll("%", "%25");
     }
 
     @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;
-                }
+        if (!ignorable) {
+            String contentID = processCharacterData(data);
+            if (contentID != null) {
+                super.startElement(XOPConstants.NAMESPACE_URI, XOPConstants.INCLUDE, XOPConstants.DEFAULT_PREFIX);
+                super.processNamespaceDeclaration(XOPConstants.DEFAULT_PREFIX, XOPConstants.NAMESPACE_URI);
+                super.processAttribute("", XOPConstants.HREF, "", getURLForContentID(contentID), "CDATA", true);
+                super.attributesCompleted();
+                super.endElement();
+                return;
             }
         }
         super.processCharacterData(data, ignorable);

Copied: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/CompletionListener.java (from r1745390, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/CompletionListener.java)
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/CompletionListener.java?p2=webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/CompletionListener.java&p1=webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/CompletionListener.java&r1=1745390&r2=1745531&rev=1745531&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/CompletionListener.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/CompletionListener.java Wed May 25 19:18:47 2016
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.om.impl.stream.xop;
+package org.apache.axiom.core.stream.xop;
 
 import org.apache.axiom.core.stream.StreamException;
 
 public interface CompletionListener {
-    void completed(XOPEncodingFilterHandler handler) throws StreamException;
+    void completed(AbstractXOPEncodingFilterHandler handler) throws StreamException;
 }

Copied: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/XOPConstants.java (from r1745390, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java)
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/XOPConstants.java?p2=webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/XOPConstants.java&p1=webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java&r1=1745390&r2=1745531&rev=1745531&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPConstants.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/xop/XOPConstants.java Wed May 25 19:18:47 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.om.impl.stream.xop;
+package org.apache.axiom.core.stream.xop;
 
 /**
  * Interface defining constants used by {@link XOPDecodingFilterHandler} and

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=1745531&r1=1745530&r2=1745531&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 Wed May 25 19:18:47 2016
@@ -32,10 +32,11 @@ import org.apache.axiom.attachments.life
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.serializer.Serializer;
+import org.apache.axiom.core.stream.xop.AbstractXOPEncodingFilterHandler;
+import org.apache.axiom.core.stream.xop.CompletionListener;
 import org.apache.axiom.om.OMOutputFormat;
 import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
 import org.apache.axiom.om.impl.OMMultipartWriter;
-import org.apache.axiom.om.impl.stream.xop.CompletionListener;
 import org.apache.axiom.om.impl.stream.xop.XOPEncodingFilterHandler;
 import org.apache.axiom.om.util.CommonUtils;
 import org.apache.axiom.util.io.IOUtils;
@@ -128,11 +129,11 @@ public class MTOMXMLStreamWriterImpl ext
             };
             handler = new XOPEncodingFilterHandler(serializer, contentIDGenerator, new OptimizationPolicyImpl(format), new CompletionListener() {
                 @Override
-                public void completed(XOPEncodingFilterHandler encoder) throws StreamException {
+                public void completed(AbstractXOPEncodingFilterHandler encoder) throws StreamException {
                     try {
                         rootPartOutputStream.close();
-                        for (String contentID : encoder.getContentIDs()) {
-                            DataHandler dataHandler = encoder.getDataHandler(contentID);
+                        for (String contentID : ((XOPEncodingFilterHandler)encoder).getContentIDs()) {
+                            DataHandler dataHandler = ((XOPEncodingFilterHandler)encoder).getDataHandler(contentID);
                             if (preserveAttachments || !(dataHandler instanceof DataHandlerExt)) {
                                 multipartWriter.writePart(dataHandler, contentID);
                             } else {

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=1745531&r1=1745530&r2=1745531&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 Wed May 25 19:18:47 2016
@@ -19,20 +19,16 @@
 package org.apache.axiom.om.impl.stream.xop;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 
 import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
 
-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.core.stream.xop.AbstractXOPDecodingFilterHandler;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.mime.MimePartProvider;
 import org.apache.axiom.om.impl.intf.TextContent;
 
-final class XOPDecodingFilterHandler extends XmlHandlerWrapper {
+final class XOPDecodingFilterHandler extends AbstractXOPDecodingFilterHandler {
     private static class DataHandlerProviderImpl implements DataHandlerProvider {
         private final MimePartProvider mimePartProvider;
         private final String contentID;
@@ -51,152 +47,19 @@ final class XOPDecodingFilterHandler ext
         }
     }
 
-    private static final String SOLE_CHILD_MSG =
-            "Expected xop:Include as the sole child of an element information item (see section " +
-            "3.2 of http://www.w3.org/TR/xop10/)";
-
     private enum State {
         AFTER_START_ELEMENT, CONTENT_SEEN, IN_XOP_INCLUDE, AFTER_XOP_INCLUDE
     }
 
     private final MimePartProvider mimePartProvider;
-    private State state = State.CONTENT_SEEN;
-    private String contentID;
 
     XOPDecodingFilterHandler(XmlHandler parent, MimePartProvider mimePartProvider) {
         super(parent);
         this.mimePartProvider = mimePartProvider;
     }
 
-    private void inContent() throws StreamException {
-        switch (state) {
-            case IN_XOP_INCLUDE:
-                throw new StreamException(
-                        "Expected xop:Include element information item to be empty");
-            case AFTER_XOP_INCLUDE:
-                throw new StreamException(SOLE_CHILD_MSG);
-            default:
-                state = State.CONTENT_SEEN;
-        }
-    }
-
-    @Override
-    public void startElement(String namespaceURI, String localName, String prefix)
-            throws StreamException {
-        if (localName.equals(XOPConstants.INCLUDE)
-                && namespaceURI.equals(XOPConstants.NAMESPACE_URI)) {
-            if (state == State.AFTER_START_ELEMENT) {
-                state = State.IN_XOP_INCLUDE;
-            } else {
-                throw new StreamException(SOLE_CHILD_MSG);
-            }
-        } else {
-            inContent();
-            super.startElement(namespaceURI, localName, prefix);
-        }
-    }
-
-    @Override
-    public void endElement() throws StreamException {
-        if (state == State.IN_XOP_INCLUDE) {
-            if (contentID == null) {
-                throw new StreamException("No href attribute found on xop:Include element");
-            }
-            super.processCharacterData(new TextContent(contentID, new DataHandlerProviderImpl(mimePartProvider, contentID), true), false);
-            contentID = null;
-            state = State.AFTER_XOP_INCLUDE;
-        } else {
-            state = State.CONTENT_SEEN;
-            super.endElement();
-        }
-    }
-
-    @Override
-    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(XOPConstants.HREF)) {
-                if (!value.startsWith("cid:")) {
-                    throw new StreamException("Expected href attribute containing a URL in the cid scheme");
-                }
-                try {
-                    // URIs should always be decoded using UTF-8. On the other hand, since non ASCII
-                    // characters are not allowed in content IDs, we can simply decode using ASCII
-                    // (which is a subset of UTF-8)
-                    contentID = URLDecoder.decode(value.substring(4), "ascii");
-                } catch (UnsupportedEncodingException ex) {
-                    // We should never get here
-                    throw new StreamException(ex);
-                }
-            } else {
-                throw new StreamException("Encountered unexpected attribute " + new QName(namespaceURI, localName) + " on xop:Include element");
-            }
-        } else {
-            super.processAttribute(namespaceURI, localName, prefix, value, type, specified);
-        }
-    }
-
-    @Override
-    public void processNamespaceDeclaration(String prefix, String namespaceURI)
-            throws StreamException {
-        if (state != State.IN_XOP_INCLUDE) {
-            super.processNamespaceDeclaration(prefix, namespaceURI);
-        }
-    }
-
-    @Override
-    public void attributesCompleted() throws StreamException {
-        if (state != State.IN_XOP_INCLUDE) {
-            super.attributesCompleted();
-            state = State.AFTER_START_ELEMENT;
-        }
-    }
-
-    @Override
-    public void processCharacterData(Object data, boolean ignorable) throws StreamException {
-        inContent();
-        super.processCharacterData(data, ignorable);
-    }
-
-    @Override
-    public void startProcessingInstruction(String target) throws StreamException {
-        inContent();
-        super.startProcessingInstruction(target);
-    }
-
-    @Override
-    public void endProcessingInstruction() throws StreamException {
-        inContent();
-        super.endProcessingInstruction();
-    }
-
-    @Override
-    public void startComment() throws StreamException {
-        inContent();
-        super.startComment();
-    }
-
-    @Override
-    public void endComment() throws StreamException {
-        inContent();
-        super.endComment();
-    }
-
-    @Override
-    public void startCDATASection() throws StreamException {
-        inContent();
-        super.startCDATASection();
-    }
-
-    @Override
-    public void endCDATASection() throws StreamException {
-        inContent();
-        super.endCDATASection();
-    }
-
     @Override
-    public void processEntityReference(String name, String replacementText) throws StreamException {
-        inContent();
-        super.processEntityReference(name, replacementText);
+    protected Object buildCharacterData(String contentID) {
+        return new TextContent(contentID, new DataHandlerProviderImpl(mimePartProvider, contentID), true);
     }
 }

Modified: 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=1745531&r1=1745530&r2=1745531&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java Wed May 25 19:18:47 2016
@@ -29,24 +29,24 @@ 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.core.stream.xop.AbstractXOPEncodingFilterHandler;
+import org.apache.axiom.core.stream.xop.CompletionListener;
 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 {
+public final class XOPEncodingFilterHandler extends AbstractXOPEncodingFilterHandler {
     private final Map<String,Object> dataHandlerObjects = new LinkedHashMap<String,Object>();
     private final ContentIDGenerator contentIDGenerator;
     private final OptimizationPolicy optimizationPolicy;
-    private final CompletionListener completionListener;
 
     public XOPEncodingFilterHandler(XmlHandler parent, ContentIDGenerator contentIDGenerator,
             OptimizationPolicy optimizationPolicy, CompletionListener completionListener) {
-        super(parent);
+        super(parent, completionListener);
         this.contentIDGenerator = contentIDGenerator;
         this.optimizationPolicy = optimizationPolicy;
-        this.completionListener = completionListener;
     }
 
     public String prepareDataHandler(DataHandler dataHandler) {
@@ -90,7 +90,7 @@ public final class XOPEncodingFilterHand
     }
 
     @Override
-    public void processCharacterData(Object data, boolean ignorable) throws StreamException {
+    protected String processCharacterData(Object data) throws StreamException {
         if (data instanceof TextContent) {
             TextContent textContent = (TextContent)data;
             if (textContent.isBinary()) {
@@ -108,21 +108,10 @@ public final class XOPEncodingFilterHand
                 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;
+                    return contentID;
                 }
             }
         }
-        super.processCharacterData(data, ignorable);
-    }
-
-    @Override
-    public void completed() throws StreamException {
-        super.completed();
-        completionListener.completed(this);
+        return null;
     }
 }