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 08ad852124f0246115d077928b884bd845a8af30
Author: Alex Heneveld <[email protected]>
AuthorDate: Thu Oct 1 23:50:10 2020 +0100

    fix the bug, by passing the loader through the bean-with-type instantiation 
flow
---
 .../BrooklynComponentTemplateResolver.java         |  2 +-
 .../creation/BrooklynEntityDecorationResolver.java |  2 +-
 .../brooklyn/CustomTypeConfigYamlOsgiTest.java     |  5 ++--
 .../jackson/BeanWithTypePlanTransformer.java       | 10 ++++++-
 .../core/resolve/jackson/BeanWithTypeUtils.java    | 13 ++++----
 ...BrooklynRegisteredTypeJacksonSerialization.java | 35 +++++++++++++---------
 .../BrooklynMiscJacksonSerializationTest.java      |  8 +----
 ...klynRegisteredTypeJacksonSerializationTest.java |  2 +-
 .../resolve/jackson/PerverseSerializationTest.java |  2 +-
 .../jackson/WrappedValuesSerializationTest.java    |  6 ++--
 10 files changed, 47 insertions(+), 38 deletions(-)

diff --git 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index 5fa1391..5d79d81 100644
--- 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -382,7 +382,7 @@ public class BrooklynComponentTemplateResolver {
     }
 
     private <T> Maybe<T> convertConfig(Maybe<Object> input, TypeToken<T> type) 
{
-        return BeanWithTypeUtils.tryConvertOrAbsent(mgmt, input, type, true, 
false).or((Maybe<T>)(input));
+        return BeanWithTypeUtils.tryConvertOrAbsent(mgmt, input, type, true, 
loader, false).or((Maybe<T>)(input));
     }
 
     protected ConfigInheritance getDefaultConfigInheritance() {
diff --git 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index 1077cf1..c53247f 100644
--- 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -200,7 +200,7 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
             EntityInitializer result;
             try {
                 result = 
BeanWithTypeUtils.convert(instantiator.getClassLoadingContext().getManagementContext(),
 decorationJson, TypeToken.of(EntityInitializer.class),
-                        true, true);
+                        true, instantiator.getClassLoadingContext(), true);
             } catch (Exception e) {
                 Exceptions.propagateIfFatal(e);
                 // fall back to the old way, eg if caller specifies 
initializerType, or for some other reason bean-with-type fails
diff --git 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
index b71760a..3911aae 100644
--- 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
+++ 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
@@ -36,6 +36,7 @@ import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.exceptions.ReferenceWithError;
+import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.osgi.OsgiTestResources;
 import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
@@ -58,14 +59,14 @@ public class CustomTypeConfigYamlOsgiTest extends 
CustomTypeConfigYamlTest {
                 new 
ResourceUtils(getClass()).getResourceFromUrl(OsgiTestResources.BROOKLYN_TEST_OSGI_BEANS_URL));
 
         OsgiBundleInstallationResult r = result.getWithError();
-        RegisteredType rt = r.getTypesInstalled().stream().filter(rti -> 
"sampleBean".equals(rti.getId())).findAny()
+        RegisteredType rt = r.getTypesInstalled().stream().filter(rti -> 
"sampleBean:0.1.0".equals(rti.getId())).findAny()
                 .orElseThrow(() -> {
                     throw Asserts.fail("Bean not found; RTs were: " + 
r.getTypesInstalled());
                 });
         Asserts.assertEquals(rt.getKind(), RegisteredTypeKind.BEAN);
 
         Object b1 = mgmt().getTypeRegistry().create(rt, null, null);
-        Object b1n = b1.getClass().getField("number").get(b1);
+        Object b1n = Reflections.getFieldValueMaybe(b1, "number").get();
         Asserts.assertEquals(b1n, 1);
     }
 }
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypePlanTransformer.java
 
b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypePlanTransformer.java
index 4663fb8..2ae07ff 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypePlanTransformer.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BeanWithTypePlanTransformer.java
@@ -19,9 +19,12 @@
 package org.apache.brooklyn.core.resolve.jackson;
 
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
+import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import 
org.apache.brooklyn.core.mgmt.classloading.OsgiBrooklynClassLoadingContext;
 import org.apache.brooklyn.core.typereg.AbstractTypePlanTransformer;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.text.Strings;
