Author: asankha
Date: Fri Sep 12 09:22:45 2008
New Revision: 694732

URL: http://svn.apache.org/viewvc?rev=694732&view=rev
Log:
support multipart/mixed and multipart/alternative mail messages

Modified:
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java
    
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailTransportListener.java
    
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailUtils.java
    
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/PollTableEntry.java

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java?rev=694732&r1=694731&r2=694732&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java
 Fri Sep 12 09:22:45 2008
@@ -174,7 +174,10 @@
         Attachments attachments = ori.getAttachmentMap();
         if (attachments != null && attachments.getAllContentIDs().length > 0) {
             String[] cIDs = attachments.getAllContentIDs();
-            String soapPart = attachments.getSOAPPartContentID();
+            String soapPart = null;
+            try {
+                soapPart = attachments.getSOAPPartContentID();
+            } catch (Exception ignore) {}
             for (String cID : cIDs) {
                 if (!cID.equals(soapPart)) {
                     newMC.addAttachment(cID, attachments.getDataHandler(cID));

Modified: 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailTransportListener.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailTransportListener.java?rev=694732&r1=694731&r2=694732&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailTransportListener.java
 (original)
+++ 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailTransportListener.java
 Fri Sep 12 09:22:45 2008
@@ -57,6 +57,7 @@
 
     public static final String DELETE = "DELETE";
     public static final String MOVE = "MOVE";
+    public static final String LEAVE = "LEAVE";
 
     /**
      * Initializes the Mail transport
@@ -394,12 +395,16 @@
                 case PollTableEntry.SUCCSESSFUL:
                     if (entry.getActionAfterProcess() == PollTableEntry.MOVE) {
                         moveToFolder = entry.getMoveAfterProcess();
+                    } else if (entry.getActionAfterProcess() == 
PollTableEntry.LEAVE) {
+                        return;
                     }
                     break;
 
                 case PollTableEntry.FAILED:
                     if (entry.getActionAfterFailure() == PollTableEntry.MOVE) {
                         moveToFolder = entry.getMoveAfterFailure();
+                    } else if (entry.getActionAfterFailure() == 
PollTableEntry.LEAVE) {
+                        return;
                     }
                     break;
                 case PollTableEntry.NONE:
@@ -469,11 +474,13 @@
             String option = ParamUtils.getOptionalParam(
                 service, MailConstants.TRANSPORT_MAIL_ACTION_AFTER_PROCESS);
             entry.setActionAfterProcess(
-                MOVE.equals(option) ? PollTableEntry.MOVE : 
PollTableEntry.DELETE);
+                MOVE.equals(option) ? PollTableEntry.MOVE :
+                LEAVE.equals(option) ? PollTableEntry.LEAVE : 
PollTableEntry.DELETE);
             option = ParamUtils.getOptionalParam(
                 service, MailConstants.TRANSPORT_MAIL_ACTION_AFTER_FAILURE);
             entry.setActionAfterFailure(
-                MOVE.equals(option) ? PollTableEntry.MOVE : 
PollTableEntry.DELETE);
+                MOVE.equals(option) ? PollTableEntry.MOVE :
+                LEAVE.equals(option) ? PollTableEntry.LEAVE : 
PollTableEntry.DELETE);
 
             String moveFolderAfterProcess = ParamUtils.getOptionalParam(
                 service, MailConstants.TRANSPORT_MAIL_MOVE_AFTER_PROCESS);

Modified: 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailUtils.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailUtils.java?rev=694732&r1=694731&r2=694732&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailUtils.java
 (original)
+++ 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/MailUtils.java
 Fri Sep 12 09:22:45 2008
@@ -20,20 +20,39 @@
 package org.apache.synapse.transport.mail;
 
 import org.apache.synapse.transport.base.BaseUtils;
+import org.apache.synapse.transport.base.BaseConstants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.commons.lang.StringUtils;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAP11Constants;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
+import org.apache.axiom.om.impl.builder.StAXBuilder;
+import org.apache.axiom.om.impl.llom.OMTextImpl;
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.builder.BuilderUtil;
 
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import javax.mail.Multipart;
+import javax.mail.Part;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeBodyPart;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.IOException;
+import javax.mail.internet.ContentType;
+import javax.mail.internet.ParseException;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.activation.DataHandler;
+
+import java.io.*;
+import java.util.List;
+import java.util.ArrayList;
 
 public class MailUtils extends BaseUtils {
 
@@ -145,4 +164,161 @@
         }
     }
 
+    @Override
+    public void setSOAPEnvelope(Object message, MessageContext msgContext, 
String contentType) throws AxisFault {
+
+        if (message instanceof MimeMessage &&
+            (contentType.toLowerCase().contains("multipart/alternative") ||
+             contentType.toLowerCase().contains("multipart/mixed"))) {
+
+            MultipartParser mp = new MultipartParser((MimeMessage) message);
+            try {
+                mp.parse();
+            } catch (Exception e) {
+                throw new AxisFault("Error parsing multipart message", e);
+            }
+
+            SOAPFactory soapFactory = new SOAP11Factory();
+            SOAPEnvelope envelope = null;
+            StAXBuilder builder = null;
+            String charSetEnc = null;
+
+            try {
+                if (mp.getMainTextContentType() != null) {
+                    charSetEnc = new 
ContentType(mp.getMainTextContentType()).getParameter("charset");
+                }
+            } catch (ParseException ignore) {
+                charSetEnc = MessageContext.DEFAULT_CHAR_SET_ENCODING;
+            }
+
+            try {
+                // select primary message - in the following order of priority
+                // SOAP 1.2, SOAP 1.1 / POX, text/plain, text/html
+                if 
(mp.getMainTextContentType().contains(SOAP12Constants.SOAP_12_CONTENT_TYPE) ||
+                    
mp.getMainTextContentType().contains((SOAP11Constants.SOAP_11_CONTENT_TYPE))) {
+                    builder = BuilderUtil.getSOAPBuilder(
+                        new 
ByteArrayInputStream(mp.getMainText().getBytes(charSetEnc)), charSetEnc);
+                    envelope = (SOAPEnvelope) builder.getDocumentElement();
+
+                } else if 
(mp.getMainTextContentType().toLowerCase().contains(("text/plain"))) {
+
+                    // pick the name of the element that will act as the 
wrapper element for the
+                    // non-xml payload. If service doesn't define one, default
+                    Parameter wrapperParam = msgContext.getAxisService().
+                        getParameter(BaseConstants.WRAPPER_PARAM);
+
+                    QName wrapperQName = null;
+                    OMElement wrapper = null;
+                    if (wrapperParam != null) {
+                        wrapperQName = 
BaseUtils.getQNameFromString(wrapperParam.getValue());
+                    }
+
+                    OMTextImpl textData = (OMTextImpl) 
soapFactory.createOMText(mp.getMainText());
+
+                    if (wrapperQName == null) {
+                        wrapperQName = BaseConstants.DEFAULT_TEXT_WRAPPER;
+                    }
+                    wrapper = soapFactory.createOMElement(wrapperQName, null);
+                    wrapper.addChild(textData);
+
+                    envelope = soapFactory.getDefaultEnvelope();
+                    envelope.getBody().addChild(wrapper);
+                }
+            } catch (XMLStreamException e) {
+                handleException("Error building SOAP or POX payload", e);
+            } catch (UnsupportedEncodingException e) {
+                handleException("Encoding error building SOAP or POX payload", 
e);
+            }
+
+            // Set the encoding scheme in the message context
+            
msgContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, 
charSetEnc);
+
+            String charEncOfMessage =
+                builder == null ? null :
+                    builder.getDocument() == null ? null : 
builder.getDocument().getCharsetEncoding();
+
+            if (StringUtils.isNotBlank(charEncOfMessage) &&
+                StringUtils.isNotBlank(charSetEnc) &&
+                !charSetEnc.equalsIgnoreCase(charEncOfMessage)) {
+                handleException("Charset encodings differs from whats used in 
the payload");
+            }
+
+            msgContext.setEnvelope(envelope);
+
+            int cid = 1;
+            for (DataHandler dh : mp.getAttachments()) {
+                msgContext.addAttachment(Integer.toString(cid++), dh);
+            }
+
+        } else {
+            super.setSOAPEnvelope(message, msgContext, contentType);
+        }
+    }
+
+    private class MultipartParser {
+
+        final MimeMessage msg;
+        private String mainText = null;
+        private String mainTextContentType = null;
+        private List<DataHandler> attachments = new ArrayList<DataHandler>();
+
+        MultipartParser(MimeMessage msg) {
+            this.msg = msg;
+        }
+
+        public void parse() throws MessagingException, IOException {
+            Multipart mp = (Multipart) msg.getContent();
+            for (int i=0; i<mp.getCount(); i++) {
+                buildContentMap(mp.getBodyPart(i));
+            }
+        }
+
+        private void buildContentMap(Part p) throws MessagingException, 
IOException {
+
+            if (p.isMimeType("multipart/alternative")) {
+
+                Multipart mp = (Multipart) p.getContent();
+                for (int i = 0; i < mp.getCount(); i++) {
+
+                    Part bp = mp.getBodyPart(i);
+                    processBodyPart(bp);
+                }
+
+            } else if (p.isMimeType("multipart/*")) {
+                Multipart mp = (Multipart) p.getContent();
+                for (int i = 0; i < mp.getCount(); i++) {
+                    buildContentMap(mp.getBodyPart(i));
+                }
+
+            } else {
+                processBodyPart(p);
+            }
+        }
+
+        private void processBodyPart(Part bp) throws MessagingException, 
IOException {
+            if (bp.isMimeType(SOAP12Constants.SOAP_12_CONTENT_TYPE) ||
+                bp.isMimeType(SOAP11Constants.SOAP_11_CONTENT_TYPE) ||
+                bp.isMimeType("text/plain")) {
+
+                if (mainText == null) {
+                    mainText = (String) bp.getContent();
+                    mainTextContentType = bp.getContentType();
+                }
+            } else {
+                attachments.add(bp.getDataHandler());
+            }
+        }
+
+        public String getMainText() {
+            return mainText;
+        }
+
+        public String getMainTextContentType() {
+            return mainTextContentType;
+        }
+
+        public List<DataHandler> getAttachments() {
+            return attachments;
+        }
+    }
 }

Modified: 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/PollTableEntry.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/PollTableEntry.java?rev=694732&r1=694731&r2=694732&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/PollTableEntry.java
 (original)
+++ 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/mail/PollTableEntry.java
 Fri Sep 12 09:22:45 2008
@@ -40,6 +40,7 @@
     // operation after mail check
     public static final int DELETE = 0;
     public static final int MOVE   = 1;
+    public static final int LEAVE  = 2;
 
     /** The email address mapped to the service */
     private InternetAddress emailAddress = null;


Reply via email to