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:26 UTC
[13/50] git commit: Register boot brooklyn bundles found on the
classpath.
Register boot brooklyn bundles found on the classpath.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/a0e6684e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/a0e6684e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/a0e6684e
Branch: refs/heads/master
Commit: a0e6684e29004002094365070cc22a8186dd07a3
Parents: d39b0e0
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Fri Jul 4 20:46:42 2014 +0300
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Jul 9 22:34:43 2014 +0100
----------------------------------------------------------------------
.../src/main/java/brooklyn/util/osgi/Osgis.java | 54 ++++++++++++++++++++
.../management/osgi/OsgiStandaloneTest.java | 23 +++++++++
2 files changed, 77 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a0e6684e/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 1f668a4..24a1360 100644
--- a/core/src/main/java/brooklyn/util/osgi/Osgis.java
+++ b/core/src/main/java/brooklyn/util/osgi/Osgis.java
@@ -23,6 +23,11 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.jar.Manifest;
@@ -53,6 +58,7 @@ import com.google.common.annotations.Beta;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.collect.Iterators;
/**
* utilities for working with osgi.
@@ -63,6 +69,7 @@ import com.google.common.base.Predicates;
@Beta
public class Osgis {
+ private static final String BROOKLYN_PACKAGE_PREFIX = "brooklyn.";
private static final Logger LOG = LoggerFactory.getLogger(Osgis.class);
public static List<Bundle> getBundlesByName(Framework framework, String symbolicName, Predicate<Version> versionMatcher) {
@@ -150,6 +157,7 @@ public class Osgis {
Map<Object,Object> cfg = MutableMap.copyOf(extraStartupConfig);
if (clean) cfg.put(Constants.FRAMEWORK_STORAGE_CLEAN, "onFirstInit");
if (felixCacheDir!=null) cfg.put(Constants.FRAMEWORK_STORAGE, felixCacheDir);
+ cfg.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, getBrooklynBootBundles());
FrameworkFactory factory = newFrameworkFactory();
Framework framework = factory.newFramework(cfg);
@@ -165,6 +173,45 @@ public class Osgis {
return framework;
}
+ private static String getBrooklynBootBundles() {
+ Enumeration<URL> resources;
+ try {
+ resources = Osgis.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
+ } catch (IOException e) {
+ throw Exceptions.propagate(e);
+ }
+
+ Collection<String> exportPackages = new ArrayList<String>();
+ while(resources.hasMoreElements()) {
+ URL url = resources.nextElement();
+ exportPackages.addAll(getBundleExportedPackages(url));
+ }
+
+ Iterator<String> brooklynPackages = Iterators.filter(exportPackages.iterator(), new Predicate<String>() {
+ @Override
+ public boolean apply(String input) {
+ return input.startsWith(BROOKLYN_PACKAGE_PREFIX);
+ }
+ });
+
+ String bootBundles = Joiner.on(",").join(brooklynPackages);
+ LOG.debug("Found the following boot OSGi packages: " + bootBundles);
+ return bootBundles;
+ }
+
+ private static Collection<String> getBundleExportedPackages(URL manifestUrl) {
+ try {
+ ManifestHelper helper = ManifestHelper.forManifest(manifestUrl);
+ return helper.getExportedPackages();
+ } catch (IOException e) {
+ LOG.warn("Unable to load manifest from " + manifestUrl + ", ignoring.", e);
+ } catch (BundleException e) {
+ LOG.warn("Unable to load manifest from " + manifestUrl + ", ignoring.", e);
+ }
+ return Collections.emptyList();
+ }
+
+
/**
* Installs a bundle from the given URL, doing a check if already installed, and
* using the {@link ResourceUtils} loader for this project (brooklyn core)
@@ -195,6 +242,13 @@ public class Osgis {
return result;
}
+ public static ManifestHelper forManifest(URL url) throws IOException, BundleException {
+ InputStream in = url.openStream();
+ ManifestHelper helper = forManifest(in);
+ in.close();
+ return helper;
+ }
+
public static ManifestHelper forManifest(InputStream in) throws IOException, BundleException {
return forManifest(new Manifest(in));
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a0e6684e/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 8b8bb0d..baecf96 100644
--- a/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
+++ b/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
@@ -20,9 +20,11 @@ package brooklyn.management.osgi;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.List;
+import java.util.jar.JarInputStream;
import org.apache.commons.io.FileUtils;
import org.osgi.framework.Bundle;
@@ -52,9 +54,11 @@ import brooklyn.util.stream.Streams;
* */
public class OsgiStandaloneTest {
+
private static final Logger log = LoggerFactory.getLogger(OsgiStandaloneTest.class);
public static final String BROOKLYN_OSGI_TEST_A_0_1_0_URL = "classpath:///brooklyn/osgi/brooklyn-osgi-test-a_0.1.0.jar";
+ private static final String BROOKLYN_TESTS_OSGI_ENTITIES_0_1_0_URL = "/brooklyn/osgi/brooklyn-tests-osgi-entities-0.1.0.jar";
protected Framework framework = null;
private File storageTempDir;
@@ -161,4 +165,23 @@ public class OsgiStandaloneTest {
Assert.assertTrue(allPackages.contains(Osgis.class.getPackage().getName()));
}
+ @Test
+ public void testReadKnownManifest() throws Exception {
+ InputStream in = this.getClass().getResourceAsStream(BROOKLYN_TESTS_OSGI_ENTITIES_0_1_0_URL);
+ JarInputStream jarIn = new JarInputStream(in);
+ ManifestHelper helper = Osgis.ManifestHelper.forManifest(jarIn.getManifest());
+ jarIn.close();
+ Assert.assertEquals(helper.getVersion().toString(), "0.1.0");
+ Assert.assertTrue(helper.getExportedPackages().contains("brooklyn.osgi.tests"));
+ }
+
+ @Test
+ public void testLoadOsgiBundleDependencies() throws Exception {
+ Bundle bundle = install("classpath:/" + BROOKLYN_TESTS_OSGI_ENTITIES_0_1_0_URL);
+ Assert.assertNotNull(bundle);
+ Class<?> aClass = bundle.loadClass("brooklyn.osgi.tests.SimpleApplicationImpl");
+ Object aInst = aClass.newInstance();
+ Assert.assertNotNull(aInst);
+ }
+
}