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:50 UTC
[08/45] git commit: Ground work to load classes from bundles in
blueprints
Ground work to load classes from bundles in blueprints
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/06c10c43
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/06c10c43
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/06c10c43
Branch: refs/heads/master
Commit: 06c10c4318374009d1b8e0ed5b314d5481a40c7c
Parents: 79ebcc3
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Thu Jun 26 14:28:24 2014 +0100
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Tue Jul 1 13:37:37 2014 +0100
----------------------------------------------------------------------
.../java/brooklyn/event/feed/ssh/SshFeed.java | 2 +-
.../brooklyn/management/ha/OsgiManager.java | 16 ++++++++++++++
.../internal/LocalManagementContext.java | 5 +++--
.../internal/ManagementContextInternal.java | 5 +++--
.../NonDeploymentManagementContext.java | 4 ++--
.../src/main/java/brooklyn/util/osgi/Osgis.java | 15 +++++++------
.../BrooklynAssemblyTemplateInstantiator.java | 17 ++++++++++++---
.../creation/BrooklynEntityClassResolver.java | 23 +++++++++++++++++---
8 files changed, 67 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/core/src/main/java/brooklyn/event/feed/ssh/SshFeed.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/ssh/SshFeed.java b/core/src/main/java/brooklyn/event/feed/ssh/SshFeed.java
index 7492f75..ab3df25 100644
--- a/core/src/main/java/brooklyn/event/feed/ssh/SshFeed.java
+++ b/core/src/main/java/brooklyn/event/feed/ssh/SshFeed.java
@@ -168,7 +168,7 @@ public class SshFeed extends AbstractFeed {
// Treat as immutable once built
private final SetMultimap<SshPollIdentifier, SshPollConfig<?>> polls = HashMultimap.<SshPollIdentifier,SshPollConfig<?>>create();
-
+
/** @deprecated since 0.7.0, use static convenience on {@link Locations} */
@Deprecated
public static SshMachineLocation getMachineOfEntity(Entity entity) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/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 07400ec..c161190 100644
--- a/core/src/main/java/brooklyn/management/ha/OsgiManager.java
+++ b/core/src/main/java/brooklyn/management/ha/OsgiManager.java
@@ -9,6 +9,7 @@ import brooklyn.config.BrooklynServerConfig;
import brooklyn.config.ConfigKey;
import brooklyn.util.collections.MutableMap;
import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.guava.Maybe;
import brooklyn.util.os.Os;
import brooklyn.util.osgi.Osgis;
@@ -45,4 +46,19 @@ public class OsgiManager {
framework = null;
}
+ // TODO: throws BundleException appropriate?
+ public void registerBundle(String bundleUrl) throws BundleException {
+ Osgis.install(framework, bundleUrl);
+ }
+
+ // TODO: Handle .get failing
+ public <T> Maybe<Class<T>> tryResolveClass(String bundleUrl, String type) {
+ try {
+ Class<T> clazz = (Class<T>) Osgis.getBundle(framework, bundleUrl).get().loadClass(type);
+ return Maybe.of(clazz);
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ return Maybe.absent(e);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
index 0d3deb9..4b70799 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
@@ -36,6 +36,7 @@ import brooklyn.management.SubscriptionManager;
import brooklyn.management.Task;
import brooklyn.management.ha.OsgiManager;
import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.guava.Maybe;
import brooklyn.util.task.BasicExecutionContext;
import brooklyn.util.task.BasicExecutionManager;
import brooklyn.util.text.Strings;
@@ -255,9 +256,9 @@ public class LocalManagementContext extends AbstractManagementContext {
}
@Override
- public synchronized OsgiManager getOsgiManager() {
+ public synchronized Maybe<OsgiManager> getOsgiManager() {
if (!isRunning()) throw new IllegalStateException("Management context no longer running");
- return osgiManager;
+ return Maybe.of(osgiManager);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java b/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java
index fb50641..4707a7f 100644
--- a/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java
+++ b/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java
@@ -19,6 +19,7 @@ import brooklyn.location.Location;
import brooklyn.management.ManagementContext;
import brooklyn.management.Task;
import brooklyn.management.ha.OsgiManager;
+import brooklyn.util.guava.Maybe;
import brooklyn.util.task.TaskTags;
public interface ManagementContextInternal extends ManagementContext {
@@ -59,9 +60,9 @@ public interface ManagementContextInternal extends ManagementContext {
UsageManager getUsageManager();
- /** returns OSGi manager, if available; may be null if OSGi not supported, e.g. in test contexts
+ /** returns OSGi manager, if available; may be absent if OSGi not supported, e.g. in test contexts
* (but major contexts will support this) */
- OsgiManager getOsgiManager();
+ Maybe<OsgiManager> getOsgiManager();
InternalEntityFactory getEntityFactory();
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
index 61826ef..5c9278c 100644
--- a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
+++ b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
@@ -178,8 +178,8 @@ public class NonDeploymentManagementContext implements ManagementContextInternal
}
@Override
- public OsgiManager getOsgiManager() {
- return null;
+ public Maybe<OsgiManager> getOsgiManager() {
+ return Maybe.absent();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/core/src/main/java/brooklyn/util/osgi/Osgis.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/osgi/Osgis.java b/core/src/main/java/brooklyn/util/osgi/Osgis.java
index 2cfc5a7..5edca46 100644
--- a/core/src/main/java/brooklyn/util/osgi/Osgis.java
+++ b/core/src/main/java/brooklyn/util/osgi/Osgis.java
@@ -13,6 +13,8 @@ import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.osgi.framework.launch.Framework;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import brooklyn.util.ResourceUtils;
import brooklyn.util.collections.MutableList;
@@ -33,13 +35,13 @@ import com.google.common.base.Predicates;
@Beta
public class Osgis {
+ private static final Logger LOG = LoggerFactory.getLogger(Osgis.class);
+
public static List<Bundle> getBundlesByName(Framework framework, String symbolicName, Predicate<Version> versionMatcher) {
List<Bundle> result = MutableList.of();
for (Bundle b: framework.getBundleContext().getBundles()) {
- if (symbolicName.equals(b.getSymbolicName())) {
- if (versionMatcher.apply(b.getVersion())) {
- result.add(b);
- }
+ if (symbolicName.equals(b.getSymbolicName()) && versionMatcher.apply(b.getVersion())) {
+ result.add(b);
}
}
return result;
@@ -115,7 +117,7 @@ public class Osgis {
try {
framework.init();
// nothing needs auto-loading, currently (and this needs a new dependency)
-// AutoProcessor.process(configProps, m_fwk.getBundleContext());
+ // AutoProcessor.process(configProps, m_fwk.getBundleContext());
framework.start();
} catch (Exception e) {
// framework bundle start exceptions are not interesting to caller...
@@ -128,12 +130,11 @@ public class Osgis {
* using the {@link ResourceUtils} loader for this project (brooklyn core) */
public static Bundle install(Framework framework, String url) throws BundleException {
Bundle bundle = framework.getBundleContext().getBundle(url);
- if (bundle!=null) return bundle;
+ if (bundle != null) return bundle;
// use our URL resolution so we get classpath items
InputStream stream = ResourceUtils.create(Osgis.class).getResourceFromUrl(url);
return framework.getBundleContext().installBundle(url, stream);
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/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 4ec821f..a06d716 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
@@ -53,7 +53,7 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateIns
Application app = create(template, platform);
Task<?> task = start(app, platform);
log.info("CAMP created "+app+"; starting in "+task);
- return ((BrooklynCampPlatform)platform).assemblies().get(app.getApplicationId());
+ return platform.assemblies().get(app.getApplicationId());
}
// note: based on BrooklynRestResourceUtils, but modified to not allow child entities (yet)
@@ -65,6 +65,18 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateIns
BrooklynCatalog catalog = mgmt.getCatalog();
CatalogItem<?> item = catalog.getCatalogItem(template.getId());
+ if (item == null) {
+ // This doesn't seem the most appropriate way to do this!
+ // Especially since YAML will only reach here if a services section was given (so that
+ // PdpProcessor calls into BrooklynEntityMatcher [via applyMatchers] which sets the
+ // instantiator to BrooklynAssemblyTemplateInstantiator). So services must be given
+ // but will be disregarded.
+ Object customId = template.getCustomAttributes().get("id");
+ if (customId != null) {
+ item = catalog.getCatalogItem(customId.toString());
+ }
+ }
+
if (item==null) {
return createApplicationFromNonCatalogCampTemplate(template, platform);
} else {
@@ -139,8 +151,7 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateIns
}
private ManagementContext getBrooklynManagementContext(CampPlatform platform) {
- ManagementContext mgmt = ((HasBrooklynManagementContext)platform).getBrooklynManagementContext();
- return mgmt;
+ return ((HasBrooklynManagementContext)platform).getBrooklynManagementContext();
}
public Task<?> start(Application app, CampPlatform platform) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/06c10c43/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 fe560da..7e71bb5 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
@@ -9,6 +9,8 @@ import org.slf4j.LoggerFactory;
import brooklyn.entity.Entity;
import brooklyn.management.ManagementContext;
+import brooklyn.management.ha.OsgiManager;
+import brooklyn.management.internal.ManagementContextInternal;
import brooklyn.util.guava.Maybe;
/**
@@ -20,7 +22,7 @@ public class BrooklynEntityClassResolver {
private static final Logger LOG = LoggerFactory.getLogger(BrooklynEntityClassResolver.class);
/**
- * Loads the class represented by {@link #entityType} with the given management context.
+ * 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
*/
@@ -36,7 +38,22 @@ public class BrooklynEntityClassResolver {
LOG.warn("Found class {} on classpath but it is not assignable to {}", entityTypeName, Entity.class);
throw new IllegalStateException("Unable to load class "+ entityTypeName +" (extending Entity) from catalogue or classpath: wrong type "+entityClazz.get());
}
- return (Class<T>) entityClazz.get();
+ return entityClazz.get();
+ }
+
+ /** 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) {
+ Maybe<OsgiManager> osgiManager = ((ManagementContextInternal) mgmt).getOsgiManager();
+ if (!osgiManager.isPresentAndNonNull()) {
+ LOG.debug("Asked to resolve class {} from bundle {} but osgi manager is unavailable in context {}",
+ new Object[]{entityTypeName, bundleUrl, mgmt});
+ return Maybe.absent();
+ }
+ Maybe<Class<T>> clazz = osgiManager.get().tryResolveClass(bundleUrl, entityTypeName);
+ if (!clazz.isPresent() || !Entity.class.isAssignableFrom(clazz.get())) {
+ return Maybe.absent();
+ }
+ return clazz;
}
@SuppressWarnings("unchecked")
@@ -59,6 +76,6 @@ public class BrooklynEntityClassResolver {
return Maybe.absent(new Throwable("Could not find "+typeName+" on classpath"));
}
- return Maybe.<Class<T>>of(clazz);
+ return Maybe.of(clazz);
}
}