Author: nthaker
Date: Wed Apr  9 12:42:39 2008
New Revision: 646502

URL: http://svn.apache.org/viewvc?rev=646502&view=rev
Log:
WSCOMMONS-313

Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/attachments/impl/BufferUtils.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/attachments/impl/BufferUtilsTests.java

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=646502&r1=646501&r2=646502&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
 Wed Apr  9 12:42:39 2008
@@ -16,7 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.axiom.attachments.impl;
 
 import java.io.FileOutputStream;
@@ -27,13 +26,19 @@
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
 
+import javax.activation.DataHandler;
+
+import org.apache.axiom.om.OMException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 /**
  * Attachment processing uses a lot of buffers.
  * The BufferUtils class attempts to reuse buffers to prevent 
  * excessive GarbageCollection
  */
 public class BufferUtils {
-    
+    private static Log log = LogFactory.getLog(BufferUtils.class);
     // Performance testing indicates that 4K is the best size for medium
     // and small payloads.  And there is a neglible effect on large payloads.
     static int BUFFER_LEN = 4 * 1024;         // Copy Buffer size
@@ -181,6 +186,80 @@
            releaseTempByteBuffer(bb);
         }
         return true;
+    }
+    /**
+     * The method checks to see if attachment is eligble for optimization.
+     * An attachment is eligible for optimization if and only if the size of 
+     * the attachment is greated then the optimzation threshold size limit. 
+     * if the Content represented by DataHandler has size less than the 
+     * optimize threshold size, the attachment will not be eligible for 
+     * optimization, instead it will be inlined.
+     * returns 1 if DataHandler data is bigger than limit.
+     * returns 0 if DataHandler data is smaller.
+     * return -1 if an error occurs or unsupported.
+     * @param in
+     * @return
+     * @throws IOException
+     */
+    public static int doesDataHandlerExceedLimit(DataHandler dh, long limit){
+        if(log.isDebugEnabled()){
+            log.debug("start isEligibleForOptimization");
+        }
+        //If Optimized Threshold not set return true.
+        if(limit==0){
+            if(log.isDebugEnabled()){
+                log.debug("optimizedThreshold not set");
+            }
+            return -1;
+        }
+        InputStream in = getInputStream(dh);
+        if(in == null){
+            if(log.isDebugEnabled()){
+                log.debug("Input Stream is null");
+            }
+            return -1;
+        }
+        
+        //read bytes from input stream to check if 
+        //attachment size is greater than the optimized size.        
+        int totalRead = 0;
+        try{
+            do{
+                byte[] buffer = getTempBuffer();
+                int bytesRead = in.read(buffer, 0, BUFFER_LEN);
+                totalRead = totalRead+bytesRead;
+                releaseTempBuffer(buffer);
+            }while((limit>totalRead) && (in.available()>0));
+            
+            if(totalRead > limit){
+                if(log.isDebugEnabled()){
+                    log.debug("Attachment size greater than limit");
+                }
+                return 1;
+            }
+        }catch(IOException e){
+            return -1;
+        }
+        
+        if(log.isDebugEnabled()){
+            log.debug("Attachment Size smaller than limit");
+        }
+        
+        return 0;        
+    }
+    
+    private static java.io.InputStream getInputStream(DataHandler 
dataHandlerObject) throws OMException {
+        InputStream inStream;
+        javax.activation.DataHandler dataHandler =
+            (javax.activation.DataHandler) dataHandlerObject;
+        try {
+            inStream = dataHandler.getDataSource().getInputStream();
+        } catch (IOException e) {
+            throw new OMException(
+                "Cannot get InputStream from DataHandler." + e);
+        }
+        return inStream;
+
     }
     
     private static synchronized byte[] getTempBuffer() {

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java?rev=646502&r1=646501&r2=646502&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMOutputFormat.java
 Wed Apr  9 12:42:39 2008
@@ -19,6 +19,8 @@
 
 package org.apache.axiom.om;
 
+import java.util.HashMap;
+
 import org.apache.axiom.om.impl.MTOMConstants;
 import org.apache.axiom.om.util.UUIDGenerator;
 import org.apache.axiom.soap.SOAP11Constants;
@@ -26,8 +28,6 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import java.util.HashMap;
-
 
 /**
  * Formats options for OM Output.
@@ -46,7 +46,8 @@
     private boolean doOptimize = false;
     private boolean doingSWA = false;
     private boolean isSoap11 = true;
-
+    private long optimizedThreshold = 0;
+    
     /** Field DEFAULT_CHAR_SET_ENCODING. Specifies the default character 
encoding scheme to be used. */
     public static final String DEFAULT_CHAR_SET_ENCODING = "utf-8";
 
@@ -337,11 +338,21 @@
         // TODO Print all properties
         sb.append(" actionProperty=");
         sb.append(getProperty(ACTION_PROPERTY));
+
+        sb.append(" optimizedThreshold=");
+        sb.append(optimizedThreshold);
         
         sb.append("]");
         return sb.toString();
         
     }
+
+    public void setOptimizedThreshold(long optimizedThreshold) {
+        this.optimizedThreshold = optimizedThreshold;
+    }
     
+    public long getOptimizedThreshold() {
+        return optimizedThreshold;
+    }
     
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java?rev=646502&r1=646501&r2=646502&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
 Wed Apr  9 12:42:39 2008
@@ -19,25 +19,28 @@
 
 package org.apache.axiom.om.impl;
 
