This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit f35185c46609495853f727b5e5ad207a011c8367 Author: Alex Heneveld <[email protected]> AuthorDate: Fri May 26 11:20:46 2023 +0100 don't use longhand object writer when given a primitive or string input --- .../brooklyn/core/resolve/jackson/BeanWithTypeUtils.java | 7 ++++++- .../jackson/BrooklynMiscJacksonSerializationTest.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypeUtils.java b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypeUtils.java index c829dfed68..ff5902eee1 100644 --- a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypeUtils.java +++ b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypeUtils.java @@ -199,7 +199,12 @@ public class BeanWithTypeUtils { public static <T> T convertDeeply(ManagementContext mgmt, Object mapOrListToSerializeThenDeserialize, TypeToken<T> type, boolean allowRegisteredTypes, BrooklynClassLoadingContext loader, boolean allowJavaTypes) throws JsonProcessingException { // try full serialization - but won't work if things being written cannot be deserialized, eg due to unknown type ObjectMapper mapper = newMapper(mgmt, allowRegisteredTypes, loader, allowJavaTypes); - String serialization = type.getRawType().equals(Object.class) ? mapper.writeValueAsString(mapOrListToSerializeThenDeserialize) : mapper.writerFor(Object.class).writeValueAsString(mapOrListToSerializeThenDeserialize); + boolean useLonghandObjectWriter = true; + + if (type.getRawType().equals(Object.class)) useLonghandObjectWriter = false; + else if (mapOrListToSerializeThenDeserialize==null || mapOrListToSerializeThenDeserialize instanceof String || Boxing.isPrimitiveOrBoxedObject(mapOrListToSerializeThenDeserialize)) useLonghandObjectWriter = false; + + String serialization = !useLonghandObjectWriter ? mapper.writeValueAsString(mapOrListToSerializeThenDeserialize) : mapper.writerFor(Object.class).writeValueAsString(mapOrListToSerializeThenDeserialize); return mapper.readValue(serialization, BrooklynJacksonType.asJavaType(mapper, type)); } diff --git a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynMiscJacksonSerializationTest.java b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynMiscJacksonSerializationTest.java index 5caa8ef19f..0db76c0ea6 100644 --- a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynMiscJacksonSerializationTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynMiscJacksonSerializationTest.java @@ -37,6 +37,9 @@ import java.util.Map; import java.util.TimeZone; import java.util.function.BiConsumer; +import com.google.common.reflect.TypeToken; +import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.collections.MutableMap; @@ -201,6 +204,19 @@ public class BrooklynMiscJacksonSerializationTest implements MapperTestFixture { Assert.assertEquals( impl2.instant, impl.instant ); } + @Test + public void testInstantFromLong() throws Exception { + mapper = BeanWithTypeUtils.newYamlMapper(null, false, null, true); + long utc = new Date().getTime(); + mapper.readerFor(Instant.class).readValue( mapper.writeValueAsString(utc) ); + // below known not to work, as long is converted to ["j...Long", utc] which we don't process + //mapper.readerFor(Instant.class).readValue( mapper.writerFor(Object.class).writeValueAsString(utc) ); + + ManagementContext mgmt = LocalManagementContextForTests.newInstance(); + BeanWithTypeUtils.convertShallow(mgmt, utc, TypeToken.of(Instant.class), false, null, false); + BeanWithTypeUtils.convertDeeply(mgmt, utc, TypeToken.of(Instant.class), false, null, false); + } + @Test public void testFailsOnTrailing() throws Exception { try {
