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