Update of 
/var/cvs/contributions/CMSContainer_Portlets/portlets-newsletter/src/java/com/finalist/newsletter/publisher
In directory james.mmbase.org:/tmp/cvs-serv28186

Modified Files:
        NewsletterPublisher.java 
Log Message:
CMSC-811 auto create publication,clone  attachment when add publication


See also: 
http://cvs.mmbase.org/viewcvs/contributions/CMSContainer_Portlets/portlets-newsletter/src/java/com/finalist/newsletter/publisher
See also: http://www.mmbase.org/jira/browse/CMSC-811


Index: NewsletterPublisher.java
===================================================================
RCS file: 
/var/cvs/contributions/CMSContainer_Portlets/portlets-newsletter/src/java/com/finalist/newsletter/publisher/NewsletterPublisher.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- NewsletterPublisher.java    30 Apr 2008 07:30:10 -0000      1.22
+++ NewsletterPublisher.java    4 May 2008 12:06:28 -0000       1.23
@@ -1,33 +1,51 @@
 package com.finalist.newsletter.publisher;
 
-import com.finalist.newsletter.domain.Subscription;
-import com.finalist.newsletter.domain.Publication;
-import com.finalist.newsletter.domain.Newsletter;
-import com.finalist.newsletter.publisher.NewsletterGenerator;
-import com.finalist.newsletter.NewsletterSendFailException;
-import com.finalist.newsletter.util.NewsletterUtil;
-import com.finalist.cmsc.mmbase.PropertiesUtil;
-import org.mmbase.module.Module;
-import org.mmbase.util.logging.Logger;
-import org.mmbase.util.logging.Logging;
-import org.apache.commons.lang.StringUtils;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
 
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.mail.BodyPart;
 import javax.mail.Message;
 import javax.mail.MessagingException;
+import javax.mail.Multipart;
 import javax.mail.Session;
 import javax.mail.Transport;
 import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
-import java.io.UnsupportedEncodingException;
-import java.util.List;
-import java.util.Date;
+
+import net.sf.mmapps.modules.cloudprovider.CloudProviderFactory;
+
+import org.apache.commons.lang.StringUtils;
+import org.mmbase.bridge.Cloud;
+import org.mmbase.bridge.Node;
+import org.mmbase.bridge.NodeList;
+import org.mmbase.module.Module;
+import org.mmbase.util.logging.Logger;
+import org.mmbase.util.logging.Logging;
+
+import com.finalist.cmsc.mmbase.PropertiesUtil;
+import com.finalist.newsletter.NewsletterSendFailException;
+import com.finalist.newsletter.domain.Newsletter;
+import com.finalist.newsletter.domain.Publication;
+import com.finalist.newsletter.domain.Subscription;
+import com.finalist.newsletter.util.NewsletterUtil;
 
 public class NewsletterPublisher {
 
-   private static Logger log = 
Logging.getLoggerInstance(NewsletterPublisher.class.getName());
+   private static Logger log = Logging
+         .getLoggerInstance(NewsletterPublisher.class.getName());
 
    private static String personaliser;
 
@@ -35,62 +53,134 @@
       NewsletterPublisher.personaliser = personaliser;
    }
 
