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