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