You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2005/12/16 06:50:27 UTC
svn commit: r357127 - in /webservices/axis2/trunk/java/modules:
core/src/org/apache/axis2/transport/
core/src/org/apache/axis2/transport/http/
integration/test/org/apache/axis2/mtom/ xml/src/org/apache/axis2/om/impl/
xml/src/org/apache/axis2/soap/impl/...
Author: dims
Date: Thu Dec 15 21:50:17 2005
New Revision: 357127
URL: http://svn.apache.org/viewcvs?rev=357127&view=rev
Log:
Fixes for getting UTF-16/MTOM working:
- Added a getReader() in that can check/consume the BOM to find the encoding as well as to create a InputStreamReader based on encoding.
- Get/Set CHARACTER_SET_ENCODING in OperationContext (See AbstractHTTPSender.java and TransportUtils.java) otherwise it is getting lost.
- Switch on UTF-16 in EchoRawMTOMTest.java
- Switch ByteArrayOutputStream in OMOutputImpl to a StringWriter. Since we need a string in MIMEOutputUtils anyway. no point converting back and forth.
(also writing to OutputStream twice in UTF-16 was adding 2 BOM's)
- Roll back previous change to CRLF in writeBodyPart method in MIMEOutputUtils. It was an untested change during hackathon.
- set the character encoding in StAXSOAPModelBuilder.java. Since we later check the character encoding and throw an exception.
Modified:
webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/TransportUtils.java
webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/HTTPTransportUtils.java
webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMTest.java
webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/soap/impl/llom/builder/StAXSOAPModelBuilder.java
webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java
Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/TransportUtils.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/TransportUtils.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/TransportUtils.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/TransportUtils.java Thu Dec 15 21:50:17 2005
@@ -66,6 +66,9 @@
String charSetEnc = (String)msgContext.getProperty(MessageContext.CHARACTER_SET_ENCODING);
if(charSetEnc == null) {
+ charSetEnc = (String)opContext.getProperty(MessageContext.CHARACTER_SET_ENCODING);
+ }
+ if(charSetEnc == null) {
charSetEnc = MessageContext.DEFAULT_CHAR_SET_ENCODING;
}
Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/AbstractHTTPSender.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/AbstractHTTPSender.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/AbstractHTTPSender.java Thu Dec 15 21:50:17 2005
@@ -251,10 +251,10 @@
for (int i = 0; i < headers.length; i++) {
NameValuePair charsetEnc = headers[i]
.getParameterByName(HTTPConstants.CHAR_SET_ENCODING);
+ OperationContext opContext = msgContext
+ .getOperationContext();
if (headers[i].getName().equalsIgnoreCase(
HTTPConstants.HEADER_ACCEPT_MULTIPART_RELATED)) {
- OperationContext opContext = msgContext
- .getOperationContext();
if (opContext != null) {
opContext.setProperty(
HTTPConstants.MTOM_RECIVED_CONTENT_TYPE, header
@@ -262,7 +262,7 @@
}
} else if (charsetEnc != null) {
- msgContext.setProperty(
+ opContext.setProperty(
MessageContext.CHARACTER_SET_ENCODING, charsetEnc
.getValue()); //change to the value, which is text/xml or application/xml+soap
}
Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/HTTPTransportUtils.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/HTTPTransportUtils.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/HTTPTransportUtils.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/HTTPTransportUtils.java Thu Dec 15 21:50:17 2005
@@ -55,6 +55,8 @@
import java.io.OutputStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
+import java.io.PushbackInputStream;
+import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
@@ -340,27 +342,23 @@
fileCacheForAttachments, attachmentRepoDir, attachmentSizeThreshold);
String charSetEncoding = TransportUtils.getCharSetEncoding(mimeHelper.getSOAPPartContentType());
- XMLStreamReader reader;
+ XMLStreamReader streamReader;
if (charSetEncoding == null || "null".equalsIgnoreCase(charSetEncoding)) {
- reader = XMLInputFactory.newInstance()
- .createXMLStreamReader(
- new BufferedReader(new InputStreamReader(mimeHelper
- .getSOAPPartInputStream(),
- charSetEncoding)));
- msgContext.setProperty(MessageContext.CHARACTER_SET_ENCODING, charSetEncoding);
+ charSetEncoding = MessageContext.UTF_8;
+ }
- } else {
- reader = XMLInputFactory.newInstance()
+ try {
+ streamReader = XMLInputFactory.newInstance()
.createXMLStreamReader(
- new BufferedReader(new InputStreamReader(mimeHelper
- .getSOAPPartInputStream())));
- msgContext.setProperty(MessageContext.CHARACTER_SET_ENCODING, MessageContext.UTF_8);
-
+ getReader(mimeHelper.getSOAPPartInputStream(), charSetEncoding));
+ } catch (IOException e) {
+ throw new XMLStreamException(e);
}
+ msgContext.setProperty(MessageContext.CHARACTER_SET_ENCODING, charSetEncoding);
/*
- * put a reference to Attachments in to the message context
- */
+ * put a reference to Attachments in to the message context
+ */
msgContext.setProperty(MTOMConstants.ATTACHMENTS, mimeHelper);
if (mimeHelper.getAttachmentSpecType().equals(MTOMConstants.MTOM_TYPE)) {
/*
@@ -368,17 +366,63 @@
*/
builder =
new MTOMStAXSOAPModelBuilder(
- reader,
+ streamReader,
mimeHelper,
null);
- } else if (
- mimeHelper.getAttachmentSpecType().equals(MTOMConstants.SWA_TYPE)) {
+ } else if (mimeHelper.getAttachmentSpecType().equals(MTOMConstants.SWA_TYPE)) {
builder =
new StAXSOAPModelBuilder(
- reader,
+ streamReader,
SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
}
return builder;
+ }
+
+ private static final int BOM_SIZE = 4;
+
+ /**
+ * Use the BOM Mark to identify the encoding to be used. Fall back to default encoding specified
+ *
+ * @param is
+ * @param charSetEncoding
+ * @return
+ * @throws IOException
+ */
+ private static Reader getReader(InputStream is, String charSetEncoding) throws IOException {
+ PushbackInputStream is2 = new PushbackInputStream(is, BOM_SIZE);
+
+ String encoding;
+ byte bom[] = new byte[BOM_SIZE];
+ int n, unread;
+ n = is2.read(bom, 0, bom.length);
+
+ if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) &&
+ (bom[2] == (byte) 0xBF)) {
+ encoding = "UTF-8";
+ unread = n - 3;
+ } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
+ encoding = "UTF-16BE";
+ unread = n - 2;
+ } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
+ encoding = "UTF-16LE";
+ unread = n - 2;
+ } else if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) &&
+ (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
+ encoding = "UTF-32BE";
+ unread = n - 4;
+ } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) &&
+ (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
+ encoding = "UTF-32LE";
+ unread = n - 4;
+ } else {
+ // Unicode BOM mark not found, unread all bytes
+ encoding = charSetEncoding;
+ unread = n;
+ }
+ if (unread > 0) is2.unread(bom, (n - unread), unread);
+
+ return new BufferedReader(new InputStreamReader(is2,
+ encoding));
}
public static boolean checkEnvelopeForOptimise(SOAPEnvelope envelope) {
Modified: webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMTest.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMTest.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMTest.java (original)
+++ webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMTest.java Thu Dec 15 21:50:17 2005
@@ -19,12 +19,15 @@
import junit.framework.TestCase;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
+import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.attachments.utils.ImageDataSource;
import org.apache.axis2.attachments.utils.ImageIO;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.async.AsyncResult;
import org.apache.axis2.client.async.Callback;
import org.apache.axis2.context.ServiceContext;
+import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.engine.Echo;
import org.apache.axis2.engine.util.TestConstants;
@@ -155,6 +158,9 @@
Options options = new Options();
call.setClientOptions(options);
+ options.setProperty(MessageContext.CHARACTER_SET_ENCODING, "UTF-16");
+ //options.setTimeOutInMilliSeconds(-1);
+ //options.setProperty(HTTPConstants.SO_TIMEOUT,new Integer(Integer.MAX_VALUE));
options.setTo(targetEPR);
options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
options.setListenerTransportProtocol(Constants.TRANSPORT_HTTP);
Modified: webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java (original)
+++ webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java Thu Dec 15 21:50:17 2005
@@ -25,22 +25,23 @@
import javax.mail.internet.MimeBodyPart;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.StringWriter;
import java.util.Iterator;
import java.util.LinkedList;
public class MIMEOutputUtils {
- private static String CRLF = "\r\n";
+ private static byte[] CRLF = { 13, 10 };
private Log log = LogFactory.getLog(getClass());
public static void complete(OutputStream outStream,
- OutputStream bufferedSoapOutStream, LinkedList binaryNodeList,
+ StringWriter writer, LinkedList binaryNodeList,
String boundary, String contentId, String charSetEncoding,String SOAPContentType) {
try {
startWritingMime(outStream, boundary);
- javax.activation.DataHandler dh = new javax.activation.DataHandler(bufferedSoapOutStream.toString(),
- "text/xml");
+ javax.activation.DataHandler dh = new javax.activation.DataHandler(writer.toString(),
+ "text/xml; charset=" + charSetEncoding);
MimeBodyPart rootMimeBodyPart = new MimeBodyPart();
rootMimeBodyPart.setDataHandler(dh);
@@ -50,13 +51,13 @@
rootMimeBodyPart.addHeader("content-transfer-encoding", "binary");
rootMimeBodyPart.addHeader("content-id","<"+contentId+">");
- writeBodyPart(outStream, rootMimeBodyPart, boundary, charSetEncoding);
+ writeBodyPart(outStream, rootMimeBodyPart, boundary);
Iterator binaryNodeIterator = binaryNodeList.iterator();
while (binaryNodeIterator.hasNext()) {
OMText binaryNode = (OMText) binaryNodeIterator.next();
writeBodyPart(outStream, createMimeBodyPart(binaryNode),
- boundary, charSetEncoding);
+ boundary);
}
finishWritingMime(outStream);
} catch (IOException e) {
@@ -106,12 +107,11 @@
*/
public static void writeBodyPart(OutputStream outStream,
MimeBodyPart part,
- String boundary,
- String encoding) throws IOException,
+ String boundary) throws IOException,
MessagingException {
- outStream.write(CRLF.getBytes(encoding));
+ outStream.write(CRLF);
part.writeTo(outStream);
- outStream.write(CRLF.getBytes(encoding));
+ outStream.write(CRLF);
writeMimeBoundary(outStream, boundary);
}
Modified: webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java (original)
+++ webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java Thu Dec 15 21:50:17 2005
@@ -27,6 +27,7 @@
import javax.xml.stream.XMLStreamWriter;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
+import java.io.StringWriter;
import java.util.LinkedList;
@@ -39,7 +40,7 @@
private XMLStreamWriter xmlWriter;
private OutputStream outStream;
private LinkedList binaryNodeList = new LinkedList();
- private ByteArrayOutputStream bufferedSoapOutStream;
+ private StringWriter bufferedSOAPBody;
private OMOutputFormat format = new OMOutputFormat();
public OMOutputImpl(XMLStreamWriter xmlWriter) {
@@ -66,9 +67,8 @@
XMLOutputFactory factory = XMLOutputFactory.newInstance();
if (format.isOptimized()) {
- bufferedSoapOutStream = new ByteArrayOutputStream();
- xmlWriter = factory.createXMLStreamWriter(bufferedSoapOutStream,
- format.getCharSetEncoding());
+ bufferedSOAPBody = new StringWriter();
+ xmlWriter = factory.createXMLStreamWriter(bufferedSOAPBody);
} else {
xmlWriter = factory.createXMLStreamWriter(outStream,
format.getCharSetEncoding());
@@ -86,7 +86,7 @@
}
MIMEOutputUtils.complete(
outStream,
- bufferedSoapOutStream,
+ bufferedSOAPBody,
binaryNodeList,
format.getMimeBoundary(),
format.getRootContentId(),
Modified: webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/soap/impl/llom/builder/StAXSOAPModelBuilder.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/soap/impl/llom/builder/StAXSOAPModelBuilder.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/soap/impl/llom/builder/StAXSOAPModelBuilder.java (original)
+++ webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/soap/impl/llom/builder/StAXSOAPModelBuilder.java Thu Dec 15 21:50:17 2005
@@ -106,6 +106,9 @@
soapFactory = OMAbstractFactory.getDefaultSOAPFactory();
isTempSOAPFactory = true;
soapMessage = soapFactory.createSOAPMessage(this);
+ if(parser.getCharacterEncodingScheme() != null) {
+ document.setCharsetEncoding(parser.getCharacterEncodingScheme());
+ }
identifySOAPVersion(soapVersion);
parseHeaders();
}
Modified: webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java?rev=357127&r1=357126&r2=357127&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java (original)
+++ webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java Thu Dec 15 21:50:17 2005
@@ -65,9 +65,9 @@
MIMEOutputUtils.startWritingMime(outStream, boundary);
MimeBodyPart part1 = MIMEOutputUtils.createMimeBodyPart(textData);
- MIMEOutputUtils.writeBodyPart(outStream, part1, boundary, "UTF-8");
+ MIMEOutputUtils.writeBodyPart(outStream, part1, boundary);
MimeBodyPart part2 = MIMEOutputUtils.createMimeBodyPart(text);
- MIMEOutputUtils.writeBodyPart(outStream, part2, boundary, "UTF-8");
+ MIMEOutputUtils.writeBodyPart(outStream, part2, boundary);
MIMEOutputUtils.finishWritingMime(outStream);
buffer = outStream.toByteArray();
}