You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ve...@apache.org on 2008/12/01 12:25:56 UTC

svn commit: r722038 - /webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPMessageImpl.java

Author: veithen
Date: Mon Dec  1 03:25:48 2008
New Revision: 722038

URL: http://svn.apache.org/viewvc?rev=722038&view=rev
Log:
Changed SOAPMessageImpl#writeTo(OutputStream) so that it conforms to the SAAJ specs, i.e. outputs a MIME-encoded byte stream if there are attachments.

Modified:
    webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPMessageImpl.java

Modified: webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPMessageImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPMessageImpl.java?rev=722038&r1=722037&r2=722038&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPMessageImpl.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPMessageImpl.java Mon Dec  1 03:25:48 2008
@@ -19,11 +19,17 @@
 
 package org.apache.axis2.saaj;
 
+import org.apache.axiom.attachments.ByteArrayDataSource;
 import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axiom.om.impl.MIMEOutputUtils;
+import org.apache.axiom.soap.SOAP11Constants;
+import org.apache.axiom.soap.SOAP12Constants;
+import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.impl.dom.soap11.SOAP11Factory;
 import org.apache.axiom.soap.impl.dom.soap12.SOAP12Factory;
 import org.apache.axis2.transport.http.HTTPConstants;
 
+import javax.activation.DataHandler;
 import javax.xml.soap.AttachmentPart;
 import javax.xml.soap.MimeHeader;
 import javax.xml.soap.MimeHeaders;
@@ -33,6 +39,8 @@
 import javax.xml.soap.SOAPHeader;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.soap.SOAPPart;
+
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -40,12 +48,13 @@
 import java.util.Collection;
 import java.util.Hashtable;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 public class SOAPMessageImpl extends SOAPMessage {
 
     private SOAPPart soapPart;
-    private Collection attachmentParts = new ArrayList();
+    private Collection<AttachmentPart> attachmentParts = new ArrayList<AttachmentPart>();
     private MimeHeadersEx mimeHeaders;
 
     private Map props = new Hashtable();
@@ -288,7 +297,8 @@
     public void writeTo(OutputStream out) throws SOAPException, IOException {
         try {
             OMOutputFormat format = new OMOutputFormat();
-            format.setCharSetEncoding((String)getProperty(CHARACTER_SET_ENCODING));
+            String enc = (String)getProperty(CHARACTER_SET_ENCODING);
+            format.setCharSetEncoding(enc != null ? enc : OMOutputFormat.DEFAULT_CHAR_SET_ENCODING);
             String writeXmlDecl = (String)getProperty(WRITE_XML_DECLARATION);
             if (writeXmlDecl == null || writeXmlDecl.equals("false")) {
 
@@ -296,8 +306,27 @@
                 format.setIgnoreXMLDeclaration(true);
             }
 
-            //the writeTo method forces the elements to be built!!!
-            ((SOAPEnvelopeImpl)soapPart.getEnvelope()).getOMEnvelope().serialize(out, format);
+            SOAPEnvelope envelope = ((SOAPEnvelopeImpl)soapPart.getEnvelope()).getOMEnvelope();
+            if (attachmentParts.isEmpty()) {
+                envelope.serialize(out, format);
+            } else {
+                format.setSOAP11(((SOAPEnvelopeImpl)soapPart.getEnvelope()).getOMFactory()
+                        instanceof SOAP11Factory);
+                Map<String,DataHandler> attachmentsMap = new LinkedHashMap<String,DataHandler>();
+                for (AttachmentPart ap : attachmentParts) {
+                    attachmentsMap.put(ap.getContentId(), ap.getDataHandler());
+                }
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                envelope.serialize(baos);
+                String contentType =
+                        (format.isSOAP11() ? SOAP11Constants.SOAP_11_CONTENT_TYPE :
+                                             SOAP12Constants.SOAP_12_CONTENT_TYPE)
+                        + "; charset=" + format.getCharSetEncoding();
+                DataHandler rootDataHandler =
+                        new DataHandler(new ByteArrayDataSource(baos.toByteArray(), contentType));
+                MIMEOutputUtils.writeDataHandlerWithAttachmentsMessage(rootDataHandler,
+                        contentType, out, attachmentsMap, format);
+            }
             saveChanges();
         } catch (Exception e) {
             throw new SOAPException(e);