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 ad...@apache.org on 2016/01/13 11:11:40 UTC

svn commit: r1724383 - in /james/project/trunk/server/protocols/jmap/src: main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java

Author: aduprat
Date: Wed Jan 13 10:11:40 2016
New Revision: 1724383

URL: http://svn.apache.org/viewvc?rev=1724383&view=rev
Log:
JAMES-1648 Instanciate Object Mapper at each request to avoid side-effects. Contributed by Ouazana <ra...@linagora.com>

Modified:
    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/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=1724383&r1=1724382&r2=1724383&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:40 2016
@@ -29,23 +29,23 @@ import org.apache.james.jmap.model.Proto
 import com.fasterxml.jackson.databind.Module;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.ser.FilterProvider;
+import com.fasterxml.jackson.databind.ser.PropertyFilter;
 import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
 import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
 
 public class JmapResponseWriterImpl implements JmapResponseWriter {
 
-    private final ObjectMapper objectMapper;
+    private final Set<Module> jacksonModules;
 
     @Inject
     public JmapResponseWriterImpl(Set<Module> jacksonModules) {
-        this.objectMapper = new ObjectMapper().registerModules(jacksonModules)
-            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+        this.jacksonModules = jacksonModules;
     }
 
     @Override
     public ProtocolResponse formatMethodResponse(JmapResponse jmapResponse) {
-        buildPropertiesFilter(jmapResponse.getProperties())
-                .ifPresent(x -> objectMapper.setFilterProvider(x));
+        ObjectMapper objectMapper = newConfiguredObjectMapper(jmapResponse);
         
         return new ProtocolResponse(
                 jmapResponse.getResponseName(), 
@@ -53,9 +53,19 @@ public class JmapResponseWriterImpl impl
                 jmapResponse.getClientId());
     }
     
-    private Optional<SimpleFilterProvider> buildPropertiesFilter(Optional<Set<String>> properties) {
-        return properties
-                .map(x -> SimpleBeanPropertyFilter.filterOutAllExcept(x))
-                .map(x -> new SimpleFilterProvider().addFilter("propertiesFilter", x));
+    private FilterProvider buildPropertiesFilter(Optional<Set<String>> properties) {
+        PropertyFilter filter = properties
+                .map(SimpleBeanPropertyFilter::filterOutAllExcept)
+                .orElse(SimpleBeanPropertyFilter.serializeAll());
+        return new SimpleFilterProvider().addFilter("propertiesFilter", filter);
+    }
+    
+    private ObjectMapper newConfiguredObjectMapper(JmapResponse jmapResponse) {
+        ObjectMapper objectMapper = new ObjectMapper().registerModules(jacksonModules)
+                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+
+        objectMapper.setFilterProvider(buildPropertiesFilter(jmapResponse.getProperties()));
+
+        return objectMapper;
     }
 }

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=1724383&r1=1724382&r2=1724383&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:40 2016
@@ -107,6 +107,35 @@ public class JmapResponseWriterImplTest
         assertThat(firstObject.get("name")).isNull();
     }
 
+    
+    @Test
+    public void formatMethodResponseShouldNotFilterFieldsWhenSecondCallWithoutProperties() {
+        ObjectResponseClass responseClass = new ObjectResponseClass();
+        responseClass.list = ImmutableList.of(new ObjectResponseClass.Foo("id", "name"));
+
+        JmapResponseWriterImpl jmapResponseWriterImpl = new JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
+        jmapResponseWriterImpl.formatMethodResponse(
+                JmapResponse
+                .builder()
+                .responseName(Method.Response.name("unknownMethod"))
+                .clientId(ClientId.of("#1"))
+                .properties(ImmutableSet.of("id"))
+                .response(responseClass)
+                .build());
+
+        ProtocolResponse response = jmapResponseWriterImpl.formatMethodResponse(
+                JmapResponse
+                .builder()
+                .responseName(Method.Response.name("unknownMethod"))
+                .clientId(ClientId.of("#1"))
+                .response(responseClass)
+                .build());
+
+        JsonNode firstObject = response.getResults().get("list").elements().next();
+        assertThat(firstObject.get("id").asText()).isEqualTo("id");
+        assertThat(firstObject.get("name").asText()).isEqualTo("name");
+    }
+
     @SuppressWarnings("unused")
     private static class ObjectResponseClass implements Method.Response {
         @JsonFilter("propertiesFilter")



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