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 <[email protected]>
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
-> org.apache.axiom.attachments.ConfigurableDataHandler,
org.apache.axiom.util.base64.Base64Utils ->
org.apache.axiom.util.activation.DataSourceUtils,
+ org.apache.axiom.mime.PartImpl ->
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 ->
org.apache.axiom.soap.SOAPFactory,
org.apache.axiom.om.OMMetaFactory ->
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() {