JAMES-2366 Rely more on Strong typing and better extract methods

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

Branch: refs/heads/master
Commit: 8947eeea67c2aa4f83c74a3415043cb02cb7f0bd
Parents: a71d033
Author: benwa <btell...@linagora.com>
Authored: Wed Apr 18 09:40:07 2018 +0700
Committer: Matthieu Baechler <matth...@apache.org>
Committed: Tue Apr 24 14:45:26 2018 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/james/core/User.java   |  7 +++
 .../rrt/lib/AbstractRecipientRewriteTable.java  | 51 +++++++++++---------
 2 files changed, 34 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8947eeea/core/src/main/java/org/apache/james/core/User.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/james/core/User.java 
b/core/src/main/java/org/apache/james/core/User.java
index 8b5421e..a3f07ff 100644
--- a/core/src/main/java/org/apache/james/core/User.java
+++ b/core/src/main/java/org/apache/james/core/User.java
@@ -23,6 +23,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
+import javax.mail.internet.AddressException;
+
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
@@ -101,6 +103,11 @@ public class User {
             .orElse(localPart);
     }
 
+    public MailAddress asMailAddress() throws AddressException {
+        Preconditions.checkState(hasDomainPart());
+        return new MailAddress(localPart, domainPart.get());
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof User) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8947eeea/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
index 23c60c2..f5da229 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
@@ -20,6 +20,7 @@ package org.apache.james.rrt.lib;
 
 import java.util.Map;
 import java.util.Optional;
+import java.util.function.Function;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 import java.util.stream.Stream;
@@ -30,7 +31,6 @@ import javax.mail.internet.AddressException;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.core.Domain;
-import org.apache.james.core.MailAddress;
 import org.apache.james.core.User;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -97,10 +97,10 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
 
     @Override
     public Mappings getMappings(String user, Domain domain) throws 
ErrorMappingException, RecipientRewriteTableException {
-        return getMappings(user, domain, mappingLimit);
+        return getMappings(User.fromLocalPartWithDomain(user, domain), 
mappingLimit);
     }
 
-    public Mappings getMappings(String user, Domain domain, int mappingLimit) 
throws ErrorMappingException, RecipientRewriteTableException {
+    public Mappings getMappings(User user, int mappingLimit) throws 
ErrorMappingException, RecipientRewriteTableException {
 
         // We have to much mappings throw ErrorMappingException to avoid
         // infinity loop
@@ -108,7 +108,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
             throw new ErrorMappingException("554 Too many mappings to 
process");
         }
 
-        Mappings targetMappings = mapAddress(user, domain);
+        Mappings targetMappings = mapAddress(user.getLocalPart(), 
user.getDomainPart().get());
 
         if (targetMappings.contains(Type.Error)) {
             throw new 
ErrorMappingException(targetMappings.getError().getErrorMessage());
@@ -117,7 +117,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
         try {
             return MappingsImpl.fromMappings(
                 targetMappings.asStream()
-                    .flatMap(Throwing.<Mapping, 
Stream<Mapping>>function(target -> convertAndRecurseMapping(target, user, 
domain, mappingLimit)).sneakyThrow()));
+                    .flatMap(Throwing.<Mapping, 
Stream<Mapping>>function(target -> convertAndRecurseMapping(user, target, 
mappingLimit)).sneakyThrow()));
         } catch (EmptyMappingException e) {
             return MappingsImpl.empty();
         }
@@ -127,39 +127,42 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
 
     }
 
-    private Stream<Mapping> convertAndRecurseMapping(Mapping target, String 
user, Domain domain, int remainingLoops) throws ErrorMappingException, 
RecipientRewriteTableException, EmptyMappingException, AddressException {
-        Optional<String> maybeAddressWithMappingApplied = target.apply(new 
MailAddress(user, domain));
+    private Stream<Mapping> convertAndRecurseMapping(User user, Mapping 
associatedMapping, int remainingLoops) throws ErrorMappingException, 
RecipientRewriteTableException, EmptyMappingException, AddressException {
 
-        if (!maybeAddressWithMappingApplied.isPresent()) {
-            return Stream.empty();
-        }
-        String addressWithMappingApplied = 
maybeAddressWithMappingApplied.get();
-        LOGGER.debug("Valid virtual user mapping {}@{} to {}", user, 
domain.name(), addressWithMappingApplied);
+        Function<String, Stream<Mapping>> convertAndRecurseMapping =
+            Throwing
+                .function((String stringMapping) -> 
convertAndRecurseMapping(associatedMapping.getType(), user, remainingLoops, 
stringMapping))
+                .sneakyThrow();
+
+        return associatedMapping.apply(user.asMailAddress())
+            .map(convertAndRecurseMapping)
+            .orElse(Stream.empty());
+    }
 
+    private Stream<Mapping> convertAndRecurseMapping(Type mappingType, User 
originalUser, int remainingLoops, String addressWithMappingApplied) throws 
ErrorMappingException, RecipientRewriteTableException {
+        LOGGER.debug("Valid virtual user mapping {} to {}", originalUser, 
addressWithMappingApplied);
+
+        Stream<Mapping> nonRecursiveResult = 
Stream.of(toMapping(addressWithMappingApplied, mappingType));
         if (!recursive) {
-            return Stream.of(toMapping(addressWithMappingApplied, 
target.getType()));
+            return nonRecursiveResult;
         }
 
-        User coreUser = User.fromUsername(addressWithMappingApplied)
-            .withDefaultDomain(domain);
-
-        String userName = coreUser.getLocalPart();
-        Domain targetDomain = coreUser.getDomainPart().get();
+        User targetUser = User.fromUsername(addressWithMappingApplied)
+            .withDefaultDomain(originalUser.getDomainPart().get());
 
         // Check if the returned mapping is the same as the
         // input. If so return null to avoid loops
-        if (userName.equalsIgnoreCase(user) && targetDomain.equals(domain)) {
-            if (target.getType().equals(Type.Forward)) {
-                return Stream.of(toMapping(addressWithMappingApplied, 
target.getType()));
+        if (originalUser.equals(targetUser)) {
+            if (mappingType.equals(Type.Forward)) {
+                return nonRecursiveResult;
             }
-            //throw exception ?
             throw new EmptyMappingException();
         }
 
-        Mappings childMappings = getMappings(userName, targetDomain, 
remainingLoops - 1);
+        Mappings childMappings = getMappings(targetUser, remainingLoops - 1);
 
         if (childMappings.isEmpty()) {
-            return Stream.of(toMapping(addressWithMappingApplied, 
target.getType()));
+            return nonRecursiveResult;
         } else {
             return childMappings.asStream();
         }


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

Reply via email to