This is an automated email from the ASF dual-hosted git repository. veithen pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ws-axiom.git
The following commit(s) were added to refs/heads/master by this push: new bf9b9df7a [AXIOM-506] Make the ContentTypeProvider configurable bf9b9df7a is described below commit bf9b9df7a236d34113cc38d6921a3cb1d2bfbea4 Author: Andreas Veithen <andreas.veit...@gmail.com> AuthorDate: Sun Nov 13 00:09:58 2022 +0000 [AXIOM-506] Make the ContentTypeProvider configurable --- .../src/main/java/org/apache/axiom/om/OMOutputFormat.java | 11 +++++++++++ .../java/org/apache/axiom/om/impl/OMMultipartWriter.java | 13 +++++++------ src/site/markdown/release-notes/2.0.0.md | 7 +++++++ .../main/java/org/apache/axiom/ts/om/xop/TestSerialize.java | 2 ++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java b/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java index 65eb96137..dd4f58ec3 100644 --- a/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java +++ b/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.Map; import org.apache.axiom.om.format.xop.ContentTransferEncodingPolicy; +import org.apache.axiom.om.format.xop.ContentTypeProvider; import org.apache.axiom.om.impl.MTOMConstants; import org.apache.axiom.om.util.StAXWriterConfiguration; import org.apache.axiom.soap.SOAPVersion; @@ -71,6 +72,7 @@ public class OMOutputFormat { @SuppressWarnings("deprecation") private StAXWriterConfiguration writerConfiguration; + private ContentTypeProvider contentTypeProvider; private ContentTransferEncodingPolicy contentTransferEncodingPolicy; /** @@ -121,6 +123,7 @@ public class OMOutputFormat { ignoreXMLDeclaration = format.ignoreXMLDeclaration; autoCloseWriter = format.autoCloseWriter; writerConfiguration = format.writerConfiguration; + contentTypeProvider = format.contentTypeProvider; contentTransferEncodingPolicy = format.contentTransferEncodingPolicy; if (format.map != null) { map = new HashMap<String,Object>(format.map); @@ -472,6 +475,14 @@ public class OMOutputFormat { this.writerConfiguration = writerConfiguration; } + public ContentTypeProvider getContentTypeProvider() { + return contentTypeProvider; + } + + public void setContentTypeProvider(ContentTypeProvider contentTypeProvider) { + this.contentTypeProvider = contentTypeProvider; + } + public ContentTransferEncodingPolicy getContentTransferEncodingPolicy() { return contentTransferEncodingPolicy; } diff --git a/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java b/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java index 4c4161fae..1f8bb66ba 100644 --- a/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java +++ b/axiom-api/src/main/java/org/apache/axiom/om/impl/OMMultipartWriter.java @@ -35,7 +35,6 @@ import org.apache.axiom.om.format.xop.CombinedContentTransferEncodingPolicy; import org.apache.axiom.om.format.xop.ContentTransferEncodingPolicy; import org.apache.axiom.om.format.xop.ContentTypeProvider; import org.apache.axiom.soap.SOAPVersion; -import org.apache.axiom.util.activation.DataHandlerContentTypeProvider; import org.apache.axiom.util.io.IOUtils; /** @@ -46,7 +45,6 @@ import org.apache.axiom.util.io.IOUtils; public class OMMultipartWriter { private final OMOutputFormat format; private final MultipartBodyWriter writer; - private final ContentTypeProvider contentTypeProvider; private final ContentTransferEncodingPolicy contentTransferEncodingPolicy; private final ContentType rootPartContentType; @@ -55,8 +53,6 @@ public class OMMultipartWriter { writer = new MultipartBodyWriter(out, format.getMimeBoundary()); - // TODO(AXIOM-506): make this configurable in OMOutputFormat - contentTypeProvider = DataHandlerContentTypeProvider.INSTANCE; ContentTransferEncodingPolicy contentTransferEncodingPolicy = format.getContentTransferEncodingPolicy(); if (format != null && Boolean.TRUE.equals( format.getProperty(OMOutputFormat.USE_CTE_BASE64_FOR_NON_TEXTUAL_ATTACHMENTS))) { @@ -88,6 +84,11 @@ public class OMMultipartWriter { } } + private ContentType getContentType(Blob blob) { + ContentTypeProvider contentTypeProvider = format.getContentTypeProvider(); + return contentTypeProvider == null ? null : contentTypeProvider.getContentType(blob); + } + private ContentTransferEncoding getContentTransferEncoding(Blob blob, ContentType contentType) { ContentTransferEncoding cte = null; if (contentTransferEncodingPolicy != null) { @@ -170,7 +171,7 @@ public class OMMultipartWriter { * if an I/O error occurs when writing the part to the underlying stream */ public void writePart(Blob blob, String contentID, List<Header> extraHeaders) throws IOException { - ContentType contentType = contentTypeProvider.getContentType(blob); + ContentType contentType = getContentType(blob); writer.writePart(blob, contentType, getContentTransferEncoding(blob, contentType), contentID, extraHeaders); } @@ -204,7 +205,7 @@ public class OMMultipartWriter { * if an I/O error occurs when writing the part to the underlying stream */ public void writePart(PartBlob blob, String contentID, boolean preserve) throws IOException { - ContentType contentType = contentTypeProvider.getContentType(blob); + ContentType contentType = getContentType(blob); OutputStream part = writer.writePart(contentType, getContentTransferEncoding(blob, contentType), contentID, null); IOUtils.copy( blob.getPart().getInputStream(preserve), diff --git a/src/site/markdown/release-notes/2.0.0.md b/src/site/markdown/release-notes/2.0.0.md index 938bee46b..385896e48 100644 --- a/src/site/markdown/release-notes/2.0.0.md +++ b/src/site/markdown/release-notes/2.0.0.md @@ -13,3 +13,10 @@ Axiom 2 introduces breaking changes to remove the dependency on `javax.activatio deprecated) methods in `OMXMLBuilderFactory` that refer to `Attachments` have been removed. To continue using the `Attachments` class, call the `getMultipartBody` method and pass the result to `OMXMLBuilderFactory`. + +- Because of these changes the XOP/MTOM serializer no longer infers the content type and content + transfer encoding of non-root parts from (`Blob` wrapped) `DataHandler` objects linked to `OMText` + nodes by default. This behavior now needs to be enabled explicitly by setting the + `ContentTypeProvider` and `ContentTransferEncodingPolicy` on the `OMOutputFormat` to + `DataHandlerContentTypeProvider.INSTANCE` and `ConfigurableDataHandler.CONTENT_TRANSFER_ENCODING_POLICY` + respectively. diff --git a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/xop/TestSerialize.java b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/xop/TestSerialize.java index 6389debbb..d8158e7d4 100644 --- a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/xop/TestSerialize.java +++ b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/xop/TestSerialize.java @@ -31,6 +31,7 @@ import org.apache.axiom.om.OMXMLParserWrapper; import org.apache.axiom.om.util.StAXParserConfiguration; import org.apache.axiom.ts.AxiomTestCase; import org.apache.axiom.ts.soap.MTOMSample; +import org.apache.axiom.util.activation.DataHandlerContentTypeProvider; public class TestSerialize extends AxiomTestCase { private final boolean base64; @@ -59,6 +60,7 @@ public class TestSerialize extends AxiomTestCase { oof.setMimeBoundary(testMessage.getBoundary()); oof.setRootContentId(testMessage.getStart()); if (base64) { + oof.setContentTypeProvider(DataHandlerContentTypeProvider.INSTANCE); oof.setProperty( OMOutputFormat.USE_CTE_BASE64_FOR_NON_TEXTUAL_ATTACHMENTS, Boolean.TRUE); }