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 54cb5401d [AXIOM-506] Migrate OptimizationPolicyImpl to Blob 54cb5401d is described below commit 54cb5401d43b9489eb9a671762de1052a32ec7a5 Author: Andreas Veithen <andreas.veit...@gmail.com> AuthorDate: Sun Nov 13 10:23:28 2022 +0000 [AXIOM-506] Migrate OptimizationPolicyImpl to Blob --- .../axiom/util/activation/DataHandlerUtils.java | 39 ---------------------- .../om/impl/stream/xop}/CountingOutputStream.java | 8 ++--- .../om/impl/stream/xop/OptimizationPolicyImpl.java | 19 ++++++++--- .../stream/xop}/SizeLimitExceededException.java | 10 +++--- 4 files changed, 22 insertions(+), 54 deletions(-) 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 900af1e3e..9f8162100 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 @@ -18,11 +18,7 @@ */ package org.apache.axiom.util.activation; -import java.io.IOException; -import java.io.OutputStream; - import javax.activation.DataHandler; -import javax.activation.DataSource; import org.apache.axiom.blob.Blob; import org.apache.axiom.mime.activation.PartDataHandler; @@ -34,41 +30,6 @@ import org.apache.axiom.mime.activation.PartDataHandlerBlob; public final class DataHandlerUtils { private DataHandlerUtils() {} - /** - * Check if the given {@link DataHandler} will produce a byte stream that is longer than a given - * limit. It will first attempt to determine the size using - * {@link DataSourceUtils#getSize(DataSource)}. If that fails, it will use - * {@link DataHandler#writeTo(OutputStream)} to determine if the size is larger than the limit. - * - * @param dh - * the {@link DataHandler} to check - * @param limit - * the limit - * @return {@code true} if the size is larger than {@code limit}, {@code false} otherwise - * @throws IOException - * if {@link DataHandler#writeTo(OutputStream)} produced an unexpected exception - */ - public static boolean isLargerThan(DataHandler dh, long limit) throws IOException { - long size = DataSourceUtils.getSize(dh.getDataSource()); - if (size != -1) { - return size > limit; - } else { - // In all other cases, we prefer DataHandler#writeTo over DataSource#getInputStream. - // The reason is that if the DataHandler was constructed from an Object rather than - // a DataSource, a call to DataSource#getInputStream() will start a new thread and - // return a PipedInputStream. This is so for Geronimo's as well as Sun's JAF - // implementation. The reason is that DataContentHandler only has a writeTo and no - // getInputStream method. Obviously starting a new thread just to check the size of - // the data is an overhead that we should avoid. - try { - dh.writeTo(new CountingOutputStream(limit)); - return false; - } catch (SizeLimitExceededException ex) { - return true; - } - } - } - /** * Get the {@link DataHandler} wrapped by the given {@link Blob}. * diff --git a/axiom-api/src/main/java/org/apache/axiom/util/activation/CountingOutputStream.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/CountingOutputStream.java similarity index 97% rename from axiom-api/src/main/java/org/apache/axiom/util/activation/CountingOutputStream.java rename to mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/CountingOutputStream.java index 91e15fcb2..ad02e78bc 100644 --- a/axiom-api/src/main/java/org/apache/axiom/util/activation/CountingOutputStream.java +++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/CountingOutputStream.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.axiom.util.activation; +package org.apache.axiom.om.impl.stream.xop; import java.io.IOException; import java.io.OutputStream; @@ -28,7 +28,7 @@ import java.io.OutputStream; final class CountingOutputStream extends OutputStream { private final long maxSize; private long size; - + CountingOutputStream(long maxSize) { this.maxSize = maxSize; } @@ -54,7 +54,7 @@ final class CountingOutputStream extends OutputStream { size++; checkSize(); } - + private void checkSize() throws SizeLimitExceededException { if (maxSize != -1 && size > maxSize) { // Throw a cached exception instance to avoid the overhead of building the @@ -66,4 +66,4 @@ final class CountingOutputStream extends OutputStream { long getSize() { return size; } -} \ No newline at end of file +} diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java index 246d21e82..680225c14 100644 --- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java +++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java @@ -22,9 +22,9 @@ package org.apache.axiom.om.impl.stream.xop; import java.io.IOException; import org.apache.axiom.blob.Blob; +import org.apache.axiom.ext.io.StreamCopyException; import org.apache.axiom.ext.stax.BlobProvider; import org.apache.axiom.om.OMOutputFormat; -import org.apache.axiom.util.activation.DataHandlerUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -52,11 +52,20 @@ public final class OptimizationPolicyImpl implements OptimizationPolicy { if (threshold == 0) { return true; } + long size = blob.getSize(); + if (size != -1) { + return size > threshold; + } try { - return DataHandlerUtils.isLargerThan(DataHandlerUtils.toDataHandler(blob), threshold); - } catch (IOException ex) { - log.warn("DataHandler.writeTo(OutputStream) threw IOException", ex); - return true; + blob.writeTo(new CountingOutputStream(threshold)); + return false; + } catch (StreamCopyException ex) { + if (ex.getOperation() == StreamCopyException.WRITE) { + return true; + } else { + log.warn("Blob.writeTo(OutputStream) threw IOException", ex.getCause()); + return true; + } } } diff --git a/axiom-api/src/main/java/org/apache/axiom/util/activation/SizeLimitExceededException.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/SizeLimitExceededException.java similarity index 88% rename from axiom-api/src/main/java/org/apache/axiom/util/activation/SizeLimitExceededException.java rename to mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/SizeLimitExceededException.java index 945bce647..8bd69c081 100644 --- a/axiom-api/src/main/java/org/apache/axiom/util/activation/SizeLimitExceededException.java +++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/SizeLimitExceededException.java @@ -16,19 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.axiom.util.activation; +package org.apache.axiom.om.impl.stream.xop; import java.io.IOException; -/** - * Exception used by {@link CountingOutputStream} if the size limit has been exceeded. - */ +/** Exception used by {@link CountingOutputStream} if the size limit has been exceeded. */ final class SizeLimitExceededException extends IOException { private static final long serialVersionUID = 1L; static final SizeLimitExceededException INSTANCE = new SizeLimitExceededException(); - + private SizeLimitExceededException() { setStackTrace(new StackTraceElement[0]); } -} \ No newline at end of file +}