You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by sc...@apache.org on 2010/09/22 18:35:29 UTC

svn commit: r1000074 - in /axis/axis2/java/core/trunk/modules/kernel: src/org/apache/axis2/transport/http/SOAPMessageFormatter.java src/org/apache/axis2/util/Utils.java test/org/apache/axis2/misc/MiscTest.java

Author: scheu
Date: Wed Sep 22 16:35:29 2010
New Revision: 1000074

URL: http://svn.apache.org/viewvc?rev=1000074&view=rev
Log:
AXIS2-4828
Committer:Rich Scheuerle
Summary:
Changed SOAPMessageFormatter to use an OutputStream to buffer the data.  This will allow components to access
the OutputStream.
Added a unit validation test.

Modified:
    axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/SOAPMessageFormatter.java
    axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/util/Utils.java
    axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/misc/MiscTest.java

Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/SOAPMessageFormatter.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/SOAPMessageFormatter.java?rev=1000074&r1=1000073&r2=1000074&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/SOAPMessageFormatter.java (original)
+++ axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/SOAPMessageFormatter.java Wed Sep 22 16:35:29 2010
@@ -65,13 +65,22 @@ public class SOAPMessageFormatter implem
 
         try {
             if (!(format.isOptimized()) && format.isDoingSWA()) {
-                StringWriter bufferedSOAPBody = new StringWriter();
+                // Write the SOAPBody to an output stream
+                // (We prefer an OutputStream because it is faster)
+                if (log.isDebugEnabled()) {
+                    log.debug("Doing SWA and the format is not optimized.  Buffer the SOAPBody in an OutputStream");
+                }
+                ByteArrayOutputStream bufferedSOAPBodyBAOS = new ByteArrayOutputStream();
                 if (preserve) {
-                    element.serialize(bufferedSOAPBody, format);
+                    element.serialize(bufferedSOAPBodyBAOS, format);
                 } else {
-                    element.serializeAndConsume(bufferedSOAPBody, format);
+                    element.serializeAndConsume(bufferedSOAPBodyBAOS, format);
                 }
-                writeSwAMessage(msgCtxt, bufferedSOAPBody, out, format);
+                // Convert the ByteArrayOutputStream to StreamWriter so that SWA can 
+                // be added.
+                String bufferedSOAPBody = Utils.BAOS2String(bufferedSOAPBodyBAOS, format.getCharSetEncoding());
+                StringWriter bufferedSOAPBodySW = Utils.String2StringWriter(bufferedSOAPBody);
+                writeSwAMessage(msgCtxt, bufferedSOAPBodySW, out, format);
             } else {
                 if (preserve) {
                     element.serialize(out, format);
@@ -100,12 +109,17 @@ public class SOAPMessageFormatter implem
             ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
             if (!format.isOptimized()) {
                 if (format.isDoingSWA()) {
+                    if (log.isDebugEnabled()) {
+                        log.debug("Doing SWA and the format is not optimized.  Buffer the SOAPBody in an OutputStream");
+                    }
                     // Why are we creating a new OMOutputFormat
                     OMOutputFormat format2 = new OMOutputFormat();
                     format2.setCharSetEncoding(format.getCharSetEncoding());
-                    StringWriter bufferedSOAPBody = new StringWriter();
-                    element.serializeAndConsume(bufferedSOAPBody, format2);
-                    writeSwAMessage(msgCtxt, bufferedSOAPBody, bytesOut, format);
+                    ByteArrayOutputStream bufferedSOAPBodyBAOS = new ByteArrayOutputStream();
+                    element.serializeAndConsume(bufferedSOAPBodyBAOS, format2);
+                    String bufferedSOAPBody = Utils.BAOS2String(bufferedSOAPBodyBAOS, format2.getCharSetEncoding());
+                    StringWriter bufferedSOAPBodySW = Utils.String2StringWriter(bufferedSOAPBody);
+                    writeSwAMessage(msgCtxt, bufferedSOAPBodySW, bytesOut, format);
                 } else {
                     element.serializeAndConsume(bytesOut, format);
                 }

Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/util/Utils.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/util/Utils.java?rev=1000074&r1=1000073&r2=1000074&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/util/Utils.java (original)
+++ axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/util/Utils.java Wed Sep 22 16:35:29 2010
@@ -57,7 +57,11 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import javax.xml.namespace.QName;
+
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedExceptionAction;
@@ -653,6 +657,36 @@ public class Utils {
     private static boolean isIP(String hostAddress) {
         return hostAddress.split("[.]").length == 4;
     }
+    
+    /**
+     * Convert ByteArrayOutputStream to String
+     * @param baos ByteArrayOutputStream
+     * @param charset
+     * @return String
+     */
+    public static String BAOS2String(ByteArrayOutputStream baos, String charset) {
+        try {
+            return baos.toString(charset);
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    /**
+     * Convert String into a StringWriter
+     * @param input String
+     * @return StringWriter
+     */
+    public static StringWriter String2StringWriter(String input) {
+        StringWriter sw = null;
+        if (input == null || input.length() == 0) {
+            sw = new StringWriter();
+        } else {
+            sw = new StringWriter(input.length());
+            sw.append(input);
+        }
+        return sw;
+    }
 
     /**
      * Get the scheme part from a URI (or URL).

Modified: axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/misc/MiscTest.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/misc/MiscTest.java?rev=1000074&r1=1000073&r2=1000074&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/misc/MiscTest.java (original)
+++ axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/misc/MiscTest.java Wed Sep 22 16:35:29 2010
@@ -21,7 +21,10 @@ package org.apache.axis2.misc;
 
 import org.apache.axis2.AbstractTestCase;
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.util.Utils;
 
+import java.io.ByteArrayOutputStream;
+import java.io.StringWriter;
 import java.lang.reflect.InvocationTargetException;
 
 public class MiscTest extends AbstractTestCase {
@@ -41,4 +44,24 @@ public class MiscTest extends AbstractTe
         e = new AxisFault("");
     }
 
+    public void testStringWriterConversion() throws Exception {
+        String input = " Some text \u00df with \u00fc special \u00f6 chars \u00e4. \n";
+        
+        String charset = "utf-8";
+        byte[] bytes = input.getBytes(charset);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        baos.write(bytes);
+        baos.flush();
+        StringWriter sw = Utils.String2StringWriter(Utils.BAOS2String(baos, charset));
+        assertTrue(input.equals(sw.toString()));
+        
+        charset = "utf-16";
+        bytes = input.getBytes(charset);
+        baos = new ByteArrayOutputStream();
+        baos.write(bytes);
+        baos.flush();
+        sw = Utils.String2StringWriter(Utils.BAOS2String(baos, charset));
+        assertTrue(input.equals(sw.toString()));
+       
+    }
 }