You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2014/07/09 23:46:42 UTC

[29/50] git commit: switch ResourceUtils so it can use BrooklynClassLoadingContext, and extend BCLC so it can support getResource, and use a ResourceUtils with item-specific BCLC when resolving icons, with test in CatalogResourceTest). (this is just one

switch ResourceUtils so it can use BrooklynClassLoadingContext, and extend BCLC so it can support getResource, and use a ResourceUtils with item-specific BCLC when resolving icons, with test in CatalogResourceTest).
(this is just one place of many that i expect we will have to do some tweaking to ResourceUtils, but it confirms/shows how it can be done elsewhere)


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

Branch: refs/heads/master
Commit: ab91c9e7cf499854f7b893b21d230d486ad5e656
Parents: 68e2d19
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Jul 8 06:50:10 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Jul 9 22:34:45 2014 +0100

----------------------------------------------------------------------
 .../BrooklynClassLoadingContext.java            |  5 ++
 .../BrooklynClassLoadingContextSequential.java  | 15 ++++++
 .../JavaBrooklynClassLoadingContext.java        | 12 ++++-
 .../OsgiBrooklynClassLoadingContext.java        | 12 +++++
 .../brooklyn/management/ha/OsgiManager.java     | 21 ++++++++
 .../internal/AbstractManagementContext.java     | 13 +++--
 .../main/java/brooklyn/util/ResourceUtils.java  | 54 ++++++++++++++++----
 .../BrooklynAssemblyTemplateInstantiator.java   |  1 -
 usage/cli/src/main/java/brooklyn/cli/Main.java  |  3 +-
 .../rest/resources/CatalogResource.java         |  2 +-
 .../rest/resources/CatalogResourceTest.java     |  9 ++--
 11 files changed, 124 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/api/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContext.java b/api/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContext.java
index 290876b..cba2bc5 100644
--- a/api/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContext.java
+++ b/api/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContext.java
@@ -1,5 +1,7 @@
 package brooklyn.management.classloading;
 
+import java.net.URL;
+
 import javax.annotation.Nullable;
 
 import brooklyn.management.ManagementContext;
@@ -18,4 +20,7 @@ public interface BrooklynClassLoadingContext {
     public Maybe<Class<?>> tryLoadClass(String className);
     public <T> Maybe<Class<? extends T>> tryLoadClass(String className, @Nullable Class<T> supertype);
     
+    /** as {@link ClassLoader#getResource(String)} */
+    public URL getResource(String name);
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/core/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContextSequential.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContextSequential.java b/core/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContextSequential.java
index cb79b1c..7889de4 100644
--- a/core/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContextSequential.java
+++ b/core/src/main/java/brooklyn/management/classloading/BrooklynClassLoadingContextSequential.java
@@ -1,5 +1,6 @@
 package brooklyn.management.classloading;
 
+import java.net.URL;
 import java.util.List;
 import java.util.Set;
 
@@ -61,6 +62,20 @@ public final class BrooklynClassLoadingContextSequential extends AbstractBrookly
         return Maybe.absent("Unable to load "+className+" from "+primaries);
     }
 
+
+    @Override
+    public URL getResource(String resourceInThatDir) {
+        for (BrooklynClassLoadingContext target: primaries) {
+            URL result = target.getResource(resourceInThatDir);
+            if (result!=null) return result;
+        }
+        for (BrooklynClassLoadingContext target: secondaries) {
+            URL result = target.getResource(resourceInThatDir);
+            if (result!=null) return result;
+        }
+        return null;
+    }
+
     @Override
     public String toString() {
         return "classload:"+primaries+";"+secondaries;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/core/src/main/java/brooklyn/management/classloading/JavaBrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/classloading/JavaBrooklynClassLoadingContext.java b/core/src/main/java/brooklyn/management/classloading/JavaBrooklynClassLoadingContext.java
index 8cae3be..bc6b4d2 100644
--- a/core/src/main/java/brooklyn/management/classloading/JavaBrooklynClassLoadingContext.java
+++ b/core/src/main/java/brooklyn/management/classloading/JavaBrooklynClassLoadingContext.java
@@ -1,5 +1,7 @@
 package brooklyn.management.classloading;
 
+import java.net.URL;
+
 import com.google.common.base.Objects;
 
 import brooklyn.management.ManagementContext;
@@ -16,7 +18,10 @@ public class JavaBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
     }
     
     public static JavaBrooklynClassLoadingContext newDefault(ManagementContext mgmt) {
-        return new JavaBrooklynClassLoadingContext(mgmt, JavaBrooklynClassLoadingContext.class.getClassLoader());
+        ClassLoader cl = null;
+        if (mgmt!=null) cl = mgmt.getCatalog().getRootClassLoader();
+        if (cl==null) cl = JavaBrooklynClassLoadingContext.class.getClassLoader();
+        return new JavaBrooklynClassLoadingContext(mgmt, cl);
     }
 
     @SuppressWarnings({ "rawtypes", "unchecked" })
