Return a generic context from newClassLoadingContextForCatalogItems https://github.com/apache/brooklyn-server/pull/338#discussion_r94751965
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/b61f972e Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/b61f972e Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/b61f972e Branch: refs/heads/master Commit: b61f972e9f4197c64ebe37a69f1631db9febb220 Parents: 3257c84 Author: Geoff Macartney <[email protected]> Authored: Wed Mar 8 15:41:56 2017 +0000 Committer: Geoff Macartney <[email protected]> Committed: Thu Apr 20 11:20:36 2017 +0100 ---------------------------------------------------------------------- .../core/catalog/internal/CatalogUtils.java | 22 ++++++++++---------- .../internal/JavaCatalogToSpecTransformer.java | 6 +++++- .../internal/AbstractManagementContext.java | 4 +++- .../BrooklynMementoPersisterToObjectStore.java | 13 ++++++++---- .../core/mgmt/rebind/RebindIteration.java | 5 ++++- .../brooklyn/util/core/ClassLoaderUtils.java | 6 ++++-- 6 files changed, 36 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b61f972e/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java index 15aafd7..4bb11fd 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java @@ -141,6 +141,17 @@ public class CatalogUtils { return result; } + public static BrooklynClassLoadingContext newClassLoadingContextForCatalogItems( + ManagementContext managementContext, List<String> catalogItemIds) { + + BrooklynClassLoadingContextSequential seqLoader = + new BrooklynClassLoadingContextSequential(managementContext); + for (String catalogItemId : catalogItemIds) { + addCatalogItemContext(managementContext, seqLoader, catalogItemId); + } + return seqLoader; + } + /** * Registers all bundles with the management context's OSGi framework. */ @@ -325,17 +336,6 @@ public class CatalogUtils { mgmt.getCatalog().persist(item); } - public static BrooklynClassLoadingContextSequential newClassLoadingContextForCatalogItems( - ManagementContext managementContext, List<String> catalogItemIds) { - - BrooklynClassLoadingContextSequential seqLoader = - new BrooklynClassLoadingContextSequential(managementContext); - for (String catalogItemId : catalogItemIds) { - addCatalogItemContext(managementContext, seqLoader, catalogItemId); - } - return seqLoader; - } - private static void addCatalogItemContext(ManagementContext managementContext, BrooklynClassLoadingContextSequential loader, String catalogItemId) { RegisteredType item = managementContext.getTypeRegistry().get(catalogItemId); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b61f972e/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 a990c2f..bf698e8 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 @@ -26,9 +26,11 @@ import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec; import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext; import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.api.policy.PolicySpec; import org.apache.brooklyn.api.typereg.RegisteredType; +import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContextSequential; import org.apache.brooklyn.core.objs.BasicSpecParameter; import org.apache.brooklyn.core.plan.PlanNotRecognizedException; import org.apache.brooklyn.core.plan.PlanToSpecTransformer; @@ -81,7 +83,9 @@ 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.newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy()).loadClass(javaType); + final BrooklynClassLoadingContextSequential ctx = new BrooklynClassLoadingContextSequential(mgmt); + ctx.add(CatalogUtils.newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy())); + type = ctx.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/b61f972e/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java index 1771028..16bb3de 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java @@ -132,8 +132,10 @@ public abstract class AbstractManagementContext implements ManagementContextInte EntityInternal internal = (EntityInternal)input; final List<String> catalogItemHierarchy = internal.getCatalogItemHierarchy(); if (catalogItemHierarchy.size() > 0) { + final ManagementContext managementContext = internal.getManagementContext(); BrooklynClassLoadingContextSequential seqLoader = - newClassLoadingContextForCatalogItems(internal.getManagementContext(), catalogItemHierarchy); + new BrooklynClassLoadingContextSequential(managementContext); + seqLoader.add(newClassLoadingContextForCatalogItems(managementContext, catalogItemHierarchy)); JavaBrooklynClassLoadingContext entityLoader = JavaBrooklynClassLoadingContext.create(input.getClass().getClassLoader()); seqLoader.add(entityLoader); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b61f972e/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 d9cafdc..a716151 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 @@ -38,6 +38,8 @@ import javax.annotation.Nullable; import javax.xml.xpath.XPathConstants; import com.google.common.collect.ImmutableList; + +import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.mgmt.rebind.PersistenceExceptionHandler; import org.apache.brooklyn.api.mgmt.rebind.RebindExceptionHandler; import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMemento; @@ -53,6 +55,7 @@ import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.config.StringConfigMap; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; import org.apache.brooklyn.core.config.ConfigKeys; +import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContextSequential; import org.apache.brooklyn.core.mgmt.classloading.ClassLoaderFromBrooklynClassLoadingContext; import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessor; import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessorWithLock; @@ -183,16 +186,18 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer } // See RebindIteration.BrooklynObjectInstantiator.load(), for handling where catalog item is missing; // similar logic here. - RegisteredType catalogItem = lookupContext.lookupManagementContext().getTypeRegistry().get(catalogItemId); + final ManagementContext managementContext = lookupContext.lookupManagementContext(); + RegisteredType catalogItem = managementContext.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"); return null; } else { - return ClassLoaderFromBrooklynClassLoadingContext.of( - CatalogUtils.newClassLoadingContextForCatalogItems(lookupContext.lookupManagementContext(), - item.getCatalogItemHierarchy())); + final BrooklynClassLoadingContextSequential ctx = new BrooklynClassLoadingContextSequential(managementContext); + ctx.add( + CatalogUtils.newClassLoadingContextForCatalogItems(managementContext, item.getCatalogItemHierarchy())); + return ClassLoaderFromBrooklynClassLoadingContext.of(ctx); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b61f972e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java index 1f23330..80c5eb2 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java @@ -19,6 +19,7 @@ package org.apache.brooklyn.core.mgmt.rebind; import static com.google.common.base.Preconditions.checkNotNull; +import static org.apache.brooklyn.core.catalog.internal.CatalogUtils.newClassLoadingContextForCatalogItems; import java.io.IOException; import java.util.Arrays; @@ -74,6 +75,7 @@ import org.apache.brooklyn.core.entity.EntityInternal; import org.apache.brooklyn.core.feed.AbstractFeed; import org.apache.brooklyn.core.location.AbstractLocation; import org.apache.brooklyn.core.location.internal.LocationInternal; +import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContextSequential; import org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext; import org.apache.brooklyn.core.mgmt.internal.BrooklynObjectManagementMode; import org.apache.brooklyn.core.mgmt.internal.BrooklynObjectManagerInternal; @@ -957,7 +959,8 @@ public abstract class RebindIteration { +" for "+contextSuchAsId + " (" + bType.getSimpleName()+"); attempting load nevertheless"); } try { - BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContextForCatalogItems(managementContext, idsFromReboundCatalog); + BrooklynClassLoadingContextSequential loader = new BrooklynClassLoadingContextSequential(managementContext); + loader.add(newClassLoadingContextForCatalogItems(managementContext, idsFromReboundCatalog)); return new LoadedClass<T>(loader.loadClass(jType, bType), idsFromReboundCatalog); } catch (Exception e) { Exceptions.propagateIfFatal(e); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b61f972e/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 d262969..88eb699 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 @@ -16,6 +16,7 @@ package org.apache.brooklyn.util.core; import static com.google.common.base.Preconditions.checkNotNull; +import static org.apache.brooklyn.core.catalog.internal.CatalogUtils.newClassLoadingContextForCatalogItems; import java.net.URL; import java.util.List; @@ -30,6 +31,7 @@ import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext; import org.apache.brooklyn.core.BrooklynVersion; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; import org.apache.brooklyn.core.entity.EntityInternal; +import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContextSequential; import org.apache.brooklyn.core.mgmt.ha.OsgiManager; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.util.core.LoaderDispatcher.ClassLoaderDispatcher; @@ -254,8 +256,8 @@ public class ClassLoaderUtils { if (catalogItemId != null) { CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogItemId); if (item != null) { - BrooklynClassLoadingContext loader = - CatalogUtils.newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy()); + BrooklynClassLoadingContextSequential loader = new BrooklynClassLoadingContextSequential(mgmt); + loader.add(newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy())); cls = dispatcher.tryLoadFrom(loader, className); if (cls.isPresent()) { return cls;
