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

Reply via email to