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 ro...@apache.org on 2016/07/19 08:04:23 UTC

[1/4] james-project git commit: JAMES-1800 Filter.header should be optional too

Repository: james-project
Updated Branches:
  refs/heads/master 917c9da07 -> 635607f23


JAMES-1800 Filter.header should be optional too


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

Branch: refs/heads/master
Commit: f117ec67bef50aa4a40ad6e58bfc3fc41e2b8755
Parents: 917c9da
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Jul 13 15:02:33 2016 +0200
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Wed Jul 13 15:02:33 2016 +0200

----------------------------------------------------------------------
 .../org/apache/james/jmap/model/FilterCondition.java    | 12 ++++++------
 .../apache/james/jmap/model/FilterConditionTest.java    |  2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f117ec67/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
index 8802da5..430d88e 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
@@ -58,12 +58,12 @@ public class FilterCondition implements Filter {
         private String bcc;
         private String subject;
         private String body;
-        private final ImmutableList.Builder<String> header;
+        private Optional<List<String>> header;
 
         private Builder() {
             inMailboxes = Optional.empty();
             notInMailboxes = Optional.empty();
-            header = ImmutableList.builder();
+            header = Optional.empty();
         }
 
         public Builder inMailboxes(Optional<List<String>> inMailboxes) {
@@ -147,7 +147,7 @@ public class FilterCondition implements Filter {
         public FilterCondition build() {
             return new FilterCondition(inMailboxes, notInMailboxes, Optional.ofNullable(before), Optional.ofNullable(after), Optional.ofNullable(minSize), Optional.ofNullable(maxSize),
                     Optional.ofNullable(isFlagged), Optional.ofNullable(isUnread), Optional.ofNullable(isAnswered), Optional.ofNullable(isDraft), Optional.ofNullable(hasAttachment),
-                    Optional.ofNullable(text), Optional.ofNullable(from), Optional.ofNullable(to), Optional.ofNullable(cc), Optional.ofNullable(bcc), Optional.ofNullable(subject), Optional.ofNullable(body), header.build());
+                    Optional.ofNullable(text), Optional.ofNullable(from), Optional.ofNullable(to), Optional.ofNullable(cc), Optional.ofNullable(bcc), Optional.ofNullable(subject), Optional.ofNullable(body), header);
         }
     }
 
@@ -169,11 +169,11 @@ public class FilterCondition implements Filter {
     private final Optional<String> bcc;
     private final Optional<String> subject;
     private final Optional<String> body;
-    private final List<String> header;
+    private final Optional<List<String>> header;
 
     @VisibleForTesting FilterCondition(Optional<List<String>> inMailboxes, Optional<List<String>> notInMailboxes, Optional<Date> before, Optional<Date> after, Optional<Integer> minSize, Optional<Integer> maxSize,
             Optional<Boolean> isFlagged, Optional<Boolean> isUnread, Optional<Boolean> isAnswered, Optional<Boolean> isDraft, Optional<Boolean> hasAttachment,
-            Optional<String> text, Optional<String> from, Optional<String> to, Optional<String> cc, Optional<String> bcc, Optional<String> subject, Optional<String> body, List<String> header) {
+            Optional<String> text, Optional<String> from, Optional<String> to, Optional<String> cc, Optional<String> bcc, Optional<String> subject, Optional<String> body, Optional<List<String>> header) {
 
         this.inMailboxes = inMailboxes;
         this.notInMailboxes = notInMailboxes;
@@ -268,7 +268,7 @@ public class FilterCondition implements Filter {
         return body;
     }
 
-    public List<String> getHeader() {
+    public Optional<List<String>> getHeader() {
         return header;
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f117ec67/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
index e034275..0ae7372 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
@@ -141,7 +141,7 @@ public class FilterConditionTest {
     public void buildShouldWork() {
         FilterCondition expectedFilterCondition = new FilterCondition(Optional.of(ImmutableList.of("1")), Optional.of(ImmutableList.of("2")), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), 
                 Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), 
-                Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), ImmutableList.of());
+                Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty());
 
         FilterCondition filterCondition = FilterCondition.builder()
                 .inMailboxes(Optional.of(ImmutableList.of("1")))


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


[3/4] james-project git commit: JAMES-1800 Handle filters with operators

Posted by ro...@apache.org.
JAMES-1800 Handle filters with operators


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

Branch: refs/heads/master
Commit: cabe4358397c778d6edf992581edc3efad633b03
Parents: 83da2c0
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Jul 13 14:56:45 2016 +0200
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Tue Jul 19 09:58:58 2016 +0200

----------------------------------------------------------------------
 .../integration/GetMessageListMethodTest.java   |  4 +-
 .../james/jmap/json/FilterDeserializer.java     | 62 +++++++++++++
 .../org/apache/james/jmap/model/Filter.java     | 15 +---
 .../james/jmap/model/FilterCondition.java       | 12 +++
 .../apache/james/jmap/model/FilterOperator.java | 16 ++++
 .../james/jmap/model/FilterConditionTest.java   | 22 ++++-
 .../james/jmap/model/FilterOperatorTest.java    | 40 +++++++++
 .../org/apache/james/jmap/model/FilterTest.java | 92 ++++++++++++++++++++
 8 files changed, 246 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index 3ade45f..161010f 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -98,9 +98,7 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("error"))
-            .body(ARGUMENTS + ".type", equalTo("invalidArguments"))
-            .body(ARGUMENTS + ".description", equalTo("Can not instantiate value of type [simple type, class org.apache.james.jmap.model.FilterCondition$Builder] from Boolean value (true); no single-boolean/Boolean-arg constructor/factory method\n" + 
-                    " at [Source: {\"filter\":true}; line: 1, column: 2] (through reference chain: org.apache.james.jmap.model.Builder[\"filter\"])"));
+            .body(ARGUMENTS + ".type", equalTo("invalidArguments"));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/FilterDeserializer.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/FilterDeserializer.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/FilterDeserializer.java
new file mode 100644
index 0000000..e4d0ca6
--- /dev/null
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/FilterDeserializer.java
@@ -0,0 +1,62 @@
+/****************************************************************
+ * 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.json;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Optional;
+
+import org.apache.james.jmap.model.Filter;
+import org.apache.james.jmap.model.FilterCondition;
+import org.apache.james.jmap.model.FilterOperator;
+import org.apache.james.util.streams.Iterators;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+public class FilterDeserializer extends StdDeserializer<Filter> {
+
+    public FilterDeserializer() {
+        super(Filter.class);
+    }
+
+    @Override
+    public Filter deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        ObjectMapper mapper = (ObjectMapper) p.getCodec();
+        ObjectNode obj = (ObjectNode) mapper.readTree(p);
+
+        return mapper.treeToValue(obj, detectClass(obj.fields()));
+    }
+
+    private Class<? extends Filter> detectClass(Iterator<Map.Entry<String, JsonNode>> elements) {
+        Optional<Class<? extends Filter>> maybeFilterOperator = Iterators.toStream(elements)
+                .map(Map.Entry::getKey)
+                .filter(name -> name.equals("operator"))
+                .findFirst()
+                .map(x -> FilterOperator.class);
+
+        return maybeFilterOperator.orElse(FilterCondition.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
index d262561..7509fba 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
@@ -19,18 +19,11 @@
 
 package org.apache.james.jmap.model;
 
-import com.fasterxml.jackson.annotation.JsonSubTypes;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.apache.james.jmap.json.FilterDeserializer;
 
-@JsonTypeInfo(
-        use = JsonTypeInfo.Id.NAME,
-        include = JsonTypeInfo.As.PROPERTY,
-        property = "filter",
-        defaultImpl = FilterCondition.class
-)
-@JsonSubTypes({
-    @JsonSubTypes.Type(value = FilterOperator.class, name = "operator")
-})
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+@JsonDeserialize(using = FilterDeserializer.class)
 public interface Filter {
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
index 76efb8a..7185cb0 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
@@ -69,11 +69,23 @@ public class FilterCondition implements Filter {
             header = Optional.empty();
         }
 
+        public Builder inMailboxes(String... inMailboxes) {
+            this.inMailboxes = Optional.of(ImmutableList.copyOf(inMailboxes));
+            return this;
+        }
+
+        @JsonDeserialize
         public Builder inMailboxes(Optional<List<String>> inMailboxes) {
             this.inMailboxes = inMailboxes.map(ImmutableList::copyOf);
             return this;
         }
 
+        public Builder notInMailboxes(String... notInMailboxes) {
+            this.notInMailboxes = Optional.of(ImmutableList.copyOf(notInMailboxes));
+            return this;
+        }
+
+        @JsonDeserialize
         public Builder notInMailboxes(Optional<List<String>> notInMailboxes) {
             this.notInMailboxes = notInMailboxes.map(ImmutableList::copyOf);
             return this;

http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
index 3a31228..f8ba52c 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
@@ -65,6 +65,22 @@ public class FilterOperator implements Filter {
         }
     }
 
+    public static FilterOperator or(Filter... filters) {
+        Preconditions.checkArgument(filters.length > 0);
+        return builder().operator(Operator.OR).conditions(ImmutableList.copyOf(filters)).build();
+    }
+
+    public static FilterOperator and(Filter... filters) {
+        Preconditions.checkArgument(filters.length > 0);
+        return builder().operator(Operator.AND).conditions(ImmutableList.copyOf(filters)).build();
+    }
+
+
+    public static FilterOperator not(Filter... filters) {
+        Preconditions.checkArgument(filters.length > 0);
+        return builder().operator(Operator.NOT).conditions(ImmutableList.copyOf(filters)).build();
+    }
+    
     private final Operator operator;
     private final List<Filter> conditions;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
index b60a935..a4707e5 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
@@ -43,7 +43,15 @@ public class FilterConditionTest {
         FilterCondition filterCondition = FilterCondition.builder()
                 .inMailboxes(Optional.of(ImmutableList.of("1", "2")))
                 .build();
-        assertThat(filterCondition.getInMailboxes()).isEqualTo(Optional.of(ImmutableList.of("1", "2")));
+        assertThat(filterCondition.getInMailboxes()).contains(ImmutableList.of("1", "2"));
+    }
+
+    @Test
+    public void buildShouldWorkWhenGivenInMailboxesAsEllipsis() {
+        FilterCondition filterCondition = FilterCondition.builder()
+                .inMailboxes("1", "2")
+                .build();
+        assertThat(filterCondition.getInMailboxes()).contains(ImmutableList.of("1", "2"));
     }
 
     @Test
@@ -51,9 +59,17 @@ public class FilterConditionTest {
         FilterCondition filterCondition = FilterCondition.builder()
                 .notInMailboxes(Optional.of(ImmutableList.of("1", "2")))
                 .build();
-        assertThat(filterCondition.getNotInMailboxes()).isEqualTo(Optional.of(ImmutableList.of("1", "2")));
+        assertThat(filterCondition.getNotInMailboxes()).contains(ImmutableList.of("1", "2"));
     }
 
+    @Test
+    public void builderShouldBuildWhenGivenNotInMailboxesAsEllipsis() {
+        FilterCondition filterCondition = FilterCondition.builder()
+                .notInMailboxes("1", "2")
+                .build();
+        assertThat(filterCondition.getNotInMailboxes()).contains(ImmutableList.of("1", "2"));
+    }
+    
     @Test(expected=NotImplementedException.class)
     public void builderShouldThrowWhenBefore() {
         FilterCondition.builder().before(null);
@@ -147,7 +163,7 @@ public class FilterConditionTest {
 
         FilterCondition filterCondition = FilterCondition.builder()
                 .inMailboxes(Optional.of(ImmutableList.of("1")))
-                .notInMailboxes(Optional.of(ImmutableList.of("2")))
+                .notInMailboxes("2")
                 .build();
 
         assertThat(filterCondition).isEqualToComparingFieldByField(expectedFilterCondition);

http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
index 920d2c6..b2b1638 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.jmap.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.junit.Test;
 
@@ -58,6 +59,45 @@ public class FilterOperatorTest {
     }
 
     @Test
+    public void andFactoryMethodShouldThrowWhenNoArgument() {
+        assertThatThrownBy(() -> FilterOperator.and()).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void andFactoryMethodShouldReturnRightOperator() {
+        FilterCondition condition = FilterCondition.builder().inMailboxes("12").build();
+        ImmutableList<Filter> conditions = ImmutableList.of(condition);
+        FilterOperator expectedFilterOperator = new FilterOperator(Operator.AND, conditions);
+        assertThat(FilterOperator.and(condition)).isEqualTo(expectedFilterOperator);
+    }
+
+    @Test
+    public void orFactoryMethodShouldThrowWhenNoArgument() {
+        assertThatThrownBy(() -> FilterOperator.or()).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void orFactoryMethodShouldReturnRightOperator() {
+        FilterCondition condition = FilterCondition.builder().inMailboxes("12").build();
+        ImmutableList<Filter> conditions = ImmutableList.of(condition);
+        FilterOperator expectedFilterOperator = new FilterOperator(Operator.OR, conditions);
+        assertThat(FilterOperator.or(condition)).isEqualTo(expectedFilterOperator);
+    }
+
+    @Test
+    public void notFactoryMethodShouldThrowWhenNoArgument() {
+        assertThatThrownBy(() -> FilterOperator.not()).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void notFactoryMethodShouldReturnRightOperator() {
+        FilterCondition condition = FilterCondition.builder().inMailboxes("12").build();
+        ImmutableList<Filter> conditions = ImmutableList.of(condition);
+        FilterOperator expectedFilterOperator = new FilterOperator(Operator.NOT, conditions);
+        assertThat(FilterOperator.not(condition)).isEqualTo(expectedFilterOperator);
+    }
+
+    @Test
     public void shouldRespectJavaBeanContract() {
         EqualsVerifier.forClass(FilterOperator.class).verify();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cabe4358/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterTest.java
new file mode 100644
index 0000000..7588bad
--- /dev/null
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterTest.java
@@ -0,0 +1,92 @@
+/****************************************************************
+ * 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.model;
+
+import org.apache.james.jmap.json.ObjectMapperFactory;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class FilterTest {
+
+    private ObjectMapper parser;
+
+    @Before
+    public void setup() {
+        parser = new ObjectMapperFactory().forParsing();
+    }
+
+    @Test
+    public void emptyFilterConditionShouldBeDeserialized() throws Exception {
+        String json = "{}";
+        Filter expected = FilterCondition.builder()
+                .build();
+        Filter actual = parser.readValue(json, Filter.class);
+        assertThat(actual).isEqualTo(expected);
+    }
+
+    @Test
+    public void singleFilterConditionShouldBeDeserialized() throws Exception {
+        String json = "{\"inMailboxes\": [\"12\",\"34\"]}";
+        Filter expected = FilterCondition.builder().inMailboxes("12","34").build();
+        Filter actual = parser.readValue(json, Filter.class);
+        assertThat(actual).isEqualTo(expected);
+    }
+
+    @Test
+    public void doubleFilterConditionShouldBeDeserialized() throws Exception {
+        String json = "{\"inMailboxes\": [\"12\",\"34\"], \"notInMailboxes\": [\"45\",\"67\"]}";
+        Filter expected = FilterCondition.builder()
+                .inMailboxes("12","34")
+                .notInMailboxes("45","67")
+                .build();
+        Filter actual = parser.readValue(json, Filter.class);
+        assertThat(actual).isEqualTo(expected);
+    }
+
+    @Test
+    public void operatorWithSingleConditionShouldBeDeserialized() throws Exception {
+        String json = "{\"operator\": \"AND\", \"conditions\": [{\"inMailboxes\": [\"12\",\"34\"]}]}";
+        Filter expected = FilterOperator.and(FilterCondition.builder().inMailboxes("12","34").build());
+        Filter actual = parser.readValue(json, Filter.class);
+        assertThat(actual).isEqualTo(expected);
+    }
+
+    @Test
+    public void complexFilterShouldBeDeserialized() throws Exception {
+        String json = "{\"operator\": \"AND\", \"conditions\": ["
+                + "         {\"inMailboxes\": [\"12\",\"34\"]},"
+                + "         {\"operator\": \"OR\", \"conditions\": ["
+                + "                 {\"operator\": \"NOT\", \"conditions\": ["
+                + "                         {\"notInMailboxes\": [\"45\"]}]},"
+                + "                 {}]}]}";
+        Filter expected = 
+                FilterOperator.and(
+                        FilterCondition.builder().inMailboxes("12","34").build(),
+                        FilterOperator.or(
+                                FilterOperator.not(
+                                        FilterCondition.builder().notInMailboxes("45").build()),
+                                FilterCondition.builder().build()));
+        Filter actual = parser.readValue(json, Filter.class);
+        assertThat(actual).isEqualTo(expected);
+    }
+}


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


[4/4] james-project git commit: JAMES-1800 Pretty print filters

Posted by ro...@apache.org.
JAMES-1800 Pretty print filters


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

Branch: refs/heads/master
Commit: 635607f23615b872bc21b7024455e0f524d24e47
Parents: cabe435
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Jul 13 16:39:12 2016 +0200
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Tue Jul 19 09:58:59 2016 +0200

----------------------------------------------------------------------
 .../org/apache/james/jmap/model/Filter.java     |  2 +-
 .../james/jmap/model/FilterCondition.java       |  5 +++++
 .../apache/james/jmap/model/FilterOperator.java | 22 +++++++++++++++----
 .../james/jmap/model/FilterOperatorTest.java    | 23 ++++++++++++++++++++
 4 files changed, 47 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/635607f2/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
index 7509fba..2b8605b 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Filter.java
@@ -25,5 +25,5 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
 @JsonDeserialize(using = FilterDeserializer.class)
 public interface Filter {
-
+    String prettyPrint(String indentation);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/635607f2/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
index 7185cb0..de5ea81 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
@@ -343,4 +343,9 @@ public class FilterCondition implements Filter {
         header.ifPresent(x -> helper.add("header", x));
         return helper.toString();
     }
+
+    @Override
+    public String prettyPrint(String indentation) {
+        return indentation + toString() + "\n";
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/635607f2/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
index f8ba52c..d1534b3 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.model;
 
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
@@ -114,9 +115,22 @@ public class FilterOperator implements Filter {
 
     @Override
     public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("operator", operator)
-                .add("conditions", conditions)
-                .toString();
+        return prettyPrint("");
+    }
+
+    @Override
+    public String prettyPrint(String indentation) {
+        return indentation
+            + MoreObjects.toStringHelper(getClass())
+                    .add("operator", operator)
+                    .toString()
+            + "\n"
+            + conditionListToString(indentation + "  ");
+    }
+
+    private String conditionListToString(String indentation) {
+        return conditions.stream()
+            .map(condition -> condition.prettyPrint(indentation))
+            .collect(Collectors.joining());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/635607f2/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
index b2b1638..f7646bb 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.junit.Test;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
@@ -101,4 +102,26 @@ public class FilterOperatorTest {
     public void shouldRespectJavaBeanContract() {
         EqualsVerifier.forClass(FilterOperator.class).verify();
     }
+
+    @Test
+    public void toStringShouldBePretty() {
+        FilterOperator testee = 
+                FilterOperator.and(
+                    FilterCondition.builder().inMailboxes("12","34").build(),
+                    FilterOperator.or(
+                        FilterOperator.not(
+                            FilterCondition.builder().notInMailboxes("45").build()),
+                        FilterCondition.builder().build()));
+                
+        String expected = Joiner.on('\n').join(
+                            "FilterOperator{operator=AND}",
+                            "  FilterCondition{inMailboxes=[12, 34]}",
+                            "  FilterOperator{operator=OR}",
+                            "    FilterOperator{operator=NOT}",
+                            "      FilterCondition{notInMailboxes=[45]}",
+                            "    FilterCondition{}",
+                            "");
+        String actual = testee.toString();
+        assertThat(actual).isEqualTo(expected);
+    }
 }


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


[2/4] james-project git commit: JAMES-1800 Add bean properties

Posted by ro...@apache.org.
JAMES-1800 Add bean properties


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

Branch: refs/heads/master
Commit: 83da2c03364baebdbfd9e328a342bbb7d49c10da
Parents: f117ec6
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Jul 13 11:15:22 2016 +0200
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Wed Jul 13 15:10:36 2016 +0200

----------------------------------------------------------------------
 .../james/jmap/model/FilterCondition.java       | 60 ++++++++++++++++++++
 .../apache/james/jmap/model/FilterOperator.java | 25 ++++++++
 .../james/jmap/model/FilterConditionTest.java   |  7 +++
 .../james/jmap/model/FilterOperatorTest.java    |  7 +++
 4 files changed, 99 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/83da2c03/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
index 430d88e..76efb8a 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.model;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 import org.apache.commons.lang.NotImplementedException;
@@ -28,6 +29,8 @@ import org.apache.commons.lang.NotImplementedException;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableList;
 
 @JsonDeserialize(builder = FilterCondition.Builder.class)
@@ -271,4 +274,61 @@ public class FilterCondition implements Filter {
     public Optional<List<String>> getHeader() {
         return header;
     }
+
+    @Override
+    public final boolean equals(Object obj) {
+        if (obj instanceof FilterCondition) {
+            FilterCondition other = (FilterCondition) obj;
+            return Objects.equals(this.inMailboxes, other.inMailboxes)
+                && Objects.equals(this.notInMailboxes, other.notInMailboxes)
+                && Objects.equals(this.before, other.before)
+                && Objects.equals(this.after, other.after)
+                && Objects.equals(this.minSize, other.minSize)
+                && Objects.equals(this.maxSize, other.maxSize)
+                && Objects.equals(this.isFlagged, other.isFlagged)
+                && Objects.equals(this.isUnread, other.isUnread)
+                && Objects.equals(this.isAnswered, other.isAnswered)
+                && Objects.equals(this.isDraft, other.isDraft)
+                && Objects.equals(this.hasAttachment, other.hasAttachment)
+                && Objects.equals(this.text, other.text)
+                && Objects.equals(this.from, other.from)
+                && Objects.equals(this.to, other.to)
+                && Objects.equals(this.cc, other.cc)
+                && Objects.equals(this.bcc, other.bcc)
+                && Objects.equals(this.subject, other.subject)
+                && Objects.equals(this.body, other.body)
+                && Objects.equals(this.header, other.header);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(inMailboxes, notInMailboxes, before, after, minSize, maxSize, isFlagged, isUnread, isAnswered, isDraft, hasAttachment, text, from, to, cc, bcc, subject, body, header);
+    }
+
+    @Override
+    public String toString() {
+        ToStringHelper helper = MoreObjects.toStringHelper(getClass());
+        inMailboxes.ifPresent(x -> helper.add("inMailboxes", x));
+        notInMailboxes.ifPresent(x -> helper.add("notInMailboxes", x));
+        before.ifPresent(x -> helper.add("before", x));
+        after.ifPresent(x -> helper.add("after", x));
+        minSize.ifPresent(x -> helper.add("minSize", x));
+        maxSize.ifPresent(x -> helper.add("maxSize", x));
+        isFlagged.ifPresent(x -> helper.add("isFlagged", x));
+        isUnread.ifPresent(x -> helper.add("isUnread", x));
+        isAnswered.ifPresent(x -> helper.add("isAnswered", x));
+        isDraft.ifPresent(x -> helper.add("isDraft", x));
+        hasAttachment.ifPresent(x -> helper.add("hasAttachment", x));
+        text.ifPresent(x -> helper.add("text", x));
+        from.ifPresent(x -> helper.add("from", x));
+        to.ifPresent(x -> helper.add("to", x));
+        cc.ifPresent(x -> helper.add("cc", x));
+        bcc.ifPresent(x -> helper.add("bcc", x));
+        subject.ifPresent(x -> helper.add("subject", x));
+        body.ifPresent(x -> helper.add("body", x));
+        header.ifPresent(x -> helper.add("header", x));
+        return helper.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/83da2c03/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
index 6ebe95c..3a31228 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterOperator.java
@@ -20,10 +20,12 @@
 package org.apache.james.jmap.model;
 
 import java.util.List;
+import java.util.Objects;
 
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
@@ -78,4 +80,27 @@ public class FilterOperator implements Filter {
     public List<Filter> getConditions() {
         return conditions;
     }
+
+    @Override
+    public final boolean equals(Object obj) {
+        if (obj instanceof FilterOperator) {
+            FilterOperator other = (FilterOperator) obj;
+            return Objects.equals(this.operator, other.operator)
+                && Objects.equals(this.conditions, other.conditions);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(operator, conditions);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("operator", operator)
+                .add("conditions", conditions)
+                .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/83da2c03/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
index 0ae7372..b60a935 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
@@ -28,6 +28,8 @@ import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 public class FilterConditionTest {
 
     @Test
@@ -150,4 +152,9 @@ public class FilterConditionTest {
 
         assertThat(filterCondition).isEqualToComparingFieldByField(expectedFilterCondition);
     }
+
+    @Test
+    public void shouldRespectJavaBeanContract() {
+        EqualsVerifier.forClass(FilterCondition.class).verify();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/83da2c03/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
index fb43062..920d2c6 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterOperatorTest.java
@@ -25,6 +25,8 @@ import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 public class FilterOperatorTest {
 
     @Test(expected=IllegalStateException.class)
@@ -54,4 +56,9 @@ public class FilterOperatorTest {
 
         assertThat(filterOperator).isEqualToComparingFieldByField(expectedFilterOperator);
     }
+
+    @Test
+    public void shouldRespectJavaBeanContract() {
+        EqualsVerifier.forClass(FilterOperator.class).verify();
+    }
 }


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