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 {

Reply via email to