com/scalagent/joram/mom/dest/mail/JavaMailTopicImpl.java

00001 /*
00002  * JORAM: Java(TM) Open Reliable Asynchronous Messaging
00003  * Copyright (C) 2003 - 2008 ScalAgent Distributed Technologies
00004  *
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Lesser General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2.1 of the License, or any later version.
00009  * 
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU Lesser General Public
00016  * License along with this library; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00018  * USA.
00019  *
00020  * Initial developer(s): ScalAgent Distributed Technologies
00021  * Contributor(s): 
00022  */
00023 package com.scalagent.joram.mom.dest.mail;
00024 
00025 import java.util.Enumeration;
00026 import java.util.Properties;
00027 import java.util.Vector;
00028 
00029 import org.objectweb.joram.mom.dest.Topic;
00030 import org.objectweb.joram.mom.dest.TopicImpl;
00031 import org.objectweb.joram.mom.notifications.ClientMessages;
00032 import org.objectweb.joram.mom.notifications.SpecialAdminRequest;
00033 import org.objectweb.joram.mom.util.DMQManager;
00034 import org.objectweb.joram.shared.MessageErrorConstants;
00035 import org.objectweb.joram.shared.admin.SpecialAdmin;
00036 import org.objectweb.joram.shared.excepts.RequestException;
00037 import org.objectweb.joram.shared.messages.Message;
00038 import org.objectweb.joram.shared.selectors.Selector;
00039 import org.objectweb.util.monolog.api.BasicLevel;
00040 import org.objectweb.util.monolog.api.Logger;
00041 
00042 import fr.dyade.aaa.agent.AgentId;
00043 import fr.dyade.aaa.util.Debug;
00044 
00049 public class JavaMailTopicImpl extends TopicImpl implements JavaMailTopicImplMBean {
00051   private static final long serialVersionUID = 1L;
00052 
00053   public static Logger logger = Debug.getLogger(JavaMailTopicImpl.class.getName());
00054 
00055   private String smtpServer = null;
00056 
00057   private String to = null;
00058   private String cc = null;
00059   private String bcc = null;
00060   private String from = null;
00061   private String subject = null;
00062   private String selector = null;
00063 
00064   private long popPeriod = -1;
00065   private String popServer = null;
00066   private String popUser = null;
00067   private String popPassword = null;
00068   private boolean expunge = false;
00069 
00070   private Vector senderInfos = null;
00071 
00072   private transient JavaMailUtil javaMailUtil = null;
00073 
00080   public JavaMailTopicImpl(AgentId adminId,
00081                            Properties prop) {
00082     super(adminId, prop);
00083     setProperties(prop);
00084 
00085     if (logger.isLoggable(BasicLevel.DEBUG))
00086       logger.log(BasicLevel.DEBUG, 
00087                  "--- " + this + " JavaMailTopicImpl.<init>: " +
00088                  "\nsenderInfos=" + senderInfos +
00089                  "\npopServer=" + popServer +
00090                  "\npopUser=" + popUser +
00091                  "\npopPeriod=" + popPeriod +
00092                  "\nexpunge=" + expunge);
00093   }
00094 
00095   public void setProperties(Properties prop) {
00096     smtpServer = prop.getProperty("smtpServer", smtpServer);
00097     to = prop.getProperty("to", to);
00098     cc = prop.getProperty("cc", cc);
00099     bcc = prop.getProperty("bcc", bcc);
00100     from = prop.getProperty("from", from);
00101     subject = prop.getProperty("subject", subject);
00102     selector = prop.getProperty("selector", selector);
00103 
00104     // to send mail
00105     senderInfos = new Vector();
00106     senderInfos.add(new SenderInfo(smtpServer,
00107                                    to, cc, bcc, from, subject,
00108                                    selector));
00109 
00110     try {
00111       popPeriod = Long.valueOf(prop.getProperty("popPeriod")).longValue();
00112     } catch (NumberFormatException exc) {
00113       popPeriod = -1;
00114     }
00115     popServer = prop.getProperty("popServer", popServer);
00116     popUser = prop.getProperty("popUser", popUser);
00117     popPassword = prop.getProperty("popPassword", popPassword);
00118     expunge = Boolean.valueOf(prop.getProperty("expunge")).booleanValue();
00119   }
00120  
00126   public void initialize(boolean firstTime) {
00127     if (logger.isLoggable(BasicLevel.DEBUG))
00128       logger.log(BasicLevel.DEBUG, "initialize(" + firstTime + ')');
00129     
00130     super.initialize(firstTime);
00131 
00132     if (logger.isLoggable(BasicLevel.DEBUG))
00133       logger.log(BasicLevel.DEBUG, 
00134                  "--- " + this +
00135                  " JavaMailTopicImpl.initialize: " +
00136                  "\nsenderInfos=" + senderInfos +
00137                  "\npopServer=" + popServer +
00138                  "\npopUser=" + popUser +
00139                  "\npopPeriod=" + popPeriod +
00140                  "\nexpunge=" + expunge);
00141 
00142     javaMailUtil = new JavaMailUtil();
00143   }
00144 
00145   // ==================================================
00146   // MBean interface
00147   // ==================================================
00153   public String getSMTPServer() {
00154     return smtpServer;
00155   }
00156 
00163   public void setSMTPServer(String smtpServer) {
00164     this.smtpServer = smtpServer;
00165   }
00166 
00172   public String getDefaultTo() {
00173     return to;
00174   }
00175 
00182   public void setDefaultTo(String to) {
00183     this.to = to;
00184   }
00185 
00191   public String getDefaultCC() {
00192     return cc;
00193   }
00194 
00201   public void setDefaultCC(String cc) {
00202     this.cc = cc;
00203   }
00204 
00210   public String getDefaultBcc() {
00211     return bcc;
00212   }
00213 
00220   public void setDefaultBcc(String bcc) {
00221     this.bcc = bcc;
00222   }
00223 
00229   public String getDefaultFrom() {
00230     return from;
00231   }
00232 
00239   public void setDefaultFrom(String from) {
00240     this.from = from;
00241   }
00242 
00248   public String getDefaultSubject() {
00249     return subject;
00250   }
00251 
00258   public void setDefaultSubject(String subject) {
00259     this.subject = subject;
00260   }
00261 
00267   public String getDefaultSelector() {
00268     return selector;
00269   }
00270 
00277   public void setDefaultSelector(String selector) {
00278     this.selector = selector;
00279   }
00280 
00286   public long getPopPeriod() {
00287     return popPeriod;
00288   }
00289 
00296   public void setPopPeriod(long period) {
00297     popPeriod = period;
00298   }
00299 
00305   public String getPopServer() {
00306     return popServer;
00307   }
00308 
00314   public void setPopServer(String server) {
00315     this.popServer = server;
00316   }
00317 
00323   public String getPopUser() {
00324     return popUser;
00325   }
00326 
00333   public void setPopUser(String user) {
00334     this.popUser = user;
00335   }
00336 
00342   public String getPopPassword() {
00343     return popPassword;
00344   }
00345 
00352   public void setPopPassword(String pass) {
00353     this.popPassword = pass;
00354   }
00355 
00361   public boolean getExpunge() {
00362     return expunge;
00363   }
00364 
00371   public void setExpunge(boolean expunge) {
00372     this.expunge = expunge;
00373   }
00374 
00375   // ==================================================
00376 
00377   public String toString() {
00378     return "JavaMailTopicImpl:" + getId().toString();
00379   }
00380 
00381   protected Object specialAdminProcess(SpecialAdminRequest not) 
00382     throws RequestException {
00383 
00384     try {
00385       SpecialAdmin req = not.getRequest();
00386       
00387       if (logger.isLoggable(BasicLevel.DEBUG))
00388         logger.log(BasicLevel.DEBUG, 
00389                    "--- " + this + " specialAdminProcess : " + req);
00390       if (req instanceof AddSenderInfo)
00391         addSenderInfo(((AddSenderInfo) req).si,
00392                       ((AddSenderInfo) req).index);
00393       else if (req instanceof RemoveSenderInfo) {
00394         if (((RemoveSenderInfo) req).index > -1)
00395           removeSenderInfo(((RemoveSenderInfo) req).index);
00396         else 
00397           removeSenderInfo(((RemoveSenderInfo) req).si);
00398       } else if (req instanceof UpdateSenderInfo)
00399         updateSenderInfo(((UpdateSenderInfo) req).oldSi,
00400                          ((UpdateSenderInfo) req).newSi);
00401         
00402       if (logger.isLoggable(BasicLevel.DEBUG))
00403         logger.log(BasicLevel.DEBUG, 
00404                    "--- " + this + " specialAdminProcess senderInfos=" + senderInfos);
00405     } catch (Exception exc) {
00406       if (logger.isLoggable(BasicLevel.WARN))
00407         logger.log(BasicLevel.WARN, 
00408                    "--- " + this + " specialAdminProcess", exc);
00409       throw new RequestException(exc.getMessage());
00410     }
00411     return "done";
00412   }
00413     
00414   protected void addSenderInfo(SenderInfo si, int index) 
00415     throws ArrayIndexOutOfBoundsException {
00416     if (index > -1)
00417       senderInfos.add(index,si);
00418     else
00419       senderInfos.add(si);
00420   }
00421 
00422   protected SenderInfo removeSenderInfo(int index)
00423     throws ArrayIndexOutOfBoundsException {
00424     return (SenderInfo) senderInfos.remove(index);
00425   }
00426 
00427   protected boolean removeSenderInfo(SenderInfo si) {
00428     return senderInfos.remove(si);
00429   }
00430 
00431   protected void updateSenderInfo(SenderInfo oldSi, SenderInfo newSi)
00432     throws ArrayIndexOutOfBoundsException {
00433     int index = senderInfos.indexOf(oldSi);
00434     if (index > -1)
00435       senderInfos.set(index,newSi);
00436   }
00437 
00438   public ClientMessages preProcess(AgentId from, ClientMessages not) {
00439     DMQManager dmqManager = null;
00440     for (Enumeration msgs = not.getMessages().elements(); msgs.hasMoreElements();) {
00441       Message msg = (Message) msgs.nextElement();
00442       SenderInfo si = match(msg);
00443 
00444       if (logger.isLoggable(BasicLevel.DEBUG))
00445         logger.log(BasicLevel.DEBUG, "--- " + this + " match=" + (si != null));
00446       if (si != null) {
00447         try {
00448           javaMailUtil.sendJavaMail(si, new MailMessage(msg));
00449         } catch (Exception exc) {
00450           if (dmqManager == null) {
00451             dmqManager = new DMQManager(not.getDMQId(), dmqId, getId());
00452           }
00453           nbMsgsSentToDMQSinceCreation++;
00454           dmqManager.addDeadMessage(msg, MessageErrorConstants.UNEXPECTED_ERROR);
00455 
00456           if (logger.isLoggable(BasicLevel.WARN))
00457             logger.log(BasicLevel.WARN, "JavaMailTopicImpl.sendJavaMail", exc);
00458         }
00459       }
00460     }
00461     if (dmqManager != null) {
00462       dmqManager.sendToDMQ();
00463     }
00464     return not;
00465   }
00466   
00467   protected SenderInfo match(Message msg) {
00468     for (Enumeration e = senderInfos.elements(); e.hasMoreElements(); ) {
00469       SenderInfo si = (SenderInfo) e.nextElement();
00470       if (si.selector == null) return si;
00471       if (Selector.matches(msg,si.selector))
00472         return si;
00473     }
00474     return null;
00475   }
00476 
00477   public void doPop() {
00478     long count = 0;
00479     Vector toExpunge = new Vector();
00480     javax.mail.Message[] msgs = javaMailUtil.popMail(popServer,
00481                                                      popUser,
00482                                                      popPassword,
00483                                                      expunge);      
00484     if (msgs != null) {
00485       for (int i = 0; i < msgs.length; i++) {
00486         if (logger.isLoggable(BasicLevel.DEBUG))
00487           logger.log(BasicLevel.DEBUG, 
00488                      "--- " + this + " doPop : msgs[" + i + "] = " + msgs[i]);
00489         try {
00490           count++;
00491           Properties prop = javaMailUtil.getMOMProperties(msgs[i]);
00492           MailMessage m = 
00493             javaMailUtil.createMessage(prop,
00494                                        getId().toString()+"mail_"+count,
00495                                        Topic.getDestinationType(),
00496                                        getId().toString(),
00497                                        Topic.getDestinationType());
00498           publish(m.getSharedMessage());
00499 
00500           if (logger.isLoggable(BasicLevel.DEBUG))
00501             logger.log(BasicLevel.DEBUG, 
00502                        "--- " + this + " doPop : publish m = " + m);
00503           if (expunge)
00504             toExpunge.add(msgs[i]);
00505         } catch (Exception exc) {
00506           if (logger.isLoggable(BasicLevel.DEBUG))
00507             logger.log(BasicLevel.DEBUG, 
00508                        "--- " + this + " doPop", exc);
00509           continue;
00510         }
00511       }
00512     }
00513     
00514     javaMailUtil.closeFolder(toExpunge,expunge);
00515     toExpunge.clear();
00516   }
00517   
00518   private void publish(Message msg) {
00519     if (logger.isLoggable(BasicLevel.DEBUG))
00520       logger.log(BasicLevel.DEBUG, 
00521                  "--- " + this + " publish msg=" + msg);
00522 
00523     Vector messages = new Vector();
00524     messages.add(msg);
00525     ClientMessages cm = new ClientMessages(-1,-1,messages);
00526     // not use channel.sendTo(...) because from=#0.0.0
00527     //javaMailTopic.send(getId(),cm);
00528     forward(getId(),cm);
00529   }
00530 }

Generated on Tue Sep 16 16:14:22 2008 for joram by  doxygen 1.5.0