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 <raphael.ouaz...@linagora.com>
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: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org