Author: veithen
Date: Thu Aug 25 20:38:42 2011
New Revision: 1161739
URL: http://svn.apache.org/viewvc?rev=1161739&view=rev
Log:
AXIOM-377: Implemented MTOM attachment streaming with serializeAndConsume.
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSerializableImpl.java
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/SOAPTestSuiteBuilder.java
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java?rev=1161739&r1=1161738&r2=1161739&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
Thu Aug 25 20:38:42 2011
@@ -30,6 +30,8 @@ import javax.xml.stream.FactoryConfigura
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
+import org.apache.axiom.attachments.impl.BufferUtils;
+import org.apache.axiom.attachments.lifecycle.DataHandlerExt;
import org.apache.axiom.om.OMException;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMOutputFormat;
@@ -63,6 +65,7 @@ public class MTOMXMLStreamWriter impleme
private OutputStream rootPartOutputStream;
private OMOutputFormat format = new OMOutputFormat();
private final OptimizationPolicy optimizationPolicy;
+ private final boolean preserveAttachments;
// State variables
private boolean isEndDocument = false; // has endElement been called
@@ -78,29 +81,42 @@ public class MTOMXMLStreamWriter impleme
log.trace("Call Stack =" + CommonUtils.callStackToString());
}
optimizationPolicy = new OptimizationPolicyImpl(format);
+ preserveAttachments = true;
}
+ public MTOMXMLStreamWriter(OutputStream outStream, OMOutputFormat format)
+ throws XMLStreamException, FactoryConfigurationError {
+ this(outStream, format, true);
+ }
+
/**
* Creates a new MTOMXMLStreamWriter with specified encoding.
- *
+ *
* @param outStream
* @param format
+ * @param preserveAttachments
+ * specifies whether attachments must be preserved or can be
consumed (i.e. streamed)
+ * during serialization; if set to <code>false</code> then
+ * {@link DataHandlerExt#readOnce()} or an equivalent method
may be used to get the
+ * data for an attachment
* @throws XMLStreamException
* @throws FactoryConfigurationError
* @see OMOutputFormat#DEFAULT_CHAR_SET_ENCODING
*/
- public MTOMXMLStreamWriter(OutputStream outStream, OMOutputFormat format)
+ public MTOMXMLStreamWriter(OutputStream outStream, OMOutputFormat format,
boolean preserveAttachments)
throws XMLStreamException, FactoryConfigurationError {
if (isDebugEnabled) {
log.debug("Creating MTOMXMLStreamWriter");
log.debug("OutputStream =" + outStream.getClass());
log.debug("OMFormat = " + format.toString());
+ log.debug("preserveAttachments = " + preserveAttachments);
}
if (isTraceEnabled) {
log.trace("Call Stack =" + CommonUtils.callStackToString());
}
this.format = format;
this.outStream = outStream;
+ this.preserveAttachments = preserveAttachments;
String encoding = format.getCharSetEncoding();
if (encoding == null) { //Default encoding is UTF-8
@@ -210,7 +226,14 @@ public class MTOMXMLStreamWriter impleme
XOPEncodingStreamWriter encoder =
(XOPEncodingStreamWriter)xmlWriter;
for (Iterator it = encoder.getContentIDs().iterator();
it.hasNext(); ) {
String contentID = (String)it.next();
-
multipartWriter.writePart(encoder.getDataHandler(contentID), contentID);
+ DataHandler dataHandler =
encoder.getDataHandler(contentID);
+ if (preserveAttachments || !(dataHandler instanceof
DataHandlerExt)) {
+ multipartWriter.writePart(dataHandler, contentID);
+ } else {
+ OutputStream out =
multipartWriter.writePart(dataHandler.getContentType(), contentID);
+
BufferUtils.inputStream2OutputStream(((DataHandlerExt)dataHandler).readOnce(),
out);
+ out.close();
+ }
}
// This is for compatibility with writeOptimized
for (Iterator it = binaryNodeList.iterator(); it.hasNext();) {
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java?rev=1161739&r1=1161738&r2=1161739&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
Thu Aug 25 20:38:42 2011
@@ -809,7 +809,7 @@ public abstract class NodeImpl implement
public void serialize(OutputStream output, OMOutputFormat format)
throws XMLStreamException {
- MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
+ MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format,
true);
try {
internalSerialize(writer, true);
// TODO: the flush is necessary because of an issue with the
lifecycle of MTOMXMLStreamWriter
@@ -835,7 +835,7 @@ public abstract class NodeImpl implement
public void serializeAndConsume(OutputStream output, OMOutputFormat format)
throws XMLStreamException {
- MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
+ MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format,
false);
try {
internalSerialize(writer, false);
// TODO: the flush is necessary because of an issue with the
lifecycle of MTOMXMLStreamWriter
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java?rev=1161739&r1=1161738&r2=1161739&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java
Thu Aug 25 20:38:42 2011
@@ -447,8 +447,13 @@ public abstract class TextNodeImpl exten
writeOutput(writer);
} else {
try {
- XMLStreamWriterUtils.writeDataHandler(writer, (DataHandler)
getDataHandler(),
- contentID, optimize);
+ if (dataHandlerObject instanceof DataHandlerProvider) {
+ XMLStreamWriterUtils.writeDataHandler(writer,
(DataHandlerProvider)dataHandlerObject,
+ contentID, optimize);
+ } else {
+ XMLStreamWriterUtils.writeDataHandler(writer,
(DataHandler)getDataHandler(),
+ contentID, optimize);
+ }
} catch (IOException ex) {
throw new OMException("Error reading data handler", ex);
}
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSerializableImpl.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSerializableImpl.java?rev=1161739&r1=1161738&r2=1161739&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSerializableImpl.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSerializableImpl.java
Thu Aug 25 20:38:42 2011
@@ -163,7 +163,7 @@ public abstract class OMSerializableImpl
}
public void serialize(OutputStream output, OMOutputFormat format) throws
XMLStreamException {
- MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
+ MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format,
true);
try {
internalSerialize(writer, true);
// TODO: the flush is necessary because of an issue with the
lifecycle of MTOMXMLStreamWriter
@@ -188,7 +188,7 @@ public abstract class OMSerializableImpl
public void serializeAndConsume(OutputStream output, OMOutputFormat format)
throws XMLStreamException {
- MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
+ MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format,
false);
try {
internalSerialize(writer, false);
// TODO: the flush is necessary because of an issue with the
lifecycle of MTOMXMLStreamWriter
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java?rev=1161739&r1=1161738&r2=1161739&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
Thu Aug 25 20:38:42 2011
@@ -405,8 +405,13 @@ public class OMTextImpl extends OMNodeIm
writeOutput(writer);
} else {
try {
- XMLStreamWriterUtils.writeDataHandler(writer,
(DataHandler)getDataHandler(),
- contentID, optimize);
+ if (dataHandlerObject instanceof DataHandlerProvider) {
+ XMLStreamWriterUtils.writeDataHandler(writer,
(DataHandlerProvider)dataHandlerObject,
+ contentID, optimize);
+ } else {
+ XMLStreamWriterUtils.writeDataHandler(writer,
(DataHandler)getDataHandler(),
+ contentID, optimize);
+ }
} catch (IOException ex) {
throw new OMException("Error reading data handler", ex);
}
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/SOAPTestSuiteBuilder.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/SOAPTestSuiteBuilder.java?rev=1161739&r1=1161738&r2=1161739&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/SOAPTestSuiteBuilder.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/SOAPTestSuiteBuilder.java
Thu Aug 25 20:38:42 2011
@@ -106,8 +106,8 @@ public class SOAPTestSuiteBuilder extend
addTest(new
org.apache.axiom.ts.soap11.header.TestGetHeadersToProcessWithParser(metaFactory));
addTest(new
org.apache.axiom.ts.soap12.envelope.TestAddElementAfterBody(metaFactory));
addTest(new
org.apache.axiom.ts.soap12.envelope.TestBuildWithAttachments(metaFactory));
-// addTest(new
org.apache.axiom.ts.soap12.envelope.TestMTOMForwardStreaming(metaFactory,
true));
-// addTest(new
org.apache.axiom.ts.soap12.envelope.TestMTOMForwardStreaming(metaFactory,
false));
+ addTest(new
org.apache.axiom.ts.soap12.envelope.TestMTOMForwardStreaming(metaFactory,
true));
+ addTest(new
org.apache.axiom.ts.soap12.envelope.TestMTOMForwardStreaming(metaFactory,
false));
addTest(new org.apache.axiom.ts.soap12.fault.TestGetNode(metaFactory));
addTest(new
org.apache.axiom.ts.soap12.fault.TestGetNodeWithParser(metaFactory));
addTest(new
org.apache.axiom.ts.soap12.fault.TestMoreChildrenAddition(metaFactory));
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java?rev=1161739&r1=1161738&r2=1161739&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java
Thu Aug 25 20:38:42 2011
@@ -32,6 +32,7 @@ import org.apache.axiom.om.OMMetaFactory
import org.apache.axiom.om.OMOutputFormat;
import org.apache.axiom.om.OMText;
import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
@@ -105,7 +106,8 @@ public class TestMTOMForwardStreaming ex
Attachments attachments = new Attachments(pipe1In,
contentType);
SOAPEnvelope envelope = new MTOMStAXSOAPModelBuilder(
StAXUtils.createXMLStreamReader(attachments.getSOAPPartInputStream()),
- attachments).getSOAPEnvelope();
+ metaFactory.getSOAP12Factory(),
attachments,
+
SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI).getSOAPEnvelope();
// The code path executed by serializeAndConsume is
significantly different if
// the element is built. Therefore we need two
different test executions.
if (buildSOAPPart) {
@@ -127,7 +129,8 @@ public class TestMTOMForwardStreaming ex
Attachments attachments = new Attachments(pipe2In, contentType);
SOAPEnvelope envelope = new MTOMStAXSOAPModelBuilder(
StAXUtils.createXMLStreamReader(attachments.getSOAPPartInputStream()),
- attachments).getSOAPEnvelope();
+ metaFactory.getSOAP12Factory(), attachments,
+
SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI).getSOAPEnvelope();
OMElement bodyElement = envelope.getBody().getFirstElement();
Iterator it = bodyElement.getChildElements();
OMElement data1 = (OMElement)it.next();