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 2022/11/13 00:10:07 UTC

[ws-axiom] branch master updated: [AXIOM-506] Make the ContentTypeProvider configurable

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 <an...@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);
         }