Author: veithen Date: Thu Mar 5 23:14:56 2009 New Revision: 750669 URL: http://svn.apache.org/viewvc?rev=750669&view=rev Log: Allow SizeAwareDataSource#getSize() to return -1 if it is unable to determine the size. Also added a comment about the expected accurateness of the size information.
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/SizeAwareDataSource.java webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/BufferUtils.java Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/SizeAwareDataSource.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/SizeAwareDataSource.java?rev=750669&r1=750668&r2=750669&view=diff ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/SizeAwareDataSource.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/SizeAwareDataSource.java Thu Mar 5 23:14:56 2009 @@ -27,15 +27,31 @@ * Code working with data sources can use this interface to optimize certain operations. * An example is * {...@link org.apache.axiom.attachments.impl.BufferUtils#doesDataHandlerExceedLimit(javax.activation.DataHandler, int)}. + * <p> + * Code using this interface should be aware that some implementations may be unable to guarantee + * 100% accuracy when determining the size of the data source. Situations where this can occur + * include: + * <ul> + * <li>The data source uses a network protocol that allows to get the size of the data + * but that doesn't guarantee accurateness.</li> + * <li>Reading the data involves a decoding operation and the length of the resulting stream + * can't be determined precisely without performing the decoding operation. In this + * case the implementation of this interface may return a value based on an estimation.</li> + * </ul> + * When reading the actual data, the code should always read until the end of the stream is + * reached (as indicated by the return value of the <code>read</code> methods of the + * {...@link java.io.InputStream} class). It must be prepared to reach the end of the stream after + * a number of bytes that is lower or higher than the value returned by {...@link #getSize()}. */ public interface SizeAwareDataSource extends DataSource { /** * Get the size of the data source. * Implementations must return the number of bytes that can be read from * the input stream returned by {...@link #getInputStream()} before reaching - * the end of the stream. + * the end of the stream. If the implementation is unable to determine the + * size, it must return -1. * - * @return the size of the data source + * @return the size of the data source or -1 if the size is not known */ long getSize(); } Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/BufferUtils.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/BufferUtils.java?rev=750669&r1=750668&r2=750669&view=diff ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/BufferUtils.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/BufferUtils.java Thu Mar 5 23:14:56 2009 @@ -279,8 +279,12 @@ } DataSource ds = dh.getDataSource(); if (ds instanceof SizeAwareDataSource) { - return ((SizeAwareDataSource)ds).getSize() > limit ? 1 : 0; - } else if (ds instanceof javax.mail.util.ByteArrayDataSource) { + long size = ((SizeAwareDataSource)ds).getSize(); + if (size != -1) { + return size > limit ? 1 : 0; + } + } + if (ds instanceof javax.mail.util.ByteArrayDataSource) { // Special optimization for JavaMail's ByteArrayDataSource (Axiom's ByteArrayDataSource // already implements SizeAwareDataSource and doesn't need further optimization): // we know that ByteArrayInputStream#available() directly returns the size of the