-import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMOutputFormat;
-import org.apache.axiom.om.OMText;
-import org.apache.axiom.om.util.StAXUtils;
-import org.apache.axiom.soap.SOAP11Constants;
-import org.apache.axiom.soap.SOAP12Constants;
-import org.apache.axiom.attachments.ByteArrayDataSource;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.LinkedList;
 
+import javax.activation.DataHandler;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.FactoryConfigurationError;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.LinkedList;
+import org.apache.axiom.attachments.impl.BufferUtils;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axiom.om.OMText;
+import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axiom.soap.SOAP11Constants;
+import org.apache.axiom.soap.SOAP12Constants;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 
 /**
@@ -48,6 +51,9 @@
  * optimizable content.
  */
 public class MTOMXMLStreamWriter implements XMLStreamWriter {
+    private static Log log = LogFactory.getLog(MTOMXMLStreamWriter.class);
+    private final static int UNSUPPORTED = -1;
+    private final static int EXCEED_LIMIT = 1;
     private XMLStreamWriter xmlWriter;
     private OutputStream outStream;
     private LinkedList binaryNodeList = new LinkedList();
@@ -268,7 +274,33 @@
     }
 
     public void writeOptimized(OMText node) {
-        binaryNodeList.add(node);
+        if(log.isDebugEnabled()){
+            log.debug("Start MTOMXMLStreamWriter.writeOptimized()");
+        }
+        DataHandler dh = (DataHandler)node.getDataHandler();
+        int optimized = UNSUPPORTED;
+        if(dh!=null){
+            if(log.isDebugEnabled()){
+                log.debug("DataHandler fetched, starting optimized Threshold 
processing");
+            }
+            optimized= BufferUtils.doesDataHandlerExceedLimit(dh, 
format.getOptimizedThreshold());
+        }
+        if(optimized == UNSUPPORTED || optimized == EXCEED_LIMIT){
+            if(log.isDebugEnabled()){
+                log.debug("node added to binart NodeList for optimization");
+            }
+            binaryNodeList.add(node);    
+        }
+        else{
+            try{
+                writeOutput(node);
+            }catch(XMLStreamException e){
+                throw new RuntimeException("XMLStreamException in 
writeOutput() call", e);
+            }
+        }
+        if(log.isDebugEnabled()){
+            log.debug("Exit MTOMXMLStreamWriter.writeOptimized()");
+        }
     }
 
     public void setXmlStreamWriter(XMLStreamWriter xmlWriter) {
@@ -356,5 +388,22 @@
             this.flush();
         }
         return os;
+    }
+    
+    /**
+     * Writes the relevant output.
+     *
+     * @param writer
+     * @throws XMLStreamException
+     */
+    private void writeOutput(OMText textNode) throws XMLStreamException {
+        int type = textNode.getType();
+        if (type == OMNode.TEXT_NODE || type == OMNode.SPACE_NODE) {
+            writeCharacters(textNode.getText());
+        } else if (type == OMNode.CDATA_SECTION_NODE) {
+            writeCData(textNode.getText());
+        } else if (type == OMNode.ENTITY_REFERENCE_NODE) {
+            writeEntityRef(textNode.getText());
+        }
     }
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/attachments/impl/BufferUtilsTests.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/attachments/impl/BufferUtilsTests.java?rev=646502&r1=646501&r2=646502&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/attachments/impl/BufferUtilsTests.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/attachments/impl/BufferUtilsTests.java
 Wed Apr  9 12:42:39 2008
@@ -16,13 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.axiom.attachments.impl;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
+
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import javax.activation.MimeType;
 
 import junit.framework.TestCase;
 
@@ -77,4 +81,41 @@
         file.delete();
     }
     
+    public void testDataSourceBackedDataHandlerExceedLimit(){
+        String 
imgFileLocation="modules/axiom-tests/test-resources/mtom/img/test2.jpg";
+        try{
+            String baseDir = new 
File(System.getProperty("basedir",".")).getCanonicalPath();
+            imgFileLocation = new File(baseDir +File.separator+ 
imgFileLocation).getAbsolutePath();
+        }catch(IOException e){
+            e.printStackTrace();
+            fail();
+        }
+        
+        File imgFile = new File(imgFileLocation);
+        FileDataSource fds = new FileDataSource(imgFile);
+        DataHandler dh = new DataHandler(fds);
+        int unsupported= BufferUtils.doesDataHandlerExceedLimit(dh, 0);
+        assertEquals(unsupported, -1);
+        int doesExceed = BufferUtils.doesDataHandlerExceedLimit(dh, 1000);
+        assertEquals(doesExceed, 1);
+        int doesNotExceed = BufferUtils.doesDataHandlerExceedLimit(dh, 100000);
+        assertEquals(doesNotExceed, 0);
+        
+    }
+    public void testObjectBackedDataHandlerExceedLimit(){
+        String str = "This is a test String";
+        try{
+            DataHandler dh = new DataHandler(str, "text/plain");          
+            int unsupported= BufferUtils.doesDataHandlerExceedLimit(dh, 0);
+            assertEquals(unsupported, -1);
+            int doesExceed = BufferUtils.doesDataHandlerExceedLimit(dh, 10);
+            assertEquals(doesExceed, 1);
+            int doesNotExceed = BufferUtils.doesDataHandlerExceedLimit(dh, 
100);
+            assertEquals(doesNotExceed, 0);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+        
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to