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/08/28 05:48:35 UTC

[1/3] james-project git commit: JAMES-2530 Review RuleDTO structure

Repository: james-project
Updated Branches:
  refs/heads/master 3b648e90f -> 1a5f21ad6


JAMES-2530 Review RuleDTO structure


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

Branch: refs/heads/master
Commit: 1a5f21ad67a61184b0ab1c36cf464f9c968c9650
Parents: d7b1caf
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Aug 27 17:56:25 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Tue Aug 28 12:48:15 2018 +0700

----------------------------------------------------------------------
 .../james/jmap/cassandra/filtering/RuleDTO.java | 188 +++++++++++++++----
 .../src/test/resources/json/event.json          |  28 ++-
 .../src/test/resources/json/eventComplex.json   |  56 ++++--
 3 files changed, 210 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1a5f21ad/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
index 02c3fae..c3d8c54 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
@@ -32,6 +32,139 @@ import com.google.common.collect.ImmutableList;
 
 public class RuleDTO {
 
+    public static class ConditionDTO {
+
+        public static ConditionDTO from(Rule.Condition condition) {
+            return new ConditionDTO(
+                condition.getField().asString(),
+                condition.getComparator().asString(),
+                condition.getValue());
+        }
+
+        private final String field;
+        private final String comparator;
+        private final String value;
+
+        @JsonCreator
+        public ConditionDTO(@JsonProperty("field") String field,
+                            @JsonProperty("comparator") String comparator,
+                            @JsonProperty("value") String value) {
+            this.field = field;
+            this.comparator = comparator;
+            this.value = value;
+        }
+
+        public String getField() {
+            return field;
+        }
+
+        public String getComparator() {
+            return comparator;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public Rule.Condition toCondition() {
+            return Rule.Condition.of(
+                    Rule.Condition.Field.of(field),
+                    Rule.Condition.Comparator.of(comparator),
+                    value);
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof ConditionDTO) {
+                ConditionDTO other = (ConditionDTO) o;
+
+                return Objects.equals(this.field, other.field)
+                        && Objects.equals(this.comparator, other.comparator)
+                        && Objects.equals(this.value, other.value);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(field, comparator, value);
+        }
+    }
+
+    public static class ActionDTO {
+
+        public static class AppendInMailboxesDTO {
+
+            public static AppendInMailboxesDTO from(Rule.Action.AppendInMailboxes appendInMailboxes) {
+                return new AppendInMailboxesDTO(appendInMailboxes.getMailboxIds());
+            }
+
+            @JsonCreator
+            public AppendInMailboxesDTO(@JsonProperty("mailboxIds") List<String> mailboxIds) {
+                this.mailboxIds = ImmutableList.copyOf(mailboxIds);
+            }
+
+            private final List<String> mailboxIds;
+
+            public List<String> getMailboxIds() {
+                return mailboxIds;
+            }
+
+            public Rule.Action.AppendInMailboxes toAppendInMailboxes() {
+                return Rule.Action.AppendInMailboxes.withMailboxIds(mailboxIds);
+            }
+
+            @Override
+            public final boolean equals(Object o) {
+                if (o instanceof AppendInMailboxesDTO) {
+                    AppendInMailboxesDTO that = (AppendInMailboxesDTO) o;
+
+                    return Objects.equals(this.mailboxIds, that.mailboxIds);
+                }
+                return false;
+            }
+
+            @Override
+            public final int hashCode() {
+                return Objects.hash(mailboxIds);
+            }
+        }
+
+        public static ActionDTO from(Rule.Action action) {
+            return new ActionDTO(AppendInMailboxesDTO.from(action.getAppendInMailboxes()));
+        }
+
+        @JsonCreator
+        public ActionDTO(@JsonProperty("appendIn") AppendInMailboxesDTO appendIn) {
+            this.appendIn = appendIn;
+        }
+
+        private final AppendInMailboxesDTO appendIn;
+
+        public AppendInMailboxesDTO getAppendIn() {
+            return appendIn;
+        }
+
+        public Rule.Action toAction() {
+            return Rule.Action.of(appendIn.toAppendInMailboxes());
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof ActionDTO) {
+                ActionDTO actionDTO = (ActionDTO) o;
+
+                return Objects.equals(this.appendIn, actionDTO.appendIn);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(appendIn);
+        }
+    }
+
     public static ImmutableList<Rule> toRules(List<RuleDTO> ruleDTOList) {
         Preconditions.checkNotNull(ruleDTOList);
         return ruleDTOList.stream()
@@ -49,31 +182,23 @@ public class RuleDTO {
     public static RuleDTO from(Rule rule) {
         return new RuleDTO(rule.getId().asString(),
                 rule.getName(),
-                rule.getCondition().getField().asString(),
-                rule.getCondition().getComparator().asString(),
-                rule.getCondition().getValue(),
-                rule.getAction().getAppendInMailboxes().getMailboxIds());
+                ConditionDTO.from(rule.getCondition()),
+                ActionDTO.from(rule.getAction()));
     }
 
     private final String id;
     private final String name;
-    private final String field;
-    private final String comparator;
-    private final String value;
-    private final List<String> mailboxIds;
+    private final ConditionDTO conditionDTO;
+    private final ActionDTO actionDTO;
 
     @JsonCreator
     public RuleDTO(@JsonProperty("id") String id,
                    @JsonProperty("name") String name,
-                   @JsonProperty("field") String field,
-                   @JsonProperty("comparator") String comparator,
-                   @JsonProperty("value") String value,
-                   @JsonProperty("mailboxIds") List<String> mailboxIds) {
+                   @JsonProperty("condition") ConditionDTO conditionDTO,
+                   @JsonProperty("action") ActionDTO actionDTO) {
         this.name = name;
-        this.field = field;
-        this.comparator = comparator;
-        this.value = value;
-        this.mailboxIds = ImmutableList.copyOf(mailboxIds);
+        this.conditionDTO = conditionDTO;
+        this.actionDTO = actionDTO;
         Preconditions.checkNotNull(id);
 
         this.id = id;
@@ -87,32 +212,21 @@ public class RuleDTO {
         return name;
     }
 
-    public String getField() {
-        return field;
-    }
-
-    public String getComparator() {
-        return comparator;
-    }
-
-    public String getValue() {
-        return value;
+    public ConditionDTO getCondition() {
+        return conditionDTO;
     }
 
-    public List<String> getMailboxIds() {
-        return mailboxIds;
+    public ActionDTO getAction() {
+        return actionDTO;
     }
 
     public Rule toRule() {
         return Rule.builder()
             .id(Rule.Id.of(id))
             .name(name)
-            .condition(Rule.Condition.of(
-                Rule.Condition.Field.valueOf(field),
-                Rule.Condition.Comparator.of(comparator),
-                value))
+            .condition(conditionDTO.toCondition())
             .name(name)
-            .action(Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds(mailboxIds)))
+            .action(actionDTO.toAction())
             .build();
     }
 
@@ -123,17 +237,15 @@ public class RuleDTO {
 
             return Objects.equals(this.id, ruleDTO.id)
                    && Objects.equals(this.name, ruleDTO.name)
-                   && Objects.equals(this.field, ruleDTO.field)
-                   && Objects.equals(this.comparator, ruleDTO.comparator)
-                   && Objects.equals(this.value, ruleDTO.value)
-                   && Objects.equals(this.mailboxIds, ruleDTO.mailboxIds);
+                   && Objects.equals(this.conditionDTO, ruleDTO.conditionDTO)
+                   && Objects.equals(this.actionDTO, ruleDTO.actionDTO);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hash(id, name, field, comparator, value, mailboxIds);
+        return Objects.hash(id, name, conditionDTO, actionDTO);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/1a5f21ad/server/data/data-jmap-cassandra/src/test/resources/json/event.json
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/event.json b/server/data/data-jmap-cassandra/src/test/resources/json/event.json
index b77e46a..d86fdfe 100644
--- a/server/data/data-jmap-cassandra/src/test/resources/json/event.json
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/event.json
@@ -6,18 +6,30 @@
     {
       "id":"1",
       "name":"a name",
-      "field":"cc",
-      "comparator":"contains",
-      "value":"something",
-      "mailboxIds":["id-01"]
+      "condition": {
+        "field": "cc",
+        "comparator": "contains",
+        "value": "something"
+      },
+      "action": {
+        "appendIn": {
+          "mailboxIds":["id-01"]
+        }
+      }
     },
     {
       "id":"2",
       "name":"a name",
-      "field":"cc",
-      "comparator":"contains",
-      "value":"something",
-      "mailboxIds":["id-01"]
+      "condition": {
+        "field": "cc",
+        "comparator": "contains",
+        "value": "something"
+      },
+      "action": {
+        "appendIn": {
+          "mailboxIds":["id-01"]
+        }
+      }
     }
   ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/1a5f21ad/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json
index a08e2d1..62b6ab0 100644
--- a/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json
@@ -6,34 +6,58 @@
     {
       "id":"id-from",
       "name":"a name",
-      "field":"from",
-      "comparator":"contains",
-      "value":"A value to match 4",
-      "mailboxIds":["mbx1"]
+      "condition": {
+        "field": "from",
+        "comparator": "contains",
+        "value": "A value to match 4"
+      },
+      "action": {
+        "appendIn": {
+          "mailboxIds":["mbx1"]
+        }
+      }
     },
     {
       "id":"id-rcpt",
       "name":"a name",
-      "field":"recipient",
-      "comparator":"not-exactly-equals",
-      "value":"A value to match 3",
-      "mailboxIds":["mbx1"]
+      "condition": {
+        "field": "recipient",
+        "comparator": "not-exactly-equals",
+        "value": "A value to match 3"
+      },
+      "action": {
+        "appendIn": {
+          "mailboxIds":["mbx1"]
+        }
+      }
     },
     {
       "id":"id-subject",
       "name":"a name",
-      "field":"subject",
-      "comparator":"not-contains",
-      "value":"A value to match 2",
-      "mailboxIds":["mbx1"]
+      "condition": {
+        "field": "subject",
+        "comparator": "not-contains",
+        "value": "A value to match 2"
+      },
+      "action": {
+        "appendIn": {
+          "mailboxIds":["mbx1"]
+        }
+      }
     },
     {
       "id":"id-to",
       "name":"a name",
-      "field":"to",
-      "comparator":"exactly-equals",
-      "value":"A value to match 1",
-      "mailboxIds":["mbx1"]
+      "condition": {
+        "field": "to",
+        "comparator": "exactly-equals",
+        "value": "A value to match 1"
+      },
+      "action": {
+        "appendIn": {
+          "mailboxIds":["mbx1"]
+        }
+      }
     }
   ]
 }
\ No newline at end of file


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


[2/3] james-project git commit: JAMES-2530 Add an intermediate AppendInMailboxes action to better describe input

Posted by bt...@apache.org.
JAMES-2530 Add an intermediate AppendInMailboxes action to better describe input


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

Branch: refs/heads/master
Commit: d7b1caf3976a9d82cc822c44aad70dbe2160ff12
Parents: 4d8e807
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Aug 27 17:16:58 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Tue Aug 28 12:48:15 2018 +0700

----------------------------------------------------------------------
 .../james/jmap/cassandra/filtering/RuleDTO.java |  4 +-
 .../apache/james/jmap/api/filtering/Rule.java   | 77 +++++++++++++++-----
 .../james/jmap/api/filtering/RuleFixture.java   | 10 +--
 .../james/jmap/api/filtering/RuleTest.java      | 16 ++--
 4 files changed, 75 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d7b1caf3/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
index c72eb39..02c3fae 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
@@ -52,7 +52,7 @@ public class RuleDTO {
                 rule.getCondition().getField().asString(),
                 rule.getCondition().getComparator().asString(),
                 rule.getCondition().getValue(),
-                rule.getAction().getMailboxIds());
+                rule.getAction().getAppendInMailboxes().getMailboxIds());
     }
 
     private final String id;
@@ -112,7 +112,7 @@ public class RuleDTO {
                 Rule.Condition.Comparator.of(comparator),
                 value))
             .name(name)
-            .action(Rule.Action.ofMailboxIds(mailboxIds))
+            .action(Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds(mailboxIds)))
             .build();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d7b1caf3/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
