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
