Author: aduprat
Date: Wed Jan 13 10:11:33 2016
New Revision: 1724382
URL: http://svn.apache.org/viewvc?rev=1724382&view=rev
Log:
JAMES-1648 Implement generic JSON properties filtering. Contributed by Ouazana
<[email protected]>
Modified:
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
Modified:
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java?rev=1724382&r1=1724381&r2=1724382&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
(original)
+++
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
Wed Jan 13 10:11:33 2016
@@ -19,6 +19,9 @@
package org.apache.james.jmap.methods;
+import java.util.Optional;
+import java.util.Set;
+
import org.apache.james.jmap.model.ClientId;
import com.google.common.annotations.VisibleForTesting;
@@ -34,6 +37,7 @@ public class JmapResponse {
private Method.Response.Name responseName;
private ClientId id;
private Method.Response response;
+ private Set<String> properties;
private Builder() {
}
@@ -53,6 +57,11 @@ public class JmapResponse {
return this;
}
+ public Builder properties(Set<String> properties) {
+ this.properties = properties;
+ return this;
+ }
+
public Builder error() {
return error(DEFAULT_ERROR_MESSAGE);
}
@@ -65,7 +74,7 @@ public class JmapResponse {
public JmapResponse build() {
- return new JmapResponse(responseName, id, response);
+ return new JmapResponse(responseName, id, response,
Optional.ofNullable(properties));
}
}
@@ -89,11 +98,13 @@ public class JmapResponse {
private final Method.Response.Name method;
private final ClientId clientId;
private final Method.Response response;
+ private Optional<Set<String>> properties;
- private JmapResponse(Method.Response.Name method, ClientId clientId,
Method.Response response) {
+ private JmapResponse(Method.Response.Name method, ClientId clientId,
Method.Response response, Optional<Set<String>> properties) {
this.method = method;
this.clientId = clientId;
this.response = response;
+ this.properties = properties;
}
public Method.Response.Name getResponseName() {
@@ -107,4 +118,8 @@ public class JmapResponse {
public ClientId getClientId() {
return clientId;
}
+
+ public Optional<Set<String>> getProperties() {
+ return properties;
+ }
}
Modified:
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java?rev=1724382&r1=1724381&r2=1724382&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
(original)
+++
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
Wed Jan 13 10:11:33 2016
@@ -19,15 +19,18 @@
package org.apache.james.jmap.methods;
+import java.util.Optional;
import java.util.Set;
import javax.inject.Inject;
-import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.james.jmap.model.ProtocolResponse;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
+import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
public class JmapResponseWriterImpl implements JmapResponseWriter {
@@ -41,9 +44,18 @@ public class JmapResponseWriterImpl impl
@Override
public ProtocolResponse formatMethodResponse(JmapResponse jmapResponse) {
+ buildPropertiesFilter(jmapResponse.getProperties())
+ .ifPresent(x -> objectMapper.setFilterProvider(x));
+
return new ProtocolResponse(
jmapResponse.getResponseName(),
objectMapper.valueToTree(jmapResponse.getResponse()),
jmapResponse.getClientId());
}
+
+ private Optional<SimpleFilterProvider>
buildPropertiesFilter(Optional<Set<String>> properties) {
+ return properties
+ .map(x -> SimpleBeanPropertyFilter.filterOutAllExcept(x))
+ .map(x -> new
SimpleFilterProvider().addFilter("propertiesFilter", x));
+ }
}
Modified:
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java?rev=1724382&r1=1724381&r2=1724382&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
(original)
+++
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
Wed Jan 13 10:11:33 2016
@@ -21,16 +21,20 @@ package org.apache.james.jmap.methods;
import static org.assertj.core.api.Assertions.assertThat;
+import java.util.List;
+
import org.apache.james.jmap.model.ClientId;
import org.apache.james.jmap.model.ProtocolRequest;
import org.apache.james.jmap.model.ProtocolResponse;
import org.junit.Ignore;
import org.junit.Test;
+import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
public class JmapResponseWriterImplTest {
@@ -42,17 +46,10 @@ public class JmapResponseWriterImplTest
String expectedClientId = "#1";
String expectedId = "myId";
- ObjectNode parameters = new ObjectNode(new JsonNodeFactory(false));
- parameters.put("id", expectedId);
- JsonNode[] nodes = new JsonNode[] { new ObjectNode(new
JsonNodeFactory(false)).textNode("unknwonMethod"),
- parameters,
- new ObjectNode(new
JsonNodeFactory(false)).textNode(expectedClientId)} ;
-
JmapResponseWriterImpl jmapResponseWriterImpl = new
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
- ProtocolRequest request = ProtocolRequest.deserialize(nodes);
ProtocolResponse response =
jmapResponseWriterImpl.formatMethodResponse(JmapResponse
.builder()
- .clientId(request.getClientId())
+ .clientId(ClientId.of(expectedClientId))
.response(null)
.build());
@@ -66,12 +63,6 @@ public class JmapResponseWriterImplTest
String expectedClientId = "#1";
String expectedId = "myId";
- ObjectNode parameters = new ObjectNode(new JsonNodeFactory(false));
- parameters.put("id", expectedId);
- JsonNode[] nodes = new JsonNode[] { new ObjectNode(new
JsonNodeFactory(false)).textNode("unknwonMethod"),
- parameters,
- new ObjectNode(new
JsonNodeFactory(false)).textNode(expectedClientId)} ;
-
ResponseClass responseClass = new ResponseClass();
responseClass.id = expectedId;
@@ -80,7 +71,7 @@ public class JmapResponseWriterImplTest
JmapResponse
.builder()
.responseName(Method.Response.name("unknownMethod"))
- .clientId(ProtocolRequest.deserialize(nodes).getClientId())
+ .clientId(ClientId.of(expectedClientId))
.response(responseClass)
.build());
@@ -95,6 +86,40 @@ public class JmapResponseWriterImplTest
public String id;
}
+
+ @Test
+ public void formatMethodResponseShouldFilterFieldsWhenProperties() {
+ ObjectResponseClass responseClass = new ObjectResponseClass();
+ responseClass.list = ImmutableList.of(new
ObjectResponseClass.Foo("id", "name"));
+
+ JmapResponseWriterImpl jmapResponseWriterImpl = new
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
+ ProtocolResponse response =
jmapResponseWriterImpl.formatMethodResponse(
+ JmapResponse
+ .builder()
+ .responseName(Method.Response.name("unknownMethod"))
+ .clientId(ClientId.of("#1"))
+ .properties(ImmutableSet.of("id"))
+ .response(responseClass)
+ .build());
+
+ JsonNode firstObject =
response.getResults().get("list").elements().next();
+ assertThat(firstObject.get("id").asText()).isEqualTo("id");
+ assertThat(firstObject.get("name")).isNull();
+ }
+
+ @SuppressWarnings("unused")
+ private static class ObjectResponseClass implements Method.Response {
+ @JsonFilter("propertiesFilter")
+ private static class Foo {
+ public String id;
+ public String name;
+ public Foo(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+ }
+ public List<Foo> list;
+ }
@Test
public void formatErrorResponseShouldWork() {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]