00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
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 }