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);
