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 bt...@apache.org on 2018/04/03 10:02:57 UTC

[11/24] james-project git commit: JAMES-2366 Refactor RecipientRewriteTableProcessor result reduction

JAMES-2366 Refactor RecipientRewriteTableProcessor result reduction


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

Branch: refs/heads/master
Commit: 9b3027e66adf25a87a62f15cef3aec3efea09d88
Parents: 9d13366
Author: benwa <bt...@linagora.com>
Authored: Wed Mar 28 13:57:54 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Apr 3 16:59:44 2018 +0700

----------------------------------------------------------------------
 .../mailets/RecipientRewriteTableProcessor.java | 125 +++++++++----------
 1 file changed, 60 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9b3027e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
index 2ca1e40..f725a4d 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
@@ -19,11 +19,9 @@
 
 package org.apache.james.transport.mailets;
 
-import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 import java.util.function.Function;
-import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import javax.mail.MessagingException;
@@ -53,22 +51,61 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 
 public class RecipientRewriteTableProcessor {
     private static final Logger LOGGER = LoggerFactory.getLogger(RecipientRewriteTableProcessor.class);
 
-    private final org.apache.james.rrt.api.RecipientRewriteTable virtualTableStore;
+    private static class RrtExecutionResult {
+        private static RrtExecutionResult empty() {
+            return new RrtExecutionResult(ImmutableList.of(), ImmutableList.of());
+        }
+
+        private static RrtExecutionResult error(MailAddress mailAddress) {
+            return new RrtExecutionResult(ImmutableList.of(), ImmutableList.of(mailAddress));
+        }
+
+        private static RrtExecutionResult success(MailAddress mailAddress) {
+            return new RrtExecutionResult(ImmutableList.of(mailAddress), ImmutableList.of());
+        }
+
+        private static RrtExecutionResult success(List<MailAddress> mailAddresses) {
+            return new RrtExecutionResult(ImmutableList.copyOf(mailAddresses), ImmutableList.of());
+        }
+
+        private static RrtExecutionResult merge(RrtExecutionResult result1, RrtExecutionResult result2) {
+            return new RrtExecutionResult(
+                ImmutableList.<MailAddress>builder()
+                    .addAll(result1.getNewRecipients())
+                    .addAll(result2.getNewRecipients())
+                    .build(),
+                ImmutableList.<MailAddress>builder()
+                    .addAll(result1.getRecipientWithError())
+                    .addAll(result2.getRecipientWithError())
+                    .build());
+        }
+
+        private final ImmutableList<MailAddress> newRecipients;
+        private final ImmutableList<MailAddress> recipientWithError;
+
+        public RrtExecutionResult(ImmutableList<MailAddress> newRecipients, ImmutableList<MailAddress> recipientWithError) {
+            this.newRecipients = newRecipients;
+            this.recipientWithError = recipientWithError;
+        }
+
+        public List<MailAddress> getNewRecipients() {
+            return newRecipients;
+        }
+
+        public List<MailAddress> getRecipientWithError() {
+            return recipientWithError;
+        }
+
+    }
+
+    private final RecipientRewriteTable virtualTableStore;
     private final DomainList domainList;
     private final MailetContext mailetContext;
 
-    private static final Function<RrtExecutionResult, Stream<MailAddress>> mailAddressesFromMappingData =
-        mappingData ->
-                OptionalUtils.or(
-                    mappingData.getNewRecipients(),
-                    mappingData.getRecipientWithError())
-            .map(Collection::stream).orElse(Stream.of());
-
     private static final Function<Mapping, Optional<MailAddress>> mailAddressFromMapping =
         addressMapping -> {
             try {
@@ -85,56 +122,44 @@ public class RecipientRewriteTableProcessor {
     }
 
     public void processMail(Mail mail) throws MessagingException {
-        ImmutableList<RrtExecutionResult> mappingDatas = toMappingDatas(mail);
+        RrtExecutionResult executionResults = executeRrtFor(mail);
 
-        ImmutableSet<MailAddress> newRecipients = getRecipientsByCondition(mappingDatas, mappingData -> !mappingData.isError());
-
-        ImmutableSet<MailAddress> errorMailAddresses = getRecipientsByCondition(mappingDatas, RrtExecutionResult::isError);
-
-        if (!errorMailAddresses.isEmpty()) {
-            mailetContext.sendMail(mail.getSender(), errorMailAddresses, mail.getMessage(), Mail.ERROR);
+        if (!executionResults.recipientWithError.isEmpty()) {
+            mailetContext.sendMail(mail.getSender(), executionResults.recipientWithError, mail.getMessage(), Mail.ERROR);
         }
 
-        if (newRecipients.isEmpty()) {
+        if (executionResults.newRecipients.isEmpty()) {
             mail.setState(Mail.GHOST);
         }
 
-        mail.setRecipients(newRecipients);
-    }
-
-
-    private ImmutableSet<MailAddress> getRecipientsByCondition(ImmutableList<RrtExecutionResult> mappingDatas, Predicate<RrtExecutionResult> filterCondition) {
-        return mappingDatas.stream()
-            .filter(filterCondition)
-            .flatMap(mailAddressesFromMappingData)
-            .collect(Guavate.toImmutableSet());
+        mail.setRecipients(executionResults.newRecipients);
     }
 
-    private ImmutableList<RrtExecutionResult> toMappingDatas(Mail mail) {
+    private RrtExecutionResult executeRrtFor(Mail mail) {
         Function<MailAddress, RrtExecutionResult> convertToMappingData = recipient -> {
             Preconditions.checkNotNull(recipient);
 
-            return getRrtExecutionResult(mail, recipient);
+            return executeRrtForRecipient(mail, recipient);
         };
 
         return mail.getRecipients()
             .stream()
             .map(convertToMappingData)
-            .collect(Guavate.toImmutableList());
+            .reduce(RrtExecutionResult.empty(), RrtExecutionResult::merge);
     }
 
-    private RrtExecutionResult getRrtExecutionResult(Mail mail, MailAddress recipient) {
+    private RrtExecutionResult executeRrtForRecipient(Mail mail, MailAddress recipient) {
         try {
             Mappings mappings = virtualTableStore.getMappings(recipient.getLocalPart(), recipient.getDomain());
 
             if (mappings != null) {
                 List<MailAddress> newMailAddresses = handleMappings(mappings, mail.getSender(), recipient, mail.getMessage());
-                return new RrtExecutionResult(Optional.of(newMailAddresses), Optional.empty());
+                return RrtExecutionResult.success(newMailAddresses);
             }
-            return origin(recipient);
+            return RrtExecutionResult.success(recipient);
         } catch (ErrorMappingException | RecipientRewriteTableException | MessagingException e) {
             LOGGER.info("Error while process mail.", e);
-            return error(recipient);
+            return RrtExecutionResult.error(recipient);
         }
     }
 
@@ -198,35 +223,5 @@ public class RecipientRewriteTableProcessor {
             throw new MessagingException("Unable to access DomainList", e);
         }
     }
-    
-    private RrtExecutionResult error(MailAddress mailAddress) {
-        return new RrtExecutionResult(Optional.empty(), Optional.of(ImmutableList.of(mailAddress)));
-    }
-
-    private RrtExecutionResult origin(MailAddress mailAddress) {
-        return new RrtExecutionResult(Optional.of(ImmutableList.of(mailAddress)), Optional.empty());
-    }
 
-    class RrtExecutionResult {
-        private final Optional<List<MailAddress>> newRecipients;
-        private final Optional<List<MailAddress>> recipientWithError;
-
-        public RrtExecutionResult(Optional<List<MailAddress>> newRecipients, Optional<List<MailAddress>> recipientWithError) {
-            this.newRecipients = newRecipients;
-            this.recipientWithError = recipientWithError;
-        }
-
-        public Optional<List<MailAddress>> getNewRecipients() {
-            return newRecipients;
-        }
-
-        public Optional<List<MailAddress>> getRecipientWithError() {
-            return recipientWithError;
-        }
-
-        public boolean isError() {
-            return recipientWithError.isPresent();
-        }
-
-    }
 }


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