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 2016/11/23 13:50:45 UTC

[42/46] james-project git commit: JAMES-1854 Only discard when Sieve script was executed successfully

JAMES-1854 Only discard when Sieve script was executed successfully


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/92515034
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/92515034
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/92515034

Branch: refs/heads/master
Commit: 925150346eef13b2ca6908fd42201eacbfcfdfff
Parents: 296bb64
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Nov 21 10:40:51 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Nov 23 18:19:35 2016 +0700

----------------------------------------------------------------------
 .../apache/james/transport/mailets/Sieve.java   | 39 +++++++++++---------
 .../mailets/jsieve/delivery/SieveExecutor.java  |  9 +++--
 2 files changed, 28 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/92515034/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
index 92c4bc6..b17eea8 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
@@ -84,29 +84,34 @@ public class Sieve extends GenericMailet {
 
     @Override
     public void service(Mail mail) throws MessagingException {
-        for(MailAddress recipient: mail.getRecipients()) {
-            executeSieveScript(mail, recipient);
-        }
-        mail.setRecipients(keepNonDiscardedRecipients(mail));
+        List<MailAddress> recipientsWithSuccessfulSieveExecution = executeRetrieveSuccess(mail);
+        mail.setRecipients(keepNonDiscardedRecipients(mail, recipientsWithSuccessfulSieveExecution));
     }
 
-    private void executeSieveScript(Mail mail, MailAddress recipient) {
-        try {
-            sieveExecutor.execute(recipient, mail);
-        } catch (Exception e) {
-            getMailetContext().getLogger().warn("Failed to execute Sieve script for user " + recipient.asPrettyString(), e);
+    private List<MailAddress> executeRetrieveSuccess(Mail mail) throws MessagingException {
+        ImmutableList.Builder<MailAddress> recipientsWithSuccessfulSieveExecution = ImmutableList.builder();
+        for(MailAddress recipient: mail.getRecipients()) {
+            if (sieveExecutor.execute(recipient, mail)) {
+                recipientsWithSuccessfulSieveExecution.add(recipient);
+            }
         }
+        return recipientsWithSuccessfulSieveExecution.build();
     }
 
-
-    private ImmutableList<MailAddress> keepNonDiscardedRecipients(Mail mail) {
+    private ImmutableList<MailAddress> keepNonDiscardedRecipients(Mail mail, final List<MailAddress> recipientsWithSuccessfulSieveExecution) {
         final List<MailAddress> discardedRecipients = retrieveDiscardedRecipients(mail);
-        return FluentIterable.from(mail.getRecipients()).filter(new Predicate<MailAddress>() {
-                @Override
-                public boolean apply(MailAddress input) {
-                    return !discardedRecipients.contains(input);
-                }
-            }).toList();
+        return FluentIterable.from(mail.getRecipients())
+            .filter(discardPredicate(discardedRecipients, recipientsWithSuccessfulSieveExecution))
+            .toList();
+    }
+
+    private Predicate<MailAddress> discardPredicate(final List<MailAddress> discardedAddressList, final List<MailAddress> discardeableAddressList) {
+        return new Predicate<MailAddress>() {
+            @Override
+            public boolean apply(MailAddress input) {
+                return !discardeableAddressList.contains(input) || !discardedAddressList.contains(input);
+            }
+        };
     }
 
     private List<MailAddress> retrieveDiscardedRecipients(Mail mail) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/92515034/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
index feb9c37..d33f7d6 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
@@ -110,21 +110,24 @@ public class SieveExecutor {
         }
     }
 
-    public void execute(MailAddress recipient, Mail mail) throws MessagingException {
+    public boolean execute(MailAddress recipient, Mail mail) throws MessagingException {
         Preconditions.checkNotNull(recipient, "Recipient for mail to be spooled cannot be null.");
         Preconditions.checkNotNull(mail.getMessage(), "Mail message to be spooled cannot be null.");
 
-        sieveMessage(recipient, mail, log);
+        return sieveMessage(recipient, mail, log);
     }
 
-    protected void sieveMessage(MailAddress recipient, Mail aMail, Log log) throws MessagingException {
+    protected boolean sieveMessage(MailAddress recipient, Mail aMail, Log log) throws MessagingException {
         try {
             ResourceLocator.UserSieveInformation userSieveInformation = resourceLocator.get(recipient);
             sieveMessageEvaluate(recipient, aMail, userSieveInformation, log);
+            return true;
         } catch (ScriptNotFoundException e) {
             log.info("Can not locate SIEVE script for user " + recipient.asPrettyString());
+            return false;
         } catch (Exception ex) {
             log.error("Cannot evaluate Sieve script for user " + recipient.asPrettyString(), ex);
+            return false;
         }
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org