svn commit: r478781 - in /incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email: EmailServices.java EmailWorker.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r478781 - in /incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email: EmailServices.java EmailWorker.java

hansbak-2
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;
     }
 }