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())); + + } }