Use newClassLoadingContextForCatalogItems where possible. https://github.com/apache/brooklyn-server/pull/338/files#r94623208
Use in org.apache.brooklyn.util.core.ClassLoaderUtils#load org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore#getCustomClassLoaderForBrooklynObject org.apache.brooklyn.core.catalog.internal.JavaCatalogToSpecTransformer#createCatalogSpec Not doing XmlMementoSerializer as it is calling newClassLoadingContext(ManagementContext mgmt, RegisteredType item) rather than newClassLoadingContext(ManagementContext mgmt, CatalogItem<?, ?> item), and the hierarchy is not available on RegisteredType. Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/3257c846 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/3257c846 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/3257c846 Branch: refs/heads/master Commit: 3257c846dd21d1b1dada9c480ef7f6e68f3bd03c Parents: 584efcc Author: Geoff Macartney <[email protected]> Authored: Wed Mar 8 12:17:57 2017 +0000 Committer: Geoff Macartney <[email protected]> Committed: Thu Apr 20 11:20:36 2017 +0100 ---------------------------------------------------------------------- .../internal/JavaCatalogToSpecTransformer.java | 2 +- .../BrooklynMementoPersisterToObjectStore.java | 10 ++++-- .../brooklyn/util/core/ClassLoaderUtils.java | 36 +++++++++++++------- 3 files changed, 32 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3257c846/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java index 4e15d24..a990c2f 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java @@ -81,7 +81,7 @@ public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer { // java types were deprecated before we added osgi support so this isn't necessary, // but it doesn't hurt (and if we re-instate a class+bundle approach for RegisteredType // we will want to do this) - type = CatalogUtils.newClassLoadingContext(mgmt, item).loadClass(javaType); + type = CatalogUtils.newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy()).loadClass(javaType); } catch (Exception e) { Exceptions.propagateIfFatal(e); throw new IllegalStateException("Unable to load old-style java catalog item type " + javaType + " for item " + item, e); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3257c846/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java index 1be1c2c..d9cafdc 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java @@ -173,7 +173,8 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer return result; } - @Nullable protected ClassLoader getCustomClassLoaderForBrooklynObject(LookupContext lookupContext, BrooklynObjectType type, String objectId) { + @Nullable protected ClassLoader getCustomClassLoaderForBrooklynObject(LookupContext lookupContext, + BrooklynObjectType type, String objectId) { BrooklynObject item = lookupContext.peek(type, objectId); String catalogItemId = (item == null) ? null : item.getCatalogItemId(); // TODO enrichers etc aren't yet known -- would need to backtrack to the entity to get them from bundles @@ -185,10 +186,13 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer RegisteredType catalogItem = lookupContext.lookupManagementContext().getTypeRegistry().get(catalogItemId); if (catalogItem == null) { // TODO do we need to only log once, rather than risk log.warn too often? I think this only happens on rebind, so ok. - LOG.warn("Unable to load catalog item "+catalogItemId+" for custom class loader of "+type+" "+objectId+"; will use default class loader"); + LOG.warn("Unable to load catalog item "+catalogItemId + +" for custom class loader of " + type + " " + objectId + "; will use default class loader"); return null; } else { - return ClassLoaderFromBrooklynClassLoadingContext.of(CatalogUtils.newClassLoadingContext(lookupContext.lookupManagementContext(), catalogItem)); + return ClassLoaderFromBrooklynClassLoadingContext.of( + CatalogUtils.newClassLoadingContextForCatalogItems(lookupContext.lookupManagementContext(), + item.getCatalogItemHierarchy())); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3257c846/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java index afb45ba..d262969 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java @@ -63,7 +63,8 @@ public class ClassLoaderUtils { */ static final String WHITE_LIST_KEY = "org.apache.brooklyn.classloader.fallback.bundles"; static final String CLASS_NAME_DELIMITER = ":"; - private static final String WHITE_LIST_DEFAULT = "org\\.apache\\.brooklyn\\..*:" + OsgiUtils.toOsgiVersion(BrooklynVersion.get()); + private static final String WHITE_LIST_DEFAULT = + "org\\.apache\\.brooklyn\\..*:" + OsgiUtils.toOsgiVersion(BrooklynVersion.get()); // Class.forName gets the class loader from the calling class. // We don't have access to the same reflection API so need to pass it explicitly. @@ -122,7 +123,8 @@ public class ClassLoaderUtils { * <ul> * <li>{@code <classname>}, such as {@code com.google.common.net.HostAndPort} * <li>{@code <bunde-symbolicName>:<classname>}, such as {@code com.google.guava:com.google.common.net.HostAndPort} - * <li>{@code <bunde-symbolicName>:<bundle-version>:<classname>}, such as {@code com.google.guava:16.0.1:com.google.common.net.HostAndPort} + * <li>{@code <bunde-symbolicName>:<bundle-version>:<classname>}, such as + * {@code com.google.guava:16.0.1:com.google.common.net.HostAndPort} * </ul> * * The classloading order is as follows: @@ -153,7 +155,8 @@ public class ClassLoaderUtils { if (cls.isPresent()) { return cls.get(); } else { - throw new ClassNotFoundException("Class " + name + " not found on the application class path, nor in the bundle white list.", getReturnException(cls)); + throw new ClassNotFoundException("Class " + name + + " not found on the application class path, nor in the bundle white list.", getReturnException(cls)); } } @@ -161,7 +164,8 @@ public class ClassLoaderUtils { try { return tryLoadFromBundle(ClassLoaderDispatcher.INSTANCE, symbolicName, version, className).get(); } catch (IllegalStateException e) { - throw new ClassNotFoundException("Class " + className + " could not be loaded from bundle " + toBundleString(symbolicName, version), e); + throw new ClassNotFoundException("Class " + className + " could not be loaded from bundle " + + toBundleString(symbolicName, version), e); } } @@ -176,7 +180,8 @@ public class ClassLoaderUtils { } /** - * Finds all the resources with the given name. Aborts going through subsequent fallbacks when it finds at least one resource. + * Finds all the resources with the given name. + * Aborts going through subsequent fallbacks when it finds at least one resource. * @see {@link #loadClass(String)} for loading order * * @return empty {@link Iterable} when no resources find @@ -198,7 +203,8 @@ public class ClassLoaderUtils { if (looksLikeBundledClassName(name)) { String[] arr = name.split(CLASS_NAME_DELIMITER); if (arr.length > 3) { - throw new IllegalStateException("'" + name + "' doesn't look like a class name and contains too many colons to be parsed as bundle:version:class triple."); + throw new IllegalStateException("'" + name + + "' doesn't look like a class name and contains too many colons to be parsed as bundle:version:class triple."); } else if (arr.length == 3) { symbolicName = arr[0]; version = arr[1]; @@ -208,7 +214,8 @@ public class ClassLoaderUtils { version = null; className = arr[1]; } else { - throw new IllegalStateException("'" + name + "' contains a bundle:version:class delimiter, but only one of those specified"); + throw new IllegalStateException("'" + name + + "' contains a bundle:version:class delimiter, but only one of those specified"); } } else { symbolicName = null; @@ -247,13 +254,15 @@ public class ClassLoaderUtils { if (catalogItemId != null) { CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogItemId); if (item != null) { - BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, item); + BrooklynClassLoadingContext loader = + CatalogUtils.newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy()); cls = dispatcher.tryLoadFrom(loader, className); if (cls.isPresent()) { return cls; } } else { - log.warn("Entity " + entity + " refers to non-existent catalog item " + catalogItemId + ". Trying to load class " + name); + log.warn("Entity " + entity + " refers to non-existent catalog item " + catalogItemId + + ". Trying to load class " + name); } } } @@ -278,7 +287,8 @@ public class ClassLoaderUtils { return Maybe.absentNull(); } - protected <T> Maybe<T> tryLoadFromBundle(LoaderDispatcher<T> dispatcher, String symbolicName, String version, String name) { + protected <T> Maybe<T> tryLoadFromBundle(LoaderDispatcher<T> dispatcher, String symbolicName, String version, + String name) { Framework framework = getFramework(); if (framework != null) { Maybe<Bundle> bundle = Osgis.bundleFinder(framework) @@ -286,7 +296,8 @@ public class ClassLoaderUtils { .version(OsgiUtils.toOsgiVersion(version)) .find(); if (bundle.isAbsent()) { - throw new IllegalStateException("Bundle " + toBundleString(symbolicName, version) + " not found to load " + name); + throw new IllegalStateException("Bundle " + toBundleString(symbolicName, version) + + " not found to load " + name); } return dispatcher.tryLoadFrom(bundle.get(), name); } else { @@ -364,7 +375,8 @@ public class ClassLoaderUtils { String symbolicName = arr[0]; String version = null; if (arr.length > 2) { - throw new IllegalStateException("Class loading fallback bundle white list '" + whiteList + "' not in the expected format <symbolic name regex>[:<version regex>]."); + throw new IllegalStateException("Class loading fallback bundle white list '" + whiteList + + "' not in the expected format <symbolic name regex>[:<version regex>]."); } else if (arr.length == 2) { version = arr[1]; }
