From 592b4cf43ddc7396273e3f5b87832450af128982 Mon Sep 17 00:00:00 2001 From: Jared Stehler Date: Sat, 3 Jun 2023 10:19:50 -0400 Subject: [PATCH] propagate isBinary flag to StoredAsJson deserializer --- .../RosettaAnnotationIntrospector.java | 2 +- .../internal/StoredAsJsonDeserializer.java | 21 ++++++++++++++----- .../rosetta/annotations/StoredAsJsonTest.java | 15 ++++++++----- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/RosettaCore/src/main/java/com/hubspot/rosetta/internal/RosettaAnnotationIntrospector.java b/RosettaCore/src/main/java/com/hubspot/rosetta/internal/RosettaAnnotationIntrospector.java index 6956c49d..7b5d2552 100644 --- a/RosettaCore/src/main/java/com/hubspot/rosetta/internal/RosettaAnnotationIntrospector.java +++ b/RosettaCore/src/main/java/com/hubspot/rosetta/internal/RosettaAnnotationIntrospector.java @@ -75,7 +75,7 @@ public JsonDeserializer findDeserializer(Annotated a) { } String empty = StoredAsJson.NULL.equals(storedAsJson.empty()) ? "null" : storedAsJson.empty(); - return new StoredAsJsonDeserializer(a.getRawType(), a.getType(), empty, objectMapper); + return new StoredAsJsonDeserializer(a.getRawType(), a.getType(), empty, objectMapper, storedAsJson.binary()); } if (rosettaDeserialize != null) { diff --git a/RosettaCore/src/main/java/com/hubspot/rosetta/internal/StoredAsJsonDeserializer.java b/RosettaCore/src/main/java/com/hubspot/rosetta/internal/StoredAsJsonDeserializer.java index 74c914a7..f6b50a2a 100644 --- a/RosettaCore/src/main/java/com/hubspot/rosetta/internal/StoredAsJsonDeserializer.java +++ b/RosettaCore/src/main/java/com/hubspot/rosetta/internal/StoredAsJsonDeserializer.java @@ -20,11 +20,14 @@ public class StoredAsJsonDeserializer extends StdScalarDeserializer { private final String defaultValue; private final ObjectMapper objectMapper; - public StoredAsJsonDeserializer(Class vc, Type type, String defaultValue, ObjectMapper objectMapper) { + private final boolean storedAsBinary; + + public StoredAsJsonDeserializer(Class vc, Type type, String defaultValue, ObjectMapper objectMapper, boolean storedAsBinary) { super(vc); this.type = type; this.defaultValue = defaultValue; this.objectMapper = objectMapper; + this.storedAsBinary = storedAsBinary; } @Override @@ -33,17 +36,25 @@ public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOExcept ObjectMapper mapper = (ObjectMapper) jp.getCodec(); if (jp.getCurrentToken() == JsonToken.VALUE_STRING) { - return deserialize(mapper, jp.getText(), javaType); + if (storedAsBinary) { + return deserializeAsBinary(jp, javaType, mapper); + } else { + return deserialize(mapper, jp.getText(), javaType); + } } else if (jp.getCurrentToken() == JsonToken.VALUE_EMBEDDED_OBJECT) { - String json = new String(jp.getBinaryValue(Base64Variants.getDefaultVariant()), StandardCharsets.UTF_8); - return deserialize(mapper, json, javaType); - } else if(jp.getCurrentToken() == JsonToken.START_OBJECT || jp.getCurrentToken() == JsonToken.START_ARRAY) { + return deserializeAsBinary(jp, javaType, mapper); + } else if (jp.getCurrentToken() == JsonToken.START_OBJECT || jp.getCurrentToken() == JsonToken.START_ARRAY) { return mapper.readValue(jp, javaType); } else { throw ctxt.mappingException("Expected JSON String"); } } + private T deserializeAsBinary(JsonParser jp, JavaType javaType, ObjectMapper mapper) throws IOException { + String json = new String(jp.getBinaryValue(Base64Variants.getDefaultVariant()), StandardCharsets.UTF_8); + return deserialize(mapper, json, javaType); + } + @Override public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException { // we're delegating to the our parent object mapper, so the TypeDeserializer doesn't matter diff --git a/RosettaCore/src/test/java/com/hubspot/rosetta/annotations/StoredAsJsonTest.java b/RosettaCore/src/test/java/com/hubspot/rosetta/annotations/StoredAsJsonTest.java index 0a07b4dd..758c4f72 100644 --- a/RosettaCore/src/test/java/com/hubspot/rosetta/annotations/StoredAsJsonTest.java +++ b/RosettaCore/src/test/java/com/hubspot/rosetta/annotations/StoredAsJsonTest.java @@ -2,12 +2,12 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import com.fasterxml.jackson.core.JsonProcessingException; @@ -26,10 +26,10 @@ import com.hubspot.rosetta.beans.ListStoredAsJsonBeanIF.ListStoredAsJsonBean; import com.hubspot.rosetta.beans.MapStoredAsJsonBean; import com.hubspot.rosetta.beans.NestedStoredAsJsonBean; +import com.hubspot.rosetta.beans.NullPolymorphicBean; import com.hubspot.rosetta.beans.OptionalStoredAsJsonBeanIF.OptionalStoredAsJsonBean; import com.hubspot.rosetta.beans.OptionalStoredAsJsonTypeInfoBean; import com.hubspot.rosetta.beans.OptionalStoredAsJsonTypeInfoBean.Polymorph; -import com.hubspot.rosetta.beans.NullPolymorphicBean; import com.hubspot.rosetta.beans.PolymorphicBeanA; import com.hubspot.rosetta.beans.PolymorphicBeanASubTypeA; import com.hubspot.rosetta.beans.PolymorphicStoredAsJsonBean; @@ -373,10 +373,14 @@ public void testBinaryFieldNullDeserialization() throws JsonProcessingException } @Test - public void testBinaryFieldWithDefaultSerialization() { + public void testBinaryFieldWithDefaultSerialization() throws IOException { bean.setBinaryFieldWithDefault(inner); assertThat(Rosetta.getMapper().valueToTree(bean).get("binaryFieldWithDefault")).isEqualTo(expectedBinary); + + String json = Rosetta.getMapper().writeValueAsString(bean); + StoredAsJsonBean deserBean = Rosetta.getMapper().readValue(json, StoredAsJsonBean.class); + assertThat(deserBean.getBinaryFieldWithDefault().getStringProperty()).isEqualTo("value"); } @Test @@ -581,7 +585,6 @@ public void itHandlesAnnotatedGenericSetterDeserialization() throws JsonProcessi } @Test - @Ignore public void testNestedStoredAsJsonBeans() throws JsonProcessingException { InnerBean innerBean = new InnerBean(); innerBean.setStringProperty("value"); @@ -593,7 +596,9 @@ public void testNestedStoredAsJsonBeans() throws JsonProcessingException { top.setAnnotatedField(storedAsJsonBean); JsonNode node = Rosetta.getMapper().valueToTree(top); - assertThat(Rosetta.getMapper().treeToValue(node, NestedStoredAsJsonBean.class)).isEqualTo(top); + NestedStoredAsJsonBean deserializedNested = Rosetta.getMapper().treeToValue(node, NestedStoredAsJsonBean.class); + + assertThat(deserializedNested.getAnnotatedField().getAnnotatedField().getStringProperty()).isEqualTo("value"); } @Test