com/scalagent/joram/mom/dest/mail/JavaMailQueueImpl.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.Queue;
00030 import org.objectweb.joram.mom.dest.QueueImpl;
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 JavaMailQueueImpl extends QueueImpl implements JavaMailQueueImplMBean {
00051   private static final long serialVersionUID = 1L;
00052 
00053   public static Logger logger = Debug.getLogger(JavaMailQueueImpl.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 JavaMailQueueImpl(AgentId adminId, Properties prop) {
00081     super(adminId, prop);
00082     setProperties(prop);
00083 
00084     if (logger.isLoggable(BasicLevel.DEBUG))
00085       logger.log(BasicLevel.DEBUG, 
00086                  "--- " + this + " JavaMailQueueImpl.<init>: " +
00087                  "\nsenderInfos=" + senderInfos +
00088                  "\npopServer=" + popServer +
00089                  "\npopUser=" + popUser +
00090                  "\npopPeriod=" + popPeriod +
00091                  "\nexpunge=" + expunge);
00092   }
00093 
00094   public void setProperties(Properties prop) {
00095     smtpServer = prop.getProperty("smtpServer", smtpServer);
00096     to = prop.getProperty("to", to);
00097     cc = prop.getProperty("cc", cc);
00098     bcc = prop.getProperty("bcc", bcc);
00099     from = prop.getProperty("from", from);
00100     subject = prop.getProperty("subject", subject);
00101     selector = prop.getProperty("selector", selector);
00102 
00103     // to send mail
00104     senderInfos = new Vector();
00105     senderInfos.add(new SenderInfo(smtpServer,
00106                                    to, cc, bcc, from, subject,
00107                                    selector));
00108 
00109     try {
00110       popPeriod = Long.valueOf(prop.getProperty("popPeriod")).longValue();
00111     } catch (NumberFormatException exc) {
00112       popPeriod = -1;
00113     }
00114     popServer = prop.getProperty("popServer", popServer);
00115     popUser = prop.getProperty("popUser", popUser);
00116     popPassword = prop.getProperty("popPassword", popPassword);
00117     expunge = Boolean.valueOf(prop.getProperty("expunge")).booleanValue();
00118   }
00119   
00125   public void initialize(boolean firstTime) {
00126     if (logger.isLoggable(BasicLevel.DEBUG))
00127       logger.log(BasicLevel.DEBUG, "initialize(" + firstTime + ')');
00128     
00129     super.initialize(firstTime);
00130 
00131     if (logger.isLoggable(BasicLevel.DEBUG))
00132       logger.log(BasicLevel.DEBUG, 
00133                  "--- " + this + " JavaMailQueueImpl.initialize: " +
00134                  "\nsenderInfos=" + senderInfos +
00135                  "\npopServer=" + popServer +
00136                  "\npopUser=" + popUser +
00137                  "\npopPeriod=" + popPeriod +
00138                  "\nexpunge=" + expunge);
00139 
00140     javaMailUtil = new JavaMailUtil();
00141   }
00142 
00143   // ==================================================
00144   // MBean interface
00145   // ==================================================
00151   public String getSMTPServer() {
00152     return smtpServer;
00153   }
00154 
00161   public void setSMTPServer(String smtpServer) {
00162     this.smtpServer = smtpServer;
00163   }
00164 
00170   public String getDefaultTo() {
00171     return to;
00172   }
00173 
00180   public void setDefaultTo(String to) {
00181     this.to = to;
00182   }
00183 
00189   public String getDefaultCC() {
00190     return cc;
00191   }
00192 
00199   public void setDefaultCC(String cc) {
00200     this.cc = cc;
00201   }
00202 
00208   public String getDefaultBcc() {
00209     return bcc;
00210   }
00211 
00218   public void setDefaultBcc(String bcc) {
00219     this.bcc = bcc;
00220   }
00221 
00227   public String getDefaultFrom() {
00228     return from;
00229   }
00230 
00237   public void setDefaultFrom(String from) {
00238     this.from = from;
00239   }
00240 
00246   public String getDefaultSubject() {
00247     return subject;
00248   }
00249 
00256   public void setDefaultSubject(String subject) {
00257     this.subject = subject;
00258   }
00259 
00265   public String getDefaultSelector() {
00266     return selector;
00267   }
00268 
00275   public void setDefaultSelector(String selector) {
00276     this.selector = selector;
00277   }
00278 
00284   public long getPopPeriod() {
00285     return popPeriod;
00286   }
00287 
00294   public void setPopPeriod(long period) {
00295     popPeriod = period;
00296   }
00297 
00303   public String getPopServer() {
00304     return popServer;
00305   }
00306 
00312   public void setPopServer(String server) {
00313     this.popServer = server;
00314   }
00315 
00321   public String getPopUser() {
00322     return popUser;
00323   }
00324 
00331   public void setPopUser(String user) {
00332     this.popUser = user;
00333   }
00334 
00340   public String getPopPassword() {
00341     return popPassword;
00342   }
00343 
00350   public void setPopPassword(String pass) {
00351     this.popPassword = pass;
00352   }
00353 
00359   public boolean getExpunge() {
00360     return expunge;
00361   }
00362 
00369   public void setExpunge(boolean expunge) {
00370     this.expunge = expunge;
00371   }
00372 
00373   // ==================================================
00374 
00375   public String toString() {
00376     return "JavaMailQueueImpl:" + getId().toString();
00377   }
00378 
00379   protected Object specialAdminProcess(SpecialAdminRequest not) 
00380     throws RequestException {
00381 
00382     try {
00383       SpecialAdmin req = not.getRequest();
00384       
00385       if (logger.isLoggable(BasicLevel.DEBUG))
00386         logger.log(BasicLevel.DEBUG, 
00387                    "--- " + this + " specialAdminProcess : " + req);
00388       if (req instanceof AddSenderInfo)
00389         addSenderInfo(((AddSenderInfo) req).si,
00390                       ((AddSenderInfo) req).index);
00391       else if (req instanceof RemoveSenderInfo) {
00392         if (((RemoveSenderInfo) req).index > -1)
00393           removeSenderInfo(((RemoveSenderInfo) req).index);
00394         else 
00395           removeSenderInfo(((RemoveSenderInfo) req).si);
00396       }  else if (req instanceof UpdateSenderInfo)
00397         updateSenderInfo(((UpdateSenderInfo) req).oldSi,
00398                          ((UpdateSenderInfo) req).newSi);
00399       
00400       if (logger.isLoggable(BasicLevel.DEBUG))
00401         logger.log(BasicLevel.DEBUG, 
00402                    "--- " + this + " specialAdminProcess senderInfos=" + senderInfos);
00403     } catch (Exception exc) {
00404       if (logger.isLoggable(BasicLevel.WARN))
00405         logger.log(BasicLevel.WARN, 
00406                    "--- " + this + " specialAdminProcess", exc);
00407       throw new RequestException(exc.getMessage());
00408     }
00409     return "done";
00410   }
00411     
00412   protected void addSenderInfo(SenderInfo si, int index) 
00413     throws ArrayIndexOutOfBoundsException {
00414     if (index > -1)
00415       senderInfos.add(index,si);
00416     else
00417       senderInfos.add(si);
00418   }
00419 
00420   protected SenderInfo removeSenderInfo(int index)
00421     throws ArrayIndexOutOfBoundsException {
00422     return (SenderInfo) senderInfos.remove(index);
00423   }
00424 
00425   protected boolean removeSenderInfo(SenderInfo si) {
00426     return senderInfos.remove(si);
00427   }
00428 
00429   protected boolean updateSenderInfo(SenderInfo oldSi, SenderInfo newSi)
00430     throws ArrayIndexOutOfBoundsException {
00431     int index = senderInfos.indexOf(oldSi);
00432     if (index > -1) return false;
00433     senderInfos.set(index,newSi);
00434     return true;
00435   }
00436 
00437   public ClientMessages preProcess(AgentId from, ClientMessages not) {
00438     DMQManager dmqManager = null;
00439     for (Enumeration msgs = not.getMessages().elements(); msgs.hasMoreElements();) {
00440       Message msg = (Message) msgs.nextElement();
00441       SenderInfo si = match(msg);
00442 
00443       if (logger.isLoggable(BasicLevel.DEBUG))
00444         logger.log(BasicLevel.DEBUG, "--- " + this + " match=" + (si != null));
00445       if (si != null) {
00446         try {
00447           javaMailUtil.sendJavaMail(si, new MailMessage(msg));
00448         } catch (Exception exc) {
00449           if (dmqManager == null) {
00450             dmqManager = new DMQManager(not.getDMQId(), dmqId, getId());
00451           }
00452           nbMsgsSentToDMQSinceCreation++;
00453           dmqManager.addDeadMessage(msg, MessageErrorConstants.UNEXPECTED_ERROR);
00454           logger.log(BasicLevel.WARN, "JavaMailQueueImpl.sendJavaMail", exc);
00455         }
00456         not.getMessages().remove(msg);
00457       }
00458     }
00459     if (dmqManager != null) {
00460       dmqManager.sendToDMQ();
00461     }
00462     if (not.getMessages().size() > 0) {
00463       return not;
00464     }
00465     return null;
00466   }
00467   
00468   protected SenderInfo match(Message msg) {
00469     for (Enumeration e = senderInfos.elements(); e.hasMoreElements(); ) {
00470       SenderInfo si = (SenderInfo) e.nextElement();
00471       if (si.selector == null) return si;
00472       if (Selector.matches(msg,si.selector))
00473         return si;
00474     }
00475     return null;
00476   }
00477 
00478   public void doPop() {
00479     long count = 0;
00480     Vector toExpunge = new Vector();
00481     javax.mail.Message[] msgs = javaMailUtil.popMail(popServer,
00482                                                      popUser,
00483                                                      popPassword,
00484                                                      expunge);            
00485     if (msgs != null) {
00486       for (int i = 0; i < msgs.length; i++) {
00487         if (logger.isLoggable(BasicLevel.DEBUG))
00488           logger.log(BasicLevel.DEBUG, 
00489                      "--- " + this + " doPop : msgs[" + i + "] = " + msgs[i]);
00490         try {
00491           count++;
00492           Properties prop = javaMailUtil.getMOMProperties(msgs[i]);
00493           MailMessage m = 
00494             javaMailUtil.createMessage(prop,
00495                                        getId().toString()+"mail_"+count,
00496                                        Queue.getDestinationType(),
00497                                        getId().toString(),
00498                                        Queue.getDestinationType());
00499           storeMessage(new org.objectweb.joram.mom.messages.Message(m.getSharedMessage()));
00500 
00501           if (logger.isLoggable(BasicLevel.DEBUG))
00502             logger.log(BasicLevel.DEBUG, 
00503                        "--- " + this + " doPop : storeMessage m = " + m);
00504           if (expunge)
00505             toExpunge.add(msgs[i]);
00506         } catch (Exception exc) {
00507           if (logger.isLoggable(BasicLevel.DEBUG))
00508             logger.log(BasicLevel.DEBUG, 
00509                        "--- " + this + " doPop", exc);
00510           continue;
00511         }
00512       }
00513       deliverMessages(0);
00514     }
00515 
00516     javaMailUtil.closeFolder(toExpunge,expunge);
00517     toExpunge.clear();
00518   }
00519 }

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