You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/20 14:35:56 UTC
[sling-org-apache-sling-commons-messaging-mail] 02/12: SLING-5644
Provide an messaging implementation based on Commons Email
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 <ol...@apache.org>
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", "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);
+ }
}
}
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.