index 0da600d..8b4ae67 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
@@ -35,8 +35,8 @@ public class Rule {
     public static class Id {
 
         public static Id of(String id) {
-            Preconditions.checkNotNull(id, "id should no be null");
-            Preconditions.checkArgument(StringUtils.isNotBlank(id), "id should no be empty");
+            Preconditions.checkNotNull(id, "id should not be null");
+            Preconditions.checkArgument(StringUtils.isNotBlank(id), "id should not be empty");
             return new Id(id);
         }
 
@@ -130,10 +130,10 @@ public class Rule {
         }
 
         public static Condition of(Field field, Comparator comparator, String value) {
-            Preconditions.checkNotNull(field, "field should no be null");
-            Preconditions.checkNotNull(comparator, "comparator should no be null");
-            Preconditions.checkNotNull(value, "value should no be null");
-            Preconditions.checkArgument(StringUtils.isNotBlank(value), "value should no be empty");
+            Preconditions.checkNotNull(field, "field should not be null");
+            Preconditions.checkNotNull(comparator, "comparator should not be null");
+            Preconditions.checkNotNull(value, "value should not be null");
+            Preconditions.checkArgument(StringUtils.isNotBlank(value), "value should not be empty");
             return new Condition(field, comparator, value);
         }
 
@@ -185,46 +185,83 @@ public class Rule {
         }
     }
 
-
     public static class Action {
 
-        public static Action ofMailboxIds(List<String> mailboxIds) {
-            Preconditions.checkNotNull(mailboxIds, "mailboxIds should no be null");
-            return new Action(mailboxIds);
+        public static class AppendInMailboxes {
+
+            public static AppendInMailboxes withMailboxIds(List<String> mailboxIds) {
+                Preconditions.checkNotNull(mailboxIds, "mailboxIds should not be null");
+                return new AppendInMailboxes(mailboxIds);
+            }
+
+            public static AppendInMailboxes withMailboxIds(String... mailboxIds) {
+                return withMailboxIds(Arrays.asList(mailboxIds));
+            }
+
+            private final ImmutableList<String> mailboxIds;
+
+            private AppendInMailboxes(List<String> mailboxIds) {
+                this.mailboxIds = ImmutableList.copyOf(mailboxIds);
+            }
+
+            public ImmutableList<String> getMailboxIds() {
+                return mailboxIds;
+            }
+
+            @Override
+            public final boolean equals(Object o) {
+                if (o instanceof AppendInMailboxes) {
+                    AppendInMailboxes appendInMailboxes = (AppendInMailboxes) o;
+                    return Objects.equals(mailboxIds, appendInMailboxes.mailboxIds);
+                }
+                return false;
+            }
+
+            @Override
+            public final int hashCode() {
+                return Objects.hash(mailboxIds);
+            }
+
+            @Override
+            public String toString() {
+                return MoreObjects.toStringHelper(this)
+                        .add("mailboxIds", mailboxIds)
+                        .toString();
+            }
         }
 
-        public static Action ofMailboxIds(String... mailboxIds) {
-            return ofMailboxIds(Arrays.asList(mailboxIds));
+        public static Action of(AppendInMailboxes appendInMailboxes) {
+            return new Action(appendInMailboxes);
         }
 
-        private final ImmutableList<String> mailboxIds;
+        private final AppendInMailboxes appendInMailboxes;
 
-        private Action(List<String> mailboxIds) {
-            this.mailboxIds = ImmutableList.copyOf(mailboxIds);
+        private Action(AppendInMailboxes appendInMailboxes) {
+            this.appendInMailboxes = appendInMailboxes;
         }
         
-        public ImmutableList<String> getMailboxIds() {
-            return mailboxIds;
+        public AppendInMailboxes getAppendInMailboxes() {
+            return appendInMailboxes;
         }
 
         @Override
         public final boolean equals(Object o) {
             if (o instanceof Action) {
                 Action action = (Action) o;
-                return Objects.equals(mailboxIds, action.mailboxIds);
+                return Objects.equals(appendInMailboxes, action.appendInMailboxes);
             }
             return false;
         }
 
         @Override
         public final int hashCode() {
-            return Objects.hash(mailboxIds);
+            return Objects.hash(appendInMailboxes);
         }
 
         @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
-                .add("mailboxIds", mailboxIds)
+                .add("appendInMailboxes", appendInMailboxes)
                 .toString();
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d7b1caf3/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
index 5d17d03..96d31ea 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
@@ -22,7 +22,7 @@ package org.apache.james.jmap.api.filtering;
 public interface RuleFixture {
     String NAME = "a name";
     Rule.Condition CONDITION = Rule.Condition.of(Rule.Condition.Field.CC, Rule.Condition.Comparator.CONTAINS, "something");
-    Rule.Action ACTION = Rule.Action.ofMailboxIds("id-01");
+    Rule.Action ACTION = Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds("id-01"));
     Rule.Builder RULE_BUILER = Rule.builder().name(NAME).condition(CONDITION).action(ACTION);
     Rule RULE_1 = RULE_BUILER.id(Rule.Id.of("1")).build();
     Rule RULE_2 = RULE_BUILER.id(Rule.Id.of("2")).build();
@@ -31,7 +31,7 @@ public interface RuleFixture {
     Rule RULE_TO = Rule.builder()
             .id(Rule.Id.of("id-to"))
             .name(NAME)
-            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .action(Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds("mbx1")))
             .condition(Rule.Condition.of(
                     Rule.Condition.Field.TO,
                     Rule.Condition.Comparator.EXACTLY_EQUALS,
@@ -41,7 +41,7 @@ public interface RuleFixture {
     Rule RULE_SUBJECT = Rule.builder()
             .id(Rule.Id.of("id-subject"))
             .name(NAME)
-            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .action(Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds("mbx1")))
             .condition(Rule.Condition.of(
                     Rule.Condition.Field.SUBJECT,
                     Rule.Condition.Comparator.NOT_CONTAINS,
@@ -51,7 +51,7 @@ public interface RuleFixture {
     Rule RULE_RECIPIENT = Rule.builder()
             .id(Rule.Id.of("id-rcpt"))
             .name(NAME)
-            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .action(Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds("mbx1")))
             .condition(Rule.Condition.of(
                     Rule.Condition.Field.RECIPIENT,
                     Rule.Condition.Comparator.NOT_EXACTLY_EQUALS,
@@ -61,7 +61,7 @@ public interface RuleFixture {
     Rule RULE_FROM = Rule.builder()
             .id(Rule.Id.of("id-from"))
             .name(NAME)
-            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .action(Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds("mbx1")))
             .condition(Rule.Condition.of(
                     Rule.Condition.Field.FROM,
                     Rule.Condition.Comparator.CONTAINS,

http://git-wip-us.apache.org/repos/asf/james-project/blob/d7b1caf3/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
index 2e3e760..c341f48 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
@@ -29,15 +29,15 @@ import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class RuleTest {
+class RuleTest {
 
     private static final List<String> ACTION_MAILBOXIDS = Arrays.asList("id-01");
     private static final String CONDITION_COMPARATOR = "contains";
     private static final String CONDITION_FIELD = "cc";
     private static final String NAME = "a name";
-    public static final Rule.Condition CONDITION = Rule.Condition.of(Rule.Condition.Field.of(CONDITION_FIELD), Rule.Condition.Comparator.of(CONDITION_COMPARATOR), "something");
-    public static final Rule.Action ACTION = Rule.Action.ofMailboxIds(ACTION_MAILBOXIDS);
-    public static final Rule.Id UNIQUE_ID = Rule.Id.of("uniqueId");
+    private static final Rule.Condition CONDITION = Rule.Condition.of(Rule.Condition.Field.of(CONDITION_FIELD), Rule.Condition.Comparator.of(CONDITION_COMPARATOR), "something");
+    private static final Rule.Action ACTION = Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds(ACTION_MAILBOXIDS));
+    private static final Rule.Id UNIQUE_ID = Rule.Id.of("uniqueId");
 
     @Test
     void shouldMatchBeanContract() {
@@ -64,6 +64,12 @@ public class RuleTest {
     }
 
     @Test
+    void innerClassAppendInMailboxesShouldMatchBeanContract() {
+        EqualsVerifier.forClass(Rule.Action.AppendInMailboxes.class)
+            .verify();
+    }
+
+    @Test
     void idShouldThrowOnNull() {
         assertThatThrownBy(() -> Rule.Id.of(null)).isInstanceOf(NullPointerException.class);
     }
@@ -158,7 +164,7 @@ public class RuleTest {
 
     @Test
     void buildActionShouldConserveMailboxIdsList() {
-        assertThat(ACTION.getMailboxIds()).isEqualTo(ACTION_MAILBOXIDS);
+        assertThat(ACTION.getAppendInMailboxes().getMailboxIds()).isEqualTo(ACTION_MAILBOXIDS);
     }
 
 }


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


[3/3] james-project git commit: JAMES-2530 [FILTERS] Complete POJOs, add tests and first draft of DTO

Posted by bt...@apache.org.
JAMES-2530 [FILTERS] Complete POJOs, add tests and first draft of DTO

Based on Gautier work


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

Branch: refs/heads/master
Commit: 4d8e807e5414d26fd912aae7017760e32fe7c38e
Parents: 3b648e9
Author: Gautier DI FOLCO <gd...@linagora.com>
Authored: Thu Aug 23 10:18:01 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Tue Aug 28 12:48:15 2018 +0700

----------------------------------------------------------------------
 server/data/data-jmap-cassandra/pom.xml         |   5 +
 .../FilteringRuleSetDefineDTOModules.java       |   4 +-
 .../filtering/FilteringRuleSetDefinedDTO.java   |   4 +
 .../james/jmap/cassandra/filtering/RuleDTO.java |  68 ++++-
 .../james/jmap/cassandra/filtering/DTOTest.java | 114 ++++++++
 .../src/test/resources/json/event.json          |  23 ++
 .../src/test/resources/json/eventComplex.json   |  39 +++
 .../src/test/resources/json/eventEmpty.json     |   6 +
 .../jmap/api/filtering/FilteringManagement.java |  11 +
 .../apache/james/jmap/api/filtering/Rule.java   | 287 ++++++++++++++++++-
 .../filtering/FilteringManagementContract.java  |  78 +++--
 .../james/jmap/api/filtering/RuleFixture.java   |  71 +++++
 .../james/jmap/api/filtering/RuleTest.java      | 133 ++++++++-
 .../filtering/impl/DefineRulesCommandTest.java  |   5 +-
 14 files changed, 799 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/pom.xml b/server/data/data-jmap-cassandra/pom.xml
index e9f4e85..67a479a 100644
--- a/server/data/data-jmap-cassandra/pom.xml
+++ b/server/data/data-jmap-cassandra/pom.xml
@@ -78,6 +78,11 @@
             <artifactId>javax.inject</artifactId>
         </dependency>
         <dependency>
+            <groupId>net.javacrumbs.json-unit</groupId>
+            <artifactId>json-unit-assertj</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java
index 0c56b1c..2248eec 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java
@@ -24,11 +24,13 @@ import org.apache.james.jmap.api.filtering.impl.RuleSetDefined;
 
 public interface FilteringRuleSetDefineDTOModules {
 
+    String TYPE = "filtering-rule-set-defined";
+
     EventDTOModule<RuleSetDefined, FilteringRuleSetDefinedDTO> FILTERING_RULE_SET_DEFINED =
         EventDTOModule
             .forEvent(RuleSetDefined.class)
             .convertToDTO(FilteringRuleSetDefinedDTO.class)
             .convertWith(FilteringRuleSetDefinedDTO::from)
-            .typeName("filtering-rule-set-defined");
+            .typeName(TYPE);
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefinedDTO.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefinedDTO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefinedDTO.java
index 5a0de2c..0aa5bf6 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefinedDTO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefinedDTO.java
@@ -41,6 +41,10 @@ public class FilteringRuleSetDefinedDTO implements EventDTO {
             RuleDTO.from(event.getRules()));
     }
 
+    public static FilteringRuleSetDefinedDTO from(RuleSetDefined event) {
+        return from(event, FilteringRuleSetDefineDTOModules.TYPE);
+    }
+
     private final String type;
     private final int eventId;
     private final String aggregateId;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
index a361465..c72eb39 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/RuleDTO.java
@@ -35,7 +35,7 @@ public class RuleDTO {
     public static ImmutableList<Rule> toRules(List<RuleDTO> ruleDTOList) {
         Preconditions.checkNotNull(ruleDTOList);
         return ruleDTOList.stream()
-                .map(dto -> Rule.of(dto.getId()))
+                .map(RuleDTO::toRule)
                 .collect(ImmutableList.toImmutableList());
     }
 
@@ -47,13 +47,33 @@ public class RuleDTO {
     }
 
     public static RuleDTO from(Rule rule) {
-        return new RuleDTO(rule.getId());
+        return new RuleDTO(rule.getId().asString(),
+                rule.getName(),
+                rule.getCondition().getField().asString(),
+                rule.getCondition().getComparator().asString(),
+                rule.getCondition().getValue(),
+                rule.getAction().getMailboxIds());
     }
 
     private final String id;
+    private final String name;
+    private final String field;
+    private final String comparator;
+    private final String value;
+    private final List<String> mailboxIds;
 
     @JsonCreator
-    public RuleDTO(@JsonProperty("id") String id) {
+    public RuleDTO(@JsonProperty("id") String id,
+                   @JsonProperty("name") String name,
+                   @JsonProperty("field") String field,
+                   @JsonProperty("comparator") String comparator,
+                   @JsonProperty("value") String value,
+                   @JsonProperty("mailboxIds") List<String> mailboxIds) {
+        this.name = name;
+        this.field = field;
+        this.comparator = comparator;
+        this.value = value;
+        this.mailboxIds = ImmutableList.copyOf(mailboxIds);
         Preconditions.checkNotNull(id);
 
         this.id = id;
@@ -63,19 +83,57 @@ public class RuleDTO {
         return id;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public String getComparator() {
+        return comparator;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public List<String> getMailboxIds() {
+        return mailboxIds;
+    }
+
+    public Rule toRule() {
+        return Rule.builder()
+            .id(Rule.Id.of(id))
+            .name(name)
+            .condition(Rule.Condition.of(
+                Rule.Condition.Field.valueOf(field),
+                Rule.Condition.Comparator.of(comparator),
+                value))
+            .name(name)
+            .action(Rule.Action.ofMailboxIds(mailboxIds))
+            .build();
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof RuleDTO) {
             RuleDTO ruleDTO = (RuleDTO) o;
 
-            return Objects.equals(this.id, ruleDTO.id);
+            return Objects.equals(this.id, ruleDTO.id)
+                   && Objects.equals(this.name, ruleDTO.name)
+                   && Objects.equals(this.field, ruleDTO.field)
+                   && Objects.equals(this.comparator, ruleDTO.comparator)
+                   && Objects.equals(this.value, ruleDTO.value)
+                   && Objects.equals(this.mailboxIds, ruleDTO.mailboxIds);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hash(id);
+        return Objects.hash(id, name, field, comparator, value, mailboxIds);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
new file mode 100644
index 0000000..08f5685
--- /dev/null
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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.jmap.cassandra.filtering;
+
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_1;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_2;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_FROM;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_RECIPIENT;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_SUBJECT;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_TO;
+import static org.assertj.core.api.Assertions.assertThat;
+import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
+
+import org.apache.james.core.User;
+import org.apache.james.eventsourcing.EventId;
+import org.apache.james.jmap.api.filtering.impl.FilteringAggregateId;
+import org.apache.james.jmap.api.filtering.impl.RuleSetDefined;
+import org.apache.james.util.ClassLoaderUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.guava.GuavaModule;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.google.common.collect.ImmutableList;
+
+public class DTOTest {
+    static final String EVENT_JSON = ClassLoaderUtils.getSystemResourceAsString("json/event.json");
+    static final String EVENT_EMPTY_JSON = ClassLoaderUtils.getSystemResourceAsString("json/eventEmpty.json");
+    static final String EVENT_COMPLEX_JSON = ClassLoaderUtils.getSystemResourceAsString("json/eventComplex.json");
+    static final FilteringRuleSetDefinedDTO SIMPLE_DTO = FilteringRuleSetDefinedDTO.from(
+            new RuleSetDefined(
+                    new FilteringAggregateId(User.fromUsername("Bart")),
+                    EventId.first(),
+                    ImmutableList.of(RULE_1, RULE_2)));
+    static final FilteringRuleSetDefinedDTO EMPTY_DTO = FilteringRuleSetDefinedDTO.from(
+            new RuleSetDefined(
+                    new FilteringAggregateId(User.fromUsername("Bart")),
+                    EventId.first(),
+                    ImmutableList.of()));
+    static final FilteringRuleSetDefinedDTO COMPLEX_DTO = FilteringRuleSetDefinedDTO.from(
+            new RuleSetDefined(
+                    new FilteringAggregateId(User.fromUsername("Bart")),
+                    EventId.first(),
+                    ImmutableList.of(RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO)));
+
+    private ObjectMapper objectMapper;
+
+    @BeforeEach
+    void setUp() {
+        objectMapper = new ObjectMapper();
+        objectMapper.registerModule(new Jdk8Module());
+        objectMapper.registerModule(new GuavaModule());
+    }
+
+    @Test
+    void shouldSerializeDTO() throws Exception {
+        String serializedEvent = objectMapper.writeValueAsString(SIMPLE_DTO);
+
+        assertThatJson(serializedEvent).isEqualTo(EVENT_JSON);
+    }
+
+    @Test
+    void shouldDeserializeDTO() throws Exception {
+        FilteringRuleSetDefinedDTO dto = objectMapper.readValue(EVENT_JSON, FilteringRuleSetDefinedDTO.class);
+
+        assertThat(dto).isEqualTo(SIMPLE_DTO);
+    }
+
+    @Test
+    void shouldSerializeEmptyDTO() throws Exception {
+        String serializedEvent = objectMapper.writeValueAsString(EMPTY_DTO);
+
+        assertThatJson(serializedEvent).isEqualTo(EVENT_EMPTY_JSON);
+    }
+
+    @Test
+    void shouldDeserializeEmptyDTO() throws Exception {
+        FilteringRuleSetDefinedDTO dto = objectMapper.readValue(EVENT_EMPTY_JSON, FilteringRuleSetDefinedDTO.class);
+
+        assertThat(dto).isEqualTo(EMPTY_DTO);
+    }
+
+    @Test
+    void shouldSerializeComplexDTO() throws Exception {
+        String serializedEvent = objectMapper.writeValueAsString(COMPLEX_DTO);
+
+        assertThatJson(serializedEvent).isEqualTo(EVENT_COMPLEX_JSON);
+    }
+
+    @Test
+    void shouldDeserializeComplexDTO() throws Exception {
+        FilteringRuleSetDefinedDTO dto = objectMapper.readValue(EVENT_COMPLEX_JSON, FilteringRuleSetDefinedDTO.class);
+
+        assertThat(dto).isEqualTo(COMPLEX_DTO);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/src/test/resources/json/event.json
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/event.json b/server/data/data-jmap-cassandra/src/test/resources/json/event.json
new file mode 100644
index 0000000..b77e46a
--- /dev/null
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/event.json
@@ -0,0 +1,23 @@
+{
+  "type":"filtering-rule-set-defined",
+  "eventId":0,
+  "aggregateId":"FilteringRule/Bart",
+  "rules":[
+    {
+      "id":"1",
+      "name":"a name",
+      "field":"cc",
+      "comparator":"contains",
+      "value":"something",
+      "mailboxIds":["id-01"]
+    },
+    {
+      "id":"2",
+      "name":"a name",
+      "field":"cc",
+      "comparator":"contains",
+      "value":"something",
+      "mailboxIds":["id-01"]
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json
new file mode 100644
index 0000000..a08e2d1
--- /dev/null
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json
@@ -0,0 +1,39 @@
+{
+  "type":"filtering-rule-set-defined",
+  "eventId":0,
+  "aggregateId":"FilteringRule/Bart",
+  "rules":[
+    {
+      "id":"id-from",
+      "name":"a name",
+      "field":"from",
+      "comparator":"contains",
+      "value":"A value to match 4",
+      "mailboxIds":["mbx1"]
+    },
+    {
+      "id":"id-rcpt",
+      "name":"a name",
+      "field":"recipient",
+      "comparator":"not-exactly-equals",
+      "value":"A value to match 3",
+      "mailboxIds":["mbx1"]
+    },
+    {
+      "id":"id-subject",
+      "name":"a name",
+      "field":"subject",
+      "comparator":"not-contains",
+      "value":"A value to match 2",
+      "mailboxIds":["mbx1"]
+    },
+    {
+      "id":"id-to",
+      "name":"a name",
+      "field":"to",
+      "comparator":"exactly-equals",
+      "value":"A value to match 1",
+      "mailboxIds":["mbx1"]
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap-cassandra/src/test/resources/json/eventEmpty.json
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/eventEmpty.json b/server/data/data-jmap-cassandra/src/test/resources/json/eventEmpty.json
new file mode 100644
index 0000000..f7fbaee
--- /dev/null
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/eventEmpty.json
@@ -0,0 +1,6 @@
+{
+  "type":"filtering-rule-set-defined",
+  "eventId":0,
+  "aggregateId":"FilteringRule/Bart",
+  "rules":[]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java
index a8b1c4b..b39f691 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java
@@ -19,14 +19,25 @@
 
 package org.apache.james.jmap.api.filtering;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.james.core.User;
 
+import com.google.common.collect.ImmutableList;
+
 public interface FilteringManagement {
 
     void defineRulesForUser(User user, List<Rule> rules);
 
+    default void defineRulesForUser(User user, Rule... rules) {
+        defineRulesForUser(user, Arrays.asList(rules));
+    }
+
+    default void clearRulesForUser(User user) {
+        defineRulesForUser(user, ImmutableList.of());
+    }
+
     List<Rule> listRulesForUser(User user);
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
index 8bca30a..0da600d 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
@@ -19,49 +19,318 @@
 
 package org.apache.james.jmap.api.filtering;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
+
+import org.apache.commons.lang3.StringUtils;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
 public class Rule {
 
-    private final String id;
+    public static class Id {
+
+        public static Id of(String id) {
+            Preconditions.checkNotNull(id, "id should no be null");
+            Preconditions.checkArgument(StringUtils.isNotBlank(id), "id should no be empty");
+            return new Id(id);
+        }
+
+        private final String value;
+
+        private Id(String value) {
+            this.value = value;
+        }
+
+        public String asString() {
+            return value;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof Id) {
+                Id id = (Id) o;
+                return Objects.equals(value, id.value);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(value);
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("value", value)
+                .toString();
+        }
+    }
+
+    public static class Condition {
+
+        public enum Field {
+            FROM("from"),
+            TO("to"),
+            CC("cc"),
+            SUBJECT("subject"),
+            RECIPIENT("recipient");
+            
+            public static Optional<Field> find(String fieldName) {
+                return Arrays.stream(values())
+                        .filter(value -> value.fieldName.equalsIgnoreCase(fieldName))
+                        .findAny();
+            }
+            
+            public static Field of(String fieldName) {
+                return find(fieldName).orElseThrow(() -> new IllegalStateException("'" + fieldName + "' is not a valid field name"));
+            }
+            
+            private final String fieldName;
+            
+            private Field(String fieldName) {
+                this.fieldName = fieldName;
+            }
+            
+            public String asString() {
+                return fieldName;
+            }
+        }
+        
+        public enum Comparator {
+            CONTAINS("contains"),
+            NOT_CONTAINS("not-contains"),
+            EXACTLY_EQUALS("exactly-equals"),
+            NOT_EXACTLY_EQUALS("not-exactly-equals");
+            
+            public static Optional<Comparator> find(String comparatorName) {
+                return Arrays.stream(values())
+                        .filter(value -> value.comparatorName.equalsIgnoreCase(comparatorName))
+                        .findAny();
+            }
+            
+            public static Comparator of(String comparatorName) {
+                return find(comparatorName).orElseThrow(() -> new IllegalStateException("'" + comparatorName + "' is not a valid comparator name"));
+            }
+            
+            private final String comparatorName;
+            
+            private Comparator(String comparator) {
+                this.comparatorName = comparator;
+            }
+            
+            public String asString() {
+                return comparatorName;
+            }
+        }
+
+        public static Condition of(Field field, Comparator comparator, String value) {
+            Preconditions.checkNotNull(field, "field should no be null");
+            Preconditions.checkNotNull(comparator, "comparator should no be null");
+            Preconditions.checkNotNull(value, "value should no be null");
+            Preconditions.checkArgument(StringUtils.isNotBlank(value), "value should no be empty");
+            return new Condition(field, comparator, value);
+        }
+
+        private final Field field;
+        private final Comparator comparator;
+        private final String value;
+
+        private Condition(Field field, Comparator comparator, String value) {
+            this.field = field;
+            this.comparator = comparator;
+            this.value = value;
+        }
+        
+        public Field getField() {
+            return field;
+        }
+        
+        public Comparator getComparator() {
+            return comparator;
+        }
+        
+        public String getValue() {
+            return value;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof Condition) {
+                Condition condition = (Condition) o;
+                return Objects.equals(field, condition.field)
+                    && Objects.equals(comparator, condition.comparator)
+                    && Objects.equals(value, condition.value);
+            }
+            return false;
+        }
 
-    public static Rule of(String id) {
-        return new Rule(id);
+        @Override
+        public final int hashCode() {
+            return Objects.hash(field, comparator, value);
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("field", field)
+                .add("comparator", comparator)
+                .add("value", value)
+                .toString();
+        }
     }
 
-    public Rule(String id) {
-        Preconditions.checkNotNull(id);
 
+    public static class Action {
+
+        public static Action ofMailboxIds(List<String> mailboxIds) {
+            Preconditions.checkNotNull(mailboxIds, "mailboxIds should no be null");
+            return new Action(mailboxIds);
+        }
+
+        public static Action ofMailboxIds(String... mailboxIds) {
+            return ofMailboxIds(Arrays.asList(mailboxIds));
+        }
+
+        private final ImmutableList<String> mailboxIds;
+
+        private Action(List<String> mailboxIds) {
+            this.mailboxIds = ImmutableList.copyOf(mailboxIds);
+        }
+        
+        public ImmutableList<String> getMailboxIds() {
+            return mailboxIds;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof Action) {
+                Action action = (Action) o;
+                return Objects.equals(mailboxIds, action.mailboxIds);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(mailboxIds);
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("mailboxIds", mailboxIds)
+                .toString();
+        }
+    }
+
+    public static class Builder {
+
+        private Optional<Id> id;
+        private Optional<String> name;
+        private Optional<Condition> condition;
+        private Optional<Action> action;
+
+        public Builder() {
+            this.id = Optional.empty();
+            this.name = Optional.empty();
+            this.condition = Optional.empty();
+            this.action = Optional.empty();
+        }
+
+        public Builder id(Id id) {
+            this.id = Optional.of(id);
+            return this;
+        }
+
+        public Builder name(String name) {
+            this.name = Optional.of(name);
+            return this;
+        }
+
+        public Builder condition(Condition condition) {
+            this.condition = Optional.of(condition);
+            return this;
+        }
+
+        public Builder action(Action action) {
+            this.action = Optional.of(action);
+            return this;
+        }
+
+        public Rule build() {
+            Preconditions.checkState(id.isPresent(), "`id` is mandatory");
+            Preconditions.checkState(name.isPresent(), "`name` is mandatory");
+            Preconditions.checkState(condition.isPresent(), "`condition` is mandatory");
+            Preconditions.checkState(action.isPresent(), "`action` is mandatory");
+
+            return new Rule(id.get(), name.get(), condition.get(), action.get());
+        }
+
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    private final Id id;
+    private final String name;
+    private final Condition condition;
+    private final Action action;
+
+    public Rule(Id id, String name, Condition condition, Action action) {
         this.id = id;
+        this.name = name;
+        this.condition = condition;
+        this.action = action;
     }
 
-    public String getId() {
+    public Id getId() {
         return id;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public Condition getCondition() {
+        return condition;
+    }
+
+    public Action getAction() {
+        return action;
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof Rule) {
             Rule rule = (Rule) o;
 
-            return Objects.equals(this.id, rule.id);
+            return Objects.equals(this.id, rule.id)
+                && Objects.equals(this.name, rule.name)
+                && Objects.equals(this.condition, rule.condition)
+                && Objects.equals(this.action, rule.action);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hash(id);
+        return Objects.hash(id, name, condition, action);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
             .add("id", id)
+            .add("name", name)
+            .add("condition", condition)
+            .add("action", action)
             .toString();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
index dd2f773..a28cbff 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
@@ -18,22 +18,27 @@
  ****************************************************************/
 package org.apache.james.jmap.api.filtering;
 
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_1;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_2;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_3;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_FROM;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_RECIPIENT;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_SUBJECT;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_TO;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.util.List;
+
 import org.apache.james.core.User;
 import org.apache.james.eventsourcing.eventstore.EventStore;
 import org.apache.james.jmap.api.filtering.impl.EventSourcingFilteringManagement;
 import org.junit.jupiter.api.Test;
 
-import com.google.common.collect.ImmutableList;
-
 public interface FilteringManagementContract {
 
     String BART_SIMPSON_CARTOON = "bart@simpson.cartoon";
-    Rule RULE_1 = Rule.of("1");
-    Rule RULE_2 = Rule.of("2");
-    Rule RULE_3 = Rule.of("3");
+    User USER = User.fromUsername(BART_SIMPSON_CARTOON);
 
     default FilteringManagement instanciateFilteringManagement(EventStore eventStore) {
         return new EventSourcingFilteringManagement(eventStore);
@@ -41,71 +46,90 @@ public interface FilteringManagementContract {
 
     @Test
     default void listingRulesForUnknownUserShouldReturnEmptyList(EventStore eventStore) {
-        User user = User.fromUsername(BART_SIMPSON_CARTOON);
-        assertThat(instanciateFilteringManagement(eventStore).listRulesForUser(user)).isEmpty();
+        assertThat(instanciateFilteringManagement(eventStore).listRulesForUser(USER))
+            .isEmpty();
     }
 
     @Test
     default void listingRulesShouldThrowWhenNullUser(EventStore eventStore) {
         User user = null;
-        assertThatThrownBy(() -> instanciateFilteringManagement(eventStore).listRulesForUser(user)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> instanciateFilteringManagement(eventStore).listRulesForUser(user))
+            .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     default void listingRulesShouldReturnDefinedRules(EventStore eventStore) {
-        User user = User.fromUsername(BART_SIMPSON_CARTOON);
         FilteringManagement testee = instanciateFilteringManagement(eventStore);
-        testee.defineRulesForUser(user, ImmutableList.of(RULE_1, RULE_2));
-        assertThat(testee.listRulesForUser(user)).containsExactly(RULE_1, RULE_2);
+
+        testee.defineRulesForUser(USER, RULE_1, RULE_2);
+
+        assertThat(testee.listRulesForUser(USER))
+            .containsExactly(RULE_1, RULE_2);
     }
 
     @Test
     default void listingRulesShouldReturnLastDefinedRules(EventStore eventStore) {
-        User user = User.fromUsername(BART_SIMPSON_CARTOON);
         FilteringManagement testee = instanciateFilteringManagement(eventStore);
-        testee.defineRulesForUser(user, ImmutableList.of(RULE_1, RULE_2));
-        testee.defineRulesForUser(user, ImmutableList.of(RULE_2, RULE_1));
-        assertThat(testee.listRulesForUser(user)).containsExactly(RULE_2, RULE_1);
+
+        testee.defineRulesForUser(USER, RULE_1, RULE_2);
+        testee.defineRulesForUser(USER, RULE_2, RULE_1);
+
+        assertThat(testee.listRulesForUser(USER))
+            .containsExactly(RULE_2, RULE_1);
     }
 
     @Test
     default void definingRulesShouldThrowWhenDuplicateRules(EventStore eventStore) {
-        User user = User.fromUsername(BART_SIMPSON_CARTOON);
         FilteringManagement testee = instanciateFilteringManagement(eventStore);
-        assertThatThrownBy(() -> testee.defineRulesForUser(user, ImmutableList.of(RULE_1, RULE_1)))
+
+        assertThatThrownBy(() -> testee.defineRulesForUser(USER, RULE_1, RULE_1))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     default void definingRulesShouldThrowWhenNullUser(EventStore eventStore) {
         FilteringManagement testee = instanciateFilteringManagement(eventStore);
-        assertThatThrownBy(() -> testee.defineRulesForUser(null, ImmutableList.of(RULE_1, RULE_1)))
+
+        assertThatThrownBy(() -> testee.defineRulesForUser(null, RULE_1, RULE_1))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     default void definingRulesShouldThrowWhenNullRuleList(EventStore eventStore) {
-        User user = User.fromUsername(BART_SIMPSON_CARTOON);
         FilteringManagement testee = instanciateFilteringManagement(eventStore);
-        assertThatThrownBy(() -> testee.defineRulesForUser(user, null))
+
+        List<Rule> rules = null;
+        assertThatThrownBy(() -> testee.defineRulesForUser(USER, rules))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     default void definingRulesShouldKeepOrdering(EventStore eventStore) {
-        User user = User.fromUsername(BART_SIMPSON_CARTOON);
         FilteringManagement testee = instanciateFilteringManagement(eventStore);
-        testee.defineRulesForUser(user, ImmutableList.of(RULE_3, RULE_2, RULE_1));
-        assertThat(testee.listRulesForUser(user)).containsExactly(RULE_3, RULE_2, RULE_1);
+        testee.defineRulesForUser(USER, RULE_3, RULE_2, RULE_1);
+
+        assertThat(testee.listRulesForUser(USER))
+            .containsExactly(RULE_3, RULE_2, RULE_1);
     }
 
     @Test
     default void definingEmptyRuleListShouldRemoveExistingRules(EventStore eventStore) {
-        User user = User.fromUsername(BART_SIMPSON_CARTOON);
         FilteringManagement testee = instanciateFilteringManagement(eventStore);
-        testee.defineRulesForUser(user, ImmutableList.of(RULE_3, RULE_2, RULE_1));
-        testee.defineRulesForUser(user, ImmutableList.of());
-        assertThat(testee.listRulesForUser(user)).isEmpty();
+
+        testee.defineRulesForUser(USER, RULE_3, RULE_2, RULE_1);
+        testee.clearRulesForUser(USER);
+
+        assertThat(testee.listRulesForUser(USER)).isEmpty();
+    }
+
+    @Test
+    default void allFieldsAndComparatorShouldWellBeStored(EventStore eventStore) {
+        FilteringManagement testee = instanciateFilteringManagement(eventStore);
+
+        testee.defineRulesForUser(USER, RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO, RULE_1);
+
+        assertThat(testee.listRulesForUser(USER))
+            .containsExactly(RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO, RULE_1);
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
new file mode 100644
index 0000000..5d17d03
--- /dev/null
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
@@ -0,0 +1,71 @@
+/****************************************************************
+ * 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.jmap.api.filtering;
+
+public interface RuleFixture {
+    String NAME = "a name";
+    Rule.Condition CONDITION = Rule.Condition.of(Rule.Condition.Field.CC, Rule.Condition.Comparator.CONTAINS, "something");
+    Rule.Action ACTION = Rule.Action.ofMailboxIds("id-01");
+    Rule.Builder RULE_BUILER = Rule.builder().name(NAME).condition(CONDITION).action(ACTION);
+    Rule RULE_1 = RULE_BUILER.id(Rule.Id.of("1")).build();
+    Rule RULE_2 = RULE_BUILER.id(Rule.Id.of("2")).build();
+    Rule RULE_3 = RULE_BUILER.id(Rule.Id.of("3")).build();
+
+    Rule RULE_TO = Rule.builder()
+            .id(Rule.Id.of("id-to"))
+            .name(NAME)
+            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .condition(Rule.Condition.of(
+                    Rule.Condition.Field.TO,
+                    Rule.Condition.Comparator.EXACTLY_EQUALS,
+                    "A value to match 1"))
+            .build();
+
+    Rule RULE_SUBJECT = Rule.builder()
+            .id(Rule.Id.of("id-subject"))
+            .name(NAME)
+            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .condition(Rule.Condition.of(
+                    Rule.Condition.Field.SUBJECT,
+                    Rule.Condition.Comparator.NOT_CONTAINS,
+                    "A value to match 2"))
+            .build();
+
+    Rule RULE_RECIPIENT = Rule.builder()
+            .id(Rule.Id.of("id-rcpt"))
+            .name(NAME)
+            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .condition(Rule.Condition.of(
+                    Rule.Condition.Field.RECIPIENT,
+                    Rule.Condition.Comparator.NOT_EXACTLY_EQUALS,
+                    "A value to match 3"))
+            .build();
+
+    Rule RULE_FROM = Rule.builder()
+            .id(Rule.Id.of("id-from"))
+            .name(NAME)
+            .action(Rule.Action.ofMailboxIds("mbx1"))
+            .condition(Rule.Condition.of(
+                    Rule.Condition.Field.FROM,
+                    Rule.Condition.Comparator.CONTAINS,
+                    "A value to match 4"))
+            .build();
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
index fc10f6a..2e3e760 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java
@@ -19,13 +19,25 @@
 
 package org.apache.james.jmap.api.filtering;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-class RuleTest {
+public class RuleTest {
+
+    private static final List<String> ACTION_MAILBOXIDS = Arrays.asList("id-01");
+    private static final String CONDITION_COMPARATOR = "contains";
+    private static final String CONDITION_FIELD = "cc";
+    private static final String NAME = "a name";
+    public static final Rule.Condition CONDITION = Rule.Condition.of(Rule.Condition.Field.of(CONDITION_FIELD), Rule.Condition.Comparator.of(CONDITION_COMPARATOR), "something");
+    public static final Rule.Action ACTION = Rule.Action.ofMailboxIds(ACTION_MAILBOXIDS);
+    public static final Rule.Id UNIQUE_ID = Rule.Id.of("uniqueId");
 
     @Test
     void shouldMatchBeanContract() {
@@ -34,8 +46,119 @@ class RuleTest {
     }
 
     @Test
-    void constructorShouldThrowWhenNullId() {
-        assertThatThrownBy(() -> new Rule(null))
-            .isInstanceOf(NullPointerException.class);
+    void innerClassConditionShouldMatchBeanContract() {
+        EqualsVerifier.forClass(Rule.Condition.class)
+            .verify();
+    }
+
+    @Test
+    void innerClassActionShouldMatchBeanContract() {
+        EqualsVerifier.forClass(Rule.Action.class)
+            .verify();
+    }
+
+    @Test
+    void innerClassIdShouldMatchBeanContract() {
+        EqualsVerifier.forClass(Rule.Id.class)
+            .verify();
+    }
+
+    @Test
+    void idShouldThrowOnNull() {
+        assertThatThrownBy(() -> Rule.Id.of(null)).isInstanceOf(NullPointerException.class);
+    }
+
+    @Test
+    void idShouldThrowOnEmpty() {
+        assertThatThrownBy(() -> Rule.Id.of("")).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void idShouldThrowOnBlank() {
+        assertThatThrownBy(() -> Rule.Id.of("   ")).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void idShouldBeMandatory() {
+        assertThatThrownBy(() ->
+            Rule.builder()
+                .name(NAME)
+                .condition(CONDITION)
+                .action(ACTION)
+                .build())
+            .isInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    void nameShouldBeMandatory() {
+        assertThatThrownBy(() ->
+            Rule.builder()
+                .id(UNIQUE_ID)
+                .condition(CONDITION)
+                .action(ACTION)
+                .build())
+            .isInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    void conditionShouldBeMandatory() {
+        assertThatThrownBy(() ->
+            Rule.builder()
+                .id(UNIQUE_ID)
+                .name(NAME)
+                .action(ACTION)
+                .build())
+            .isInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    void actionShouldBeMandatory() {
+        assertThatThrownBy(() ->
+            Rule.builder()
+                .id(UNIQUE_ID)
+                .name(NAME)
+                .condition(CONDITION)
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
-}
\ No newline at end of file
+
+    @Test
+    void builderShouldPreserveCondition() {
+        Rule rule = Rule.builder()
+            .id(UNIQUE_ID)
+            .name(NAME)
+            .condition(CONDITION)
+            .action(ACTION)
+            .build();
+
+        assertThat(rule.getCondition()).isEqualTo(CONDITION);
+    }
+
+    @Test
+    void builderShouldPreserveAction() {
+        Rule rule = Rule.builder()
+            .id(UNIQUE_ID)
+            .name(NAME)
+            .condition(CONDITION)
+            .action(ACTION)
+            .build();
+
+        assertThat(rule.getAction()).isEqualTo(ACTION);
+    }
+
+    @Test
+    void buildConditionShouldConserveField() {
+        assertThat(CONDITION.getField().asString()).isEqualTo(CONDITION_FIELD);
+    }
+
+    @Test
+    void buildConditionShouldConserveComparator() {
+        assertThat(CONDITION.getComparator().asString()).isEqualTo(CONDITION_COMPARATOR);
+    }
+
+    @Test
+    void buildActionShouldConserveMailboxIdsList() {
+        assertThat(ACTION.getMailboxIds()).isEqualTo(ACTION_MAILBOXIDS);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d8e807e/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
index a917fdd..2fa75c0 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
@@ -19,10 +19,11 @@
 
 package org.apache.james.jmap.api.filtering.impl;
 
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_1;
+import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_2;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.core.User;
-import org.apache.james.jmap.api.filtering.Rule;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
@@ -39,7 +40,7 @@ class DefineRulesCommandTest {
 
     @Test
     void constructorShouldThrowWhenNullUser() {
-        assertThatThrownBy(() -> new DefineRulesCommand(null, ImmutableList.of(Rule.of("1"), Rule.of("2"))))
+        assertThatThrownBy(() -> new DefineRulesCommand(null, ImmutableList.of(RULE_1, RULE_2)))
             .isInstanceOf(NullPointerException.class);
     }
 


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