Author: hansbak
Date: Thu Nov 23 22:42:24 2006
New Revision: 478781

URL: http://svn.apache.org/viewvc?view=rev&rev=478781
Log:
system now accepts incoming email messages with multilevel multiparts

Modified:
    
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailServices.java
    
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailWorker.java

Modified: 
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailServices.java
URL: 
http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailServices.java?view=diff&rev=478781&r1=478780&r2=478781
==============================================================================
--- 
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailServices.java
 (original)
+++ 
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailServices.java
 Thu Nov 23 22:42:24 2006
@@ -642,6 +642,53 @@
         
         return allResults;
     }
+
+    public static String contentIndex = "";
+    private static Map addMessageBody( Map commEventMap, Multipart multipart) 
+       throws MessagingException, IOException {
+       try {
+               int multipartCount = multipart.getCount();
+               for (int i=0; i < multipartCount  && i < 10; i++) { 
+                       Part part = multipart.getBodyPart(i);
+                       String thisContentTypeRaw = part.getContentType();
+                       String content = null;
+                       int idx2 = thisContentTypeRaw.indexOf(";");
+                       if (idx2 == -1) idx2 = thisContentTypeRaw.length();
+                       String thisContentType = 
thisContentTypeRaw.substring(0, idx2);
+                       if (thisContentType == null || 
thisContentType.equals("")) thisContentType = "text/html";
+                       String disposition = part.getDisposition();
+
+                       if (thisContentType.startsWith("multipart") || 
thisContentType.startsWith("Multipart")) {
+                                       contentIndex = contentIndex.concat("." 
+ i);
+                               return addMessageBody(commEventMap, (Multipart) 
part.getContent());
+                       }
+                       // See this case where the disposition of the inline 
text is null
+                       else if ((disposition == null) && (i == 0) && 
thisContentType.startsWith("text")) {
+                               content = (String)part.getContent();
+                               if (UtilValidate.isNotEmpty(content)) {
+                                       contentIndex = contentIndex.concat("." 
+ i);
+                                       commEventMap.put("content", content);
+                                       commEventMap.put("contentMimeTypeId", 
thisContentType);
+                                       return commEventMap;
+                               }
+                       } else if ((disposition != null)
+                                       && (disposition.equals(Part.ATTACHMENT) 
|| disposition.equals(Part.INLINE))
+                                       && thisContentType.startsWith("text")) {
+                                       contentIndex = contentIndex.concat("." 
+ i);
+                               commEventMap.put("content", part.getContent());
+                               commEventMap.put("contentMimeTypeId", 
thisContentType);
+                               return commEventMap;
+                       }
+               }
+               return commEventMap;
+       } catch (MessagingException e) {
+               Debug.logError(e, module);
+               return ServiceUtil.returnError(e.getMessage());
+        } catch (IOException e) {
+            Debug.logError(e, module);
+            return ServiceUtil.returnError(e.getMessage());
+        }
+    }
     
     /**
      * This service is the main one for processing incoming emails.
@@ -665,7 +712,9 @@
      * CommunicationEvent.content field) are cycled thru and attached to the 
CommunicationEvent entity using the 
      * createCommContentDataResource service. This happens in the 
EmailWorker.addAttachmentsToCommEvent method.
      * 
-     * -Al Byers
+     * However multiparts can contain multiparts. A recursive function has 
been added.
+     * 
+     * -Al Byers - Hans Bakker
      * @param dctx
      * @param context
      * @return
@@ -681,7 +730,6 @@
         String partyIdTo = null;
         String partyIdFrom = null;
         String contentType = null;
-        String content = null;
                String communicationEventId = null;
         String contactMechIdFrom = null;
         String contactMechIdTo = null;
@@ -770,42 +818,13 @@
                commEventMap.put("datetimeEnded", 
UtilDateTime.toTimestamp(message.getReceivedDate()));
 
             // get the content(type) part
-               int contentIndex = -1;
-                       Multipart multipart = null;
                if (contentType.startsWith("text")) {
-                       content = (String)message.getContent();
+                       commEventMap.put("content", message.getContent());
                        commEventMap.put("contentMimeTypeId", contentType);
                } else if (contentType.startsWith("multipart") || 
contentType.startsWith("Multipart")) {
-                       multipart = (Multipart) message.getContent();
-                       int multipartCount = multipart.getCount();
-                       for (int i=0; i < multipartCount; i++) {
-                               Part part = multipart.getBodyPart(i);
-                               String thisContentTypeRaw = 
part.getContentType();
-                   int idx2 = thisContentTypeRaw.indexOf(";");
-                    if (idx2 == -1) idx2 = thisContentTypeRaw.length();
-                   String thisContentType = thisContentTypeRaw.substring(0, 
idx2);
-                    if (thisContentType == null || thisContentType.equals("")) 
thisContentType = "text/html";
-                    String disposition = part.getDisposition();
-                               
-                               // See this case where the disposition of the 
inline text is null
-                               if ((disposition == null) && (i == 0) && 
thisContentType.startsWith("text")) {
-                                       content = (String)part.getContent();
-                                       if (UtilValidate.isNotEmpty(content)) {
-                                               contentIndex = i;
-                                               
commEventMap.put("contentMimeTypeId", thisContentType);
-                                               break;
-                                       }
-                               } else if ((disposition != null)
-                                                && 
(disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))
-                                            && 
thisContentType.startsWith("text")) {
-                                       content = (String)part.getContent();
-                                       contentIndex = i;
-                                       commEventMap.put("contentMimeTypeId", 
thisContentType);
-                                       break;
-                               }
-                       }                       
-               }
-               commEventMap.put("content", content);
+                       contentIndex = "";
+                       commEventMap = addMessageBody(commEventMap, (Multipart) 
message.getContent());
+               }                       
                
             // store from/to parties, but when not found make a note of the 
email to/from address in the workEffort Note Section.
             String commNote = "";
@@ -844,10 +863,9 @@
                result = dispatcher.runSync("createCommunicationEvent", 
commEventMap);
                communicationEventId = 
(String)result.get("communicationEventId");
             
-               // 'system' Id has no partyId but needed for prefix generation 
of the creation of related contentId and dataresourceId.
             // store attachements
                if (contentType.startsWith("multipart") || 
contentType.startsWith("Multipart")) {
-                       int attachmentCount = 
EmailWorker.addAttachmentsToCommEvent(message, communicationEventId, 
contentIndex, dispatcher, userLogin);
+                       int attachmentCount = 
EmailWorker.addAttachmentsToCommEvent(message, communicationEventId, 
dispatcher, userLogin);
                        if (Debug.infoOn()) Debug.logInfo(attachmentCount + " 
attachments added to CommunicationEvent:" + communicationEventId,module);
                }
             

Modified: 
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailWorker.java
URL: 
http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailWorker.java?view=diff&rev=478781&r1=478780&r2=478781
==============================================================================
--- 
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailWorker.java
 (original)
+++ 
incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email/EmailWorker.java
 Thu Nov 23 22:42:24 2006
@@ -30,6 +30,7 @@
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.service.LocalDispatcher;
 import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.ServiceUtil;
 import org.ofbiz.entity.util.ByteWrapper;
 
 public class EmailWorker {
@@ -43,9 +44,8 @@
        return fieldValue;
     }
     
-    public static int addAttachmentsToCommEvent(MimeMessage message, String 
communicationEventId, int bodyContentIndex, LocalDispatcher dispatcher, 
GenericValue userLogin) 
+    public static int addAttachmentsToCommEvent(MimeMessage message, String 
communicationEventId, LocalDispatcher dispatcher, GenericValue userLogin) 
        throws MessagingException, IOException, GenericServiceException {
-       int attachmentCount =0;
        Map commEventMap = new HashMap();
        commEventMap.put("communicationEventId", communicationEventId);
        commEventMap.put("contentTypeId", "DOCUMENT");
@@ -55,55 +55,76 @@
                if (subject != null && subject.length() > 80) { 
                        subject = subject.substring(0,80); // make sure not too 
big for database field. (20 characters for filename)
                }
-               ByteArrayOutputStream baos = new ByteArrayOutputStream();
-       
-               Multipart multipart = (Multipart)message.getContent();
-               int multipartCount = multipart.getCount();
-               for (int i=0; i < multipartCount; i++) {
-                       Part part = multipart.getBodyPart(i);
-                       String thisContentTypeRaw = part.getContentType();
-            int idx2 = thisContentTypeRaw.indexOf(";");
-            if (idx2 == -1) idx2 = thisContentTypeRaw.length();
-            String thisContentType = thisContentTypeRaw.substring(0, idx2);
-                       String disposition = part.getDisposition();
-                       
-                       // The first test should not pass, because if it 
exists, it should be the bodyContentIndex part
-                       if (((disposition == null) && (i == 0) && (i != 
bodyContentIndex)  && thisContentType.startsWith("text")) 
-               || ((disposition != null)
-                                        && 
(disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))
-                                    && (i != bodyContentIndex)) )
-                   {
-                               String attFileName = part.getFileName();
-                               if (attFileName != null && attFileName.length() 
> 17) {
-                                       attFileName = 
attFileName.substring(0,17);
-                               }
-                               commEventMap.put("contentName", subject + "-" + 
i + " " + attFileName);
-                       commEventMap.put("drMimeTypeId", thisContentType);
-                       if (thisContentType.startsWith("text")) {
-                               String content = (String)part.getContent();
-                               commEventMap.put("drDataResourceTypeId", 
"ELECTRONIC_TEXT");
-                               commEventMap.put("textData", content);
-                       } else {
-                               
-                               InputStream is = part.getInputStream();
-                               int c;
-                               while ((c = is.read()) > -1) {
-                                       baos.write(c);
-                               }
-                               
-                               ByteWrapper imageData = new 
ByteWrapper(baos.toByteArray());
-                               int len = imageData.getLength();
-                               if (Debug.infoOn()) Debug.logInfo("imageData 
length: " + len, module);
-                    commEventMap.put("drDataResourceName", part.getFileName());
-                               commEventMap.put("imageData", imageData);
-                               commEventMap.put("drDataResourceTypeId", 
"IMAGE_OBJECT");
-                       commEventMap.put("_imageData_contentType", 
thisContentType);
-                       }
-                       dispatcher.runSync("createCommContentDataResource", 
commEventMap);
-                       attachmentCount++;
-                   }
-               }
+               currentIndex = "";
+               attachmentCount = 0;
+               return 
addMultipartAttachementToComm((Multipart)message.getContent(), commEventMap, 
subject, dispatcher, userLogin);
+
+    }
+    private static String currentIndex = "";
+    private static int attachmentCount = 0;
+    private static int addMultipartAttachementToComm(Multipart multipart, Map 
commEventMap, String subject, LocalDispatcher dispatcher, GenericValue 
userLogin)
+    throws MessagingException, IOException, GenericServiceException {
+       try {
+               int multipartCount = multipart.getCount();
+               for (int i=0; i < multipartCount; i++) {
+                       Part part = multipart.getBodyPart(i);
+                       String thisContentTypeRaw = part.getContentType();
+                       int idx2 = thisContentTypeRaw.indexOf(";");
+                       if (idx2 == -1) idx2 = thisContentTypeRaw.length();
+                       String thisContentType = 
thisContentTypeRaw.substring(0, idx2);
+                       String disposition = part.getDisposition();
+                       ByteArrayOutputStream baos = new 
ByteArrayOutputStream();
+
+                       if (thisContentType.startsWith("multipart") || 
thisContentType.startsWith("Multipart")) {
+                               currentIndex = currentIndex.concat("." + i);
+                               return  
addMultipartAttachementToComm((Multipart) part.getContent(), commEventMap, 
subject, dispatcher, userLogin);
+                       }
+                       
+                       if(currentIndex.concat("." + 
i).equals(EmailServices.contentIndex)) continue;
+
+                       // The first test should not pass, because if it 
exists, it should be the bodyContentIndex part
+                       if (((disposition == null) && (i == 0) && 
thisContentType.startsWith("text")) 
+                                       || ((disposition != null)
+                                                       && 
(disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))
+                                                       ) )
+                       {
+                               String attFileName = part.getFileName();
+                               if (attFileName != null && attFileName.length() 
> 17) {
+                                       attFileName = 
attFileName.substring(0,17);
+                               }
+                               commEventMap.put("contentName", subject + "-" + 
attachmentCount + " " + attFileName);
+                               commEventMap.put("drMimeTypeId", 
thisContentType);
+                               if (thisContentType.startsWith("text")) {
+                                       String content = 
(String)part.getContent();
+                                       
commEventMap.put("drDataResourceTypeId", "ELECTRONIC_TEXT");
+                                       commEventMap.put("textData", content);
+                               } else {
+
+                                       InputStream is = part.getInputStream();
+                                       int c;
+                                       while ((c = is.read()) > -1) {
+                                               baos.write(c);
+                                       }
 
+                                       ByteWrapper imageData = new 
ByteWrapper(baos.toByteArray());
+                                       int len = imageData.getLength();
+                                       if (Debug.infoOn()) 
Debug.logInfo("imageData length: " + len, module);
+                                       commEventMap.put("drDataResourceName", 
part.getFileName());
+                                       commEventMap.put("imageData", 
imageData);
+                                       
commEventMap.put("drDataResourceTypeId", "IMAGE_OBJECT");
+                                       
commEventMap.put("_imageData_contentType", thisContentType);
+                               }
+                               
dispatcher.runSync("createCommContentDataResource", commEventMap);
+                               attachmentCount++;
+                       }
+               }
+       } catch (MessagingException e) {
+               Debug.logError(e, module);
+       } catch (IOException e) {
+               Debug.logError(e, module);
+       } catch (GenericServiceException e) {
+               Debug.logError(e, module);
+       }
        return attachmentCount;
     }
 }


Reply via email to