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;
}
}