diff options
author | Roberto E. Escobar | 2014-06-24 20:56:47 +0000 |
---|---|---|
committer | Roberto E. Escobar | 2014-08-28 23:58:48 +0000 |
commit | 9f10d7adfc07fe803d1401a9230f9c2f385a5fe3 (patch) | |
tree | 6d9bdef5762985827f950c24ad52ff9ba91bbc5a /plugins/org.eclipse.osee.mail | |
parent | 55e42b036062fbb48313e8ff68584e60f94603a2 (diff) | |
download | org.eclipse.osee-9f10d7adfc07fe803d1401a9230f9c2f385a5fe3.tar.gz org.eclipse.osee-9f10d7adfc07fe803d1401a9230f9c2f385a5fe3.tar.xz org.eclipse.osee-9f10d7adfc07fe803d1401a9230f9c2f385a5fe3.zip |
feature[ats_ATS64268]: Update mail service to use configAdmin
Change-Id: I25b73a456f3232cf0d90a9462c1a4da67f1aa77b
Diffstat (limited to 'plugins/org.eclipse.osee.mail')
13 files changed, 488 insertions, 290 deletions
diff --git a/plugins/org.eclipse.osee.mail/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.mail/META-INF/MANIFEST.MF index 30429f7af6a..ce406e7112a 100644 --- a/plugins/org.eclipse.osee.mail/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.osee.mail/META-INF/MANIFEST.MF @@ -14,6 +14,7 @@ Import-Package: javax.activation, javax.xml.bind.annotation, org.eclipse.osee.event, org.eclipse.osee.framework.jdk.core.util, - org.eclipse.osee.framework.jdk.core.util.windows + org.eclipse.osee.framework.jdk.core.util.windows, + org.eclipse.osee.logger Service-Component: OSGI-INF/*.xml Export-Package: org.eclipse.osee.mail diff --git a/plugins/org.eclipse.osee.mail/OSGI-INF/mail.service.xml b/plugins/org.eclipse.osee.mail/OSGI-INF/mail.service.xml index f0698c3fd31..c86d68ada24 100644 --- a/plugins/org.eclipse.osee.mail/OSGI-INF/mail.service.xml +++ b/plugins/org.eclipse.osee.mail/OSGI-INF/mail.service.xml @@ -1,14 +1,12 @@ <?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.internal.MailServiceImpl"> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" configuration-policy="require" deactivate="stop" modified="update"> <implementation class="org.eclipse.osee.mail.internal.MailServiceImpl"/> - + <service> + <provide interface="org.eclipse.osee.mail.MailService"/> + </service> <reference interface="org.eclipse.osee.event.EventService" name="EventService" cardinality="1..1" policy="static" bind="setEventService" /> - - <service> - <provide interface="org.eclipse.osee.mail.MailService"/> - </service> - + <reference bind="setLogger" cardinality="1..1" interface="org.eclipse.osee.logger.Log" name="Log" policy="static"/> </scr:component> diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailConfiguration.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailConfiguration.java new file mode 100644 index 00000000000..d58533d2399 --- /dev/null +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailConfiguration.java @@ -0,0 +1,258 @@ +/******************************************************************************* + * Copyright (c) 2014 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; + +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_ADMIN_EMAIL; +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_HOST; +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_PASSWORD; +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_PORT; +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_STATUS_WAIT_TIME_MILLIS; +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_TEST_EMAIL_BODY; +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_TEST_EMAIL_SUBJECT; +import static org.eclipse.osee.mail.MailConstants.DEFAULT_MAIL_SERVER_TRANSPORT; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_ADMIN_EMAIL; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_HOST; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_PASSWORD; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_PORT; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_STATUS_WAIT_TIME_MILLIS; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_TEST_EMAIL_BODY; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_TEST_EMAIL_SUBJECT; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_TRANSPORT; +import static org.eclipse.osee.mail.MailConstants.MAIL_SERVER_USERNAME; +import java.util.Map; +import org.eclipse.osee.framework.jdk.core.util.Strings; + +/** + * <pre> + * Gmail Example: + * host = "smtp.gmail.com; + * transport = "smpts"; + * requireAuthentication = true; + * + * Yahoo Example: + * host = "smtp.mail.yahoo.com"; + * transport = "smpts"; + * requireAuthentication = true; + * </pre> + * + * @author Roberto E. Escobar + */ +public class MailConfiguration { + + private String username; + private String password; + private String host; + private int port; + private String transport; + private String adminEmail; + private String testEmailSubject; + private String testEmailBody; + private long waitTimeInMillis; + + private MailConfiguration() { + //Builder class + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + public String getTransport() { + return transport; + } + + public boolean isAuthenticationRequired() { + return Strings.isValid(username) && Strings.isValid(password); + } + + public String getUserName() { + return username; + } + + public String getPassword() { + return password; + } + + public String getAdminEmail() { + return adminEmail; + } + + public String getTestEmailSubject() { + return testEmailSubject; + } + + public String getTestEmailBody() { + return testEmailBody; + } + + public long getStatusWaitTime() { + return waitTimeInMillis; + } + + public MailConfiguration copy() { + MailConfiguration data = new MailConfiguration(); + data.username = this.username; + data.password = this.password; + data.host = this.host; + data.port = this.port; + data.transport = this.transport; + data.adminEmail = this.adminEmail; + data.testEmailSubject = this.testEmailSubject; + data.testEmailBody = this.testEmailBody; + data.waitTimeInMillis = this.waitTimeInMillis; + return data; + } + + void setUserName(String username) { + this.username = username; + } + + void setPassword(String password) { + this.password = password; + } + + void setHost(String host) { + this.host = host; + } + + void setPort(int port) { + this.port = port; + } + + void setTransport(String transport) { + this.transport = transport; + } + + void setAdminEmail(String adminEmail) { + this.adminEmail = adminEmail; + } + + void setTestEmailSubject(String testEmailSubject) { + this.testEmailSubject = testEmailSubject; + } + + void setTestEmailBody(String testEmailBody) { + this.testEmailBody = testEmailBody; + } + + void setStatusWaitTime(long waitTimeInMillis) { + this.waitTimeInMillis = waitTimeInMillis; + } + + @Override + public String toString() { + return "MailConfiguration [username=" + username + ", password=" + password + ", host=" + host + ", port=" + port + ", transport=" + transport + ", adminEmail=" + adminEmail + ", testEmailSubject=" + testEmailSubject + ", testEmailBody=" + testEmailBody + ", waitTimeInMillis=" + waitTimeInMillis + "]"; + } + + public static MailConfigurationBuilder newBuilder() { + return new MailConfigurationBuilder(); + } + + public static MailConfigurationBuilder fromProperties(Map<String, Object> props) { + return newBuilder().properties(props); + } + + public static MailConfiguration newConfig(Map<String, Object> props) { + return fromProperties(props).build(); + } + + public static final class MailConfigurationBuilder { + private final MailConfiguration config = new MailConfiguration(); + + public MailConfiguration build() { + return config.copy(); + } + + public MailConfigurationBuilder properties(Map<String, Object> props) { + //@formatter:off + username(get(props, MAIL_SERVER_USERNAME, MailConstants.DEFAULT_MAIL_SERVER_USERNAME)); + password(get(props, MAIL_SERVER_PASSWORD, DEFAULT_MAIL_SERVER_PASSWORD)); + host(get(props, MAIL_SERVER_HOST, DEFAULT_MAIL_SERVER_HOST)); + port(getInt(props, MAIL_SERVER_PORT, DEFAULT_MAIL_SERVER_PORT)); + transport(get(props, MAIL_SERVER_TRANSPORT, DEFAULT_MAIL_SERVER_TRANSPORT)); + adminEmail(get(props, MAIL_SERVER_ADMIN_EMAIL, DEFAULT_MAIL_SERVER_ADMIN_EMAIL)); + testEmailSubject(get(props, MAIL_SERVER_TEST_EMAIL_SUBJECT, DEFAULT_MAIL_SERVER_TEST_EMAIL_SUBJECT)); + testEmailBody(get(props, MAIL_SERVER_TEST_EMAIL_BODY, DEFAULT_MAIL_SERVER_TEST_EMAIL_BODY)); + statusWaitTime(getLong(props, MAIL_SERVER_STATUS_WAIT_TIME_MILLIS, DEFAULT_MAIL_SERVER_STATUS_WAIT_TIME_MILLIS)); + //@formatter:on + return this; + } + + public MailConfigurationBuilder username(String userName) { + config.setUserName(userName); + return this; + } + + public MailConfigurationBuilder password(String password) { + config.setPassword(password); + return this; + } + + public MailConfigurationBuilder host(String host) { + config.setHost(host); + return this; + } + + public MailConfigurationBuilder port(int port) { + config.setPort(port); + return this; + } + + public MailConfigurationBuilder transport(String transport) { + config.setTransport(transport); + return this; + } + + public MailConfigurationBuilder adminEmail(String adminEmail) { + config.setAdminEmail(adminEmail); + return this; + } + + public MailConfigurationBuilder testEmailSubject(String testMailSubject) { + config.setTestEmailSubject(testMailSubject); + return this; + } + + public MailConfigurationBuilder testEmailBody(String testMailBody) { + config.setTestEmailBody(testMailBody); + return this; + } + + public MailConfigurationBuilder statusWaitTime(long waitTimeInMillis) { + config.setStatusWaitTime(waitTimeInMillis); + return this; + } + + private long getLong(Map<String, Object> props, String key, long defaultValue) { + String toReturn = get(props, key, String.valueOf(defaultValue)); + return Strings.isNumeric(toReturn) ? Long.parseLong(toReturn) : -1L; + } + + private static int getInt(Map<String, Object> props, String key, int defaultValue) { + String toReturn = get(props, key, String.valueOf(defaultValue)); + return Strings.isNumeric(toReturn) ? Integer.parseInt(toReturn) : -1; + } + + private static String get(Map<String, Object> props, String key, String defaultValue) { + String toReturn = defaultValue; + Object object = props != null ? props.get(key) : null; + if (object != null) { + toReturn = String.valueOf(object); + } + return toReturn; + } + } + +} diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailConstants.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailConstants.java index aa45332799c..80820a5ad0d 100644 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailConstants.java +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailConstants.java @@ -21,10 +21,6 @@ public final class MailConstants { private static final String PREFIX = "org/eclipse/osee/mail/event/"; - public static final String REGISTRATION_EVENT = PREFIX + "MAIL_SERVICE_REGISTRATION"; - - public static final String DEREGISTRATION_EVENT = PREFIX + "MAIL_SERVICE_DEREGISTRATION"; - public static final String MAIL_MESSAGE_DELIVERED = PREFIX + "MESSAGE_DELIVERED"; public static final String MAIL_MESSAGE_NOT_DELIVERED = PREFIX + "MESSAGE_NOT_DELIVERED"; @@ -46,4 +42,30 @@ public final class MailConstants { public static final String MAIL_UUID = "mail.uuid"; public static final String MAIL_UUID_HEADER = "OSEE-MAIL-UUID"; + + public static final String NAMESPACE = "mail.server"; + + private static String qualify(String value) { + return String.format("%s.%s", NAMESPACE, value); + } + + public static final String MAIL_SERVER_USERNAME = qualify("username"); + public static final String MAIL_SERVER_PASSWORD = qualify("password"); + public static final String MAIL_SERVER_HOST = qualify("host"); + public static final String MAIL_SERVER_PORT = qualify("port"); + public static final String MAIL_SERVER_TRANSPORT = qualify("transport"); + public static final String MAIL_SERVER_ADMIN_EMAIL = qualify("admin.email"); + public static final String MAIL_SERVER_TEST_EMAIL_SUBJECT = qualify("test.email.subject"); + public static final String MAIL_SERVER_TEST_EMAIL_BODY = qualify("test.email.body"); + public static final String MAIL_SERVER_STATUS_WAIT_TIME_MILLIS = qualify("status.wait.time"); + + public static final String DEFAULT_MAIL_SERVER_USERNAME = null; + public static final String DEFAULT_MAIL_SERVER_PASSWORD = null; + public static final String DEFAULT_MAIL_SERVER_HOST = null; + public static final int DEFAULT_MAIL_SERVER_PORT = 25; + public static final String DEFAULT_MAIL_SERVER_TRANSPORT = "smtp"; + public static final String DEFAULT_MAIL_SERVER_ADMIN_EMAIL = null; + public static final String DEFAULT_MAIL_SERVER_TEST_EMAIL_SUBJECT = "Test Email"; + public static final String DEFAULT_MAIL_SERVER_TEST_EMAIL_BODY = "This is a test email sent from OSEE Mail Service"; + public static final long DEFAULT_MAIL_SERVER_STATUS_WAIT_TIME_MILLIS = 60L * 1000L; } diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailService.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailService.java index bd7893b76b3..82fb83fea73 100644 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailService.java +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailService.java @@ -12,18 +12,14 @@ package org.eclipse.osee.mail; import java.util.List; import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; /** * @author Roberto E. Escobar */ public interface MailService { - List<Callable<SendMailStatus>> createSendCalls(long waitForStatus, TimeUnit unit, MailMessage... emails); + List<Callable<SendMailStatus>> createSendCalls(MailMessage... emails); - MailServiceConfig getConfiguration(); + MailMessage createSystemTestMessage(); - void setConfiguration(MailServiceConfig config); - - MailMessage createSystemTestMessage(int testNumber); } diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailServiceConfig.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailServiceConfig.java deleted file mode 100644 index 9f8ca86880a..00000000000 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/MailServiceConfig.java +++ /dev/null @@ -1,137 +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; - -import javax.xml.bind.annotation.XmlRootElement; - -/** - * <pre> - * Gmail Example: - * host = "smtp.gmail.com; - * transport = "smpts"; - * requireAuthentication = true; - * - * Yahoo Example: - * host = "smtp.mail.yahoo.com"; - * transport = "smpts"; - * requireAuthentication = true; - * </pre> - * - * @author Roberto E. Escobar - */ -@XmlRootElement -public class MailServiceConfig { - - private String userName = ""; - private String password = ""; - private String host = ""; - private int port = 25; - private String transport = "smtp"; - private boolean debug = false; - private boolean authenticationRequired = false; - private String systemAdminEmailAddress = ""; - private boolean mailStatsEnabled = false; - - public MailServiceConfig() { - super(); - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public boolean isDebug() { - return debug; - } - - public void setDebug(boolean debug) { - this.debug = debug; - } - - public String getTransport() { - return transport; - } - - public void setTransport(String transport) { - this.transport = transport; - } - - public boolean isAuthenticationRequired() { - return authenticationRequired; - } - - public void setAuthenticationRequired(boolean authenticationRequired) { - this.authenticationRequired = authenticationRequired; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getPassword() { - return password; - } - - public String getSystemAdminEmailAddress() { - return systemAdminEmailAddress; - } - - public void setSystemAdminEmailAddress(String systemAdminEmailAddress) { - this.systemAdminEmailAddress = systemAdminEmailAddress; - } - - public boolean isMailStatsEnabled() { - return mailStatsEnabled; - } - - public void setMailStatsEnabled(boolean mailStatsEnabled) { - this.mailStatsEnabled = mailStatsEnabled; - } - - public void setTo(MailServiceConfig other) { - if (other != null) { - setAuthenticationRequired(other.isAuthenticationRequired()); - setDebug(other.isDebug()); - setHost(other.getHost()); - setMailStatsEnabled(other.isMailStatsEnabled()); - setPassword(other.getPassword()); - setPort(other.getPort()); - setSystemAdminEmailAddress(other.getSystemAdminEmailAddress()); - setTransport(other.getTransport()); - setUserName(other.getUserName()); - } - } - - @Override - public String toString() { - return "MailServiceConfig [userName=" + userName + ", password=" + password + ", host=" + host + ", port=" + port + ", transport=" + transport + ", debug=" + debug + ", authenticationRequired=" + authenticationRequired + ", systemAdminEmailAddress=" + systemAdminEmailAddress + ", mailStatsEnabled=" + mailStatsEnabled + "]"; - } -} diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/ForwardingStream.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/ForwardingStream.java new file mode 100644 index 00000000000..707f7124f0d --- /dev/null +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/ForwardingStream.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2014 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.internal; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Based on org.apache.commons.exec.LogOutputStream + * + * @author Roberto E. Escobar + */ +public abstract class ForwardingStream extends OutputStream { + + private static final int INTIAL_SIZE = 132; + private static final int CR = 0x0d; + private static final int LF = 0x0a; + + private final ByteArrayOutputStream buffer = new ByteArrayOutputStream(INTIAL_SIZE); + + private boolean skip = false; + + @Override + public void write(final int cc) { + final byte c = (byte) cc; + if (c == '\n' || c == '\r') { + if (!skip) { + forwardBuffer(); + } + } else { + buffer.write(cc); + } + skip = c == '\r'; + } + + protected void forwardBuffer() { + forward(buffer.toString()); + buffer.reset(); + } + + @Override + public void write(final byte[] b, final int off, final int len) { + int offset = off; + int blockStartOffset = offset; + int remaining = len; + while (remaining > 0) { + while (remaining > 0 && b[offset] != LF && b[offset] != CR) { + offset++; + remaining--; + } + final int blockLength = offset - blockStartOffset; + if (blockLength > 0) { + buffer.write(b, blockStartOffset, blockLength); + } + while (remaining > 0 && (b[offset] == LF || b[offset] == CR)) { + write(b[offset]); + offset++; + remaining--; + } + blockStartOffset = offset; + } + } + + @Override + public void flush() { + if (buffer.size() > 0) { + forwardBuffer(); + } + } + + @Override + public void close() throws IOException { + if (buffer.size() > 0) { + forwardBuffer(); + } + super.close(); + } + + protected abstract void forward(String data); + +} diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailMessageFactory.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailMessageFactory.java index 8832232753b..7e7662309e7 100644 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailMessageFactory.java +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailMessageFactory.java @@ -10,10 +10,14 @@ *******************************************************************************/ package org.eclipse.osee.mail.internal; +import java.io.PrintStream; import java.util.Collection; import java.util.Date; import java.util.Properties; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; import javax.activation.DataHandler; +import javax.activation.DataSource; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; @@ -25,42 +29,54 @@ import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import org.eclipse.osee.framework.jdk.core.util.Strings; +import org.eclipse.osee.logger.Log; import org.eclipse.osee.mail.MailConstants; import org.eclipse.osee.mail.MailMessage; -import org.eclipse.osee.mail.MailServiceConfig; +import org.eclipse.osee.mail.MailUtils; /** * @author Roberto E. Escobar */ public class MailMessageFactory { - private final MailServiceConfig config; + private final Log logger; + private final AtomicInteger testCounter; - public MailMessageFactory(MailServiceConfig config) { - this.config = config; + public MailMessageFactory(Log logger, AtomicInteger testCounter) { + this.logger = logger; + this.testCounter = testCounter; } - public Session createSession() { - final Properties props = System.getProperties(); + public Session createSession(String transport, String host, int port, boolean requiresAuthentication) { + final Properties props = new Properties(); - 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()); + props.put("mail." + transport + ".host", host); + props.put("mail." + transport + ".port", String.valueOf(port)); + props.put("mail." + transport + ".auth", String.valueOf(requiresAuthentication).toLowerCase()); + + boolean isDebugEnabled = logger != null && logger.isDebugEnabled(); + props.put("mail.debug", isDebugEnabled); Session session = Session.getDefaultInstance(props); - session.setDebug(config.isDebug()); - session.setDebugOut(System.out); + session.setDebug(isDebugEnabled); + if (isDebugEnabled) { + session.setDebugOut(new PrintStream(new ForwardingStream() { + @Override + protected void forward(String data) { + logger.debug(data); + } + })); + } return session; } - public Transport createTransport(Session session) throws MessagingException { + public Transport createTransport(Session session, String username, String password) throws MessagingException { Transport transport = session.getTransport(); if (!transport.isConnected()) { - if (config.isAuthenticationRequired()) { - transport.connect(config.getUserName(), config.getPassword()); + if (Strings.isValid(username) && Strings.isValid(password)) { + transport.connect(username, password); } else { transport.connect(); } @@ -88,6 +104,27 @@ public class MailMessageFactory { return message; } + public MailMessage createTestMessage(String adminEmail, String subject, String plainTextBody) { + MailMessage message = new MailMessage(); + message.setId(UUID.randomUUID().toString()); + message.setFrom(adminEmail); + message.getRecipients().add(adminEmail); + + String subjectWithCounter = String.format("%s #%s", subject, testCounter.incrementAndGet()); + message.setSubject(subjectWithCounter); + + String htmlData = + String.format("<html><body><big>%s</big><p>%s</p></body></html>", subjectWithCounter, plainTextBody); + DataSource source; + try { + source = MailUtils.createAlternativeDataSource("test.email", htmlData, plainTextBody); + } catch (Exception ex) { + source = MailUtils.createFromString("test.email", plainTextBody); + } + message.addAttachment(source); + return message; + } + private Address[] toAddress(Collection<String> rawAddresses) throws AddressException { InternetAddress[] toReturn = new InternetAddress[rawAddresses.size()]; int index = 0; diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailServiceImpl.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailServiceImpl.java index 32c9295cdd1..e2ffcf9c6fe 100644 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailServiceImpl.java +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/MailServiceImpl.java @@ -13,17 +13,14 @@ package org.eclipse.osee.mail.internal; 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 java.util.concurrent.atomic.AtomicInteger; import javax.mail.event.TransportListener; import org.eclipse.osee.event.EventService; -import org.eclipse.osee.mail.MailConstants; +import org.eclipse.osee.logger.Log; +import org.eclipse.osee.mail.MailConfiguration; 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.SendMailStatus; /** @@ -31,69 +28,58 @@ import org.eclipse.osee.mail.SendMailStatus; */ public class MailServiceImpl implements MailService { - private MailServiceConfig config; - private MailMessageFactory factory; private EventService eventService; - private TransportListener[] listeners; + private Log logger; - public void setEventService(EventService eventService) { - this.eventService = eventService; - } - - public EventService getEventService() { - return eventService; - } + private MailMessageFactory factory; + private TransportListener[] listeners; + private volatile MailConfiguration config; - @Override - public MailServiceConfig getConfiguration() { - return config; + public void setLogger(Log logger) { + this.logger = logger; } - @Override - public void setConfiguration(MailServiceConfig config) { - this.config.setTo(config); + public void setEventService(EventService eventService) { + this.eventService = eventService; } - public synchronized void start(Map<String, ?> props) { - config = new MailServiceConfig(); - factory = new MailMessageFactory(config); - getEventService().postEvent(MailConstants.REGISTRATION_EVENT, props); - + public void start(Map<String, Object> props) { + logger.trace("Starting [%s]...", getClass().getSimpleName()); + update(props); + AtomicInteger testCounter = new AtomicInteger(); + factory = new MailMessageFactory(logger, testCounter); listeners = new TransportListener[] {new MailTransportListener(eventService)}; } - public synchronized void stop(Map<String, ?> props) { - getEventService().postEvent(MailConstants.DEREGISTRATION_EVENT, props); + public void stop(Map<String, Object> props) { + logger.trace("Stopping [%s]...", getClass().getSimpleName()); listeners = null; + factory = null; + config = null; + } + + public void update(Map<String, Object> props) { + logger.trace("Configuring [%s]...", getClass().getSimpleName()); + config = MailConfiguration.newConfig(props); } @Override - public List<Callable<SendMailStatus>> createSendCalls(long waitForStatus, TimeUnit timeUnit, MailMessage... emails) { + public List<Callable<SendMailStatus>> createSendCalls(MailMessage... emails) { + final MailConfiguration configCopy = config.copy(); + long waitForStatus = configCopy.getStatusWaitTime(); List<Callable<SendMailStatus>> callables = new ArrayList<Callable<SendMailStatus>>(); for (MailMessage mail : emails) { - callables.add(new SendMailCallable(factory, mail, waitForStatus, timeUnit, listeners)); + callables.add(new SendMailCallable(configCopy, factory, mail, waitForStatus, listeners)); } return callables; } @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", htmlData, plainText); - } catch (Exception ex) { - source = MailUtils.createFromString("TestEmail", plainText); - } - message.addAttachment(source); - return message; + public MailMessage createSystemTestMessage() { + final MailConfiguration configCopy = config.copy(); + String adminEmail = configCopy.getAdminEmail(); + String subject = configCopy.getTestEmailSubject(); + String body = configCopy.getTestEmailBody(); + return factory.createTestMessage(adminEmail, subject, body); } } diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/SendMailCallable.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/SendMailCallable.java index bf46158f6c5..dbb6e5b4bd2 100644 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/SendMailCallable.java +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/SendMailCallable.java @@ -11,13 +11,13 @@ package org.eclipse.osee.mail.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.MailConfiguration; import org.eclipse.osee.mail.MailMessage; import org.eclipse.osee.mail.MailUtils; import org.eclipse.osee.mail.SendMailStatus; @@ -28,18 +28,18 @@ import org.eclipse.osee.mail.SendMailStatus.MailStatus; */ public class SendMailCallable implements Callable<SendMailStatus> { + private final MailConfiguration config; 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) { + public SendMailCallable(MailConfiguration config, MailMessageFactory factory, MailMessage email, long waitForStatus, TransportListener... listeners) { + this.config = config; this.factory = factory; this.email = email; this.listeners = listeners; this.waitForStatus = waitForStatus; - this.timeUnit = timeUnit; } @Override @@ -47,9 +47,16 @@ public class SendMailCallable implements Callable<SendMailStatus> { MailcapCommandMap mc = MailUtils.getMailcapCommandMap(); CommandMap.setDefaultCommandMap(mc); - final Session session = factory.createSession(); + String transportProtocol = config.getTransport(); + String host = config.getHost(); + int port = config.getPort(); + boolean requiresAuthentication = config.isAuthenticationRequired(); + String username = config.getUserName(); + String password = config.getPassword(); + + final Session session = factory.createSession(transportProtocol, host, port, requiresAuthentication); final MimeMessage message = factory.createMimeMessage(session, email); - final Transport transport = factory.createTransport(session); + final Transport transport = factory.createTransport(session, username, password); final SendMailStatus status = new SendMailStatus(); StatusTransportListener statusListener = new StatusTransportListener(status); @@ -63,8 +70,7 @@ public class SendMailCallable implements Callable<SendMailStatus> { message.saveChanges(); transport.sendMessage(message, message.getAllRecipients()); synchronized (statusListener) { - long waitMillis = timeUnit.toMillis(waitForStatus); - statusListener.wait(waitMillis); + statusListener.wait(waitForStatus); } } finally { if (listeners != null) { diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailApplication.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailApplication.java index fce64f7e68b..3f5e4938f68 100644 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailApplication.java +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailApplication.java @@ -31,7 +31,6 @@ public class MailApplication extends Application { public void start() { singletons.add(new MailResource(mailService)); - singletons.add(new MailConfigResource(mailService)); } public void stop() { diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailConfigResource.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailConfigResource.java deleted file mode 100644 index 2c66a6bfe8f..00000000000 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailConfigResource.java +++ /dev/null @@ -1,55 +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.internal.resources; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.xml.bind.JAXBElement; -import org.eclipse.osee.mail.MailService; -import org.eclipse.osee.mail.MailServiceConfig; - -/** - * @author Roberto E. Escobar - */ -@Path("config") -public class MailConfigResource { - - private final MailService mailService; - - public MailConfigResource(MailService mailService) { - super(); - this.mailService = mailService; - } - - @GET - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) - public MailServiceConfig getConfig() { - return mailService.getConfiguration(); - } - - @POST - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) - public Response updateConfig(JAXBElement<MailServiceConfig> jaxConfig) { - MailServiceConfig config = jaxConfig.getValue(); - return postAndGetResponse(config); - } - - private Response postAndGetResponse(MailServiceConfig config) { - mailService.setConfiguration(config); - return Response.ok("Mail Service Configuration Updated", MediaType.TEXT_PLAIN).build(); - } -} diff --git a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailResource.java b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailResource.java index 20c20d3d4a8..a6e7282d94b 100644 --- a/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailResource.java +++ b/plugins/org.eclipse.osee.mail/src/org/eclipse/osee/mail/internal/resources/MailResource.java @@ -36,9 +36,6 @@ import org.eclipse.osee.mail.SendMailStatus; @Path("send") public class MailResource { - private static long STATUS_WAIT_TIME = 60; - private static int testEmailCount = 0; - private final MailService mailService; public MailResource(MailService mailService) { @@ -49,14 +46,14 @@ public class MailResource { @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public MailMessage getTestMailMessage() { - return mailService.createSystemTestMessage(++testEmailCount); + return mailService.createSystemTestMessage(); } @POST @Path("test") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public SendMailStatus sendTestMail() throws Exception { - MailMessage message = mailService.createSystemTestMessage(++testEmailCount); + MailMessage message = mailService.createSystemTestMessage(); List<SendMailStatus> results = sendMail(message); return results.iterator().next(); @@ -74,7 +71,7 @@ public class MailResource { } private List<SendMailStatus> sendMail(MailMessage... messages) throws InterruptedException, ExecutionException { - List<Callable<SendMailStatus>> calls = mailService.createSendCalls(STATUS_WAIT_TIME, TimeUnit.SECONDS, messages); + List<Callable<SendMailStatus>> calls = mailService.createSendCalls(messages); List<Future<SendMailStatus>> futures = new ArrayList<Future<SendMailStatus>>(); if (messages.length > 0) { |