diff options
author | rescobar | 2011-06-02 22:12:41 +0000 |
---|---|---|
committer | Ryan D. Brooks | 2011-06-02 22:12:41 +0000 |
commit | 85ba84b82f5afbfb30c07b9daeb214cc2f872d71 (patch) | |
tree | e83d505970993c53a97672d156fc37f5ef5e740a /plugins/org.eclipse.osee.mail.admin | |
parent | a6413d0a0ed0042221342a9f23996dd92c077622 (diff) | |
download | org.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')
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 |