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 c715fd003 [AXIOM-506] Eliminate Part.getDataHandler
c715fd003 is described below

commit c715fd00343cd8b86d0b9cadcc150c642089a8da
Author: Andreas Veithen <andreas.veit...@gmail.com>
AuthorDate: Sat Nov 5 16:40:47 2022 +0000

    [AXIOM-506] Eliminate Part.getDataHandler
---
 axiom-api/pom.xml                                     |  1 +
 .../axiom/attachments/LegacyPartDataHandler.java      | 12 ++++++------
 .../axiom/attachments/MultipartBodyAdapter.java       | 11 +++++++----
 .../org/apache/axiom/mime/DataHandlerFactory.java     | 14 ++++++++++----
 .../src/main/java/org/apache/axiom/mime/Part.java     |  9 ---------
 .../java/org/apache/axiom/mime/PartDataHandler.java   | 19 ++++++++++++-------
 .../java/org/apache/axiom/mime/PartDataSource.java    |  8 ++++++--
 .../src/main/java/org/apache/axiom/mime/PartImpl.java | 16 +++++++---------
 .../om/impl/common/factory/meta/BuilderSpec.java      |  5 ++++-
 9 files changed, 53 insertions(+), 42 deletions(-)

diff --git a/axiom-api/pom.xml b/axiom-api/pom.xml
index 6de2c96cb..373ebd01c 100644
--- a/axiom-api/pom.xml
+++ b/axiom-api/pom.xml
@@ -256,6 +256,7 @@
                                 <!-- TODO(AXIOM-506) -->
                                 org.apache.axiom.om.impl.OMMultipartWriter 
-&gt; org.apache.axiom.attachments.ConfigurableDataHandler,
                                 org.apache.axiom.util.base64.Base64Utils -&gt; 
org.apache.axiom.util.activation.DataSourceUtils,
+                                org.apache.axiom.mime.PartImpl -&gt; 
org.apache.axiom.util.activation.DataHandlerUtils,
                                 <!-- o.a.a.soap should be a layer on top of 
o.a.a.om -->
                                 org.apache.axiom.om.OMAbstractFactory -&gt; 
org.apache.axiom.soap.SOAPFactory,
                                 org.apache.axiom.om.OMMetaFactory -&gt; 
org.apache.axiom.soap.SOAPFactory,
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/attachments/LegacyPartDataHandler.java
 
b/axiom-api/src/main/java/org/apache/axiom/attachments/LegacyPartDataHandler.java
index f91ab814f..a23557af1 100644
--- 
a/axiom-api/src/main/java/org/apache/axiom/attachments/LegacyPartDataHandler.java
+++ 
b/axiom-api/src/main/java/org/apache/axiom/attachments/LegacyPartDataHandler.java
@@ -20,6 +20,7 @@ package org.apache.axiom.attachments;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.function.Supplier;
 
 import javax.activation.DataSource;
 
@@ -29,15 +30,14 @@ import org.apache.axiom.mime.Part;
 import org.apache.axiom.mime.PartDataHandler;
 
 final class LegacyPartDataHandler extends PartDataHandler implements 
