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


The following commit(s) were added to refs/heads/master by this push:
     new 35ce88f195 support entity search path even without a catalog item id 
defined
35ce88f195 is described below

commit 35ce88f195cb9af1c1c457d70d7ac6119779d045
Author: Alex Heneveld <[email protected]>
AuthorDate: Wed Mar 29 10:20:17 2023 +0100

    support entity search path even without a catalog item id defined
---
 .../core/catalog/internal/CatalogUtils.java        |  2 +-
 .../mgmt/internal/AbstractManagementContext.java   | 33 ++++++++++++----------
 .../workflow/steps/external/SshWorkflowStep.java   |  1 +
 .../brooklyn/util/core/ClassLoaderUtilsTest.java   | 11 ++++++++
 4 files changed, 31 insertions(+), 16 deletions(-)

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 026c3c04c1..c4aaa9185e 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
@@ -151,7 +151,7 @@ public class CatalogUtils {
         BrooklynClassLoadingContextSequential seqLoader = new 
BrooklynClassLoadingContextSequential(managementContext);
         Set<String> path = MutableSet.copyOf(searchPath);
 
-        if (!omitPrimaryIfContainedInSearchPath || 
!searchPath.contains(primaryItemId)) {
+        if (primaryItemId!=null && (!omitPrimaryIfContainedInSearchPath || 
!searchPath.contains(primaryItemId))) {
             addSearchItem(managementContext, seqLoader, primaryItemId, false 
/* primary ID may be temporary */);
             path.remove(primaryItemId);
         }
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 be1f97c767..b212589556 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
@@ -105,25 +105,28 @@ public abstract class AbstractManagementContext 
implements ManagementContextInte
                 if (input instanceof EntityInternal) {
                     EntityInternal internal = (EntityInternal)input;
                     String inputCatalogItemId = internal.getCatalogItemId();
-                    if(inputCatalogItemId != null) {
-                        RegisteredType item = 
internal.getManagementContext().getTypeRegistry().get(internal.getCatalogItemId());
-
-                        if (item != null) {
-                            final List<String> searchPath = 
internal.getCatalogItemIdSearchPath();
-                            final ManagementContext managementContext = 
internal.getManagementContext();
-                            BrooklynClassLoadingContextSequential seqLoader =
-                                new 
BrooklynClassLoadingContextSequential(managementContext);
-                            
seqLoader.add(newClassLoadingContextForCatalogItems(managementContext, 
inputCatalogItemId, searchPath));
-                            JavaBrooklynClassLoadingContext entityLoader =
-                                
JavaBrooklynClassLoadingContext.create(input.getClass().getClassLoader());
-                            seqLoader.add(entityLoader);
-                            return seqLoader;
-                        } else {
+                    RegisteredType item = null;
+                    if (inputCatalogItemId != null) {
+                        item = 
internal.getManagementContext().getTypeRegistry().get(internal.getCatalogItemId());
+                        if (item==null) {
                             log.error("Can't find catalog item " + 
internal.getCatalogItemId() +
                                     " used for instantiating entity " + 
internal +
-                                    ". Falling back to application 
classpath.");
+                                    ". Falling back to search items and/or 
application classpath.");
                         }
                     }
+
+                    final List<String> searchPath = 
internal.getCatalogItemIdSearchPath();
+                    if (item != null || (searchPath!=null && 
!searchPath.isEmpty())) {
+                        final ManagementContext managementContext = 
internal.getManagementContext();
+                        BrooklynClassLoadingContextSequential seqLoader =
+                            new 
BrooklynClassLoadingContextSequential(managementContext);
+                        
seqLoader.add(newClassLoadingContextForCatalogItems(managementContext, 
inputCatalogItemId, searchPath));
+                        JavaBrooklynClassLoadingContext entityLoader =
+                            
JavaBrooklynClassLoadingContext.create(input.getClass().getClassLoader());
+                        seqLoader.add(entityLoader);
+                        return seqLoader;
+                    }
+
                     return apply(internal.getManagementSupport());
                 }
                 
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
 
b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
index 1e08d59e6e..7192e76d3b 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
@@ -74,6 +74,7 @@ public class SshWorkflowStep extends WorkflowStepDefinition {
             // TODO
             throw new IllegalStateException("Explicit endpoint not currently 
supported for ssh step");
         } else {
+            // TODO better errors if multiple
             machine = 
Locations.findUniqueSshMachineLocation(context.getEntity().getLocations()).orThrow("No
 SSH location available for workflow at "+context.getEntity()+" and no endpoint 
specified");
         }
 
diff --git 
a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java 
b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java
index b868c46764..6863fdf20a 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java
@@ -52,6 +52,7 @@ import 
org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
+import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.osgi.Osgis;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
@@ -122,6 +123,16 @@ public class ClassLoaderUtilsTest {
         assertLoadFails(classname, cluMgmt);
         assertLoadSucceeds(bundle.getSymbolicName() + ":" + classname, clazz, 
cluMgmt, cluClass, cluEntity);
         assertLoadSucceeds(bundle.getSymbolicName() + ":" + 
bundle.getVersion()+":" + classname, clazz, cluMgmt, cluClass, cluEntity);
+
+        // we can also load classpath url in the scope of the entity
+        
ResourceUtils.create(entity).getResourceAsString("classpath://"+classname.replaceAll("\\.",
 "/")+".class");
+        // (but not in global scope)
+        Asserts.assertFailsWith(() -> 
ResourceUtils.create(null).getResourceAsString("classpath://"+classname.replaceAll("\\.",
 "/")+".class"),
+            e -> Asserts.expectedFailureContainsIgnoreCase(e, "not found on 
classpath", "SimpleEntity"));
+
+        // test load still works when we have the item in the search path only 
but not a catalog item id on the entity
+        ((EntityInternal)entity).setCatalogItemIdAndSearchPath(null, 
MutableList.of(entity.getCatalogItemId()));
+        
ResourceUtils.create(entity).getResourceAsString("classpath://"+classname.replaceAll("\\.",
 "/")+".class");
     }
 
     @Test

Reply via email to