JAMES-2366 Behaviour upon identity should be specified in Mapping::Type

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

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

----------------------------------------------------------------------
 .../java/org/apache/james/rrt/lib/Mapping.java  | 38 ++++++++++++++++----
 .../rrt/lib/SkipMappingProcessingException.java | 24 +++++++++++++
 .../rrt/lib/AbstractRecipientRewriteTable.java  | 25 ++++++-------
 3 files changed, 66 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f08343dd/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java 
b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java
index 3a7757a..c494d8b 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java
@@ -22,7 +22,9 @@ package org.apache.james.rrt.lib;
 
 import java.util.Optional;
 import java.util.function.Supplier;
+import java.util.stream.Stream;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
@@ -53,17 +55,19 @@ public interface Mapping {
     Optional<MailAddress> asMailAddress();
 
     enum Type {
-        Regex("regex:"),
-        Domain("domain:"),
-        Error("error:"),
-        Forward("forward:"),
-        Group("group:"),
-        Address("");
+        Regex("regex:", IdentityMappingBehaviour.Throw),
+        Domain("domain:", IdentityMappingBehaviour.Throw),
+        Error("error:", IdentityMappingBehaviour.Throw),
+        Forward("forward:", IdentityMappingBehaviour.ReturnIdentity),
+        Group("group:", IdentityMappingBehaviour.Throw),
+        Address("", IdentityMappingBehaviour.Throw);
 
         private final String asPrefix;
+        private final IdentityMappingBehaviour identityMappingBehaviour;
 
-        Type(String asPrefix) {
+        Type(String asPrefix, IdentityMappingBehaviour 
identityMappingBehaviour) {
             this.asPrefix = asPrefix;
+            this.identityMappingBehaviour = identityMappingBehaviour;
         }
 
         public String asPrefix() {
@@ -82,6 +86,26 @@ public interface Mapping {
                 || mapping.startsWith(Forward.asPrefix())
                 || mapping.startsWith(Group.asPrefix());
         }
+
+        public IdentityMappingBehaviour getIdentityMappingBehaviour() {
+            return identityMappingBehaviour;
+        }
+    }
+
+    enum IdentityMappingBehaviour {
+        Throw,
+        ReturnIdentity;
+
+        public Stream<Mapping> handleIdentity(Stream<Mapping> mapping) {
+            switch (this) {
+                case Throw:
+                    throw new SkipMappingProcessingException();
+                case ReturnIdentity:
+                    return mapping;
+                default:
+                    throw new NotImplementedException("Unknown 
IdentityMappingBehaviour : " + this);
+            }
+        }
     }
 
     Type getType();

http://git-wip-us.apache.org/repos/asf/james-project/blob/f08343dd/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java
 
b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java
new file mode 100644
index 0000000..00a62e1
--- /dev/null
+++ 
b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java
@@ -0,0 +1,24 @@
+/****************************************************************
+ * 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.rrt.lib;
+
+public class SkipMappingProcessingException extends RuntimeException {
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f08343dd/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 f5da229..1632414 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
@@ -118,20 +118,16 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
             return MappingsImpl.fromMappings(
                 targetMappings.asStream()
                     .flatMap(Throwing.<Mapping, 
Stream<Mapping>>function(target -> convertAndRecurseMapping(user, target, 
mappingLimit)).sneakyThrow()));
-        } catch (EmptyMappingException e) {
+        } catch (SkipMappingProcessingException e) {
             return MappingsImpl.empty();
         }
     }
 
-    private static class EmptyMappingException extends RuntimeException {
-
-    }
-
-    private Stream<Mapping> convertAndRecurseMapping(User user, Mapping 
associatedMapping, int remainingLoops) throws ErrorMappingException, 
RecipientRewriteTableException, EmptyMappingException, AddressException {
+    private Stream<Mapping> convertAndRecurseMapping(User user, Mapping 
associatedMapping, int remainingLoops) throws ErrorMappingException, 
RecipientRewriteTableException, SkipMappingProcessingException, 
AddressException {
 
         Function<String, Stream<Mapping>> convertAndRecurseMapping =
             Throwing
-                .function((String stringMapping) -> 
convertAndRecurseMapping(associatedMapping.getType(), user, remainingLoops, 
stringMapping))
+                .function((String stringMapping) -> 
convertAndRecurseMapping(associatedMapping.getType(), user, stringMapping, 
remainingLoops))
                 .sneakyThrow();
 
         return associatedMapping.apply(user.asMailAddress())
@@ -139,7 +135,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
             .orElse(Stream.empty());
     }
 
-    private Stream<Mapping> convertAndRecurseMapping(Type mappingType, User 
originalUser, int remainingLoops, String addressWithMappingApplied) throws 
ErrorMappingException, RecipientRewriteTableException {
+    private Stream<Mapping> convertAndRecurseMapping(Type mappingType, User 
originalUser, String addressWithMappingApplied, int remainingLoops) throws 
ErrorMappingException, RecipientRewriteTableException {
         LOGGER.debug("Valid virtual user mapping {} to {}", originalUser, 
addressWithMappingApplied);
 
         Stream<Mapping> nonRecursiveResult = 
Stream.of(toMapping(addressWithMappingApplied, mappingType));
@@ -150,15 +146,16 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
         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
+        // Check if the returned mapping is the same as the input. If so we 
need to handle identity to avoid loops.
         if (originalUser.equals(targetUser)) {
-            if (mappingType.equals(Type.Forward)) {
-                return nonRecursiveResult;
-            }
-            throw new EmptyMappingException();
+            return mappingType.getIdentityMappingBehaviour()
+                .handleIdentity(nonRecursiveResult);
+        } else {
+            return recurseMapping(nonRecursiveResult, targetUser, 
remainingLoops);
         }
+    }
 
+    private Stream<Mapping> recurseMapping(Stream<Mapping> nonRecursiveResult, 
User targetUser, int remainingLoops) throws ErrorMappingException, 
RecipientRewriteTableException {
         Mappings childMappings = getMappings(targetUser, remainingLoops - 1);
 
         if (childMappings.isEmpty()) {


---------------------------------------------------------------------
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