This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-messaging-mail.git
commit c60f2f2526d3e1e4eaeb57a5c0f02f417141be63 Author: Oliver Lietz <[email protected]> AuthorDate: Fri Apr 8 09:49:38 2016 +0000 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) git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1738226 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 7 ++- .../messaging/mail/{internal => }/MailResult.java | 25 ++------ .../messaging/mail/internal/MailFailure.java | 52 ----------------- .../messaging/mail/internal/SimpleMailService.java | 68 +++++++--------------- .../commons/messaging/mail/MailTestSupport.java | 2 + .../mail/internal/SimpleMailServiceIT.java | 46 +++++++++++---- 6 files changed, 68 insertions(+), 132 deletions(-) diff --git a/pom.xml b/pom.xml index 5f604e8..73b0583 100644 --- a/pom.xml +++ b/pom.xml @@ -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> diff --git a/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java b/src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java similarity index 63% rename from src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java rename to src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java index 072b1b5..c6c1b05 100644 --- a/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailResult.java +++ b/src/main/java/org/apache/sling/commons/messaging/mail/MailResult.java @@ -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; - } - } diff --git a/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailFailure.java b/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailFailure.java deleted file mode 100644 index ecb837e..0000000 --- a/src/main/java/org/apache/sling/commons/messaging/mail/internal/MailFailure.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.sling.commons.messaging.mail.internal; - -import org.apache.sling.commons.messaging.Failure; - -public class MailFailure implements Failure { - - private final String code; - - private final String type; - - private final String message; - - public MailFailure(final String code, final String type, final String message) { - this.code = code; - this.type = type; - this.message = message; - } - - @Override - public String getCode() { - return code; - } - - @Override - public String getType() { - return type; - } - - @Override - public String getMessage() { - return message; - } - -} diff --git a/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java b/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java index b79eef1..19d003f 100644 --- a/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java +++ b/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java @@ -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 implements MessageService { } @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); } } diff --git a/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java b/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java index 6ba0f9f..a1edb6c 100644 --- a/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java +++ b/src/test/java/org/apache/sling/commons/messaging/mail/MailTestSupport.java @@ -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) diff --git a/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java b/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java index 85fd000..9a8983c 100644 --- a/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java +++ b/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceIT.java @@ -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.ExamReactorStrategy; 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 MailTestSupport { 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 MailTestSupport { 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 MailTestSupport { @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", "[email protected]"); - final Result result = future.get(); - assertFalse(result.hasFailures()); + final CompletableFuture<Result> future = messageService.send("simple test message", "[email protected]"); + 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", "[email protected]", data); - final Result result = future.get(); - assertFalse(result.hasFailures()); + final CompletableFuture<Result> future = messageService.send("simple test message", "[email protected]", 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", "[email protected]"); + try { + future.get(); + } catch (Exception e) { + logger.info(e.getMessage(), e); + assertTrue(ExceptionUtils.getRootCause(e) instanceof AuthenticationFailedException); + } } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
