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