Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrescobar2011-06-02 22:12:41 +0000
committerRyan D. Brooks2011-06-02 22:12:41 +0000
commit85ba84b82f5afbfb30c07b9daeb214cc2f872d71 (patch)
treee83d505970993c53a97672d156fc37f5ef5e740a /plugins/org.eclipse.osee.mail.admin
parenta6413d0a0ed0042221342a9f23996dd92c077622 (diff)
downloadorg.eclipse.osee-85ba84b82f5afbfb30c07b9daeb214cc2f872d71.tar.gz
org.eclipse.osee-85ba84b82f5afbfb30c07b9daeb214cc2f872d71.tar.xz
org.eclipse.osee-85ba84b82f5afbfb30c07b9daeb214cc2f872d71.zip
feature[bgz_348148]: Create server side mail service
Diffstat (limited to 'plugins/org.eclipse.osee.mail.admin')
-rw-r--r--plugins/org.eclipse.osee.mail.admin/.classpath7
-rw-r--r--plugins/org.eclipse.osee.mail.admin/.project33
-rw-r--r--plugins/org.eclipse.osee.mail.admin/META-INF/MANIFEST.MF17
-rw-r--r--plugins/org.eclipse.osee.mail.admin/OSGI-INF/mail.manager.xml13
-rw-r--r--plugins/org.eclipse.osee.mail.admin/build.properties9
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailMessageFactory.java105
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailSendOperation.java88
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailServiceImpl.java112
-rw-r--r--plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailTransportListener.java50
9 files changed, 434 insertions, 0 deletions
diff --git a/plugins/org.eclipse.osee.mail.admin/.classpath b/plugins/org.eclipse.osee.mail.admin/.classpath
new file mode 100644
index 00000000000..ad32c83a788
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.osee.mail.admin/.project b/plugins/org.eclipse.osee.mail.admin/.project
new file mode 100644
index 00000000000..149ba1757f0
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.mail.admin</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.osee.mail.admin/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.mail.admin/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c619be6d541
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Mail Admin
+Bundle-SymbolicName: org.eclipse.osee.mail.admin
+Bundle-Version: 0.9.9.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.activation;version="1.1.0",
+ javax.mail;version="1.4.1",
+ javax.mail.event;version="1.4.1",
+ javax.mail.internet;version="1.4.1",
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.mail,
+ org.osgi.service.event;version="1.2.0"
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/plugins/org.eclipse.osee.mail.admin/OSGI-INF/mail.manager.xml b/plugins/org.eclipse.osee.mail.admin/OSGI-INF/mail.manager.xml
new file mode 100644
index 00000000000..4aceb37f75b
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/OSGI-INF/mail.manager.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" enabled="true" name="org.eclipse.osee.mail.admin.internal.MailServiceImpl">
+ <implementation class="org.eclipse.osee.mail.admin.internal.MailServiceImpl"/>
+
+ <reference interface="org.osgi.service.event.EventAdmin" name="EventAdmin"
+ cardinality="1..1"
+ policy="static"
+ bind="setEventAdmin" />
+ <service>
+ <provide interface="org.eclipse.osee.mail.MailService"/>
+ </service>
+
+</scr:component>
diff --git a/plugins/org.eclipse.osee.mail.admin/build.properties b/plugins/org.eclipse.osee.mail.admin/build.properties
new file mode 100644
index 00000000000..cd62aceb319
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/build.properties
@@ -0,0 +1,9 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+additional.bundles = org.eclipse.osee.mail,\
+ javax.mail.glassfish,\
+ org.eclipse.osee.framework.core,\
+ org.eclipse.core.runtime
diff --git a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailMessageFactory.java b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailMessageFactory.java
new file mode 100644
index 00000000000..5c5a653c38a
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailMessageFactory.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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.Collection;
+import java.util.Date;
+import java.util.Properties;
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.mail.Address;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import org.eclipse.osee.mail.MailConstants;
+import org.eclipse.osee.mail.MailMessage;
+import org.eclipse.osee.mail.MailServiceConfig;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MailMessageFactory {
+
+ private final MailServiceConfig config;
+
+ public MailMessageFactory(MailServiceConfig config) {
+ this.config = config;
+ }
+
+ public Session createSession() {
+ final Properties props = System.getProperties();
+
+ String transport = config.getTransport();
+ props.put("mail.transport.protocol", transport);
+ props.put("mail." + transport + ".host", config.getHost());
+ props.put("mail." + transport + ".port", String.valueOf(config.getPort()));
+ props.put("mail." + transport + ".auth", String.valueOf(config.isAuthenticationRequired()).toLowerCase());
+ props.put("mail.debug", config.isDebug());
+
+ Session session = Session.getDefaultInstance(props);
+ session.setDebug(config.isDebug());
+ session.setDebugOut(System.out);
+ return session;
+ }
+
+ public Transport createTransport(Session session) throws MessagingException {
+ Transport transport = session.getTransport();
+ if (!transport.isConnected()) {
+ if (config.isAuthenticationRequired()) {
+ transport.connect(config.getUserName(), config.getPassword());
+ } else {
+ transport.connect();
+ }
+ }
+ return transport;
+ }
+
+ public MimeMessage createMimeMessage(Session session, MailMessage email) throws AddressException, MessagingException {
+ MimeMessage message = new MimeMessage(session);
+ message.setFrom(toAddress(email.getFrom()));
+ message.setSubject(email.getSubject(), "UTF-8");
+ message.setReplyTo(toAddress(email.getReplyTo()));
+ message.setRecipients(Message.RecipientType.TO, toAddress(email.getRecipients()));
+ message.addHeader(MailConstants.MAIL_UUID_HEADER, email.getId());
+ message.setSentDate(new Date());
+
+ Multipart multiPart = new MimeMultipart();
+ for (DataSource source : email.getAttachments()) {
+ MimeBodyPart part = new MimeBodyPart();
+ part.setDataHandler(new DataHandler(source));
+ multiPart.addBodyPart(part);
+ }
+ message.setContent(multiPart);
+ message.saveChanges();
+ return message;
+ }
+
+ private Address[] toAddress(Collection<String> rawAddresses) throws AddressException {
+ InternetAddress[] toReturn = new InternetAddress[rawAddresses.size()];
+ int index = 0;
+ for (String rawAddress : rawAddresses) {
+ toReturn[index++] = toAddress(rawAddress);
+ }
+ return toReturn;
+ }
+
+ private InternetAddress toAddress(String rawAddress) throws AddressException {
+ return new InternetAddress(rawAddress);
+ }
+
+}
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
new file mode 100644
index 00000000000..999ee81da3e
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailSendOperation.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.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.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 = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
+ mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
+ mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
+ mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
+ mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
+ mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
+ CommandMap.setDefaultCommandMap(mc);
+
+ //ClassLoader original = Thread.currentThread().getContextClassLoader();
+ // // Set class loader so can find the mail handlers
+ // Thread.currentThread().setContextClassLoader(
+ // new ExportClassLoader(SkynetGuiPlugin.getInstance().getPackageAdmin()));
+
+ 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();
+ // Thread.currentThread().setContextClassLoader(original);
+ }
+ }
+
+}
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
new file mode 100644
index 00000000000..f072c17276f
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailServiceImpl.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.activation.DataSource;
+import javax.mail.MessagingException;
+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.osgi.service.event.Event;
+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;
+
+ public void setEventAdmin(EventAdmin eventAdmin) {
+ this.eventAdmin = eventAdmin;
+ }
+
+ @Override
+ public MailServiceConfig getConfiguration() {
+ return config;
+ }
+
+ @Override
+ public void setConfiguration(MailServiceConfig config) {
+ this.config.setTo(config);
+ }
+
+ public synchronized void start(Map<String, String> props) {
+ config = new MailServiceConfig();
+ factory = new MailMessageFactory(config);
+ eventAdmin.postEvent(new Event(MailConstants.REGISTRATION_EVENT, props));
+ }
+
+ public synchronized void stop(Map<String, String> props) {
+ eventAdmin.postEvent(new Event(MailConstants.DEREGISTRATION_EVENT, props));
+ }
+
+ @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));
+ }
+ }
+ }
+ 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;
+ }
+
+ @Override
+ public MailMessage createSystemTestMessage(int testNumber) {
+ MailServiceConfig config = getConfiguration();
+ MailMessage message = new MailMessage();
+ message.setId(UUID.randomUUID().toString());
+ message.setFrom(config.getSystemAdminEmailAddress());
+ message.setSubject(String.format("Test email #%s", testNumber));
+ message.getRecipients().add(config.getSystemAdminEmailAddress());
+
+ String plainText = String.format("This is test email %s sent from org.eclipse.osee.mail.admin", testNumber);
+ String htmlData = String.format("<html><body><h4>%s</h4></body></html>", plainText);
+ DataSource source;
+ try {
+ source = MailUtils.createAlternativeDataSource("TestEmail", plainText, htmlData);
+ } catch (MessagingException ex) {
+ source = MailUtils.createFromString("TestEmail", plainText);
+ }
+ message.addAttachment(source);
+ return message;
+ }
+}
diff --git a/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailTransportListener.java b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailTransportListener.java
new file mode 100644
index 00000000000..1d896ac90a9
--- /dev/null
+++ b/plugins/org.eclipse.osee.mail.admin/src/org/eclipse/osee/mail/admin/internal/MailTransportListener.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.Map;
+import javax.mail.event.TransportEvent;
+import javax.mail.event.TransportListener;
+import org.eclipse.osee.mail.MailConstants;
+import org.eclipse.osee.mail.MailEventUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class MailTransportListener implements TransportListener {
+
+ private final EventAdmin eventAdmin;
+
+ public MailTransportListener(EventAdmin eventAdmin) {
+ this.eventAdmin = eventAdmin;
+ }
+
+ @Override
+ public void messageDelivered(TransportEvent event) {
+ Map<String, String> data = MailEventUtil.createTransportEventData(event);
+ eventAdmin.postEvent(new Event(MailConstants.MAIL_MESSAGE_DELIVERED, data));
+ }
+
+ @Override
+ public void messageNotDelivered(TransportEvent event) {
+ Map<String, String> data = MailEventUtil.createTransportEventData(event);
+ eventAdmin.postEvent(new Event(MailConstants.MAIL_MESSAGE_NOT_DELIVERED, data));
+ }
+
+ @Override
+ public void messagePartiallyDelivered(TransportEvent event) {
+ Map<String, String> data = MailEventUtil.createTransportEventData(event);
+ eventAdmin.postEvent(new Event(MailConstants.MAIL_MESSAGE_PARTIALLY_DELIVERED, data));
+ }
+
+} \ No newline at end of file

Back to the top