svn commit: r774087 - /ofbiz/trunk/framework/service/src/org/ofbiz/service/mail/MimeMessageWrapper.java

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

svn commit: r774087 - /ofbiz/trunk/framework/service/src/org/ofbiz/service/mail/MimeMessageWrapper.java

jaz-3
Author: jaz
Date: Tue May 12 21:09:48 2009
New Revision: 774087

URL: http://svn.apache.org/viewvc?rev=774087&view=rev
Log:
added a bunch of mail handing methods to the message wrapper to make dealing with email messages easiler

Modified:
    ofbiz/trunk/framework/service/src/org/ofbiz/service/mail/MimeMessageWrapper.java

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/mail/MimeMessageWrapper.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/mail/MimeMessageWrapper.java?rev=774087&r1=774086&r2=774087&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/mail/MimeMessageWrapper.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/mail/MimeMessageWrapper.java Tue May 12 21:09:48 2009
@@ -21,12 +21,26 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.sql.Timestamp;
+import java.util.List;
 import java.util.Properties;
+
+import javax.mail.Address;
+import javax.mail.BodyPart;
+import javax.mail.Message;
 import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Part;
 import javax.mail.Session;
 import javax.mail.internet.MimeMessage;
 
+import javolution.util.FastList;
+
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.GeneralRuntimeException;
+import org.ofbiz.base.util.UtilDateTime;
 
 public class MimeMessageWrapper implements java.io.Serializable {
 
@@ -34,7 +48,9 @@
     protected transient MimeMessage message = null;
     protected transient Session session = null;
     protected Properties mailProperties = null;
+    protected String contentType = null;
     protected byte[] serializedBytes = null;
+    protected int parts = 0;
 
     public MimeMessageWrapper(Session session, MimeMessage message) {
         this(session);
@@ -60,12 +76,22 @@
     public void setMessage(MimeMessage message) {
         if (message != null) {
             // serialize the message
-            this.message = message;
+            this.message = message;            
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             try {
                 message.writeTo(baos);
                 baos.flush();
                 serializedBytes = baos.toByteArray();
+                this.contentType = message.getContentType();
+                
+                // see if this is a multi-part message
+                Object content = message.getContent();
+                if (content instanceof Multipart) {
+                    Multipart mp = (Multipart) content;
+                    this.parts = mp.getCount();
+                } else {
+                    this.parts = 0;
+                }
             } catch (MessagingException e) {
                 Debug.logError(e, module);
             } catch (IOException e) {
@@ -89,9 +115,380 @@
                     message = new MimeMessage(this.getSession(), bais);
                 } catch (MessagingException e) {
                     Debug.logError(e, module);
+                    throw new GeneralRuntimeException(e.getMessage(), e);
                 }
             }
         }
         return message;
     }
+    
+    public Address[] getFrom() {
+        MimeMessage message = getMessage();
+        try {
+            return message.getFrom();
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+    
+    public Address[] getTo() {
+        MimeMessage message = getMessage();
+        try {
+            return message.getRecipients(MimeMessage.RecipientType.TO);
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+    
+    public Address[] getCc() {
+        MimeMessage message = getMessage();
+        try {
+            return message.getRecipients(MimeMessage.RecipientType.CC);
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+    
+    public Address[] getBcc() {
+        MimeMessage message = getMessage();
+        try {
+            return message.getRecipients(MimeMessage.RecipientType.BCC);
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+    
+    public String getSubject() {
+        MimeMessage message = getMessage();
+        try {
+            return message.getSubject();
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+    
+    public String getMessageId() {
+        MimeMessage message = getMessage();
+        try {
+            return message.getMessageID();
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+    
+    public Timestamp getSentDate() {
+        MimeMessage message = getMessage();
+        try {
+            return UtilDateTime.toTimestamp(message.getSentDate());
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+    
+    public Timestamp getReceivedDate() {
+        MimeMessage message = getMessage();
+        try {
+            return UtilDateTime.toTimestamp(message.getReceivedDate());
+        } catch (MessagingException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+    }
+            
+    public String getContentType() {
+        return contentType;
+    }
+    
+    public int getMainPartCount() {
+        return this.parts;
+    }
+    
+    public int getSubPartCount(int index) {
+        BodyPart part = getPart(Integer.toString(index));
+        try {
+            Object content = part.getContent();
+            if (content instanceof Multipart) {
+                return ((Multipart) content).getCount();
+            } else {
+                return 0;
+            }
+        } catch (Exception e) {
+            Debug.logError(e, module);
+            return -1;
+        }
+    }
+    
+    public List<String> getAttachmentIndexes() {
+        List<String> attachments = FastList.newInstance();        
+        if (getMainPartCount() == 0) { // single part message (no attachments)
+            return attachments;
+        } else {
+            for (int i = 0; i < getMainPartCount(); i++) {
+                int subPartCount = getSubPartCount(i);
+                String idx = Integer.toString(i);
+                if (subPartCount > 0) {
+                    for (int si = 0; si < subPartCount; si++) {
+                        String sidx = idx + "." + Integer.toString(si);
+                        if (getPartDisposition(sidx) != null && getPartDisposition(sidx).equals(Part.ATTACHMENT)) {
+                            attachments.add(sidx);
+                        }
+                    }
+                } else {
+                    if (getPartDisposition(idx) != null && getPartDisposition(idx).equals(Part.ATTACHMENT)) {
+                        attachments.add(idx);
+                    }
+                }
+            }
+            return attachments;
+        }
+    }
+    
+    public String getMessageBody() {
+        MimeMessage message = getMessage();
+        if (getMainPartCount() == 0) { // single part message
+            try {
+                Object content = message.getContent();
+                return getContentText(content);
+            } catch (Exception e) {
+                Debug.logError(e, module);
+                return null;  
+            }
+        } else { // multi-part message
+            StringBuffer body = new StringBuffer();
+            for (int i = 0; i < getMainPartCount(); i++) {
+                int subPartCount = getSubPartCount(i);
+                String idx = Integer.toString(i);
+                if (subPartCount > 0) {
+                    for (int si = 0; si < subPartCount; si++) {
+                        String sidx = idx + "." + Integer.toString(si);
+                        if (getPartDisposition(sidx) == null || getPartDisposition(sidx).equals(Part.INLINE)) {
+                            body.append(getPartText(sidx)).append("\n");    
+                        }
+                    }
+                } else {
+                    if (getPartContentType(idx) != null && getPartContentType(idx).toLowerCase().startsWith("text")) {
+                        // make sure the part isn't an attachment
+                        if (getPartDisposition(idx) == null || getPartDisposition(idx).equals(Part.INLINE)) {
+                            body.append(getPartText(idx)).append("\n");                        
+                        }
+                    }
+                }
+            }
+            return body.toString();
+        }        
+    }
+    
+    public String getMessageRawText() {
+        MimeMessage message = getMessage();
+        try {
+            return getTextFromStream(message.getInputStream());
+        } catch (Exception e) {
+            Debug.logError(e, module);
+            return null;          
+        }
+    }
+    
+    public String getPartDescription(String index) {        
+        BodyPart part = getPart(index);
+        if (part != null) {
+            try {                
+                return part.getDescription();
+            } catch (MessagingException e) {
+                Debug.logError(e, module);
+                return null;
+            }
+        } else {
+            return null;
+        }        
+    }
+    
+    public String getPartContentType(String index) {        
+        BodyPart part = getPart(index);
+        if (part != null) {
+            try {                
+                return part.getContentType();
+            } catch (MessagingException e) {
+                Debug.logError(e, module);
+                return null;
+            }
+        } else {
+            return null;
+        }        
+    }
+    
+    public String getPartDisposition(String index) {
+        BodyPart part = getPart(index);
+        if (part != null) {
+            try {
+                return part.getDisposition();
+            } catch (MessagingException e) {
+                Debug.logError(e, module);
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+    
+    public String getPartFilename(String index) {
+        BodyPart part = getPart(index);
+        if (part != null) {
+            try {
+                return part.getFileName();
+            } catch (MessagingException e) {
+                Debug.logError(e, module);
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+    
+    public ByteBuffer getPartByteBuffer(String index) {
+        BodyPart part = getPart(index);
+        if (part != null) {            
+            try {
+                InputStream stream = part.getInputStream();
+                return getByteBufferFromStream(stream);
+            } catch (Exception e) {
+                Debug.logError(e, module);
+                return null;
+            }                      
+        } else {
+            return null;
+        }        
+    }
+    
+    public String getPartText(String index) {                
+        BodyPart part = getPart(index);
+        if (part != null) {
+            try {
+                return getContentText(part.getContent());
+            } catch (Exception e) {
+                Debug.logError(e, module);
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+    
+    public String getPartRawText(String index) {                
+        BodyPart part = getPart(index);
+        if (part != null) {
+            try {
+                return getTextFromStream(part.getInputStream());
+            } catch (Exception e) {
+                Debug.logError(e, module);
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+    
+    public BodyPart getPart(String indexStr) {
+        int mainIndex, subIndex;        
+        try {
+            if (indexStr.indexOf(".") == -1) {
+                mainIndex = Integer.parseInt(indexStr);
+                subIndex = -1;
+            } else {
+                String[] indexSplit = indexStr.split("\\.");              
+                mainIndex = Integer.parseInt(indexSplit[0]);
+                subIndex = Integer.parseInt(indexSplit[1]);
+            }
+        } catch (NumberFormatException e) {
+            Debug.logError(e, "Illegal index string format. Should be part 'dot' subpart: " + indexStr, module);
+            return null;
+        } catch (ArrayIndexOutOfBoundsException e) {
+            Debug.logError(e, "Illegal index string format. Should be part 'dot' subpart: " + indexStr, module);
+            return null;
+        }
+        
+        if (getMainPartCount() > 0 && getMainPartCount() > mainIndex) {
+            MimeMessage message = this.getMessage();
+            try {
+                Multipart mp = (Multipart) message.getContent();
+                if (subIndex == -1) {
+                    return mp.getBodyPart(mainIndex);
+                } else {
+                    BodyPart part = mp.getBodyPart(mainIndex);
+                    int subPartCount = getSubPartCount(mainIndex);
+                    if (subPartCount > subIndex) {
+                        Multipart sp = (Multipart) part.getContent();
+                        return sp.getBodyPart(subIndex);
+                    } else {
+                        Debug.logWarning("Requested a subpart [" + subIndex + "] which deos not exist; only [" + getSubPartCount(mainIndex) + "] parts", module);
+                        // there is no sub part to find
+                        return part;
+                    }
+                }
+            } catch (MessagingException e) {
+                Debug.logError(e, module);
+                return null;
+            } catch (IOException e) {
+                Debug.logError(e, module);
+                return null;
+            }
+        } else {
+            Debug.logWarning("Requested a part [" + mainIndex + "] which deos not exist; only [" + getMainPartCount() + "] parts", module);
+            return null;
+        }
+    }
+    
+    protected String getContentText(Object content) {
+        if (content == null) return null;
+        if (content instanceof String) {
+            return (String) content;
+        } else if (content instanceof InputStream) {
+            return getTextFromStream((InputStream) content);
+        } else if (content instanceof Message) {
+            try {
+                return getTextFromStream(((Message) content).getInputStream());
+            } catch (Exception e) {
+                Debug.logError(e, module);
+                return null;      
+            }
+        } else {
+            Debug.logWarning("Content was not a string or a stream; no known handler -- " + content.toString(), module);
+            return null;
+        }
+    }
+    
+    protected String getTextFromStream(InputStream stream) {
+        StringBuilder builder = new StringBuilder();
+        byte[] buffer = new byte[4096];
+        try {
+            for (int n; (n = stream.read(buffer)) != -1;) {
+                builder.append(new String(buffer, 0, n));
+            }
+        } catch (IOException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+        return builder.toString();
+    }
+    
+    protected ByteBuffer getByteBufferFromStream(InputStream stream) {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        byte[] buffer = new byte[4096];
+        try {            
+            for (int n; (n = stream.read(buffer)) != -1;) {
+                baos.write(n);
+            }
+        } catch (IOException e) {
+            Debug.logError(e, module);
+            return null;
+        }
+        
+        return ByteBuffer.wrap(baos.toByteArray());
+    }
 }