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 8ba7c6be4f809ec013c1614981dacf303cbe73ab
Author: Alex Heneveld <[email protected]>
AuthorDate: Mon Nov 7 19:20:05 2022 +0000

    fix eager deserialization into config when type might be a field not an 
instruction
---
 .../brooklyn/core/entity/EntityInitializers.java   |  6 ++++--
 ...klynRegisteredTypeJacksonSerializationTest.java | 24 ++++++++++++++++++++--
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git 
a/core/src/main/java/org/apache/brooklyn/core/entity/EntityInitializers.java 
b/core/src/main/java/org/apache/brooklyn/core/entity/EntityInitializers.java
index 9e0001b4bd..bbbb95dbfd 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/EntityInitializers.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/EntityInitializers.java
@@ -26,6 +26,7 @@ import java.util.function.BiConsumer;
 import com.fasterxml.jackson.annotation.JsonAnySetter;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.google.common.base.Function;
 import org.apache.brooklyn.api.entity.EntityInitializer;
 import org.apache.brooklyn.api.entity.EntityLocal;
@@ -33,6 +34,7 @@ import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.objs.BasicConfigurableObject;
+import org.apache.brooklyn.core.resolve.jackson.JsonPassThroughDeserializer;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.config.ConfigBag;
@@ -191,12 +193,12 @@ public class EntityInitializers {
 
         ConfigBag initParams() { return initParams; }
 
-        @JsonAnySetter
+        @JsonAnySetter @JsonDeserialize(contentUsing = 
JsonPassThroughDeserializer.class)
         protected void initField(String key, Object value) {
             initFromConfigBag(ConfigBag.newInstance(MutableMap.of(key, 
value)));
         }
 
-        @JsonProperty("brooklyn.config")
+        @JsonProperty("brooklyn.config") @JsonDeserialize(contentUsing = 
JsonPassThroughDeserializer.class)
         private void initBrooklynConfig(Map<String,Object> params) {
             initFromConfigBag(ConfigBag.newInstance(params));
         }
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
index 55d076014e..bd66d7578b 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
@@ -146,16 +146,36 @@ public class 
BrooklynRegisteredTypeJacksonSerializationTest extends BrooklynMgmt
 
     @Test
     public void testDeserializeEntityInitializerWithTypeField() throws 
Exception {
-        RegisteredType rt = 
BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, "samplebean-with-type", 
"1", SampleBeanWithType.class);
+        BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, 
"samplebean-with-type", "1", SampleBeanWithType.class);
         Object impl = deser("{\"type\":\""+ WorkflowSensor.class.getName()+"\""
                 
+",\"brooklyn.config\":{\"sensor\":{\"name\":\"mytestsensor\",\"type\":\"samplebean-with-type\"}}"
                 +"}");
         Asserts.assertInstanceOf(impl, WorkflowSensor.class);
     }
 
+    @Test
+    public void testDeserializeEntityInitializerWithTypeFieldInParent() throws 
Exception {
+        BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, "samplebean", 
"1", SampleBean.class);
+        Object impl = deser("{\"type\":\""+ WorkflowSensor.class.getName()+"\""
+                +",\"brooklyn.config\":{\"x\":\"y\""
+                
+",\"sensor\":{\"name\":\"mytestsensor\",\"type\":\"samplebean\"}"
+                +"}}");
+        Asserts.assertInstanceOf(impl, WorkflowSensor.class);
+    }
+
+    @Test
+    public void testDeserializeEntityInitializerFromCatalogWithTypeField() 
throws Exception {
+        BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, 
"samplebean-with-type", "1", SampleBeanWithType.class);
+        BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, 
"workflow-sensor", "1", WorkflowSensor.class);
+        Object impl = deser("{\"type\":\"workflow-sensor\""
+                
+",\"brooklyn.config\":{\"sensor\":{\"name\":\"mytestsensor\",\"type\":\"samplebean-with-type\"}}"
+                +"}");
+        Asserts.assertInstanceOf(impl, WorkflowSensor.class);
+    }
+
     @Test
     public void 
testDeserializeEntityInitializerWithTypeFieldNeededForDeserialization() throws 
Exception {
-        RegisteredType rt = 
BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, "samplebean-with-type", 
"1", SampleBeanWithType.class);
+        BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, 
"samplebean-with-type", "1", SampleBeanWithType.class);
         // 'type' field used to give type because the expected type does not 
expect 'type'
         Object impl = 
deser("{\"x\":\"mytestsensor\",\"type\":\"samplebean-with-type\"}", 
SampleBean.class);
         Asserts.assertInstanceOf(impl, SampleBeanWithType.class);

Reply via email to