Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrescobar2011-08-10 03:28:05 +0000
committerRyan D. Brooks2011-08-10 03:28:05 +0000
commitf135d5263a3d0c5597e8a48f43ac9a8dc50ec1f8 (patch)
treec5fca6e4ec7272f1f78af0d4e064f356ed4c4180 /plugins/org.eclipse.osee.mail.admin
parent34711e00d3a815754426b86248b5d90d5c0f9902 (diff)
downloadorg.eclipse.osee-f135d5263a3d0c5597e8a48f43ac9a8dc50ec1f8.tar.gz
org.eclipse.osee-f135d5263a3d0c5597e8a48f43ac9a8dc50ec1f8.tar.xz
org.eclipse.osee-f135d5263a3d0c5597e8a48f43ac9a8dc50ec1f8.zip
feature[bgz_348148]: Update mail service to use callables
Diffstat (limited to 'plugins/org.eclipse.osee.mail.admin')
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailSendOperation.java78
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailServiceImpl.java41
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/SendMailCallable.java88
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/StatusTransportListener.java62
4 files changed, 163 insertions, 106 deletions
diff --git a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailSendOperation.java b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailSendOperation.java
deleted file mode 100644
index 48999929fdd..00000000000
--- a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailSendOperation.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Boeing.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Boeing - initial API and implementation
- *******************************************************************************/
-package org.eclipse.osee.mail.admin.internal;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.activation.CommandMap;
-import javax.activation.MailcapCommandMap;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.event.TransportListener;
-import javax.mail.internet.MimeMessage;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.osee.framework.core.operation.AbstractOperation;
-import org.eclipse.osee.mail.MailMessage;
-import org.eclipse.osee.mail.MailUtils;
-import org.eclipse.osee.mail.SendMailOperation;
-
-/**
- * @author Roberto E. Escobar
- */
-public final class MailSendOperation extends AbstractOperation implements SendMailOperation {
- private final MailMessage email;
- private final MailMessageFactory factory;
- private final Set<TransportListener> listeners = new HashSet<TransportListener>();
-
- public MailSendOperation(String opName, String plugin, MailMessageFactory factory, MailMessage email) {
- super(opName, plugin);
- this.factory = factory;
- this.email = email;
- }
-
- @Override
- public void addListener(TransportListener listener) {
- if (listener != null) {
- listeners.add(listener);
- }
- }
-
- @Override
- public void removeListener(TransportListener listener) {
- if (listener != null) {
- listeners.remove(listener);
- }
- }
-
- @Override
- protected void doWork(IProgressMonitor monitor) throws Exception {
- MailcapCommandMap mc = MailUtils.getMailcapCommandMap();
- CommandMap.setDefaultCommandMap(mc);
-
- final Session session = factory.createSession();
- final MimeMessage message = factory.createMimeMessage(session, email);
- final Transport transport = factory.createTransport(session);
-
- for (TransportListener listener : listeners) {
- transport.addTransportListener(listener);
- }
- try {
- message.saveChanges();
- transport.sendMessage(message, message.getAllRecipients());
- } finally {
- for (TransportListener listener : listeners) {
- transport.removeTransportListener(listener);
- }
- transport.close();
- }
- }
-
-}
diff --git a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailServiceImpl.java b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailServiceImpl.java
index 90df3076698..01cfa72397b 100644
--- a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailServiceImpl.java
+++ b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailServiceImpl.java
@@ -14,13 +14,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
import javax.activation.DataSource;
+import javax.mail.event.TransportListener;
import org.eclipse.osee.mail.MailConstants;
import org.eclipse.osee.mail.MailMessage;
import org.eclipse.osee.mail.MailService;
import org.eclipse.osee.mail.MailServiceConfig;
import org.eclipse.osee.mail.MailUtils;
-import org.eclipse.osee.mail.SendMailOperation;
+import org.eclipse.osee.mail.SendMailStatus;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
@@ -28,11 +31,11 @@ import org.osgi.service.event.EventAdmin;
* @author Roberto E. Escobar
*/
public class MailServiceImpl implements MailService {
- public static final String PLUGIN_ID = "org.eclipse.osee.mail.admin";
private MailServiceConfig config;
private MailMessageFactory factory;
private EventAdmin eventAdmin;
+ private TransportListener[] listeners;
public void setEventAdmin(EventAdmin eventAdmin) {
this.eventAdmin = eventAdmin;
@@ -52,40 +55,22 @@ public class MailServiceImpl implements MailService {
config = new MailServiceConfig();
factory = new MailMessageFactory(config);
eventAdmin.postEvent(new Event(MailConstants.REGISTRATION_EVENT, props));
+
+ listeners = new TransportListener[] {new MailTransportListener(eventAdmin)};
}
public synchronized void stop(Map<String, String> props) {
eventAdmin.postEvent(new Event(MailConstants.DEREGISTRATION_EVENT, props));
+ listeners = null;
}
@Override
- public List<SendMailOperation> createSendOp(MailMessage... emails) {
- return createOperation(factory, eventAdmin, emails);
- }
-
- private static List<SendMailOperation> createOperation(MailMessageFactory factory, EventAdmin eventAdmin, MailMessage... emails) {
- List<SendMailOperation> ops = new ArrayList<SendMailOperation>();
- int size = emails.length;
- if (size != 0) {
- if (size == 1) {
- MailMessage mail = emails[0];
- String opName = String.format("Send [%s]", mail.getSubject());
- ops.add(createMailSendOp(factory, eventAdmin, opName, mail));
- } else {
- int count = 0;
- for (MailMessage mail : emails) {
- String opName = String.format("Send [%s of %s] [%s]", ++count, size, mail.getSubject());
- ops.add(createMailSendOp(factory, eventAdmin, opName, mail));
- }
- }
+ public List<Callable<SendMailStatus>> createSendCalls(long waitForStatus, TimeUnit timeUnit, MailMessage... emails) {
+ List<Callable<SendMailStatus>> callables = new ArrayList<Callable<SendMailStatus>>();
+ for (MailMessage mail : emails) {
+ callables.add(new SendMailCallable(factory, mail, waitForStatus, timeUnit, listeners));
}
- return ops;
- }
-
- private static MailSendOperation createMailSendOp(MailMessageFactory handler, EventAdmin eventAdmin, String opName, MailMessage mail) {
- MailSendOperation operation = new MailSendOperation(opName, PLUGIN_ID, handler, mail);
- operation.addListener(new MailTransportListener(eventAdmin));
- return operation;
+ return callables;
}
@Override
diff --git a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/SendMailCallable.java b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/SendMailCallable.java
new file mode 100644
index 00000000000..78c4f5eec80
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/SendMailCallable.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.mail.admin.internal;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import javax.activation.CommandMap;
+import javax.activation.MailcapCommandMap;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.event.TransportListener;
+import javax.mail.internet.MimeMessage;
+import org.eclipse.osee.mail.MailMessage;
+import org.eclipse.osee.mail.MailUtils;
+import org.eclipse.osee.mail.SendMailStatus;
+import org.eclipse.osee.mail.SendMailStatus.MailStatus;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SendMailCallable implements Callable<SendMailStatus> {
+
+ private final MailMessage email;
+ private final MailMessageFactory factory;
+ private final TransportListener[] listeners;
+ private final long waitForStatus;
+ private final TimeUnit timeUnit;
+
+ public SendMailCallable(MailMessageFactory factory, MailMessage email, long waitForStatus, TimeUnit timeUnit, TransportListener... listeners) {
+ this.factory = factory;
+ this.email = email;
+ this.listeners = listeners;
+ this.waitForStatus = waitForStatus;
+ this.timeUnit = timeUnit;
+ }
+
+ @Override
+ public SendMailStatus call() throws Exception {
+ MailcapCommandMap mc = MailUtils.getMailcapCommandMap();
+ CommandMap.setDefaultCommandMap(mc);
+
+ final Session session = factory.createSession();
+ final MimeMessage message = factory.createMimeMessage(session, email);
+ final Transport transport = factory.createTransport(session);
+ final SendMailStatus status = new SendMailStatus();
+
+ StatusTransportListener statusListener = new StatusTransportListener(status);
+ transport.addTransportListener(statusListener);
+ if (listeners != null) {
+ for (TransportListener listener : listeners) {
+ transport.addTransportListener(listener);
+ }
+ }
+ try {
+ message.saveChanges();
+ transport.sendMessage(message, message.getAllRecipients());
+ synchronized (statusListener) {
+ long waitMillis = timeUnit.toMillis(waitForStatus);
+ statusListener.wait(waitMillis);
+ }
+ } finally {
+ if (listeners != null) {
+ for (TransportListener listener : listeners) {
+ transport.removeTransportListener(listener);
+ }
+ }
+ transport.removeTransportListener(statusListener);
+ transport.close();
+ }
+ if (waitForStatus <= 0 || !statusListener.wasUpdateReceived()) {
+ MailStatus mStatus = new MailStatus();
+ mStatus.setDateSent(message.getSentDate());
+ mStatus.setSubject(message.getSubject());
+ mStatus.setUuid(message.getMessageID());
+ mStatus.setVerified(false);
+ status.add(mStatus);
+ }
+ return status;
+ }
+}
diff --git a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/StatusTransportListener.java b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/StatusTransportListener.java
new file mode 100644
index 00000000000..ff9e9edcfbc
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/StatusTransportListener.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.mail.admin.internal;
+
+import javax.mail.event.TransportEvent;
+import javax.mail.event.TransportListener;
+import org.eclipse.osee.mail.MailEventUtil;
+import org.eclipse.osee.mail.SendMailStatus;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StatusTransportListener implements TransportListener {
+
+ private final SendMailStatus status;
+ private volatile boolean wasUpdateReceived;
+
+ public StatusTransportListener(SendMailStatus status) {
+ this.status = status;
+ this.wasUpdateReceived = false;
+ }
+
+ @Override
+ public void messageDelivered(TransportEvent event) {
+ handleEvent(event);
+ }
+
+ @Override
+ public void messageNotDelivered(TransportEvent event) {
+ handleEvent(event);
+ }
+
+ @Override
+ public void messagePartiallyDelivered(TransportEvent event) {
+ handleEvent(event);
+ }
+
+ private void handleEvent(TransportEvent event) {
+ synchronized (this) {
+ try {
+ MailEventUtil.loadStatus(status, event);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ wasUpdateReceived = true;
+ notify();
+ }
+ }
+
+ public synchronized boolean wasUpdateReceived() {
+ return wasUpdateReceived;
+ }
+
+} \ No newline at end of file

Back to the top