summaryrefslogtreecommitdiffstats
path: root/flags
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-06-17 15:51:39 +0200
committerMartin Polden <mpolden@mpolden.no>2021-06-17 15:51:39 +0200
commit12effb8f8a601f153315325e5403e49aee03bfcf (patch)
tree02b341df1b6dba3306b7ac3d7718381c3bdd1890 /flags
parent03b4ce1b9ae1070e2ff8b1e2f0a6dbfdb1e6b63f (diff)
Construct ObjectMapper lazily
Any code using feature flags will implicitly load JsonNodeRawFlag as long as there is a flag type defined that uses JsonNodeRawFlag. However, we don't want code that don't use such flags to require constructing ObjectMapper.
Diffstat (limited to 'flags')
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/JsonNodeRawFlag.java24
1 files changed, 18 insertions, 6 deletions
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/JsonNodeRawFlag.java b/flags/src/main/java/com/yahoo/vespa/flags/JsonNodeRawFlag.java
index 92b7b3bc04d..ec49c1b0eff 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/JsonNodeRawFlag.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/JsonNodeRawFlag.java
@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collection;
+import java.util.concurrent.atomic.AtomicReference;
import static com.yahoo.yolean.Exceptions.uncheck;
@@ -15,7 +16,8 @@ import static com.yahoo.yolean.Exceptions.uncheck;
* @author hakonhall
*/
public class JsonNodeRawFlag implements RawFlag {
- private static final ObjectMapper mapper = new ObjectMapper();
+
+ private static final AtomicReference<ObjectMapper> mapper = new AtomicReference<>();
private final JsonNode jsonNode;
@@ -24,7 +26,7 @@ public class JsonNodeRawFlag implements RawFlag {
}
public static JsonNodeRawFlag fromJson(String json) {
- return new JsonNodeRawFlag(uncheck(() -> mapper.readTree(json)));
+ return new JsonNodeRawFlag(uncheck(() -> objectMapper().readTree(json)));
}
public static JsonNodeRawFlag fromJsonNode(JsonNode jsonNode) {
@@ -32,20 +34,20 @@ public class JsonNodeRawFlag implements RawFlag {
}
public static <T> JsonNodeRawFlag fromJacksonClass(T value) {
- return new JsonNodeRawFlag(uncheck(() -> mapper.valueToTree(value)));
+ return new JsonNodeRawFlag(uncheck(() -> objectMapper().valueToTree(value)));
}
public <T> T toJacksonClass(Class<T> jacksonClass) {
- return uncheck(() -> mapper.treeToValue(jsonNode, jacksonClass));
+ return uncheck(() -> objectMapper().treeToValue(jsonNode, jacksonClass));
}
public <T> T toJacksonClass(JavaType jacksonClass) {
- return uncheck(() -> mapper.readValue(jsonNode.toString(), jacksonClass));
+ return uncheck(() -> objectMapper().readValue(jsonNode.toString(), jacksonClass));
}
@SuppressWarnings("rawtypes")
public static JavaType constructCollectionType(Class<? extends Collection> collectionClass, Class<?> elementClass) {
- return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass);
+ return objectMapper().getTypeFactory().constructCollectionType(collectionClass, elementClass);
}
@Override
@@ -57,4 +59,14 @@ public class JsonNodeRawFlag implements RawFlag {
public String asJson() {
return jsonNode.toString();
}
+
+ /** Initialize object mapper lazily */
+ private static ObjectMapper objectMapper() {
+ // ObjectMapper is a heavy-weight object so we construct it only when we need it
+ return mapper.updateAndGet((objectMapper) -> {
+ if (objectMapper != null) return objectMapper;
+ return new ObjectMapper();
+ });
+ }
+
}