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

Reply via email to