diff --git a/transact/src/main/java/dev/dbos/transact/json/JSONSerde.java b/transact/src/main/java/dev/dbos/transact/json/JSONSerde.java new file mode 100644 index 00000000..22d2df0f --- /dev/null +++ b/transact/src/main/java/dev/dbos/transact/json/JSONSerde.java @@ -0,0 +1,11 @@ +package dev.dbos.transact.json; + +public interface JSONSerde { + String serializeArray(Object[] args); + + Object[] deserializeToArray(String json); + + String toJson(Object obj); + + T fromJson(String content, Class valueType); +} diff --git a/transact/src/main/java/dev/dbos/transact/json/JSONUtil.java b/transact/src/main/java/dev/dbos/transact/json/JSONUtil.java index ec1f0927..49f29dd1 100644 --- a/transact/src/main/java/dev/dbos/transact/json/JSONUtil.java +++ b/transact/src/main/java/dev/dbos/transact/json/JSONUtil.java @@ -14,20 +14,24 @@ import java.util.List; import java.util.Map; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JSONUtil { private static final Logger logger = LoggerFactory.getLogger(Conductor.class); - private static final ObjectMapper mapper = new ObjectMapper(); + private static JSONSerde jsonSerde = new JacksonJSONSerde(); + + public static JSONSerde getJsonSerde() { + return jsonSerde; + } + + public static void setJsonSerde(JSONSerde jsonSerde) { + JSONUtil.jsonSerde = jsonSerde; + } public static class JsonRuntimeException extends RuntimeException { - public JsonRuntimeException(JsonProcessingException cause) { + public JsonRuntimeException(Exception cause) { super(cause.getMessage(), cause); setStackTrace(cause.getStackTrace()); for (Throwable suppressed : cause.getSuppressed()) { @@ -36,30 +40,16 @@ public JsonRuntimeException(JsonProcessingException cause) { } } - static { - mapper.registerModule(new JavaTimeModule()); - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // Optional - } - public static String serialize(Object obj) { return serializeArray(new Object[] {obj}); } public static String serializeArray(Object[] args) { - try { - return mapper.writeValueAsString(new Boxed(args)); - } catch (JsonProcessingException e) { - throw new JsonRuntimeException(e); - } + return jsonSerde.serializeArray(args); } public static Object[] deserializeToArray(String json) { - try { - Boxed boxed = mapper.readValue(json, Boxed.class); - return boxed.args; - } catch (JsonProcessingException e) { - throw new JsonRuntimeException(e); - } + return jsonSerde.deserializeToArray(json); } public static String serializeAppException(Throwable error) { @@ -83,19 +73,11 @@ public static Throwable deserializeAppException(String str) { } public static String toJson(Object obj) { - try { - return mapper.writeValueAsString(obj); - } catch (JsonProcessingException e) { - throw new JsonRuntimeException(e); - } + return jsonSerde.toJson(obj); } public static T fromJson(String content, Class valueType) { - try { - return mapper.readValue(content, valueType); - } catch (JsonProcessingException e) { - throw new JsonRuntimeException(e); - } + return jsonSerde.fromJson(content, valueType); } public static final class WireThrowable { diff --git a/transact/src/main/java/dev/dbos/transact/json/JacksonJSONSerde.java b/transact/src/main/java/dev/dbos/transact/json/JacksonJSONSerde.java new file mode 100644 index 00000000..8b5f427e --- /dev/null +++ b/transact/src/main/java/dev/dbos/transact/json/JacksonJSONSerde.java @@ -0,0 +1,50 @@ +package dev.dbos.transact.json; + +import dev.dbos.transact.json.JSONUtil.JsonRuntimeException; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +public class JacksonJSONSerde implements JSONSerde { + private final ObjectMapper mapper = new ObjectMapper(); + + { + mapper.registerModule(new JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // Optional + } + + public String serializeArray(Object[] args) { + try { + return mapper.writeValueAsString(new Boxed(args)); + } catch (JsonProcessingException e) { + throw new JsonRuntimeException(e); + } + } + + public Object[] deserializeToArray(String json) { + try { + Boxed boxed = mapper.readValue(json, Boxed.class); + return boxed.args; + } catch (JsonProcessingException e) { + throw new JsonRuntimeException(e); + } + } + + public String toJson(Object obj) { + try { + return mapper.writeValueAsString(obj); + } catch (JsonProcessingException e) { + throw new JsonRuntimeException(e); + } + } + + public T fromJson(String content, Class valueType) { + try { + return mapper.readValue(content, valueType); + } catch (JsonProcessingException e) { + throw new JsonRuntimeException(e); + } + } +}