Do resource lookup from nested catalog ids.

Fixes testDeepCatalogItemCanLoadResources.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/47c5580e
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/47c5580e
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/47c5580e

Branch: refs/heads/master
Commit: 47c5580e9ea9b5cfb6a42c84428c641dbe88f244
Parents: 39dc1cc
Author: Geoff Macartney <[email protected]>
Authored: Wed Sep 21 16:36:49 2016 +0100
Committer: Geoff Macartney <[email protected]>
Committed: Thu Apr 20 11:18:42 2017 +0100

----------------------------------------------------------------------
 .../internal/AbstractManagementContext.java     | 37 +++++++++++++-------
 1 file changed, 24 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/47c5580e/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 89d5b3c..42c9c14 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
@@ -131,20 +131,18 @@ public abstract class AbstractManagementContext 
implements ManagementContextInte
             public BrooklynClassLoadingContext apply(@Nullable Object input) {
                 if (input instanceof EntityInternal) {
                     EntityInternal internal = (EntityInternal)input;
-                    if (internal.getCatalogItemId() != null) {
-                        RegisteredType item = 
internal.getManagementContext().getTypeRegistry().get(internal.getCatalogItemId());
-
-                        if (item != null) {
-                            BrooklynClassLoadingContext itemLoader = 
CatalogUtils.newClassLoadingContext(internal.getManagementContext(), item);
-                            // Falls back to the entity's class loader
-                            JavaBrooklynClassLoadingContext entityLoader = 
JavaBrooklynClassLoadingContext.create(input.getClass().getClassLoader());
-                            BrooklynClassLoadingContext seqLoader = new 
BrooklynClassLoadingContextSequential(internal.getManagementContext(), 
itemLoader, entityLoader);
-                            return seqLoader;
-                        } else {
-                            log.error("Can't find catalog item " + 
internal.getCatalogItemId() +
-                                    " used for instantiating entity " + 
internal +
-                                    ". Falling back to application 
classpath.");
+                    final List<String> catalogItemSuperIds = 
internal.getCatalogItemSuperIds();
+                    if (catalogItemSuperIds.size() > 0) {
+                        BrooklynClassLoadingContextSequential seqLoader = new 
BrooklynClassLoadingContextSequential(internal.getManagementContext());
+                        for (String catalogItemId : catalogItemSuperIds) {
+                            addCatalogItemContext(internal, seqLoader, 
catalogItemId);
                         }
+                        // TODO what if not all items were found? need to 
consider what the right behaviour is.
+                        // TODO for now take the course of using whatever 
items we *did* find
+                        if (seqLoader.getPrimaries().size() != 
catalogItemSuperIds.size()) {
+                            log.error("Couldn't find all catalog items  used 
for instantiating entity " + internal);
+                        }
+                        return seqLoader;
                     }
                     return apply(internal.getManagementSupport());
                 }
@@ -158,6 +156,19 @@ public abstract class AbstractManagementContext implements 
ManagementContextInte
         });
     }
 
+    private static void addCatalogItemContext(EntityInternal entity, 
BrooklynClassLoadingContextSequential loader, String catalogItemId) {
+        RegisteredType item = 
entity.getManagementContext().getTypeRegistry().get(catalogItemId);
+
+        if (item != null) {
+            BrooklynClassLoadingContext itemLoader = 
CatalogUtils.newClassLoadingContext(entity.getManagementContext(), item);
+            loader.add(itemLoader);
+        } else {
+            log.error("Can't find catalog item " + catalogItemId +
+                " used for instantiating entity " + entity +
+                ". Falling back to application classpath.");
+        }
+    }
+
     private final AtomicLong totalEffectorInvocationCount = new AtomicLong();
 
     protected DeferredBrooklynProperties configMap;

Reply via email to