You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2016/04/08 11:49:39 UTC
svn commit: r1738226 - in
/sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail: ./
src/main/java/org/apache/sling/commons/messaging/mail/
src/main/java/org/apache/sling/commons/messaging/mail/internal/
src/test/java/org/apache/sling/com...
Author: olli
Date: Fri Apr 8 09:49:38 2016
New Revision: 1738226
URL: http://svn.apache.org/viewvc?rev=1738226&view=rev
Log:
SLING-5644 Provide an messaging implementation based on Commons Email
* adjust to latest Messaging API
* make MailResult public
* add test for failing transmission (authentication failure)
Added:
sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java
- copied, changed from r1738189, sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java
Removed:
sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailFailure.java
sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java
Modified:
sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/pom.xml
sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java
sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java
sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java
Modified: sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/pom.xml?rev=1738226&r1=1738225&r2=1738226&view=diff
==============================================================================
--- sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/pom.xml (original)
+++ sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/pom.xml Fri Apr 8 09:49:38 2016
@@ -143,6 +143,11 @@
<version>1.4</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.4</version>
+ </dependency>
<!-- Apache Felix -->
<dependency>
<groupId>org.apache.felix</groupId>
@@ -160,7 +165,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.threads</artifactId>
- <version>3.2.6</version>
+ <version>3.2.7-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
Copied: sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java (from r1738189, sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java)
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java?p2=sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java&p1=sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java&r1=1738189&r2=1738226&rev=1738226&view=diff
==============================================================================
--- sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java (original)
+++ sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java Fri Apr 8 09:49:38 2016
@@ -16,41 +16,26 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.sling.commons.messaging.mail.internal;
+package org.apache.sling.commons.messaging.mail;
-import java.util.Arrays;
-import java.util.Collection;
-
-import org.apache.sling.commons.messaging.Failure;
import org.apache.sling.commons.messaging.Result;
+import org.osgi.annotation.versioning.ConsumerType;
+@ConsumerType
public class MailResult implements Result<byte[]> {
private final byte[] message;
- private final Collection<Failure> failures;
-
- public MailResult(final byte[] message, final Failure... failures) {
+ public MailResult(final byte[] message) {
this.message = message;
- this.failures = Arrays.asList(failures);
}
/**
- * @return the message in <a href="https://tools.ietf.org/html/rfc822">RFC 822</a> format
+ * @return the sent message in <a href="https://tools.ietf.org/html/rfc822">RFC 822</a> format
*/
@Override
public byte[] getMessage() {
return message;
}
- @Override
- public boolean hasFailures() {
- return !(failures == null || failures.isEmpty());
- }
-
- @Override
- public Collection<Failure> getFailures() {
- return failures;
- }
-
}
Modified: sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java?rev=1738226&r1=1738225&r2=1738226&view=diff
==============================================================================
--- sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java (original)
+++ sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java Fri Apr 8 09:49:38 2016
@@ -18,16 +18,21 @@
*/
package org.apache.sling.commons.messaging.mail.internal;
+import java.io.IOException;
import java.util.Collections;
import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+
+import javax.annotation.Nonnull;
+import javax.mail.MessagingException;
import org.apache.commons.mail.Email;
-import org.apache.sling.commons.messaging.Failure;
+import org.apache.commons.mail.EmailException;
import org.apache.sling.commons.messaging.MessageService;
import org.apache.sling.commons.messaging.Result;
import org.apache.sling.commons.messaging.mail.MailBuilder;
+import org.apache.sling.commons.messaging.mail.MailResult;
import org.apache.sling.commons.messaging.mail.MailUtil;
import org.apache.sling.commons.threads.ThreadPool;
import org.apache.sling.commons.threads.ThreadPoolManager;
@@ -103,57 +108,24 @@ public class SimpleMailService implement
}
@Override
- public Future<Result> send(final String message, final String recipient) {
+ public CompletableFuture<Result> send(@Nonnull final String message, @Nonnull final String recipient) {
return send(message, recipient, Collections.emptyMap());
}
@Override
- public Future<Result> send(final String message, final String recipient, final Map data) {
- final Mailing mailing = new Mailing(message, recipient, data, mailBuilder);
- return threadPool.submit(mailing);
+ public CompletableFuture<Result> send(@Nonnull final String message, @Nonnull final String recipient, @Nonnull final Map data) {
+ return CompletableFuture.supplyAsync(() -> sendMail(message, recipient, data, mailBuilder), threadPool);
}
- private class Mailing implements Callable<Result> {
-
- private final String message;
-
- private final String recipient;
-
- private final Map data;
-
- private MailBuilder mailBuilder;
-
- Mailing(final String message, final String recipient, final Map data, final MailBuilder mailBuilder) {
- this.message = message;
- this.recipient = recipient;
- this.data = data;
- this.mailBuilder = mailBuilder;
- }
-
- @Override
- public Result call() {
- Email mail = null;
- // build mail
- try {
- mail = mailBuilder.build(message, recipient, data);
- } catch (Exception e) {
- logger.error("building mail failed: {}", e.getMessage(), e);
- final Failure failure = new MailFailure(null, null, e.getMessage());
- return new MailResult(null, failure);
- } finally {
- mailBuilder = null;
- }
- // send mail
- try {
- final String messageId = mail.send();
- logger.info("mail '{}' sent", messageId);
- final byte[] bytes = MailUtil.toByteArray(mail);
- return new MailResult(bytes);
- } catch (Exception e) {
- logger.error("sending mail failed: {}", e.getMessage(), e);
- final Failure failure = new MailFailure(null, null, e.getMessage());
- return new MailResult(null, failure);
- }
+ private MailResult sendMail(final String message, final String recipient, final Map data, final MailBuilder mailBuilder) {
+ try {
+ final Email email = mailBuilder.build(message, recipient, data);
+ final String messageId = email.send();
+ logger.info("mail '{}' sent", messageId);
+ final byte[] bytes = MailUtil.toByteArray(email);
+ return new MailResult(bytes);
+ } catch (EmailException | MessagingException | IOException e) {
+ throw new CompletionException(e);
}
}
Modified: sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java?rev=1738226&r1=1738225&r2=1738226&view=diff
==============================================================================
--- sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java (original)
+++ sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java Fri Apr 8 09:49:38 2016
@@ -66,6 +66,7 @@ public abstract class MailTestSupport {
final org.osgi.service.cm.Configuration configuration = configurationAdmin.createFactoryConfiguration(factoryPid);
configuration.setBundleLocation(null);
configuration.update(properties);
+ Thread.sleep(1000);
logger.debug("configuration: {}", configurationAdmin.getConfiguration(factoryPid));
}
@@ -85,6 +86,7 @@ public abstract class MailTestSupport {
mavenBundle().groupId("com.sun.mail").artifactId("javax.mail").versionAsInProject(),
mavenBundle().groupId("javax.mail").artifactId("javax.mail-api").versionAsInProject(),
mavenBundle().groupId("org.apache.commons").artifactId("commons-email").versionAsInProject(),
+ mavenBundle().groupId("org.apache.commons").artifactId("commons-lang3").versionAsInProject(),
mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.commons.messaging").versionAsInProject(),
mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.commons.threads").versionAsInProject(),
bundle("reference:file:" + filename)
Modified: sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java?rev=1738226&r1=1738225&r2=1738226&view=diff
==============================================================================
--- sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java (original)
+++ sling/trunk/bundles/commons/org.apache.sling.commons.messaging.mail/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java Fri Apr 8 09:49:38 2016
@@ -18,14 +18,19 @@
*/
package org.apache.sling.commons.messaging.mail.internal;
+import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Map;
-import java.util.concurrent.Future;
+import java.util.concurrent.CompletableFuture;
+import javax.mail.AuthenticationFailedException;
+
+import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.sling.commons.messaging.MessageService;
import org.apache.sling.commons.messaging.Result;
import org.apache.sling.commons.messaging.mail.MailBuilderConfigurations;
+import org.apache.sling.commons.messaging.mail.MailResult;
import org.apache.sling.commons.messaging.mail.MailTestSupport;
import org.junit.After;
import org.junit.Before;
@@ -38,7 +43,7 @@ import org.ops4j.pax.exam.spi.reactors.E
import org.ops4j.pax.exam.spi.reactors.PerMethod;
import org.subethamail.wiser.Wiser;
-import static junit.framework.TestCase.assertFalse;
+import static org.junit.Assert.assertTrue;
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerMethod.class)
@@ -46,6 +51,8 @@ public class SimpleMailServiceIT extends
protected Wiser wiser;
+ public static final String FACTORY_PID = "org.apache.sling.commons.messaging.mail.internal.SimpleMailBuilder";
+
@Configuration
public Option[] configuration() {
return baseConfiguration();
@@ -56,9 +63,6 @@ public class SimpleMailServiceIT extends
final int smtpPort = findFreePort();
wiser = new Wiser(smtpPort);
wiser.start();
- final String factoryPid = "org.apache.sling.commons.messaging.mail.internal.SimpleMailBuilder";
- final Dictionary<String, Object> properties = MailBuilderConfigurations.full(smtpPort);
- createFactoryConfiguration(factoryPid, properties);
}
@After
@@ -69,20 +73,40 @@ public class SimpleMailServiceIT extends
@Test
public void send() throws Exception {
+ final Dictionary<String, Object> properties = MailBuilderConfigurations.full(wiser.getServer().getPort());
+ createFactoryConfiguration(FACTORY_PID, properties);
final MessageService messageService = getService(MessageService.class);
- final Future<Result> future = messageService.send("simple test message", "recipient@example.net");
- final Result result = future.get();
- assertFalse(result.hasFailures());
+ final CompletableFuture<Result> future = messageService.send("simple test message", "recipient@example.net");
+ final MailResult result = (MailResult) future.get();
+ final String message = new String(result.getMessage(), StandardCharsets.UTF_8);
+ logger.info("message: {}", message); // TODO assert
}
@Test
public void sendWithData() throws Exception {
+ final Dictionary<String, Object> properties = MailBuilderConfigurations.full(wiser.getServer().getPort());
+ createFactoryConfiguration(FACTORY_PID, properties);
final MessageService messageService = getService(MessageService.class);
final Map configuration = Collections.singletonMap("mail.subject", "Testing the Simple Mail Service with a custom subject");
final Map data = Collections.singletonMap("mail", configuration);
- final Future<Result> future = messageService.send("simple test message", "recipient@example.net", data);
- final Result result = future.get();
- assertFalse(result.hasFailures());
+ final CompletableFuture<Result> future = messageService.send("simple test message", "recipient@example.net", data);
+ final MailResult result = (MailResult) future.get();
+ final String message = new String(result.getMessage(), StandardCharsets.UTF_8);
+ logger.info("message: {}", message); // TODO assert
+ }
+
+ @Test
+ public void sendWithoutAuthentication() throws Exception {
+ final Dictionary<String, Object> properties = MailBuilderConfigurations.minimal();
+ createFactoryConfiguration(FACTORY_PID, properties);
+ final MessageService messageService = getService(MessageService.class);
+ final CompletableFuture<Result> future = messageService.send("simple test message", "recipient@example.net");
+ try {
+ future.get();
+ } catch (Exception e) {
+ logger.info(e.getMessage(), e);
+ assertTrue(ExceptionUtils.getRootCause(e) instanceof AuthenticationFailedException);
+ }
}
}