DataHandlerExt {
-    LegacyPartDataHandler(Part part) {
-        super(part);
+    LegacyPartDataHandler(Part part, Supplier<Blob> contentSupplier) {
+        super(part, contentSupplier);
     }
 
     @Override
-    protected DataSource createDataSource(Part part, String contentType) {
-        Blob blob = part.getBlob();
-        if (blob instanceof LegacyTempFileBlob) {
-            return ((LegacyTempFileBlob)blob).getDataSource(contentType);
+    protected DataSource createDataSource(Blob content, String contentType) {
+        if (content instanceof LegacyTempFileBlob) {
+            return ((LegacyTempFileBlob)content).getDataSource(contentType);
         } else {
             return null;
         }
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/attachments/MultipartBodyAdapter.java
 
b/axiom-api/src/main/java/org/apache/axiom/attachments/MultipartBodyAdapter.java
index 6866ae55e..c90a13a88 100644
--- 
a/axiom-api/src/main/java/org/apache/axiom/attachments/MultipartBodyAdapter.java
+++ 
b/axiom-api/src/main/java/org/apache/axiom/attachments/MultipartBodyAdapter.java
@@ -25,9 +25,11 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import javax.activation.DataHandler;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.blob.WritableBlobFactory;
 import org.apache.axiom.mime.ContentType;
 import org.apache.axiom.mime.DataHandlerFactory;
@@ -37,6 +39,7 @@ import 
org.apache.axiom.mime.MultipartBody.PartCreationListener;
 import org.apache.axiom.mime.Part;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.util.UIDGenerator;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -76,8 +79,8 @@ final class MultipartBodyAdapter extends AttachmentsDelegate 
implements PartCrea
                 .setAttachmentBlobFactory(attachmentBlobFactory)
                 .setDataHandlerFactory(new DataHandlerFactory() {
                         @Override
-                        public DataHandler createDataHandler(Part part) {
-                            return new LegacyPartDataHandler(part);
+                        public DataHandler createDataHandler(Part part, 
Supplier<Blob> contentSupplier) {
+                            return new LegacyPartDataHandler(part, 
contentSupplier);
                         }
                     })
                 .setPartCreationListener(this)
@@ -87,7 +90,7 @@ final class MultipartBodyAdapter extends AttachmentsDelegate 
implements PartCrea
         String rootPartContentID = rootPart.getContentID();
         if (rootPartContentID == null) {
             rootPartContentID = "firstPart_" + 
UIDGenerator.generateContentId();
-            map.put(rootPartContentID, rootPart.getDataHandler());
+            map.put(rootPartContentID, 
DataHandlerUtils.toDataHandler(rootPart.getBlob()));
         }
         this.rootPartContentID = rootPartContentID;
     }
@@ -96,7 +99,7 @@ final class MultipartBodyAdapter extends AttachmentsDelegate 
implements PartCrea
     public void partCreated(Part part) {
         String contentID = part.getContentID();
         if (contentID != null) {
-            map.put(contentID, part.getDataHandler());
+            map.put(contentID, DataHandlerUtils.toDataHandler(part.getBlob()));
         }
     }
 
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/mime/DataHandlerFactory.java 
b/axiom-api/src/main/java/org/apache/axiom/mime/DataHandlerFactory.java
index 902ba3af1..e0d90f2c1 100644
--- a/axiom-api/src/main/java/org/apache/axiom/mime/DataHandlerFactory.java
+++ b/axiom-api/src/main/java/org/apache/axiom/mime/DataHandlerFactory.java
@@ -18,10 +18,14 @@
  */
 package org.apache.axiom.mime;
 
+import java.util.function.Supplier;
+
 import javax.activation.DataHandler;
 
+import org.apache.axiom.blob.Blob;
+
 /**
- * Factory for the {@link DataHandler} instances returned by {@link 
Part#getDataHandler()}.
+ * Factory for the {@link DataHandler} instances returned by {@link 
Part#getBlob()}.
  */
 public interface DataHandlerFactory {
     /**
@@ -29,8 +33,8 @@ public interface DataHandlerFactory {
      */
     DataHandlerFactory DEFAULT = new DataHandlerFactory() {
         @Override
-        public DataHandler createDataHandler(Part part) {
-            return new PartDataHandler(part);
+        public DataHandler createDataHandler(Part part, Supplier<Blob> 
contentSupplier) {
+            return new PartDataHandler(part, contentSupplier);
         }
     };
 
@@ -39,7 +43,9 @@ public interface DataHandlerFactory {
      * 
      * @param part
      *            the MIME part
+     * @param contentSupplier
+     *            a supplier for the content of the part
      * @return the data handler
      */
-    DataHandler createDataHandler(Part part);
+    DataHandler createDataHandler(Part part, Supplier<Blob> contentSupplier);
 }
diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/Part.java 
b/axiom-api/src/main/java/org/apache/axiom/mime/Part.java
index 38744c938..0808b9b88 100644
--- a/axiom-api/src/main/java/org/apache/axiom/mime/Part.java
+++ b/axiom-api/src/main/java/org/apache/axiom/mime/Part.java
@@ -21,8 +21,6 @@ package org.apache.axiom.mime;
 import java.io.InputStream;
 import java.util.List;
 
-import javax.activation.DataHandler;
-
 import org.apache.axiom.blob.Blob;
 
 /**
@@ -79,13 +77,6 @@ public interface Part {
      */
     InputStream getInputStream(boolean preserve);
 
-    /**
-     * Get the content of this part as a {@link DataHandler}.
-     * 
-     * @return the content of this part
-     */
-    DataHandler getDataHandler();
-
     /**
      * Make sure that this part has been fully read from the underlying stream.
      */
diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/PartDataHandler.java 
b/axiom-api/src/main/java/org/apache/axiom/mime/PartDataHandler.java
index 1c585b103..afe1cdf29 100644
--- a/axiom-api/src/main/java/org/apache/axiom/mime/PartDataHandler.java
+++ b/axiom-api/src/main/java/org/apache/axiom/mime/PartDataHandler.java
@@ -20,26 +20,31 @@ package org.apache.axiom.mime;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.function.Supplier;
 
 import javax.activation.DataHandler;
 import javax.activation.DataSource;
 
+import org.apache.axiom.blob.Blob;
+
 /**
  * {@link DataHandler} implementation for MIME parts read from a stream.
  */
 public class PartDataHandler extends DataHandler {
     private final Part part;
+    private final Supplier<Blob> contentSupplier;
     private DataSource dataSource;
 
-    protected PartDataHandler(Part part) {
+    protected PartDataHandler(Part part, Supplier<Blob> contentSupplier) {
         // We can't call PartImpl#getDataSource() here because it would fetch 
the content of the
         // part and therefore disable streaming. We can't pass null here 
either because Geronimo's
         // DataHandler implementation would throw a NullPointerException. 
Therefore we create the
         // default PartDataSource. When the DataSource is requested, we check 
if for there is an
         // implementation specific to the buffering strategy and return that 
instead of the default
         // implementation.
-        super(new PartDataSource(part));
+        super(new PartDataSource(part, contentSupplier));
         this.part = part;
+        this.contentSupplier = contentSupplier;
     }
 
     /**
@@ -54,7 +59,7 @@ public class PartDataHandler extends DataHandler {
     @Override
     public final DataSource getDataSource() {
         if (dataSource == null) {
-            dataSource = createDataSource(part, 
Util.getDataSourceContentType(part));
+            dataSource = createDataSource(contentSupplier.get(), 
Util.getDataSourceContentType(part));
             if (dataSource == null) {
                 // We get here if there is no DataSource implementation 
specific to the buffering
                 // strategy being used. In this case we use 
super.getDataSource() to get the
@@ -69,15 +74,15 @@ public class PartDataHandler extends DataHandler {
      * Create the {@link DataSource} to be returned by {@link 
#getDataSource()}. This method may be
      * overridden by subclasses to support custom {@link DataSource} 
implementations.
      * 
-     * @param part
-     *            the {@link Part} backing this data handler
+     * @param content
+     *            the content of the part
      * @param contentType
      *            the content type expected to be returned by {@link 
DataSource#getContentType()};
      *            defaults to {@code application/octet-stream} if the part 
doesn't specify a content
      *            type
      * @return the {@link DataSource} instance, or {@code null} to use the 
default implementation
      */
-    protected DataSource createDataSource(Part part, String contentType) {
+    protected DataSource createDataSource(Blob content, String contentType) {
         return null;
     }
 
@@ -86,6 +91,6 @@ public class PartDataHandler extends DataHandler {
         // The PartContent may have an implementation of writeTo that is more 
efficient than the default
         // DataHandler#writeTo method (which requests an input stream and then 
copies it to the output
         // stream).
-        part.getBlob().writeTo(os);
+        contentSupplier.get().writeTo(os);
     }
 }
diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/PartDataSource.java 
b/axiom-api/src/main/java/org/apache/axiom/mime/PartDataSource.java
index 1f8e2f94b..e67176d75 100644
--- a/axiom-api/src/main/java/org/apache/axiom/mime/PartDataSource.java
+++ b/axiom-api/src/main/java/org/apache/axiom/mime/PartDataSource.java
@@ -21,7 +21,9 @@ package org.apache.axiom.mime;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.function.Supplier;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.ext.activation.SizeAwareDataSource;
 
 /**
@@ -29,9 +31,11 @@ import org.apache.axiom.ext.activation.SizeAwareDataSource;
  */
 final class PartDataSource implements SizeAwareDataSource {
     private final Part part;
+    private final Supplier<Blob> contentSupplier;
 
-    PartDataSource(Part part) {
+    PartDataSource(Part part, Supplier<Blob> contentSupplier) {
         this.part = part;
+        this.contentSupplier = contentSupplier;
     }
 
     @Override
@@ -56,6 +60,6 @@ final class PartDataSource implements SizeAwareDataSource {
 
     @Override
     public long getSize() {
-        return part.getBlob().getSize();
+        return contentSupplier.get().getSize();
     }
 }
diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/PartImpl.java 
b/axiom-api/src/main/java/org/apache/axiom/mime/PartImpl.java
index 9c4d19959..815d7cc5a 100644
--- a/axiom-api/src/main/java/org/apache/axiom/mime/PartImpl.java
+++ b/axiom-api/src/main/java/org/apache/axiom/mime/PartImpl.java
@@ -24,14 +24,13 @@ import org.apache.axiom.blob.OverflowableBlob;
 import org.apache.axiom.blob.WritableBlob;
 import org.apache.axiom.blob.WritableBlobFactory;
 import org.apache.axiom.ext.io.StreamCopyException;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.stream.EntityState;
 import org.apache.james.mime4j.stream.MimeTokenStream;
 
-import javax.activation.DataHandler;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.text.ParseException;
@@ -87,7 +86,7 @@ final class PartImpl implements Part {
      */
     private WritableBlob content;
     
-    private DataHandler dataHandler;
+    private Blob blob;
     
     private PartInputStream partInputStream;
     
@@ -140,11 +139,11 @@ final class PartImpl implements Part {
     }
     
     @Override
-    public DataHandler getDataHandler() {
-        if (dataHandler == null) {
-            dataHandler = 
message.getDataHandlerFactory().createDataHandler(this);
+    public Blob getBlob() {
+        if (blob == null) {
+            blob = 
DataHandlerUtils.toBlob(message.getDataHandlerFactory().createDataHandler(this, 
this::getRawBlob));
         }
-        return dataHandler;
+        return blob;
     }
 
     private WritableBlob getContent() {
@@ -159,8 +158,7 @@ final class PartImpl implements Part {
         }
     }
     
-    @Override
-    public Blob getBlob() {
+    private Blob getRawBlob() {
         WritableBlob blob = getContent();
         if (blob instanceof OverflowableBlob) {
             WritableBlob overflowBlob = 
((OverflowableBlob)blob).getOverflowBlob();
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderSpec.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderSpec.java
index 10a0f963e..4a18e5703 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderSpec.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderSpec.java
@@ -48,6 +48,7 @@ import 
org.apache.axiom.om.impl.stream.stax.pull.AxiomXMLStreamReaderHelperFacto
 import org.apache.axiom.om.impl.stream.xop.XOPDecodingFilter;
 import org.apache.axiom.om.util.StAXParserConfiguration;
 import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.axiom.util.stax.XMLFragmentStreamReader;
 import org.apache.axiom.util.xml.stream.XMLEventUtils;
 import org.w3c.dom.Node;
@@ -221,7 +222,9 @@ public final class BuilderSpec {
                                     @Override
                                     public DataHandler getDataHandler(String 
contentID) {
                                         Part part = message.getPart(contentID);
-                                        return part == null ? null : 
part.getDataHandler();
+                                        return part == null
+                                                ? null
+                                                : 
DataHandlerUtils.toDataHandler(part.getBlob());
                                     }
                                 })),
                 new Detachable() {

Reply via email to