@@ -46,5 +51,10 @@ public class JavaBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
         if (!Objects.equal(loader, ((JavaBrooklynClassLoadingContext)obj).loader)) return false;
         return true;
     }
+
+    @Override
+    public URL getResource(String name) {
+        return loader.getResource(name);
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java b/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
index 5065078..7011354 100644
--- a/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
+++ b/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
@@ -1,5 +1,6 @@
 package brooklyn.management.classloading;
 
+import java.net.URL;
 import java.util.List;
 
 import brooklyn.management.ManagementContext;
@@ -60,5 +61,16 @@ public class OsgiBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
         if (!Objects.equal(bundles, ((OsgiBrooklynClassLoadingContext)obj).bundles)) return false;
         return true;
     }
+
+    @Override
+    public URL getResource(String name) {
+        if (mgmt!=null) {
+            Maybe<OsgiManager> osgi = ((ManagementContextInternal)mgmt).getOsgiManager();
+            if (osgi.isPresent() && bundles!=null && !bundles.isEmpty()) {
+                return osgi.get().getResource(name, bundles);
+            }
+        }
+        return null;
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/core/src/main/java/brooklyn/management/ha/OsgiManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/ha/OsgiManager.java b/core/src/main/java/brooklyn/management/ha/OsgiManager.java
index c4b94d8..d0447c8 100644
--- a/core/src/main/java/brooklyn/management/ha/OsgiManager.java
+++ b/core/src/main/java/brooklyn/management/ha/OsgiManager.java
@@ -19,6 +19,7 @@
 package brooklyn.management.ha;
 
 import java.io.File;
+import java.net.URL;
 import java.util.Arrays;
 import java.util.Map;
 
@@ -124,4 +125,24 @@ public class OsgiManager {
         return Maybe.absent("Unable to resolve class "+type+": "+bundleProblems);
     }
 
+    public URL getResource(String name, Iterable<String> bundleUrlsOrNameVersionString) {
+        for (String bundleUrlOrNameVersionString: bundleUrlsOrNameVersionString) {
+            try {
+                String bundleNameVersion = bundleUrlToNameVersionString.get(bundleUrlOrNameVersionString);
+                if (bundleNameVersion==null) {
+                    bundleNameVersion = bundleUrlOrNameVersionString;
+                }
+                
+                Maybe<Bundle> bundle = Osgis.getBundle(framework, bundleNameVersion);
+                if (bundle.isPresent()) {
+                    URL result = bundle.get().getResource(name);
+                    if (result!=null) return result;
+                }
+            } catch (Throwable e) {
+                Exceptions.propagateIfFatal(e);
+            }
+        }
+        return null;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/core/src/main/java/brooklyn/management/internal/AbstractManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/AbstractManagementContext.java b/core/src/main/java/brooklyn/management/internal/AbstractManagementContext.java
index cb636e8..55399cd 100644
--- a/core/src/main/java/brooklyn/management/internal/AbstractManagementContext.java
+++ b/core/src/main/java/brooklyn/management/internal/AbstractManagementContext.java
@@ -58,8 +58,11 @@ import brooklyn.internal.storage.impl.inmemory.InMemoryDataGridFactory;
 import brooklyn.location.LocationRegistry;
 import brooklyn.location.basic.BasicLocationRegistry;
 import brooklyn.management.ExecutionContext;
+import brooklyn.management.ManagementContext;
 import brooklyn.management.SubscriptionContext;
 import brooklyn.management.Task;
+import brooklyn.management.classloading.BrooklynClassLoadingContext;
+import brooklyn.management.classloading.JavaBrooklynClassLoadingContext;
 import brooklyn.management.entitlement.EntitlementManager;
 import brooklyn.management.entitlement.Entitlements;
 import brooklyn.management.ha.HighAvailabilityManager;
@@ -111,15 +114,17 @@ public abstract class AbstractManagementContext implements ManagementContextInte
     static {
         // ensure that if ResourceUtils is given an entity as context,
         // we use the catalog class loader (e.g. to resolve classpath URLs)
-        ResourceUtils.addClassLoaderProvider(new Function<Object, ClassLoader>() {
+        ResourceUtils.addClassLoaderProvider(new Function<Object, BrooklynClassLoadingContext>() {
             @Override
-            public ClassLoader apply(@Nullable Object input) {
+            public BrooklynClassLoadingContext apply(@Nullable Object input) {
+                // TODO for entities, this should get its originating catalog item's loader
                 if (input instanceof EntityInternal)
                     return apply(((EntityInternal)input).getManagementSupport());
+                
                 if (input instanceof EntityManagementSupport)
                     return apply(((EntityManagementSupport)input).getManagementContext());
-                if (input instanceof AbstractManagementContext)
-                    return ((AbstractManagementContext)input).getCatalog().getRootClassLoader();
+                if (input instanceof ManagementContext)
+                    return JavaBrooklynClassLoadingContext.newDefault((ManagementContext) input);
                 return null;
             }
         });

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/core/src/main/java/brooklyn/util/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/ResourceUtils.java b/core/src/main/java/brooklyn/util/ResourceUtils.java
index b39199d..bdda6df 100644
--- a/core/src/main/java/brooklyn/util/ResourceUtils.java
+++ b/core/src/main/java/brooklyn/util/ResourceUtils.java
@@ -38,7 +38,11 @@ import java.util.regex.Pattern;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
 import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.management.ManagementContext;
+import brooklyn.management.classloading.BrooklynClassLoadingContext;
+import brooklyn.management.classloading.JavaBrooklynClassLoadingContext;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.javalang.Threads;
@@ -56,9 +60,9 @@ import com.google.common.collect.Lists;
 public class ResourceUtils {
     
     private static final Logger log = LoggerFactory.getLogger(ResourceUtils.class);
-    private static final List<Function<Object,ClassLoader>> classLoaderProviders = Lists.newCopyOnWriteArrayList();
+    private static final List<Function<Object,BrooklynClassLoadingContext>> classLoaderProviders = Lists.newCopyOnWriteArrayList();
 
-    private ClassLoader loader = null;
+    private BrooklynClassLoadingContext loader = null;
     private String context = null;
     private Object contextObject = null;
     
@@ -77,6 +81,20 @@ public class ResourceUtils {
     }
 
     /**
+     * Creates a {@link ResourceUtils} object with a specific class loader and context.
+     * <p>
+     * Use the provided {@link BrooklynClassLoadingContext} object for class loading with the
+     * {@code contextObject} for context and the {@code contextMessage} string for
+     * error messages.
+     *
+     * @see ResourceUtils#create(Object, String)
+     * @see ResourceUtils#create(Object)
+     */
+    public static final ResourceUtils create(BrooklynClassLoadingContext loader, Object contextObject, String contextMessage) {
+        return new ResourceUtils(loader, contextObject, contextMessage);
+    }
+
+    /**
      * Creates a {@link ResourceUtils} object with the given context.
      * <p>
      * Uses the {@link ClassLoader} of the given {@code contextObject} for class
@@ -113,13 +131,16 @@ public class ResourceUtils {
     }
 
     public ResourceUtils(ClassLoader loader, Object contextObject, String contextMessage) {
+    }
+    
+    public ResourceUtils(BrooklynClassLoadingContext loader, Object contextObject, String contextMessage) {
         this.loader = loader;
         this.contextObject = contextObject;
         this.context = contextMessage;
     }
 
     public ResourceUtils(Object contextObject, String contextMessage) {
-        this(contextObject==null ? null : getClassLoaderForObject(contextObject), contextObject, contextMessage);
+        this(contextObject==null ? null : getClassLoadingContextForObject(contextObject), contextObject, contextMessage);
     }
 
     public ResourceUtils(Object contextObject) {
@@ -127,23 +148,34 @@ public class ResourceUtils {
     }
     
     /** used to register custom mechanisms for getting classloaders given an object */
-    public static void addClassLoaderProvider(Function<Object,ClassLoader> provider) {
+    public static void addClassLoaderProvider(Function<Object,BrooklynClassLoadingContext> provider) {
         classLoaderProviders.add(provider);
     }
     
-    public static ClassLoader getClassLoaderForObject(Object contextObject) {
-        for (Function<Object,ClassLoader> provider: classLoaderProviders) {
-            ClassLoader result = provider.apply(contextObject);
+    public static BrooklynClassLoadingContext getClassLoadingContextForObject(Object contextObject) {
+        if (contextObject instanceof BrooklynClassLoadingContext)
+            return (BrooklynClassLoadingContext) contextObject;
+        
+        for (Function<Object,BrooklynClassLoadingContext> provider: classLoaderProviders) {
+            BrooklynClassLoadingContext result = provider.apply(contextObject);
             if (result!=null) return result;
         }
-        return contextObject instanceof Class ? ((Class<?>)contextObject).getClassLoader() : 
+        
+        ClassLoader cl = contextObject instanceof Class ? ((Class<?>)contextObject).getClassLoader() : 
             contextObject instanceof ClassLoader ? ((ClassLoader)contextObject) : 
                 contextObject.getClass().getClassLoader();
+        return getClassLoadingContextForClassLoader(cl);
+    }
+    
+    protected static BrooklynClassLoadingContext getClassLoadingContextForClassLoader(ClassLoader loader) {
+        ManagementContext mgmt = null;
+        BrooklynClassLoadingContext bl = BrooklynLoaderTracker.getLoader();
+        if (bl!=null) mgmt = bl.getManagementContext();
+        return new JavaBrooklynClassLoadingContext(mgmt, loader);
     }
     
-    public ClassLoader getLoader() {
-        //TODO allow a sequence of loaders?
-        return (loader!=null ? loader : getClass().getClassLoader());
+    public BrooklynClassLoadingContext getLoader() {
+        return (loader!=null ? loader : getClassLoadingContextForClassLoader(getClass().getClassLoader()));
     }
     
     /**

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
index 8d73ccc..604d8bf 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@ -293,7 +293,6 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateSpe
     @SuppressWarnings("unchecked")
     protected EntitySpec<? extends Application> createApplicationFromNonCatalogCampTemplate(AssemblyTemplate template, CampPlatform platform, BrooklynClassLoadingContext loader) {
         // AssemblyTemplates created via PDP, _specifying_ then entities to put in
-        final ManagementContext mgmt = getBrooklynManagementContext(platform);
 
         BrooklynComponentTemplateResolver resolver = BrooklynComponentTemplateResolver.Factory.newInstance(
             loader, template);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/usage/cli/src/main/java/brooklyn/cli/Main.java
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/java/brooklyn/cli/Main.java b/usage/cli/src/main/java/brooklyn/cli/Main.java
index 7ec5cba..ae2696d 100644
--- a/usage/cli/src/main/java/brooklyn/cli/Main.java
+++ b/usage/cli/src/main/java/brooklyn/cli/Main.java
@@ -372,8 +372,7 @@ public class Main {
                 computeLocations();
                 
                 ResourceUtils utils = ResourceUtils.create(this);
-                ClassLoader parent = utils.getLoader();
-                GroovyClassLoader loader = new GroovyClassLoader(parent);
+                GroovyClassLoader loader = new GroovyClassLoader(getClass().getClassLoader());
     
                 // First, run a setup script if the user has provided one
                 if (script != null) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
index 1bfae95..3b8843d 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
@@ -173,7 +173,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
             log.debug("Loading and returning "+url+" as icon for "+result);
             
             MediaType mime = WebResourceUtils.getImageMediaTypeFromExtension(Files.getFileExtension(url));
-            Object content = ResourceUtils.create(brooklyn().getCatalog().getRootClassLoader()).getResourceFromUrl(url);
+            Object content = ResourceUtils.create(result.newClassLoadingContext(mgmt())).getResourceFromUrl(url);
             return Response.ok(content, mime).build();
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab91c9e7/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
index 6745037..6dd5d7c 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
@@ -66,7 +66,7 @@ public class CatalogResourceTest extends BrooklynRestResourceTest {
   }
 
   @Test
-  public void testRegisterCustomEntityWithBundleWhereEntityIsFromCore() {
+  public void testRegisterCustomEntityWithBundleWhereEntityIsFromCoreAndIconFromBundle() {
     String registeredTypeName = "my.catalog.app.id";
     String bundleUrl = OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL;
     String yaml =
@@ -76,7 +76,7 @@ public class CatalogResourceTest extends BrooklynRestResourceTest {
         "  id: " + registeredTypeName + "\n"+
         "  name: My Catalog App\n"+
         "  description: My description\n"+
-        "  icon_url: classpath://path/to/myicon.jpg\n"+
+        "  icon_url: classpath:/brooklyn/osgi/tests/icon.gif\n"+
         "  version: 0.1.2\n"+
         "  libraries:\n"+
         "  - url: " + bundleUrl + "\n"+
@@ -111,7 +111,10 @@ public class CatalogResourceTest extends BrooklynRestResourceTest {
     assertEquals(entityItem.getName(), "My Catalog App");
     assertEquals(entityItem.getDescription(), "My description");
     assertEquals(entityItem.getIconUrl(), "/v1/catalog/icon/my.catalog.app.id");
-    assertEquals(item.getIconUrl(), "classpath://path/to/myicon.jpg");
+    assertEquals(item.getIconUrl(), "classpath:/brooklyn/osgi/tests/icon.gif");
+    
+    byte[] iconData = client().resource("/v1/catalog/icon/"+registeredTypeName).get(byte[].class);
+    log.info("ICON: "+new String(iconData));
   }
 
   @Test