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 -> 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() {