+   enum MimeType {
+      image, attachment
+   };
+
    public void deliver(Publication publication, Subscription subscription) {
       try {
          Message message = new MimeMessage(getMailSession());
          Newsletter newsletter = publication.getNewsletter();
-         setSenderInfomation(message,
-               newsletter.getFromAddress(),
-               newsletter.getFromName(),
-               newsletter.getReplyAddress(),
-               newsletter.getReplyName());
+         setSenderInfomation(message, newsletter.getFromAddress(), newsletter
+               .getFromName(), newsletter.getReplyAddress(), newsletter
+               .getReplyName());
 
+         setContent(message, publication, subscription);
          setRecipient(message, subscription.getEmail());
-         setBody(publication, subscription, message);
-         setTitle(message, publication.getNewsletter().getTitle());
-         setMIME(message, subscription.getMimeType());
+         // setBody(publication, subscription, message);
+         setTitle(message, newsletter.getTitle());
+         // setMIME(message, subscription.getMimeType());
 
          Transport.send(message);
-         log.debug("mail send! publication:"+publication.getId()+"to 
subscription"+subscription.getId()+" in MIME"+subscription.getMimeType());
-      } catch (MessagingException e) {
+         log.debug("mail send! publication:" + publication.getId()
+               + "to subscription" + subscription.getId() + " in MIME"
+               + subscription.getMimeType());
+      } 
+      catch (MessagingException e) {
          log.error(e);
          throw new NewsletterSendFailException(e);
-      } catch (UnsupportedEncodingException e) {
+      } 
+      catch (UnsupportedEncodingException e) {
          log.error(e);
          throw new NewsletterSendFailException(e);
       }
    }
 
-   private void setBody(Publication publication, Subscription subscription, 
Message message) throws MessagingException {
-      String url = 
NewsletterUtil.getTermURL(publication.getUrl(),subscription.getTerms(),publication.getId());
-      int articleCounts = 
NewsletterUtil.countArticlesByNewsletter(publication.getNewsletterId());
+   private void setContent(Message message, Publication publication,
+         Subscription subscription) {
+      Cloud cloud = CloudProviderFactory.getCloudProvider().getCloud();
+      Node newsletterPublicationNode = cloud.getNode(publication.getId());
+      NodeList attachmentNodes = 
newsletterPublicationNode.getRelatedNodes("attachments");
+      Multipart multipart = new MimeMultipart();
+      BodyPart mdp = new MimeBodyPart();
+      try {
+         mdp.setContent(getBody(publication, subscription), "text/html");
+         multipart.addBodyPart(mdp);
+      } catch (MessagingException e1) {
+         e1.printStackTrace();
+      }
+
+      setAttachment(multipart, attachmentNodes, MimeType.attachment);
+      NodeList imageNodes = 
newsletterPublicationNode.getRelatedNodes("images");
+      setAttachment(multipart, imageNodes, MimeType.image);
+      try {
+         message.setContent(multipart);
+      } 
+      catch (MessagingException e) {
+         e.printStackTrace();
+      }
+   }
+
+   private void setAttachment(Multipart multipart, NodeList attachmentNodes,
+         MimeType mimeType) {
+      if (attachmentNodes.size() > 0) {
+
+         try {
+            for (int i = 0; i < attachmentNodes.size(); i++) {
+               Node node = attachmentNodes.getNode(i);
+               DataHandler dh = null;
+               byte[] bytes = node.getByteValue("handle");
+               ByteArrayDataSource bads = new ByteArrayDataSource(bytes, null);
+
+               BodyPart messageBodyPart = new MimeBodyPart();
+               if (mimeType.compareTo(MimeType.image) == 0) {
+                  bads = new ByteArrayDataSource(bytes, "image/"
+                        + node.getStringValue("itype"));
+               } else if (mimeType.compareTo(MimeType.attachment) == 0) {
+                  bads = new ByteArrayDataSource(bytes, node
+                        .getStringValue("mimetype"));
+               }
+               dh = new DataHandler(bads);
+               messageBodyPart.setFileName(node.getStringValue("filename"));
+               messageBodyPart.setDataHandler(dh);
+               multipart.addBodyPart(messageBodyPart);
+            }
+         } 
+         catch (MessagingException e) {
+            e.printStackTrace();
+         }
+      }
+   }
+
+   private String getBody(Publication publication, Subscription subscription)
+         throws MessagingException {
+      String url = NewsletterUtil.getTermURL(publication.getUrl(), subscription
+            .getTerms(), publication.getId());
+      int articleCounts = NewsletterUtil.countArticlesByNewsletter(publication
+            .getNewsletterId());
       String content = " ";
-      if(articleCounts == 0) {
-         if(publication.getNewsletter().getSendempty()) {
+      if (articleCounts == 0) {
+         if (publication.getNewsletter().getSendempty()) {
             content = publication.getNewsletter().getTxtempty();
          }
-      }
-      else {
-         content = NewsletterGenerator.generate(url, 
subscription.getMimeType());
+      } else {
+         content = NewsletterGenerator
+               .generate(url, subscription.getMimeType());
       }
       
       if (null != getPersonalise()) {
-         content = getPersonalise().personalise(content, subscription, 
publication);
+         content = getPersonalise().personalise(content, subscription,
+               publication);
       }
       
-      message.setText(content + "\n");
+      return content + "\n";
    }
 
-
-   private void setSenderInfomation(Message message, String fromAddress, 
String fromName, String replyAddress, String replyName)
+   private void setSenderInfomation(Message message, String fromAddress,
+         String fromName, String replyAddress, String replyName)
          throws MessagingException, UnsupportedEncodingException {
 
-      String emailFrom = getHeaderProperties(fromAddress, 
"newsletter.default.fromaddress");
-      String nameFrom = getHeaderProperties(fromName, 
"newsletter.default.fromname");
-      String emailReplyTo = getHeaderProperties(replyAddress, 
"newsletter.default.replytoadress");
-      String nameReplyTo = getHeaderProperties(replyName, 
"newsletter.default.replyto");
+      String emailFrom = getHeaderProperties(fromAddress,
+            "newsletter.default.fromaddress");
+      String nameFrom = getHeaderProperties(fromName,
+            "newsletter.default.fromname");
+      String emailReplyTo = getHeaderProperties(replyAddress,
+            "newsletter.default.replytoadress");
+      String nameReplyTo = getHeaderProperties(replyName,
+            "newsletter.default.replyto");
 
-      log.debug("set header property:<" + nameFrom + ">" + emailFrom + "<" + 
nameReplyTo + ">" + emailReplyTo);
+      log.debug("set header property:<" + nameFrom + ">" + emailFrom + "<"
+            + nameReplyTo + ">" + emailReplyTo);
 
       InternetAddress senderAddress = new InternetAddress(emailFrom);
       senderAddress.setPersonal(nameFrom);
@@ -98,8 +188,7 @@
 
       InternetAddress replyToAddress = new InternetAddress(emailReplyTo);
       replyToAddress.setPersonal(nameReplyTo);
-      message.setReplyTo(new InternetAddress[]{replyToAddress});
-
+      message.setReplyTo(new InternetAddress[] { replyToAddress });
 
    }
 
@@ -110,11 +199,13 @@
       message.setSentDate(new Date());
    }
 
-   private void setTitle(Message message, String title) throws 
MessagingException {
+   private void setTitle(Message message, String title)
+         throws MessagingException {
       message.setSubject(title);
    }
 
-   private void setRecipient(Message message, String email) throws 
MessagingException {
+   private void setRecipient(Message message, String email)
+         throws MessagingException {
       InternetAddress toAddress = new InternetAddress(email);
       message.setRecipient(MimeMessage.RecipientType.TO, toAddress);
    }
@@ -123,13 +214,15 @@
       if (StringUtils.isBlank(property)) {
          property = PropertiesUtil.getProperty(defaultKey);
 
-         log.debug("get property:" + defaultKey + " from system property got:" 
+ property);
+         log.debug("get property:" + defaultKey + " from system property got:"
+               + property);
       }
 
       if (StringUtils.isBlank(property)) {
          property = "[EMAIL PROTECTED]";
 
-         log.debug("get property:" + defaultKey + " from system property 
failed use default:" + property);
+         log.debug("get property:" + defaultKey
+               + " from system property failed use default:" + property);
       }
 
       return property;
@@ -146,8 +239,11 @@
          Context initCtx = new InitialContext();
          Context envCtx = (Context) initCtx.lookup(context);
          session = (javax.mail.Session) envCtx.lookup(datasource);
-      } catch (NamingException e) {
-         log.fatal("Configured dataSource '" + getParameter("datasource") + "' 
of context '" + getParameter("context") + "' is not a Session ");
+      } 
+      catch (NamingException e) {
+         log.fatal("Configured dataSource '" + getParameter("datasource")
+               + "' of context '" + getParameter("context")
+               + "' is not a Session ");
       }
       return session;
    }
@@ -155,14 +251,16 @@
    private static String getParameter(String name) {
       Module sendmailModule = Module.getModule("sendmail");
       if (sendmailModule == null) {
-         log.fatal("Sendmail module not installed which is required for 
newsletter generation");
+         log
+               .fatal("Sendmail module not installed which is required for 
newsletter generation");
          return null;
       }
 
       String parameter = sendmailModule.getInitParameter(name);
       if (parameter == null) {
          parameter = "java:comp/env";
-         log.warn("The property " + parameter + " is missing, taking default " 
+ parameter);
+         log.warn("The property " + parameter + " is missing, taking default "
+               + parameter);
       }
       return parameter;
    }
@@ -187,4 +285,60 @@
       return ps;
 
    }
+
+   public class ByteArrayDataSource implements DataSource {
+      private byte[] data; // data
+      private String type; // content-type
+
+      /* Create a DataSource from an input stream */
+      public ByteArrayDataSource(InputStream is, String type) {
+         this.type = type;
+         try {
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            int ch;
+            while ((ch = is.read()) != -1)
+               os.write(ch);
+               data = os.toByteArray();
+         }
+         catch (IOException ioex) {
+         }
+      }
+
+      /* Create a DataSource from a byte array */
+      public ByteArrayDataSource(byte[] data, String type) {
+         this.data = data;
+         this.type = type;
+      }
+
+      /* Create a DataSource from a String */
+      public ByteArrayDataSource(String data, String type) {
+         try {
+            this.data = data.getBytes("iso-8859-1");
+         } 
+         catch (UnsupportedEncodingException uex) {
+         }
+         this.type = type;
+      }
+      /**
+       * Return an InputStream for the data. Note - a new stream must be
+       * returned each time.
+       */
+      public InputStream getInputStream() throws IOException {
+         if (data == null)
+            throw new IOException("no data");
+         return new ByteArrayInputStream(data);
+      }
+
+      public OutputStream getOutputStream() throws IOException {
+         throw new IOException("cannot do this");
+      }
+
+      public String getContentType() {
+         return type;
+      }
+
+      public String getName() {
+         return "dummy";
+      }
+   }
 }
\ No newline at end of file
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to