You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2009/05/13 05:06:11 UTC

svn commit: r774179 - /ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java

Author: jaz
Date: Wed May 13 03:06:10 2009
New Revision: 774179

URL: http://svn.apache.org/viewvc?rev=774179&view=rev
Log:
refactored the service which stores incoming mail to be thread safe, now using the specific methods on the message wrapper

Modified:
    ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java

Modified: ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java?rev=774179&r1=774178&r2=774179&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java (original)
+++ ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java Wed May 13 03:06:10 2009
@@ -467,12 +467,13 @@
      * @param context
      * @return
      */
+    @SuppressWarnings("unchecked")
     public static Map<String, Object> storeIncomingEmail(DispatchContext dctx, Map<String, ? extends Object> context) {
 
         GenericDelegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
         MimeMessageWrapper wrapper = (MimeMessageWrapper) context.get("messageWrapper");
-        MimeMessage message = wrapper.getMessage();
+        
         Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         String partyIdTo = null;
@@ -484,17 +485,17 @@
 
         Map<String, Object> result = null;
         try {
-            String contentTypeRaw = message.getContentType();
+            String contentTypeRaw = wrapper.getContentType();
             int idx = contentTypeRaw.indexOf(";");
             if (idx == -1) idx = contentTypeRaw.length();
             contentType = contentTypeRaw.substring(0, idx);
             if (contentType == null || contentType.equals("")) contentType = "text/html";
             contentType = contentType.toLowerCase();
-            Address[] addressesFrom = message.getFrom();
-            Address[] addressesTo = message.getRecipients(MimeMessage.RecipientType.TO);
-            Address[] addressesCC = message.getRecipients(MimeMessage.RecipientType.CC);
-            Address[] addressesBCC = message.getRecipients(MimeMessage.RecipientType.BCC);
-            String messageId = message.getMessageID();
+            Address[] addressesFrom = wrapper.getFrom();
+            Address[] addressesTo = wrapper.getTo();
+            Address[] addressesCC = wrapper.getCc();
+            Address[] addressesBCC = wrapper.getBcc();
+            String messageId = wrapper.getMessageId();
 
             String aboutThisEmail = "message [" + messageId + "] from [" +
                 (addressesFrom[0] == null? "not found" : addressesFrom[0].toString()) + "] to [" +
@@ -505,8 +506,8 @@
             String spamHeaderName = UtilProperties.getPropertyValue("general.properties", "mail.spam.name", "N");
             String configHeaderValue = UtilProperties.getPropertyValue("general.properties", "mail.spam.value");
             //          only execute when config file has been set && header variable found
-            if (!spamHeaderName.equals("N") && message.getHeader(spamHeaderName) != null && message.getHeader(spamHeaderName).length > 0) {
-                String msgHeaderValue = message.getHeader(spamHeaderName)[0];
+            if (!spamHeaderName.equals("N") && wrapper.getHeader(spamHeaderName) != null && wrapper.getHeader(spamHeaderName).length > 0) {
+                String msgHeaderValue = wrapper.getHeader(spamHeaderName)[0];
                 if (msgHeaderValue != null && msgHeaderValue.startsWith(configHeaderValue)) {
                     Debug.logInfo("Incoming Email message ignored, was detected by external spam checker", module);
                     return ServiceUtil.returnSuccess(" Message Ignored: detected by external spam checker");
@@ -548,9 +549,8 @@
                 contactMechIdTo = (String)firstAddressTo.get("contactMechId");
             }
 
-            String deliveredTo = null;
-            if (message.getHeader("Delivered-To") != null) {
-                deliveredTo = message.getHeader("Delivered-To")[0];
+            String deliveredTo = wrapper.getFirstHeader("Delivered-To");
+            if (deliveredTo != null) {                
                 // check if started with the domain name if yes remove including the dash.
                 String dn = deliveredTo.substring(deliveredTo.indexOf("@")+1, deliveredTo.length());
                 if (deliveredTo.startsWith(dn)) {
@@ -582,30 +582,30 @@
             commEventMap.put("contactMechTypeId", "EMAIL_ADDRESS");
             commEventMap.put("messageId", messageId);
 
-            String subject = message.getSubject();
+            String subject = wrapper.getSubject();
             commEventMap.put("subject", subject);
 
             // Set sent and received dates
             commEventMap.put("entryDate", nowTimestamp);
-            commEventMap.put("datetimeStarted", UtilDateTime.toTimestamp(message.getSentDate()));
-            commEventMap.put("datetimeEnded", UtilDateTime.toTimestamp(message.getReceivedDate()));
+            commEventMap.put("datetimeStarted", UtilDateTime.toTimestamp(wrapper.getSentDate()));
+            commEventMap.put("datetimeEnded", UtilDateTime.toTimestamp(wrapper.getReceivedDate()));
 
             // default role types (_NA_)
             commEventMap.put("roleTypeIdFrom", "_NA_");
             commEventMap.put("roleTypeIdTo", "_NA_");
 
             // get the content(type) part
-            Object messageContent = message.getContent();
-            if (contentType.startsWith("text")) {
-                commEventMap.put("content", messageContent);
-                commEventMap.put("contentMimeTypeId", contentType);
-            } else if (messageContent instanceof Multipart) {
-                contentIndex = "";
-                commEventMap = addMessageBody(commEventMap, (Multipart) messageContent);
+            String messageBodyContentType = wrapper.getMessageBodyContentType();
+            if (messageBodyContentType.indexOf(";") > -1) {
+                messageBodyContentType = messageBodyContentType.substring(0, messageBodyContentType.indexOf(";"));
             }
+            String messageBody = wrapper.getMessageBody();
+                        
+            commEventMap.put("content", messageBody);
+            commEventMap.put("contentMimeTypeId", messageBodyContentType.toLowerCase());            
 
             // check for for a reply to communication event (using in-reply-to the parent messageID)
-            String[] inReplyTo = message.getHeader("In-Reply-To");
+            String[] inReplyTo = wrapper.getHeader("In-Reply-To");
             if (inReplyTo != null && inReplyTo[0] != null) {
                 GenericValue parentCommEvent = null;
                 try {
@@ -692,7 +692,7 @@
 
             // Populate the CommunicationEvent.headerString field with the email headers
             StringBuilder headerString = new StringBuilder();
-            Enumeration headerLines = message.getAllHeaderLines();
+            Enumeration headerLines = wrapper.getMessage().getAllHeaderLines();
             while (headerLines.hasMoreElements()) {
                 headerString.append(System.getProperty("line.separator"));
                 headerString.append(headerLines.nextElement());
@@ -702,12 +702,52 @@
             result = dispatcher.runSync("createCommunicationEvent", commEventMap);
             communicationEventId = (String)result.get("communicationEventId");
 
-            if (messageContent instanceof Multipart) {
-                Debug.logInfo("===message has attachments=====", module);
-                int attachmentCount = addAttachmentsToCommEvent((Multipart) messageContent, subject, communicationEventId, dispatcher, userLogin);
-                if (Debug.infoOn()) Debug.logInfo(attachmentCount + " attachments added to CommunicationEvent:" + communicationEventId,module);
+            // handle the attachments
+            List<String> attachmentIndexes = wrapper.getAttachmentIndexes();
+            if (attachmentIndexes.size() > 0) {
+                Debug.logInfo("=== message has attachments [" + attachmentIndexes.size() + "] =====", module);
+                for (String attachmentIdx : attachmentIndexes) {
+                    Map<String, Object> attachmentMap = FastMap.newInstance();
+                    attachmentMap.put("communicationEventId", communicationEventId);
+                    attachmentMap.put("contentTypeId", "DOCUMENT");
+                    attachmentMap.put("mimeTypeId", "text/html");
+                    attachmentMap.put("userLogin", userLogin);
+                    if (subject != null && subject.length() > 80) {
+                        subject = subject.substring(0,80); // make sure not too big for database field. (20 characters for filename)
+                    }
+                    
+                    String attFileName = wrapper.getPartFilename(attachmentIdx);
+                    String attContentType = wrapper.getPartContentType(attachmentIdx);
+                    if (attContentType != null && attContentType.indexOf(";") > -1) {
+                        attContentType = attContentType.toLowerCase().substring(0, attContentType.indexOf(";"));
+                    }                    
+                    
+                    if (!UtilValidate.isEmpty(attFileName)) {
+                        attachmentMap.put("contentName", attFileName);
+                        attachmentMap.put("description", subject + "-" + attachmentIdx);
+                    } else {
+                        attachmentMap.put("contentName", subject + "-" + attachmentIdx);
+                    }
+                    
+                    attachmentMap.put("drMimeTypeId", attContentType);
+                    if (attContentType.startsWith("text")) {
+                        String text = wrapper.getPartText(attachmentIdx);
+                        attachmentMap.put("drDataResourceTypeId", "ELECTRONIC_TEXT");
+                        attachmentMap.put("textData", text);
+                    } else {
+                        ByteBuffer data = wrapper.getPartByteBuffer(attachmentIdx);                        
+                        if (Debug.infoOn()) Debug.logInfo("Binary attachment size: " + data.limit(), module);
+                        attachmentMap.put("drDataResourceName", attFileName);
+                        attachmentMap.put("imageData", data);
+                        attachmentMap.put("drDataResourceTypeId", "IMAGE_OBJECT"); // TODO: why always use IMAGE
+                        attachmentMap.put("_imageData_contentType", attContentType);
+                    }
+                    
+                    // save the content
+                    dispatcher.runSync("createCommContentDataResource", attachmentMap);                    
+                }
             }
-
+            
             // For all addresses create a CommunicationEventRoles
             createCommEventRoles(userLogin, delegator, dispatcher, communicationEventId, toParties, "ADDRESSEE");
             createCommEventRoles(userLogin, delegator, dispatcher, communicationEventId, ccParties, "CC");
@@ -722,10 +762,7 @@
             return ServiceUtil.returnError(e.getMessage());
         } catch (GenericServiceException e) {
             Debug.logError(e, module);
-            return ServiceUtil.returnError(e.getMessage());
-        } catch (IOException e) {
-            Debug.logError(e, module);
-            return ServiceUtil.returnError(e.getMessage());
+            return ServiceUtil.returnError(e.getMessage());        
         } catch (Exception e) {
             Debug.logError(e, module);
             return ServiceUtil.returnError(e.getMessage());
@@ -813,148 +850,6 @@
         return tempResults;
     }
 
-    public static String contentIndex = "";
-    private static Map<String, Object> addMessageBody( Map<String, Object> 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";
-                thisContentType = thisContentType.toLowerCase();
-                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());
-        }
-    }
-
-    public String getForwardedField(MimeMessage message) {
-        String fieldValue = null;
-        return fieldValue;
-    }
-
-    public static int addAttachmentsToCommEvent(Multipart messageContent, String subject, String communicationEventId, LocalDispatcher dispatcher, GenericValue userLogin)
-        throws MessagingException, IOException, GenericServiceException {
-        Map<String, Object> commEventMap = FastMap.newInstance();
-        commEventMap.put("communicationEventId", communicationEventId);
-        commEventMap.put("contentTypeId", "DOCUMENT");
-        commEventMap.put("mimeTypeId", "text/html");
-        commEventMap.put("userLogin", userLogin);
-        if (subject != null && subject.length() > 80) {
-            subject = subject.substring(0,80); // make sure not too big for database field. (20 characters for filename)
-        }
-        currentIndex = "";
-        attachmentCount = 0;
-        return addMultipartAttachementToComm(messageContent, commEventMap, subject, dispatcher, userLogin);
-    }
-    private static String currentIndex = "";
-    private static int attachmentCount = 0;
-    private static int addMultipartAttachementToComm(Multipart multipart, Map<String, Object> commEventMap, String subject, LocalDispatcher dispatcher, GenericValue userLogin)
-    throws MessagingException, IOException, GenericServiceException {
-        try {
-            int multipartCount = multipart.getCount();
-            // Debug.logInfo(currentIndex + "====number of attachments: " + multipartCount, module);
-            for (int i=0; i < multipartCount; i++) {
-                // Debug.logInfo(currentIndex + "====processing attachment: " + i, module);
-                Part part = multipart.getBodyPart(i);
-                String thisContentTypeRaw = part.getContentType();
-                // Debug.logInfo("====thisContentTypeRaw: " + thisContentTypeRaw, module);
-                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 (part instanceof Multipart) {
-                    currentIndex = currentIndex.concat("." + i);
-                    // Debug.logInfo("=====attachment contain attachment, index:" + currentIndex, module);
-                    return addMultipartAttachementToComm((Multipart) part.getContent(), commEventMap, subject, dispatcher, userLogin);
-                }
-                // Debug.logInfo("=====attachment not contains attachment, index:" + currentIndex, module);
-                // Debug.logInfo("=====check for currentIndex(" + currentIndex  + ") against master contentIndex(" + EmailServices.contentIndex + ")", module);
-                if (currentIndex.concat("." + i).equals(CommunicationEventServices.contentIndex)) continue;
-
-                // The first test should not pass, because if it exists, it should be the bodyContentIndex part
-                // Debug.logInfo("====check for disposition: " + disposition + " contentType: '" + thisContentType + "' variable i:" + i, module);
-                if ((disposition == null && thisContentType.startsWith("text"))
-                        || ((disposition != null)
-                                && (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))
-                                ) )
-                {
-                    String attFileName = part.getFileName();
-                    Debug.logInfo("===processing attachment: " + attFileName, module);
-                    if (!UtilValidate.isEmpty(attFileName)) {
-                           commEventMap.put("contentName", attFileName);
-                           commEventMap.put("description", subject + "-" + attachmentCount);
-                    } else {
-                        commEventMap.put("contentName", subject + "-" + attachmentCount);
-                    }
-                    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);
-                        }
-                        ByteBuffer imageData = ByteBuffer.wrap(baos.toByteArray());
-                        int len = imageData.limit();
-                        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;
-    }
-    
     /*
      * Service to process incoming email and look for a bounce message. If the email is indeed a bounce message
      * the CommunicationEvent will be updated with the proper COM_BOUNCED status.