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);
+    }
+    
 }