You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/07/04 11:50:55 UTC
[13/45] git commit: Incorporate loading from bundles into
BrooklynEntityClassResolver
Incorporate loading from bundles into BrooklynEntityClassResolver
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/494291d8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/494291d8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/494291d8
Branch: refs/heads/master
Commit: 494291d8029d6e5fa02f1444a3e5d218ca3ef902
Parents: b0bd808
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Mon Jun 30 13:19:51 2014 +0100
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Tue Jul 1 13:37:37 2014 +0100
----------------------------------------------------------------------
.../java/brooklyn/catalog/BrooklynCatalog.java | 2 ++
.../internal/CatalogItemDtoAbstract.java | 17 ++++++++--
.../management/osgi/OsgiStandaloneTest.java | 1 +
.../creation/BrooklynEntityClassResolver.java | 33 ++++++++++++++++++--
.../spi/creation/BrooklynYamlTypeLoader.java | 11 ++++---
5 files changed, 54 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/494291d8/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java b/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
index 622241f..720a2bc 100644
--- a/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
+++ b/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
@@ -13,6 +13,7 @@ public interface BrooklynCatalog {
/** returns all items in the catalog */
<T> Iterable<CatalogItem<T>> getCatalogItems();
+
/** convenience for filtering items in the catalog; see CatalogPredicates for useful filters */
<T> Iterable<CatalogItem<T>> getCatalogItems(Predicate<? super CatalogItem<T>> filter);
@@ -42,6 +43,7 @@ public interface BrooklynCatalog {
/** adds a classpath entry which will be used by the 'manual' catalog */
void addToClasspath(ClassLoader loader);
+
/** adds a classpath entry which will be used by the 'manual' catalog */
void addToClasspath(String url);
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/494291d8/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
index ad0fa71..043758b 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
@@ -1,11 +1,21 @@
package brooklyn.catalog.internal;
-import javax.annotation.Nullable;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
import brooklyn.catalog.CatalogItem;
public abstract class CatalogItemDtoAbstract<T> implements CatalogItem<T> {
-
+
+ private static final CatalogItemContext EMPTY_CONTEXT = new CatalogItemContext() {
+ @Override
+ public List<String> getBundles() {
+ return Collections.emptyList();
+ }
+ };
+
String id;
String type;
String name;
@@ -34,6 +44,7 @@ public abstract class CatalogItemDtoAbstract<T> implements CatalogItem<T> {
return iconUrl;
}
+ @Nonnull
@Override
public CatalogItemContext getContext() {
return context;
@@ -76,7 +87,7 @@ public abstract class CatalogItemDtoAbstract<T> implements CatalogItem<T> {
target.type = type;
target.name = name;
target.description = description;
- target.context = context;
+ target.context = context != null ? context : EMPTY_CONTEXT;
return target;
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/494291d8/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java b/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
index 7ffaf2d..2461f27 100644
--- a/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
+++ b/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
@@ -110,6 +110,7 @@ public class OsgiStandaloneTest {
Object result = aClass.getMethod("times", int.class).invoke(aInst, input);
Assert.assertEquals(result, output);
}
+
protected void setAMultiplier(Bundle bundle, int newMultiplier) throws Exception {
Assert.assertNotNull(bundle);
Class<?> aClass = bundle.loadClass("brooklyn.test.osgi.TestA");
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/494291d8/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityClassResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityClassResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityClassResolver.java
index 7e71bb5..df096dc 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityClassResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityClassResolver.java
@@ -2,6 +2,8 @@ package io.brooklyn.camp.brooklyn.spi.creation;
import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Collections;
+import java.util.List;
import java.util.NoSuchElementException;
import org.slf4j.Logger;
@@ -27,9 +29,33 @@ public class BrooklynEntityClassResolver {
* @throws java.lang.IllegalStateException if no class extending {@link Entity} is found
*/
public static <T extends Entity> Class<T> resolveEntity(String entityTypeName, ManagementContext mgmt) {
+ return resolveEntity(entityTypeName, mgmt, Collections.<String>emptyList());
+ }
+
+ /**
+ * Loads the class represented by entityTypeName with the given management context.
+ * Tries the context's catalogue first, then from its root classloader.
+ * @throws java.lang.IllegalStateException if no class extending {@link Entity} is found
+ */
+ public static <T extends Entity> Class<T> resolveEntity(String entityTypeName, ManagementContext mgmt, List<String> context) {
checkNotNull(mgmt, "management context");
- Maybe<Class<T>> entityClazz = tryLoadEntityFromCatalogue(entityTypeName, mgmt);
- if (!entityClazz.isPresent()) entityClazz = tryLoadFromClasspath(entityTypeName, mgmt);
+ Maybe<Class<T>> entityClazz = Maybe.absent();
+ // TODO: What if context not empty but class not found? Throw?
+ if (context != null) {
+ for (String bundleUrl : context) {
+ entityClazz = tryLoadEntityFromBundle(entityTypeName, bundleUrl, mgmt);
+ if (entityClazz.isPresent()) {
+ break;
+ }
+ }
+ }
+
+ if (!entityClazz.isPresent()) {
+ entityClazz = tryLoadEntityFromCatalogue(entityTypeName, mgmt);
+ }
+ if (!entityClazz.isPresent()) {
+ entityClazz = tryLoadFromClasspath(entityTypeName, mgmt);
+ }
if (!entityClazz.isPresent()) {
LOG.warn("No catalog item for {} and could not load class directly; throwing", entityTypeName);
throw new IllegalStateException("Unable to load class "+ entityTypeName +" (extending Entity) from catalogue or classpath: not found");
@@ -43,6 +69,7 @@ public class BrooklynEntityClassResolver {
/** Tries to load the entity with the given class name from the given bundle. */
public static <T extends Entity> Maybe<Class<T>> tryLoadEntityFromBundle(String entityTypeName, String bundleUrl, ManagementContext mgmt) {
+ LOG.debug("Trying to resolve class {} from bundle {}", entityTypeName, bundleUrl);
Maybe<OsgiManager> osgiManager = ((ManagementContextInternal) mgmt).getOsgiManager();
if (!osgiManager.isPresentAndNonNull()) {
LOG.debug("Asked to resolve class {} from bundle {} but osgi manager is unavailable in context {}",
@@ -58,6 +85,7 @@ public class BrooklynEntityClassResolver {
@SuppressWarnings("unchecked")
public static <T extends Entity> Maybe<Class<T>> tryLoadEntityFromCatalogue(String entityTypeName, ManagementContext mgmt) {
+ LOG.debug("Trying to resolve class {} from catalog", entityTypeName);
try {
return (Maybe<Class<T>>)(Maybe<?>) Maybe.<Class<? extends Entity>>of(mgmt.getCatalog().loadClassByType(entityTypeName, Entity.class));
} catch (NoSuchElementException e) {
@@ -68,6 +96,7 @@ public class BrooklynEntityClassResolver {
@SuppressWarnings("unchecked")
public static <T> Maybe<Class<T>> tryLoadFromClasspath(String typeName, ManagementContext mgmt) {
+ LOG.debug("Trying to resolve class {} from classpath", typeName);
Class<T> clazz;
try {
clazz = (Class<T>) mgmt.getCatalog().getRootClassLoader().loadClass(typeName);
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/494291d8/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeLoader.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeLoader.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeLoader.java
index 77c8580..747e507 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeLoader.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeLoader.java
@@ -15,6 +15,7 @@ import brooklyn.util.config.ConfigBag;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.guava.Maybe;
import brooklyn.util.javalang.Reflections;
+import brooklyn.util.osgi.Osgis;
import com.google.common.annotations.Beta;
import com.google.common.base.Optional;
@@ -167,23 +168,23 @@ public abstract class BrooklynYamlTypeLoader {
return loadClass(type, getTypeName().get(), factory.mgmt, factory.contextForLogging);
}
- /**
+ /**
* TODO in future will want OSGi-based resolver here (eg create from osgi:<bundle>: prefix
* would use that OSGi mechanism here
*/
@SuppressWarnings("unchecked")
private static <T> Class<T> loadClass(@Nullable Class<T> optionalSupertype, String typeName, ManagementContext mgmt, Object otherContext) {
try {
- if (optionalSupertype!=null && Entity.class.isAssignableFrom(optionalSupertype))
+ if (optionalSupertype != null && Entity.class.isAssignableFrom(optionalSupertype))
return (Class<T>) BrooklynEntityClassResolver.<Entity>resolveEntity(typeName, mgmt);
else
return BrooklynEntityClassResolver.<T>tryLoadFromClasspath(typeName, mgmt).get();
} catch (Exception e) {
Exceptions.propagateIfFatal(e);
- log.warn("Unable to resolve "+typeName+" in spec "+otherContext);
+ log.warn("Unable to resolve " + typeName + " in spec " + otherContext);
throw Exceptions.propagate(new IllegalStateException("Unable to resolve "
- + (optionalSupertype!=null ? optionalSupertype.getSimpleName()+" " : "")
- + "type '"+typeName+"'", e));
+ + (optionalSupertype != null ? optionalSupertype.getSimpleName() + " " : "")
+ + "type '" + typeName + "'", e));
}
}