@@ -72,7 +75,12 @@ public class BeanWithTypePlanTransformer extends 
AbstractTypePlanTransformer {
         } catch (Exception e) {
             throw Exceptions.propagateAnnotated("Invalid YAML in definition of 
'"+registeredType.getId()+"'", e);
         }
-        return BeanWithTypeUtils.newMapper(mgmt, true, true).readValue(
+
+
+        BrooklynClassLoadingContext loader = registeredTypeLoadingContext != 
null ? registeredTypeLoadingContext.getLoader() : null;
+        loader = CatalogUtils.newClassLoadingContext(mgmt, registeredType, 
loader);
+
+        return BeanWithTypeUtils.newMapper(mgmt, true, loader, true).readValue(
                 
BeanWithTypeUtils.newSimpleMapper().writeValueAsString(definition), 
Object.class);
     }
 
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 5020f1c..cd018ec 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
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.google.common.reflect.TypeToken;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
 import 
org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonSerializationUtils.ConfigurableBeanDeserializerModifier;
 import 
org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonSerializationUtils.JsonDeserializerForCommonBrooklynThings;
 import org.apache.brooklyn.util.core.task.DeferredSupplier;
@@ -37,10 +38,10 @@ public class BeanWithTypeUtils {
 
     public static final String FORMAT = "bean-with-type";
 
-    public static ObjectMapper newMapper(ManagementContext mgmt, boolean 
allowRegisteredTypes, boolean allowJavaTypes) {
+    public static ObjectMapper newMapper(ManagementContext mgmt, boolean 
allowRegisteredTypes, BrooklynClassLoadingContext loader, boolean 
allowBasicJavaTypes) {
         JsonMapper mapper = newSimpleMapper();
 
-        BrooklynRegisteredTypeJacksonSerialization.apply(mapper, mgmt, 
allowRegisteredTypes, allowJavaTypes);
+        BrooklynRegisteredTypeJacksonSerialization.apply(mapper, mgmt, 
allowRegisteredTypes, loader, allowBasicJavaTypes);
         WrappedValuesSerialization.apply(mapper);
         mapper = new ConfigurableBeanDeserializerModifier()
                 .addDeserializerWrapper(
@@ -80,12 +81,12 @@ public class BeanWithTypeUtils {
         return isJsonAndOthers(o, oo -> oo instanceof DeferredSupplier);
     }
 
-    public static <T> T convert(ManagementContext mgmt, Map<?,?> map, 
TypeToken<T> type, boolean allowRegisteredTypes, boolean allowJavaTypes) throws 
JsonProcessingException {
-        ObjectMapper m = newMapper(mgmt, allowRegisteredTypes, allowJavaTypes);
+    public static <T> T convert(ManagementContext mgmt, Map<?,?> map, 
TypeToken<T> type, boolean allowRegisteredTypes, BrooklynClassLoadingContext 
loader, boolean allowJavaTypes) throws JsonProcessingException {
+        ObjectMapper m = newMapper(mgmt, allowRegisteredTypes, loader, 
allowJavaTypes);
         return m.readValue(m.writeValueAsString(map), 
BrooklynJacksonSerializationUtils.asTypeReference(type));
     }
 
-    public static <T> Maybe<T> tryConvertOrAbsent(ManagementContext mgmt, 
Maybe<Object> inputMap, TypeToken<T> type, boolean allowRegisteredTypes, 
boolean allowJavaTypes) {
+    public static <T> Maybe<T> tryConvertOrAbsent(ManagementContext mgmt, 
Maybe<Object> inputMap, TypeToken<T> type, boolean allowRegisteredTypes, 
BrooklynClassLoadingContext loader, boolean allowJavaTypes) {
         if (inputMap.isAbsent()) return (Maybe<T>)inputMap;
 
         Object o = inputMap.get();
@@ -109,7 +110,7 @@ public class BeanWithTypeUtils {
         }
 
         try {
-            return Maybe.of(convert(mgmt, (Map<?,?>)o, type, 
allowRegisteredTypes, allowJavaTypes));
+            return Maybe.of(convert(mgmt, (Map<?,?>)o, type, 
allowRegisteredTypes, loader, allowJavaTypes));
         } catch (Exception e) {
             if (fallback!=null) return fallback;
             return Maybe.absent("BeanWithType cannot convert given map to 
"+type, e);
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerialization.java
 
b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerialization.java
index 24e7d08..a60060d 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerialization.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerialization.java
@@ -33,15 +33,12 @@ import 
com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator
 import com.fasterxml.jackson.databind.module.SimpleDeserializers;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.type.SimpleType;
-import com.google.common.reflect.TypeToken;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import 
org.apache.brooklyn.core.resolve.jackson.AsPropertyIfAmbiguous.AsPropertyButNotIfFieldConflictTypeDeserializer;
 import 
org.apache.brooklyn.core.resolve.jackson.AsPropertyIfAmbiguous.AsPropertyIfAmbiguousTypeSerializer;
 import 
org.apache.brooklyn.core.resolve.jackson.AsPropertyIfAmbiguous.HasBaseType;
-import 
org.apache.brooklyn.core.resolve.jackson.BrooklynRegisteredTypeJacksonSerialization.BrooklynRegisteredTypeAndClassNameIdResolver;
-import 
org.apache.brooklyn.core.resolve.jackson.BrooklynRegisteredTypeJacksonSerialization.RegisteredTypeDeserializers;
-import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.flags.BrooklynTypeNameResolution;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 
@@ -109,14 +106,16 @@ public class BrooklynRegisteredTypeJacksonSerialization {
     static class BrooklynRegisteredTypeAndClassNameIdResolver extends 
ClassNameIdResolver implements HasBaseType {
         private final ManagementContext mgmt;
         private final boolean allowRegisteredTypes;
-        private final boolean allowJavaTypes;
+        private final BrooklynClassLoadingContext loader;
+        private final boolean allowPojoJavaTypes;
 
         public BrooklynRegisteredTypeAndClassNameIdResolver(JavaType baseType, 
MapperConfig<?> config, PolymorphicTypeValidator subtypeValidator, 
ManagementContext mgmt,
-                boolean allowRegisteredTypes, boolean allowJavaTypes) {
+                boolean allowRegisteredTypes, BrooklynClassLoadingContext 
loader, boolean allowPojoJavaTypes) {
             super(baseType, config.getTypeFactory(), subtypeValidator);
             this.mgmt = mgmt;
             this.allowRegisteredTypes = allowRegisteredTypes;
-            this.allowJavaTypes = allowJavaTypes;
+            this.loader = loader;
+            this.allowPojoJavaTypes = allowPojoJavaTypes;
         }
 
         @Override
@@ -132,7 +131,13 @@ public class BrooklynRegisteredTypeJacksonSerialization {
                     return new BrooklynJacksonType(mgmt, rt);
                 }
             }
-            if (allowJavaTypes) {
+            if (loader!=null) {
+                Maybe<Class<?>> fromLoader = loader.tryLoadClass(id);
+                if (fromLoader.isPresent()) {
+                    return context.constructType(fromLoader.get());
+                }
+            }
+            if (allowPojoJavaTypes) {
                 return super.typeFromId(context, id);
             }
 
@@ -152,9 +157,10 @@ public class BrooklynRegisteredTypeJacksonSerialization {
     static class BrtTypeResolverBuilder extends DefaultTypeResolverBuilder {
         private final ManagementContext mgmt;
         private final boolean allowRegisteredTypes;
-        private final boolean allowJavaTypes;
+        private final BrooklynClassLoadingContext loader;
+        private final boolean allowPojoJavaTypes;
 
-        public BrtTypeResolverBuilder(ManagementContext mgmt, boolean 
allowRegisteredTypes, boolean allowJavaTypes) {
+        public BrtTypeResolverBuilder(ManagementContext mgmt, boolean 
allowRegisteredTypes, BrooklynClassLoadingContext loader, boolean 
allowPojoJavaTypes) {
             super(DefaultTyping.NON_FINAL, 
LaissezFaireSubTypeValidator.instance);
             this.mgmt = mgmt;
 
@@ -165,12 +171,13 @@ public class BrooklynRegisteredTypeJacksonSerialization {
             inclusion(As.PROPERTY);
             typeProperty("type");
             this.allowRegisteredTypes = allowRegisteredTypes;
-            this.allowJavaTypes = allowJavaTypes;
+            this.loader = loader;
+            this.allowPojoJavaTypes = allowPojoJavaTypes;
         }
 
         @Override
         protected TypeIdResolver idResolver(MapperConfig<?> config, JavaType 
baseType, PolymorphicTypeValidator subtypeValidator, Collection<NamedType> 
subtypes, boolean forSer, boolean forDeser) {
-            return new BrooklynRegisteredTypeAndClassNameIdResolver(baseType, 
config, subtypeValidator, mgmt, allowRegisteredTypes, allowJavaTypes);
+            return new BrooklynRegisteredTypeAndClassNameIdResolver(baseType, 
config, subtypeValidator, mgmt, allowRegisteredTypes, loader, 
allowPojoJavaTypes);
         }
 
         @Override
@@ -216,10 +223,10 @@ public class BrooklynRegisteredTypeJacksonSerialization {
         }
     }
 
-    public static ObjectMapper apply(ObjectMapper mapper, ManagementContext 
mgmt, boolean allowRegisteredTypes, boolean allowJavaTypes) {
+    public static ObjectMapper apply(ObjectMapper mapper, ManagementContext 
mgmt, boolean allowRegisteredTypes, BrooklynClassLoadingContext loader, boolean 
allowPojoJavaTypes) {
         // the type resolver is extended to recognise brooklyn registered type 
names
         // and return a subtype of jackson JavaType
-        mapper.setDefaultTyping(new BrtTypeResolverBuilder(mgmt, 
allowRegisteredTypes, allowJavaTypes));
+        mapper.setDefaultTyping(new BrtTypeResolverBuilder(mgmt, 
allowRegisteredTypes, loader, allowPojoJavaTypes));
 
         SimpleModule module = new SimpleModule();
         if (allowRegisteredTypes) {
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 bf0cca5..a2297c7 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
@@ -19,20 +19,14 @@
 package org.apache.brooklyn.core.resolve.jackson;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import java.util.function.Supplier;
-import 
org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonSerializationUtils.ConfigurableBeanDeserializerModifier;
-import 
org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonSerializationUtils.JsonDeserializerForCommonBrooklynThings;
-import 
org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonSerializationUtils.NestedLoggingDeserializer;
-import 
org.apache.brooklyn.core.resolve.jackson.WrappedValue.WrappedValuesInitialized;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.time.Duration;
-import org.testng.Assert;
 import org.testng.annotations.Test;
 
 public class BrooklynMiscJacksonSerializationTest implements MapperTestFixture 
{
 
     public ObjectMapper mapper() {
-        ObjectMapper mapper = BeanWithTypeUtils.newMapper(null, false, true);
+        ObjectMapper mapper = BeanWithTypeUtils.newMapper(null, false, null, 
true);
 
         return mapper;
     }
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 a21eb46..0dc9fd7 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
@@ -40,7 +40,7 @@ public class BrooklynRegisteredTypeJacksonSerializationTest 
extends BrooklynMgmt
     }
 
     public ObjectMapper mapper() {
-        return BeanWithTypeUtils.newMapper(mgmt(), true, true);
+        return BeanWithTypeUtils.newMapper(mgmt(), true, null, true);
     }
 
     @Test
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/PerverseSerializationTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/PerverseSerializationTest.java
index 71d5675..00a7823 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/PerverseSerializationTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/PerverseSerializationTest.java
@@ -36,7 +36,7 @@ import java.util.Map;
 public class PerverseSerializationTest implements MapperTestFixture {
 
     public ObjectMapper mapper() {
-        return BeanWithTypeUtils.newMapper(null, true, true);
+        return BeanWithTypeUtils.newMapper(null, true, null, true);
     }
 
     private static class BeanWithFieldCalledType {
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/WrappedValuesSerializationTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/WrappedValuesSerializationTest.java
index f52a93a..25aec9a 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/WrappedValuesSerializationTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/WrappedValuesSerializationTest.java
@@ -19,18 +19,16 @@
 package org.apache.brooklyn.core.resolve.jackson;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.json.JsonMapper;
+import java.util.function.Supplier;
 import 
org.apache.brooklyn.core.resolve.jackson.WrappedValue.WrappedValuesInitialized;
 import org.apache.brooklyn.test.Asserts;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import java.util.function.Supplier;
-
 public class WrappedValuesSerializationTest implements MapperTestFixture {
 
     public ObjectMapper mapper() {
-        return BeanWithTypeUtils.newMapper(null, false, true);
+        return BeanWithTypeUtils.newMapper(null, false, null, true);
     }
 
     // basic serialization / deserialization of wrapped values

Reply via email to