diff options
author | rescobar | 2011-08-10 03:28:05 +0000 |
---|---|---|
committer | Ryan D. Brooks | 2011-08-10 03:28:05 +0000 |
commit | f135d5263a3d0c5597e8a48f43ac9a8dc50ec1f8 (patch) | |
tree | c5fca6e4ec7272f1f78af0d4e064f356ed4c4180 /plugins/org.eclipse.osee.mail.admin | |
parent | 34711e00d3a815754426b86248b5d90d5c0f9902 (diff) | |
download | org.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')
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 |