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);
+        }
     }
 
 }