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.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
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
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
00527
00528 forward(getId(),cm);
00529 }
00530 }