You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2017/01/10 14:18:40 UTC
[25/50] [abbrv] james-project git commit: JAMES-1877 Simplify
MessageComposer API with ExecutionResult
JAMES-1877 Simplify MessageComposer API with ExecutionResult
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/942cdfc6
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/942cdfc6
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/942cdfc6
Branch: refs/heads/master
Commit: 942cdfc66265af6a966b5814b5366fda26433e7e
Parents: 26c6d9c
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Dec 1 18:45:36 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Tue Jan 10 15:12:50 2017 +0700
----------------------------------------------------------------------
.../remoteDelivery/DeliveryRunnable.java | 108 +++++--------------
.../mailets/remoteDelivery/ExecutionResult.java | 76 +++++++++++++
.../mailets/remoteDelivery/MessageComposer.java | 8 +-
3 files changed, 110 insertions(+), 82 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/942cdfc6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
index 39b38d0..f497767 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
@@ -51,65 +51,11 @@ import org.apache.mailet.MailAddress;
import org.apache.mailet.MailetContext;
import org.slf4j.Logger;
-import com.google.common.base.Optional;
import com.sun.mail.smtp.SMTPTransport;
@SuppressWarnings("deprecation")
public class DeliveryRunnable implements Runnable {
- private static ExecutionResult success() {
- return new ExecutionResult(ExecutionState.SUCCESS, Optional.<Exception>absent());
- }
-
- private static ExecutionResult temporaryFailure(Exception e) {
- return new ExecutionResult(ExecutionState.TEMPORARY_FAILURE, Optional.of(e));
- }
-
- private static ExecutionResult permanentFailure(Exception e) {
- return new ExecutionResult(ExecutionState.PERMANENT_FAILURE, Optional.of(e));
- }
-
- private static ExecutionResult temporaryFailure() {
- return new ExecutionResult(ExecutionState.TEMPORARY_FAILURE, Optional.<Exception>absent());
- }
-
- private static ExecutionResult permanentFailure() {
- return new ExecutionResult(ExecutionState.PERMANENT_FAILURE, Optional.<Exception>absent());
- }
-
- private static class ExecutionResult {
- private final ExecutionState executionState;
- private final Optional<Exception> exception;
-
- public ExecutionResult(ExecutionState executionState, Optional<Exception> exception) {
- this.executionState = executionState;
- this.exception = exception;
- }
-
- public ExecutionState getExecutionState() {
- return executionState;
- }
-
- public Optional<Exception> getException() {
- return exception;
- }
- }
-
- private enum ExecutionState {
- SUCCESS,
- PERMANENT_FAILURE,
- TEMPORARY_FAILURE
- }
-
- private static ExecutionResult onFailure(boolean permanent, Exception exeption) {
- if (permanent) {
- return permanentFailure(exeption);
- } else {
- return temporaryFailure(exeption);
- }
- }
-
- public static final boolean PERMANENT_FAILURE = true;
public static final String BIT_MIME_8 = "8BITMIME";
private final MailQueue queue;
private final RemoteDeliveryConfiguration configuration;
@@ -251,20 +197,22 @@ public class DeliveryRunnable implements Runnable {
// or mailbox is full or domain is setup wrong). We fail permanently if this was a 5xx error
boolean isPermanent = '5' == ex.getMessage().charAt(0);
- logger.debug(messageComposer.composeFailLogMessage(mail, ex, isPermanent));
- return onFailure(isPermanent, ex);
+ ExecutionResult executionResult = ExecutionResult.onFailure(isPermanent, ex);
+ logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
+ return executionResult;
} catch (Exception ex) {
logger.error("Generic exception = permanent failure: " + ex.getMessage(), ex);
// Generic exception = permanent failure
- logger.debug(messageComposer.composeFailLogMessage(mail, ex, PERMANENT_FAILURE));
- return permanentFailure(ex);
+ ExecutionResult executionResult = ExecutionResult.permanentFailure(ex);
+ logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
+ return executionResult;
}
}
private ExecutionResult tryDeliver(Mail mail, Session session) throws MessagingException {
if (mail.getRecipients().isEmpty()) {
logger.info("No recipients specified... not sure how this could have happened.");
- return permanentFailure(new Exception("No recipients specified for " + mail.getName() + " sent by " + mail.getSender()));
+ return ExecutionResult.permanentFailure(new Exception("No recipients specified for " + mail.getName() + " sent by " + mail.getSender()));
}
if (configuration.isDebug()) {
logger.debug("Attempting to deliver " + mail.getName());
@@ -299,7 +247,7 @@ public class DeliveryRunnable implements Runnable {
while (targetServers.hasNext()) {
try {
if (tryDeliveryToHost(mail, session, message, addr, targetServers.next())) {
- return success();
+ return ExecutionResult.success();
}
} catch (SendFailedException sfe) {
lastError = handleSendFailException(mail, sfe);
@@ -316,7 +264,7 @@ public class DeliveryRunnable implements Runnable {
if (lastError != null) {
throw lastError;
}
- return temporaryFailure();
+ return ExecutionResult.temporaryFailure();
}
private boolean tryDeliveryToHost(Mail mail, Session session, MimeMessage message, InternetAddress[] addr, HostAddress outgoingMailServer) throws MessagingException {
@@ -382,7 +330,7 @@ public class DeliveryRunnable implements Runnable {
// Copy the recipients as direct modification may not be possible
Collection<MailAddress> recipients = new ArrayList<MailAddress>(mail.getRecipients());
- ExecutionResult deleteMessage = temporaryFailure();
+ ExecutionResult deleteMessage = ExecutionResult.temporaryFailure();
/*
* If you send a message that has multiple invalid addresses, you'll
@@ -411,7 +359,7 @@ public class DeliveryRunnable implements Runnable {
int returnCode = (Integer) invokeGetter(sfe, "getReturnCode");
// If we got an SMTPSendFailedException, use its RetCode to
// determine default permanent/temporary failure
- deleteMessage = onFailure(returnCode >= 500 && returnCode <= 599, sfe);
+ deleteMessage = ExecutionResult.onFailure(returnCode >= 500 && returnCode <= 599, sfe);
} else {
// Sometimes we'll get a normal SendFailedException with
// nested SMTPAddressFailedException, so use the latter
@@ -422,7 +370,7 @@ public class DeliveryRunnable implements Runnable {
me = (MessagingException) ne;
if (me.getClass().getName().endsWith(".SMTPAddressFailedException")) {
int returnCode = (Integer) invokeGetter(me, "getReturnCode");
- deleteMessage = onFailure(returnCode >= 500 && returnCode <= 599, sfe);
+ deleteMessage = ExecutionResult.onFailure(returnCode >= 500 && returnCode <= 599, sfe);
}
}
}
@@ -457,8 +405,8 @@ public class DeliveryRunnable implements Runnable {
if (configuration.isDebug())
logger.debug("Invalid recipients: " + recipients);
- logger.debug(messageComposer.composeFailLogMessage(mail, sfe, true));
- deleteMessage = permanentFailure(sfe);
+ deleteMessage = ExecutionResult.permanentFailure(sfe);
+ logger.debug(messageComposer.composeFailLogMessage(mail, deleteMessage));
}
}
@@ -484,11 +432,11 @@ public class DeliveryRunnable implements Runnable {
if (sfe.getClass().getName().endsWith(".SMTPSendFailedException")) {
int returnCode = (Integer) invokeGetter(sfe, "getReturnCode");
boolean isPermanent = returnCode >= 500 && returnCode <= 599;
- logger.debug(messageComposer.composeFailLogMessage(mail, sfe, isPermanent));
- deleteMessage = onFailure(isPermanent, sfe);
+ deleteMessage = ExecutionResult.onFailure(isPermanent, sfe);
+ logger.debug(messageComposer.composeFailLogMessage(mail, deleteMessage));
} else {
- logger.debug(messageComposer.composeFailLogMessage(mail, sfe, false));
- deleteMessage = temporaryFailure(sfe);
+ deleteMessage = ExecutionResult.temporaryFailure(sfe);
+ logger.debug(messageComposer.composeFailLogMessage(mail, deleteMessage));
}
}
}
@@ -615,25 +563,27 @@ public class DeliveryRunnable implements Runnable {
}
private ExecutionResult handleTemporaryResolutionException(Mail mail, String host) {
- MessagingException messagingException = new MessagingException("Temporary problem looking up mail server for host: " + host + ". I cannot determine where to send this message.");
- logger.debug(messageComposer.composeFailLogMessage(mail, messagingException, false));
- return temporaryFailure(messagingException);
+ ExecutionResult executionResult = ExecutionResult.temporaryFailure(new MessagingException("Temporary problem looking " +
+ "up mail server for host: " + host + ". I cannot determine where to send this message."));
+ logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
+ return executionResult;
}
private ExecutionResult handleNoTargetServer(Mail mail, String host) {
logger.info("No mail server found for: " + host);
String exceptionBuffer = "There are no DNS entries for the hostname " + host + ". I cannot determine where to send this message.";
+ MessagingException messagingException = new MessagingException(exceptionBuffer);
int retry = DeliveryRetriesHelper.retrieveRetries(mail);
if (retry == 0 || retry > configuration.getDnsProblemRetry()) {
// The domain has no dns entry.. Return a permanent error
- MessagingException messagingException = new MessagingException(exceptionBuffer);
- logger.debug(messageComposer.composeFailLogMessage(mail, messagingException, true));
- return permanentFailure(messagingException);
+ ExecutionResult executionResult = ExecutionResult.permanentFailure(messagingException);
+ logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
+ return executionResult;
} else {
- MessagingException messagingException = new MessagingException(exceptionBuffer);
- logger.debug(messageComposer.composeFailLogMessage(mail, messagingException, false));
- return temporaryFailure(messagingException);
+ ExecutionResult executionResult = ExecutionResult.temporaryFailure(messagingException);
+ logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
+ return executionResult;
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/942cdfc6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/ExecutionResult.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/ExecutionResult.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/ExecutionResult.java
new file mode 100644
index 0000000..f984fd1
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/ExecutionResult.java
@@ -0,0 +1,76 @@
+/****************************************************************
+ * 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.james.transport.mailets.remoteDelivery;
+
+import com.google.common.base.Optional;
+
+public class ExecutionResult {
+
+ public enum ExecutionState {
+ SUCCESS,
+ PERMANENT_FAILURE,
+ TEMPORARY_FAILURE
+ }
+
+ public static ExecutionResult success() {
+ return new ExecutionResult(ExecutionState.SUCCESS, Optional.<Exception>absent());
+ }
+
+ public static ExecutionResult temporaryFailure(Exception e) {
+ return new ExecutionResult(ExecutionState.TEMPORARY_FAILURE, Optional.of(e));
+ }
+
+ public static ExecutionResult permanentFailure(Exception e) {
+ return new ExecutionResult(ExecutionState.PERMANENT_FAILURE, Optional.of(e));
+ }
+
+ public static ExecutionResult temporaryFailure() {
+ return new ExecutionResult(ExecutionState.TEMPORARY_FAILURE, Optional.<Exception>absent());
+ }
+
+ public static ExecutionResult onFailure(boolean permanent, Exception exeption) {
+ if (permanent) {
+ return permanentFailure(exeption);
+ } else {
+ return temporaryFailure(exeption);
+ }
+ }
+
+ private final ExecutionState executionState;
+ private final Optional<Exception> exception;
+
+ public ExecutionResult(ExecutionState executionState, Optional<Exception> exception) {
+ this.executionState = executionState;
+ this.exception = exception;
+ }
+
+ public ExecutionState getExecutionState() {
+ return executionState;
+ }
+
+ public Optional<Exception> getException() {
+ return exception;
+ }
+
+ public boolean isPermanent() {
+ return executionState == ExecutionState.PERMANENT_FAILURE;
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/james-project/blob/942cdfc6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MessageComposer.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MessageComposer.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MessageComposer.java
index a323ba9..3e6d861 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MessageComposer.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MessageComposer.java
@@ -122,12 +122,14 @@ public class MessageComposer {
}
}
- public String composeFailLogMessage(Mail mail, Exception ex, boolean permanent) {
+ public String composeFailLogMessage(Mail mail, ExecutionResult executionResult) {
StringWriter sout = new StringWriter();
PrintWriter out = new PrintWriter(sout, true);
- out.print(permanentAsString(permanent) + " exception delivering mail (" + mail.getName() + ")" + retrieveExceptionLog(ex) + ": " );
+ out.print(permanentAsString(executionResult.isPermanent()) + " exception delivering mail (" + mail.getName()
+ + ")" + retrieveExceptionLog(executionResult.getException().orNull()) + ": " );
if (configuration.isDebug()) {
- ex.printStackTrace(out);
+ if (executionResult.getException().isPresent())
+ executionResult.getException().get().printStackTrace(out);
}
return sout.toString();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org