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 042218f5b [AXIOM-506] Introduce PartBlob 042218f5b is described below commit 042218f5b53aabe93e365322586f70404181fc82 Author: Andreas Veithen <andreas.veit...@gmail.com> AuthorDate: Sun Nov 6 12:19:59 2022 +0000 [AXIOM-506] Introduce PartBlob --- .../axiom/attachments/LegacyPartDataHandler.java | 5 +- .../axiom/attachments/MultipartBodyAdapter.java | 15 +++--- .../java/org/apache/axiom/mime/MultipartBody.java | 18 +++---- .../src/main/java/org/apache/axiom/mime/Part.java | 7 +++ .../DataHandlerBlobFactory.java => PartBlob.java} | 26 ++++------ .../{BlobFactory.java => PartBlobFactory.java} | 33 ++++++------- .../main/java/org/apache/axiom/mime/PartImpl.java | 9 ++-- .../axiom/mime/activation/PartDataHandler.java | 23 ++++++--- ...artDataSource.java => PartDataHandlerBlob.java} | 36 +++++++------- .../activation/PartDataHandlerBlobFactory.java | 55 ++++++++++++++++++++++ .../axiom/mime/activation/PartDataSource.java | 8 +--- .../activation/DataHandlerContentTypeProvider.java | 5 +- .../axiom/util/activation/DataHandlerUtils.java | 27 +++++++++-- .../om/impl/common/factory/meta/BuilderSpec.java | 2 +- .../java/org/apache/axiom/samples/MTOMSample.java | 4 +- .../org/apache/axiom/ts/om/xop/TestSerialize.java | 4 +- .../soap12/envelope/TestBuildWithAttachments.java | 4 +- .../soap12/envelope/TestMTOMForwardStreaming.java | 7 +-- 18 files changed, 182 insertions(+), 106 deletions(-) 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 7d6b8da84..9cc5d0f24 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,7 +20,6 @@ package org.apache.axiom.attachments; import java.io.IOException; import java.io.InputStream; -import java.util.function.Supplier; import javax.activation.DataSource; @@ -30,8 +29,8 @@ import org.apache.axiom.mime.Part; import org.apache.axiom.mime.activation.PartDataHandler; final class LegacyPartDataHandler extends PartDataHandler implements DataHandlerExt { - LegacyPartDataHandler(Part part, Supplier<Blob> contentSupplier) { - super(part, contentSupplier); + LegacyPartDataHandler(Part part) { + super(part); } @Override 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 60180071a..6d3ed9fbc 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,14 +25,13 @@ 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.BlobFactory; +import org.apache.axiom.mime.activation.PartDataHandler; +import org.apache.axiom.mime.activation.PartDataHandlerBlobFactory; import org.apache.axiom.mime.Header; import org.apache.axiom.mime.MultipartBody; import org.apache.axiom.mime.MultipartBody.PartCreationListener; @@ -77,10 +76,10 @@ final class MultipartBodyAdapter extends AttachmentsDelegate implements PartCrea .setInputStream(inStream) .setContentType(contentTypeString) .setAttachmentBlobFactory(attachmentBlobFactory) - .setBlobFactory(new BlobFactory() { + .setPartBlobFactory(new PartDataHandlerBlobFactory() { @Override - public Blob createBlob(Part part, Supplier<Blob> contentSupplier) { - return DataHandlerUtils.toBlob(new LegacyPartDataHandler(part, contentSupplier)); + protected PartDataHandler createDataHandler(Part part) { + return new LegacyPartDataHandler(part); } }) .setPartCreationListener(this) @@ -90,7 +89,7 @@ final class MultipartBodyAdapter extends AttachmentsDelegate implements PartCrea String rootPartContentID = rootPart.getContentID(); if (rootPartContentID == null) { rootPartContentID = "firstPart_" + UIDGenerator.generateContentId(); - map.put(rootPartContentID, DataHandlerUtils.toDataHandler(rootPart.getBlob())); + map.put(rootPartContentID, DataHandlerUtils.toDataHandler(rootPart.getPartBlob())); } this.rootPartContentID = rootPartContentID; } @@ -99,7 +98,7 @@ final class MultipartBodyAdapter extends AttachmentsDelegate implements PartCrea public void partCreated(Part part) { String contentID = part.getContentID(); if (contentID != null) { - map.put(contentID, DataHandlerUtils.toDataHandler(part.getBlob())); + map.put(contentID, DataHandlerUtils.toDataHandler(part.getPartBlob())); } } diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBody.java b/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBody.java index 72f6a77d1..d1065d18c 100644 --- a/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBody.java +++ b/axiom-api/src/main/java/org/apache/axiom/mime/MultipartBody.java @@ -58,7 +58,7 @@ public final class MultipartBody implements Iterable<Part> { private InputStream inputStream; private ContentType contentType; private WritableBlobFactory<?> attachmentBlobFactory; - private BlobFactory blobFactory; + private PartBlobFactory partBlobFactory; private PartCreationListener partCreationListener; Builder() {} @@ -87,8 +87,8 @@ public final class MultipartBody implements Iterable<Part> { return this; } - public Builder setBlobFactory(BlobFactory blobFactory) { - this.blobFactory = blobFactory; + public Builder setPartBlobFactory(PartBlobFactory partBlobFactory) { + this.partBlobFactory = partBlobFactory; return this; } @@ -108,7 +108,7 @@ public final class MultipartBody implements Iterable<Part> { inputStream, contentType, attachmentBlobFactory == null ? MemoryBlob.FACTORY : attachmentBlobFactory, - blobFactory == null ? BlobFactory.DEFAULT : blobFactory, + partBlobFactory == null ? PartBlobFactory.DEFAULT : partBlobFactory, partCreationListener); } } @@ -138,15 +138,15 @@ public final class MultipartBody implements Iterable<Part> { private int partCount; private final WritableBlobFactory<?> attachmentBlobFactory; - private final BlobFactory blobFactory; + private final PartBlobFactory partBlobFactory; private final PartCreationListener partCreationListener; MultipartBody(InputStream inStream, ContentType contentType, WritableBlobFactory<?> attachmentBlobFactory, - BlobFactory blobFactory, + PartBlobFactory partBlobFactory, PartCreationListener partCreationListener) { this.attachmentBlobFactory = attachmentBlobFactory; - this.blobFactory = blobFactory; + this.partBlobFactory = partBlobFactory; this.partCreationListener = partCreationListener; this.contentType = contentType; @@ -187,8 +187,8 @@ public final class MultipartBody implements Iterable<Part> { return contentID; } - BlobFactory getBlobFactory() { - return blobFactory; + PartBlobFactory getPartBlobFactory() { + return partBlobFactory; } public ContentType getContentType() { 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 0808b9b88..9adfcba30 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 @@ -67,6 +67,13 @@ public interface Part { */ Blob getBlob(); + /** + * Get the {@link PartBlob} instance created by the configured {@link PartBlobFactory}. + * + * @return the {@link PartBlob} instance + */ + PartBlob getPartBlob(); + /** * Get the content of this part as an {@link InputStream}. * diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/activation/DataHandlerBlobFactory.java b/axiom-api/src/main/java/org/apache/axiom/mime/PartBlob.java similarity index 54% rename from axiom-api/src/main/java/org/apache/axiom/mime/activation/DataHandlerBlobFactory.java rename to axiom-api/src/main/java/org/apache/axiom/mime/PartBlob.java index 3f41a2476..f6b24e0ae 100644 --- a/axiom-api/src/main/java/org/apache/axiom/mime/activation/DataHandlerBlobFactory.java +++ b/axiom-api/src/main/java/org/apache/axiom/mime/PartBlob.java @@ -16,26 +16,18 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.axiom.mime.activation; - -import java.util.function.Supplier; +package org.apache.axiom.mime; import org.apache.axiom.blob.Blob; -import org.apache.axiom.mime.BlobFactory; -import org.apache.axiom.mime.Part; -import org.apache.axiom.util.activation.DataHandlerUtils; /** - * {@link BlobFactory} implementation that creates {@link Blob} instances that wrap - * {@link PartDataHandler} instances. + * A {@link Blob} that enables access to the {@link Part} whose content it represents. */ -public final class DataHandlerBlobFactory implements BlobFactory { - public static final DataHandlerBlobFactory INSTANCE = new DataHandlerBlobFactory(); - - private DataHandlerBlobFactory() {} - - @Override - public Blob createBlob(Part part, Supplier<Blob> contentSupplier) { - return DataHandlerUtils.toBlob(new PartDataHandler(part, contentSupplier)); - } +public interface PartBlob extends Blob { + /** + * The the MIME part from which this blob was created. + * + * @return the MIME part + */ + Part getPart(); } diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/BlobFactory.java b/axiom-api/src/main/java/org/apache/axiom/mime/PartBlobFactory.java similarity index 62% rename from axiom-api/src/main/java/org/apache/axiom/mime/BlobFactory.java rename to axiom-api/src/main/java/org/apache/axiom/mime/PartBlobFactory.java index 53caa05db..c63441036 100644 --- a/axiom-api/src/main/java/org/apache/axiom/mime/BlobFactory.java +++ b/axiom-api/src/main/java/org/apache/axiom/mime/PartBlobFactory.java @@ -21,51 +21,52 @@ 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.io.StreamCopyException; /** - * Factory for the {@link Blob} instances returned by {@link Part#getBlob()}. This may be used to - * create {@link Blob} instances that wrap some other type of objects representing the content of + * Factory for the {@link PartBlob} instances returned by {@link Part#getBlob()}. This may be used to + * create {@link PartBlob} instances that wrap some other type of objects representing the content of * MIME parts. */ -public interface BlobFactory { +public interface PartBlobFactory { /** - * Default factory that creates {@link Blob} instances that lazily access the underlying + * Default factory that creates {@link PartBlob} instances that lazily access the underlying * content. */ - BlobFactory DEFAULT = new BlobFactory() { + PartBlobFactory DEFAULT = new PartBlobFactory() { @Override - public Blob createBlob(Part part, Supplier<Blob> contentSupplier) { - return new Blob() { + public PartBlob createBlob(Part part) { + return new PartBlob() { + @Override + public Part getPart() { + return part; + } + @Override public InputStream getInputStream() throws IOException { - return contentSupplier.get().getInputStream(); + return part.getBlob().getInputStream(); } @Override public void writeTo(OutputStream out) throws StreamCopyException { - contentSupplier.get().writeTo(out); + part.getBlob().writeTo(out); } @Override public long getSize() { - return contentSupplier.get().getSize(); + return part.getBlob().getSize(); } }; } }; /** - * Create a {@link Blob} for the given MIME part. + * Create a {@link PartBlob} for the given MIME part. * * @param part * the MIME part - * @param contentSupplier - * a supplier for the content of the part * @return the blob */ - Blob createBlob(Part part, Supplier<Blob> contentSupplier); + PartBlob createBlob(Part part); } 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 1eaddca5b..cec33e239 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 @@ -85,7 +85,7 @@ final class PartImpl implements Part { */ private WritableBlob content; - private Blob blob; + private PartBlob blob; private PartInputStream partInputStream; @@ -138,9 +138,9 @@ final class PartImpl implements Part { } @Override - public Blob getBlob() { + public PartBlob getPartBlob() { if (blob == null) { - blob = message.getBlobFactory().createBlob(this, this::getRawBlob); + blob = message.getPartBlobFactory().createBlob(this); } return blob; } @@ -157,7 +157,8 @@ final class PartImpl implements Part { } } - private Blob getRawBlob() { + @Override + public Blob getBlob() { WritableBlob blob = getContent(); if (blob instanceof OverflowableBlob) { WritableBlob overflowBlob = ((OverflowableBlob)blob).getOverflowBlob(); diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandler.java b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandler.java index 4fef99f16..82a08ecb0 100644 --- a/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandler.java +++ b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandler.java @@ -20,32 +20,32 @@ package org.apache.axiom.mime.activation; 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; import org.apache.axiom.mime.Part; +import org.apache.axiom.mime.PartBlob; /** * {@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 final PartDataHandlerBlob blob; private DataSource dataSource; - protected PartDataHandler(Part part, Supplier<Blob> contentSupplier) { + protected PartDataHandler(Part part) { // 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, contentSupplier)); + super(new PartDataSource(part)); this.part = part; - this.contentSupplier = contentSupplier; + this.blob = new PartDataHandlerBlob(this); } /** @@ -57,10 +57,19 @@ public class PartDataHandler extends DataHandler { return part; } + /** + * Get the {@link PartBlob} that wraps this instance. + * + * @return the blob wrapper + */ + public final PartBlob getBlob() { + return blob; + } + @Override public final DataSource getDataSource() { if (dataSource == null) { - dataSource = createDataSource(contentSupplier.get(), Util.getDataSourceContentType(part)); + dataSource = createDataSource(part.getBlob(), 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 @@ -92,6 +101,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). - contentSupplier.get().writeTo(os); + part.getBlob().writeTo(os); } } diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataSource.java b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandlerBlob.java similarity index 58% copy from axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataSource.java copy to axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandlerBlob.java index facac683c..6643ab968 100644 --- a/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataSource.java +++ b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandlerBlob.java @@ -21,46 +21,42 @@ package org.apache.axiom.mime.activation; 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; +import org.apache.axiom.ext.io.StreamCopyException; import org.apache.axiom.mime.Part; +import org.apache.axiom.mime.PartBlob; /** - * Default {@link DataSource} implementation for MIME parts. + * {@link PartBlob} implementation that wraps a {@link PartDataHandler}. */ -final class PartDataSource implements SizeAwareDataSource { - private final Part part; - private final Supplier<Blob> contentSupplier; +public final class PartDataHandlerBlob implements PartBlob { + private final PartDataHandler dataHandler; - PartDataSource(Part part, Supplier<Blob> contentSupplier) { - this.part = part; - this.contentSupplier = contentSupplier; + PartDataHandlerBlob(PartDataHandler dataHandler) { + this.dataHandler = dataHandler; } - @Override - public String getContentType() { - return Util.getDataSourceContentType(part); + public PartDataHandler getDataHandler() { + return dataHandler; } @Override - public InputStream getInputStream() throws IOException { - return part.getInputStream(true); + public Part getPart() { + return dataHandler.getPart(); } @Override - public String getName() { - return part.getContentID(); + public InputStream getInputStream() throws IOException { + return dataHandler.getPart().getBlob().getInputStream(); } @Override - public OutputStream getOutputStream() throws IOException { - throw new UnsupportedOperationException(); + public void writeTo(OutputStream out) throws StreamCopyException { + dataHandler.getPart().getBlob().writeTo(out); } @Override public long getSize() { - return contentSupplier.get().getSize(); + return dataHandler.getPart().getBlob().getSize(); } } diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandlerBlobFactory.java b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandlerBlobFactory.java new file mode 100644 index 000000000..ebe6ceee5 --- /dev/null +++ b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataHandlerBlobFactory.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.axiom.mime.activation; + +import org.apache.axiom.mime.PartBlobFactory; +import org.apache.axiom.mime.Part; +import org.apache.axiom.mime.PartBlob; + +/** + * {@link PartBlobFactory} implementation that creates {@link PartBlob} instances that wrap + * {@link PartDataHandler} instances. + */ +public abstract class PartDataHandlerBlobFactory implements PartBlobFactory { + /** + * {@link PartDataHandlerBlobFactory} instance that creates plain {@link PartDataHandler} + * instances. + */ + public static final PartDataHandlerBlobFactory DEFAULT = new PartDataHandlerBlobFactory() { + @Override + protected PartDataHandler createDataHandler(Part part) { + return new PartDataHandler(part); + } + }; + + protected PartDataHandlerBlobFactory() {} + + @Override + public final PartBlob createBlob(Part part) { + return createDataHandler(part).getBlob(); + } + + /** + * Create a {@link PartDataHandler} for the given {@link Part}. + * + * @param part the MIME part + * @return the data handler + */ + protected abstract PartDataHandler createDataHandler(Part part); +} diff --git a/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataSource.java b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataSource.java index facac683c..acbc0f7ea 100644 --- a/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataSource.java +++ b/axiom-api/src/main/java/org/apache/axiom/mime/activation/PartDataSource.java @@ -21,9 +21,7 @@ package org.apache.axiom.mime.activation; 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; import org.apache.axiom.mime.Part; @@ -32,11 +30,9 @@ import org.apache.axiom.mime.Part; */ final class PartDataSource implements SizeAwareDataSource { private final Part part; - private final Supplier<Blob> contentSupplier; - PartDataSource(Part part, Supplier<Blob> contentSupplier) { + PartDataSource(Part part) { this.part = part; - this.contentSupplier = contentSupplier; } @Override @@ -61,6 +57,6 @@ final class PartDataSource implements SizeAwareDataSource { @Override public long getSize() { - return contentSupplier.get().getSize(); + return part.getBlob().getSize(); } } diff --git a/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerContentTypeProvider.java b/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerContentTypeProvider.java index 2eb083ce8..b5e4da206 100644 --- a/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerContentTypeProvider.java +++ b/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerContentTypeProvider.java @@ -41,10 +41,11 @@ public final class DataHandlerContentTypeProvider implements ContentTypeProvider @Override public ContentType getContentType(Blob blob) { - if (!(blob instanceof DataHandlerBlob)) { + DataHandler dh = DataHandlerUtils.getDataHandler(blob); + if (dh == null) { return null; } - String contentType = ((DataHandlerBlob) blob).getDataHandler().getContentType(); + String contentType = dh.getContentType(); if (contentType == null) { return null; } diff --git a/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerUtils.java b/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerUtils.java index 9cbd50e69..900af1e3e 100644 --- a/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerUtils.java +++ b/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerUtils.java @@ -25,6 +25,8 @@ import javax.activation.DataHandler; import javax.activation.DataSource; import org.apache.axiom.blob.Blob; +import org.apache.axiom.mime.activation.PartDataHandler; +import org.apache.axiom.mime.activation.PartDataHandlerBlob; /** * Contains utility methods to work with {@link DataHandler} objects. @@ -67,6 +69,22 @@ public final class DataHandlerUtils { } } + /** + * Get the {@link DataHandler} wrapped by the given {@link Blob}. + * + * @param blob the {@link Blob} to unwrap + * @return the wrapped {@link DataHandler}, or {@code null} if the blob doesn't wrap a {@link DataHandler} + */ + public static DataHandler getDataHandler(Blob blob) { + if (blob instanceof DataHandlerBlob) { + return ((DataHandlerBlob)blob).getDataHandler(); + } + if (blob instanceof PartDataHandlerBlob) { + return ((PartDataHandlerBlob)blob).getDataHandler(); + } + return null; + } + /** * Get a {@link DataHandler} for the given {@link Blob}. If the blob was obtained from {@link * #toBlob(DataHandler)}, the original {@link DataHandler} is returned. @@ -75,10 +93,8 @@ public final class DataHandlerUtils { * @return a {@link DataHandler} representing the {@link Blob} */ public static DataHandler toDataHandler(Blob blob) { - if (blob instanceof DataHandlerBlob) { - return ((DataHandlerBlob)blob).getDataHandler(); - } - return new BlobDataHandler(blob); + DataHandler dh = getDataHandler(blob); + return dh != null ? dh : new BlobDataHandler(blob); } /** @@ -92,6 +108,9 @@ public final class DataHandlerUtils { if (dh instanceof BlobDataHandler) { return ((BlobDataHandler)dh).getBlob(); } + if (dh instanceof PartDataHandler) { + return ((PartDataHandler)dh).getBlob(); + } return new DataHandlerBlob(dh); } } 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 a521da6c9..f1d970522 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 @@ -221,7 +221,7 @@ public final class BuilderSpec { @Override public Blob getBlob(String contentID) { Part part = message.getPart(contentID); - return part == null ? null : part.getBlob(); + return part == null ? null : part.getPartBlob(); } })), new Detachable() { diff --git a/samples/src/test/java/org/apache/axiom/samples/MTOMSample.java b/samples/src/test/java/org/apache/axiom/samples/MTOMSample.java index 4d3921cd3..d67240a33 100644 --- a/samples/src/test/java/org/apache/axiom/samples/MTOMSample.java +++ b/samples/src/test/java/org/apache/axiom/samples/MTOMSample.java @@ -30,7 +30,7 @@ import javax.xml.ws.Endpoint; import junit.framework.TestCase; import org.apache.axiom.mime.MultipartBody; -import org.apache.axiom.mime.activation.DataHandlerBlobFactory; +import org.apache.axiom.mime.activation.PartDataHandlerBlobFactory; import org.apache.axiom.mime.activation.PartDataHandler; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; @@ -69,7 +69,7 @@ public class MTOMSample extends TestCase { MultipartBody multipartBody = MultipartBody.builder() .setInputStream(in) .setContentType(connection.getContentType()) - .setBlobFactory(DataHandlerBlobFactory.INSTANCE) + .setPartBlobFactory(PartDataHandlerBlobFactory.DEFAULT) .build(); SOAPEnvelope response = OMXMLBuilderFactory.createSOAPModelBuilder(multipartBody).getSOAPEnvelope(); OMElement retrieveContentResponse = response.getBody().getFirstElement(); 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 c12d5909a..6389debbb 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 @@ -22,7 +22,7 @@ import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.axiom.mime.MultipartBody; -import org.apache.axiom.mime.activation.DataHandlerBlobFactory; +import org.apache.axiom.mime.activation.PartDataHandlerBlobFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMMetaFactory; import org.apache.axiom.om.OMOutputFormat; @@ -51,7 +51,7 @@ public class TestSerialize extends AxiomTestCase { MultipartBody.builder() .setInputStream(inStream) .setContentType(testMessage.getContentType()) - .setBlobFactory(DataHandlerBlobFactory.INSTANCE) + .setPartBlobFactory(PartDataHandlerBlobFactory.DEFAULT) .build(); OMOutputFormat oof = new OMOutputFormat(); diff --git a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestBuildWithAttachments.java b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestBuildWithAttachments.java index be287595e..2cb5103cf 100644 --- a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestBuildWithAttachments.java +++ b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestBuildWithAttachments.java @@ -22,7 +22,7 @@ import java.io.InputStream; import java.util.Iterator; import org.apache.axiom.mime.MultipartBody; -import org.apache.axiom.mime.activation.DataHandlerBlobFactory; +import org.apache.axiom.mime.activation.PartDataHandlerBlobFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMMetaFactory; import org.apache.axiom.om.OMText; @@ -45,7 +45,7 @@ public class TestBuildWithAttachments extends AxiomTestCase { MultipartBody.builder() .setInputStream(in) .setContentType(sample.getContentType()) - .setBlobFactory(DataHandlerBlobFactory.INSTANCE) + .setPartBlobFactory(PartDataHandlerBlobFactory.DEFAULT) .build(); SOAPEnvelope envelope = OMXMLBuilderFactory.createSOAPModelBuilder(metaFactory, mb).getSOAPEnvelope(); diff --git a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java index 4a7348360..58777bc82 100644 --- a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java +++ b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap12/envelope/TestMTOMForwardStreaming.java @@ -26,7 +26,7 @@ import javax.activation.DataHandler; import javax.activation.DataSource; import org.apache.axiom.mime.MultipartBody; -import org.apache.axiom.mime.activation.DataHandlerBlobFactory; +import org.apache.axiom.mime.activation.PartDataHandlerBlobFactory; import org.apache.axiom.mime.activation.PartDataHandler; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMMetaFactory; @@ -109,7 +109,8 @@ public class TestMTOMForwardStreaming extends AxiomTestCase { MultipartBody.builder() .setInputStream(pipe1In) .setContentType(contentType) - .setBlobFactory(DataHandlerBlobFactory.INSTANCE) + .setPartBlobFactory( + PartDataHandlerBlobFactory.DEFAULT) .build(); SOAPEnvelope envelope = OMXMLBuilderFactory.createSOAPModelBuilder( @@ -138,7 +139,7 @@ public class TestMTOMForwardStreaming extends AxiomTestCase { MultipartBody.builder() .setInputStream(pipe2In) .setContentType(contentType) - .setBlobFactory(DataHandlerBlobFactory.INSTANCE) + .setPartBlobFactory(PartDataHandlerBlobFactory.DEFAULT) .build(); SOAPEnvelope envelope = OMXMLBuilderFactory.createSOAPModelBuilder(metaFactory, mb).getSOAPEnvelope();