You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2022/07/27 16:32:45 UTC
[brooklyn-server] 01/02: minor dsl serialization tidies and test
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 76d88466014ca39cc16ade030fc287831d1079b5
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Wed Jul 27 16:49:07 2022 +0100
minor dsl serialization tidies and test
---
.../spi/dsl/methods/BrooklynDslCommon.java | 2 +-
.../util/json/BrooklynJacksonSerializerTest.java | 64 ++++++++++++++++++++--
2 files changed, 59 insertions(+), 7 deletions(-)
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index d729f585a1..62507b9f58 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -448,7 +448,7 @@ public class BrooklynDslCommon {
public DslLiteral(Object input) {
this.literalString = input instanceof String ? (String)input : null;
- this.literalObjectJson = input instanceof String ? null : Jsonya.render(input);
+ this.literalObjectJson = (input==null || input instanceof String) ? null : Jsonya.render(input);
}
public String getLiteralObjectJson() {
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
index 40d3b8f00b..fb92bdd47e 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
@@ -29,13 +29,15 @@ import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.camp.brooklyn.BrooklynCampPlatform;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.DslUtils;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent;
+import org.apache.brooklyn.camp.spi.PlatformRootSummary;
import org.apache.brooklyn.core.entity.Attributes;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.core.resolve.jackson.BeanWithTypeUtils;
-import org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonSerializationUtils;
-import org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonType;
-import org.apache.brooklyn.core.resolve.jackson.WrappedValue;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.resolve.jackson.*;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.core.test.entity.TestEntity;
import org.apache.brooklyn.entity.stock.BasicApplication;
@@ -46,13 +48,13 @@ import org.apache.brooklyn.util.core.flags.TypeCoercions;
import org.apache.brooklyn.util.core.json.BidiSerialization;
import org.apache.brooklyn.util.core.units.ByteSize;
import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.javalang.Reflections;
import org.apache.brooklyn.util.net.UserAndHostAndPort;
import org.apache.brooklyn.util.stream.Streams;
import org.apache.brooklyn.util.text.StringEscapes;
import org.apache.brooklyn.util.text.Strings;
import org.apache.brooklyn.util.time.Duration;
import org.apache.brooklyn.util.time.Time;
-import org.apache.brooklyn.util.time.Timestamp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
@@ -60,8 +62,12 @@ import org.testng.annotations.Test;
import java.io.ByteArrayOutputStream;
import java.io.NotSerializableException;
+import java.lang.reflect.Field;
import java.time.Instant;
-import java.util.*;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -595,4 +601,50 @@ public class BrooklynJacksonSerializerTest {
}
}
+ public static class ObjectWithWrappedValueStringAndAnother extends WrappedValuesSerializationTest.ObjectWithWrappedValueString {
+ public String y;
+ }
+
+ @Test
+ public void testDslSupplier() throws Exception {
+ LocalManagementContext mgmt = LocalManagementContextForTests.newInstance();
+ try {
+ BrooklynCampPlatform platform = new BrooklynCampPlatform(
+ PlatformRootSummary.builder().name("Brooklyn CAMP Platform").build(),
+ mgmt)
+ .setConfigKeyAtManagmentContext();
+ TestEntity entity = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class).configure("fk", "foo"));
+ Object dsl = DslUtils.parseBrooklynDsl(mgmt, "$brooklyn:config(\"fk\")");
+ ObjectWithWrappedValueStringAndAnother obj = new ObjectWithWrappedValueStringAndAnother();
+ obj.x = WrappedValue.of(dsl);
+ obj.y = "yyy";
+
+ mgmt.getExecutionContext(entity).submit("resolve", () -> Asserts.assertEquals(obj.x.get(), "foo")).get();
+
+ List result = BeanWithTypeUtils.convert(mgmt, MutableList.of(obj), TypeToken.of(List.class), true, null, true);
+
+ mgmt.getExecutionContext(entity).submit("resolve", () -> Asserts.assertEquals(
+ ((WrappedValuesSerializationTest.ObjectWithWrappedValueString) result.get(0)).x.get(), "foo")).get();
+
+ // if dsl field is cleared, we can still read it, this time using class instantiation
+ Field dslField = Reflections.findField(dsl.getClass(), "dsl");
+ dslField.setAccessible(true);
+ dslField.set(dsl, null);
+
+ dslField = Reflections.findField(((DslComponent.DslConfigSupplier)dsl).getComponent().getClass(), "dsl");
+ dslField.setAccessible(true);
+ dslField.set( ((DslComponent.DslConfigSupplier)dsl).getComponent() , null);
+
+ List result2 = BeanWithTypeUtils.convert(mgmt, MutableList.of(obj), TypeToken.of(List.class), true, null, true);
+
+ mgmt.getExecutionContext(entity).submit("resolve", () -> Asserts.assertEquals(
+ ((WrappedValuesSerializationTest.ObjectWithWrappedValueString) result2.get(0)).x.get(), "foo")).get();
+
+ // (above test was to investigate a situation where ultimately a downstream "shorthand" serializer was using
+ // findRootValueDeserializer rather than findContextualValueDeserializer, so not attending to our custom type info rules;
+ // the test is useful however, so has been added
+ } finally {
+ Entities.destroyAll(mgmt);
+ }
+ }
}