JAMES-2366 Forward mappings should be sorted just after Domains

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

Branch: refs/heads/master
Commit: d1b0a112b99054a67ad5f4f2262f7527eed17a85
Parents: 048e362
Author: Antoine Duprat <adup...@linagora.com>
Authored: Thu Mar 29 15:38:26 2018 +0200
Committer: Antoine Duprat <adup...@linagora.com>
Committed: Fri Apr 6 14:39:17 2018 +0200

----------------------------------------------------------------------
 .../java/org/apache/james/rrt/lib/Mapping.java  | 18 +++++++++-----
 .../org/apache/james/rrt/lib/MappingsImpl.java  | 25 +++++++-------------
 .../lib/AbstractRecipientRewriteTableTest.java  |  5 +++-
 .../apache/james/rrt/lib/MappingsImplTest.java  | 13 ++++++++++
 4 files changed, 37 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d1b0a112/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 72193dc..bb3ec7e 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
@@ -47,16 +47,18 @@ public interface Mapping {
     String getAddress();
 
     enum Type {
-        Regex("regex:"), 
-        Domain("domain:"), 
-        Error("error:"), 
-        Forward("forward:"),
-        Address(""); 
+        Regex("regex:", 3),
+        Domain("domain:", 1),
+        Error("error:", 3),
+        Forward("forward:", 2),
+        Address("", 3);
 
         private final String asPrefix;
+        private final int order;
 
-        Type(String asPrefix) {
+        Type(String asPrefix, Integer order) {
             this.asPrefix = asPrefix;
+            this.order = order;
         }
 
         public String asPrefix() {
@@ -74,6 +76,10 @@ public interface Mapping {
                 || mapping.startsWith(Error.asPrefix())
                 || mapping.startsWith(Forward.asPrefix());
         }
+
+        public int getOrder() {
+            return order;
+        }
     }
 
     Type getType();

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1b0a112/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
index eab5fd8..23c3a3d 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
@@ -44,6 +44,10 @@ public class MappingsImpl implements Mappings, Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    public static final Comparator<Mapping> MAPPING_COMPARATOR = Comparator
+        .<Mapping, Integer>comparing(mapping -> mapping.getType().getOrder())
+        .thenComparing(Mapping::asString);
+
     public static MappingsImpl empty() {
         return builder().build();
     }
@@ -103,7 +107,6 @@ public class MappingsImpl implements Mappings, Serializable 
{
             mappings.add(mapping);
             return this;
         }
-
         
         public Builder addAll(Mappings mappings) {
             this.mappings.addAll(mappings);
@@ -111,24 +114,12 @@ public class MappingsImpl implements Mappings, 
Serializable {
         }
         
         public MappingsImpl build() {
-            Comparator<? super Mapping> byTypeComparator = (mapping1, 
mapping2) -> {
-                if (mapping1.getType() == mapping2.getType()) {
-                    return mapping1.asString().compareTo(mapping2.asString());
-                }
-                if (mapping1.getType() == Type.Domain) {
-                    return -1;
-                }
-                if (mapping2.getType() == Type.Domain) {
-                    return 1;
-                }
-                return mapping1.asString().compareTo(mapping2.asString());
-            };
-            return new MappingsImpl(mappings.build().stream()
-                    .sorted(byTypeComparator)
-                    .collect(Guavate.toImmutableList()));
+            return new MappingsImpl(mappings.build()
+                .stream()
+                .sorted(MAPPING_COMPARATOR)
+                .collect(Guavate.toImmutableList()));
         }
 
-        
     }
     
     private final ImmutableList<Mapping> mappings;

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1b0a112/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
index 3c69fab..143fb27 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
@@ -223,7 +223,10 @@ public abstract class AbstractRecipientRewriteTableTest {
 
         assertThat(virtualUserTable.getMappings(user, aliasDomain))
             .describedAs("Domain mapped as first, Address mapped as second")
-            .containsExactly(MappingImpl.address(user + "@" + domain), 
MappingImpl.address(user2 + "@" + domain));
+            .isEqualTo(MappingsImpl.builder()
+                .add(MappingImpl.address(user + "@" + domain))
+                .add(MappingImpl.address(user2 + "@" + domain))
+                .build());
 
         removeMapping(RecipientRewriteTable.WILDCARD, aliasDomain, user2 + "@" 
+ domain, Type.Address);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1b0a112/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
index efb5add..1f8dcd9 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
@@ -326,4 +326,17 @@ public class MappingsImplTest {
                 .build();
         assertThat(mappingsImpl).containsExactly(domainMapping, 
domain2Mapping, addressMapping, errorMapping);
     }
+    
+    @Test
+    public void 
builderShouldPutDomainAliasFirstThenForwardWhenVariousMappings() {
+        MappingImpl regexMapping = MappingImpl.regex("regex");
+        MappingImpl forwardMapping = MappingImpl.forward("forward");
+        MappingImpl domainMapping = MappingImpl.domain(Domain.of("domain"));
+        MappingsImpl mappingsImpl = MappingsImpl.builder()
+                .add(regexMapping)
+                .add(forwardMapping)
+                .add(domainMapping)
+                .build();
+        assertThat(mappingsImpl).containsExactly(domainMapping, 
forwardMapping, regexMapping);
+    }
 }


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