Skip to content

Commit b69b88a

Browse files
committed
refactor: use LoadingCache and BitSet to defer construction of...
...object mappers until not requested and to allow future extensions of serialization feature configurations.
1 parent c79a500 commit b69b88a

File tree

2 files changed

+30
-29
lines changed
  • core/com.b2international.snowowl.core.rest/src/com/b2international/snowowl/core/rest
  • fhir/com.b2international.snowowl.fhir.rest.tests/src/com/b2international/snowowl/fhir/tests

2 files changed

+30
-29
lines changed

core/com.b2international.snowowl.core.rest/src/com/b2international/snowowl/core/rest/SnowOwlApiConfig.java

+29-28
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.lang.reflect.AnnotatedElement;
1919
import java.lang.reflect.Method;
20+
import java.util.BitSet;
2021
import java.util.List;
2122
import java.util.Map;
2223
import java.util.TimeZone;
@@ -55,7 +56,6 @@
5556
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
5657

5758
import com.auth0.jwt.interfaces.JWTVerifier;
58-
import com.b2international.commons.exceptions.NotImplementedException;
5959
import com.b2international.commons.options.Metadata;
6060
import com.b2international.commons.options.MetadataHolder;
6161
import com.b2international.commons.options.MetadataHolderMixin;
@@ -79,8 +79,10 @@
7979
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
8080
import com.google.common.base.Charsets;
8181
import com.google.common.base.Strings;
82+
import com.google.common.cache.CacheBuilder;
83+
import com.google.common.cache.CacheLoader;
84+
import com.google.common.cache.LoadingCache;
8285
import com.google.common.collect.ImmutableMap;
83-
import com.google.common.collect.MapMaker;
8486
import com.google.inject.Provider;
8587

8688
import io.micrometer.core.instrument.MeterRegistry;
@@ -98,7 +100,9 @@
98100
public class SnowOwlApiConfig extends WebMvcConfigurationSupport {
99101

100102
private static final String INCLUDE_NULL = "includeNull";
103+
private static final int INCLUDE_NULL_IDX = 0;
101104
private static final String PRETTY = "pretty";
105+
private static final int PRETTY_IDX = 1;
102106

103107
static {
104108
SpringDocUtils.getConfig().addResponseWrapperToIgnore(Promise.class);
@@ -107,14 +111,22 @@ public class SnowOwlApiConfig extends WebMvcConfigurationSupport {
107111
@Autowired
108112
private org.springframework.context.ApplicationContext ctx;
109113

110-
private Map<String, ObjectMapper> objectMappers;
114+
private final LoadingCache<BitSet, ObjectMapper> objectMappers = CacheBuilder.newBuilder().build(new CacheLoader<BitSet, ObjectMapper>() {
115+
@Override
116+
public ObjectMapper load(BitSet configuration) throws Exception {
117+
ObjectMapper mapper = createObjectMapper();
118+
mapper.setSerializationInclusion(configuration.get(INCLUDE_NULL_IDX) ? Include.ALWAYS : Include.NON_NULL);
119+
mapper.configure(SerializationFeature.INDENT_OUTPUT, configuration.get(PRETTY_IDX));
120+
return mapper;
121+
}
122+
});
111123

112124
@Bean
113125
public OpenAPI openAPI() {
114126
return new OpenAPI();
115127
}
116128

117-
public ObjectMapper createObjectMapper() {
129+
public static ObjectMapper createObjectMapper() {
118130
final ObjectMapper objectMapper = new ObjectMapper();
119131
objectMapper.registerModule(new JavaTimeModule());
120132
objectMapper.setSerializationInclusion(Include.NON_NULL);
@@ -130,32 +142,21 @@ public ObjectMapper createObjectMapper() {
130142
@Bean
131143
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
132144
public ObjectMapper objectMapper(@Autowired HttpServletRequest request) {
133-
if (objectMappers == null) {
134-
objectMappers = new MapMaker().makeMap();
135-
objectMappers.put("includeNonNullObjectMapper", createObjectMapper());
136-
objectMappers.put("includeNonNullObjectMapperPretty", createObjectMapper()
137-
.enable(SerializationFeature.INDENT_OUTPUT));
138-
objectMappers.put("includeAllObjectMapper", createObjectMapper()
139-
.setSerializationInclusion(Include.ALWAYS));
140-
objectMappers.put("includeAllObjectMapperPretty", createObjectMapper()
141-
.setSerializationInclusion(Include.ALWAYS)
142-
.enable(SerializationFeature.INDENT_OUTPUT));
143-
}
145+
return objectMappers.getUnchecked(toConfig(
146+
extractBooleanQueryParameterValue(request, INCLUDE_NULL),
147+
extractBooleanQueryParameterValue(request, PRETTY)
148+
));
149+
}
144150

145-
boolean includeNulls = extractBooleanQueryParameterValue(request, INCLUDE_NULL);
146-
boolean pretty = extractBooleanQueryParameterValue(request, PRETTY);
147-
148-
if (includeNulls && pretty) {
149-
return objectMappers.get("includeAllObjectMapperPretty");
150-
} else if (includeNulls && !pretty) {
151-
return objectMappers.get("includeAllObjectMapper");
152-
} else if (!includeNulls && pretty) {
153-
return objectMappers.get("includeNonNullObjectMapperPretty");
154-
} else if (!includeNulls && !pretty) {
155-
return objectMappers.get("includeNonNullObjectMapper");
156-
} else {
157-
throw new NotImplementedException("Unexpected case that should not happen");
151+
private BitSet toConfig(boolean...serializationFeatureValuesInOrder) {
152+
if (serializationFeatureValuesInOrder == null) {
153+
return new BitSet(0);
154+
}
155+
BitSet config = new BitSet(serializationFeatureValuesInOrder.length);
156+
for (int i = 0; i < serializationFeatureValuesInOrder.length; i++) {
157+
config.set(i, serializationFeatureValuesInOrder[i]);
158158
}
159+
return config;
159160
}
160161

161162
private boolean extractBooleanQueryParameterValue(HttpServletRequest request, String queryParameterKey) {

fhir/com.b2international.snowowl.fhir.rest.tests/src/com/b2international/snowowl/fhir/tests/FhirTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class FhirTest {
3939

4040
protected static final String TEST_DATE_STRING = "2018-03-23T07:49:40.000+0000"; //$NON-NLS-N$
4141

42-
protected static final ObjectMapper objectMapper = new SnowOwlApiConfig().createObjectMapper();
42+
protected static final ObjectMapper objectMapper = SnowOwlApiConfig.createObjectMapper();
4343

4444
@Rule
4545
public ExpectedException exception = ExpectedException.none();

0 commit comments

Comments
 (0)