BROOKLYN-379: Fix osgi resolveClass to strip bundle prefix Without this, RebindOsgiTest.testUsesCatalogBundleVersion fails
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/6e68d74e Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/6e68d74e Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/6e68d74e Branch: refs/heads/master Commit: 6e68d74e043e38fed811bba03a5218b32469dc66 Parents: a72d1f2 Author: Aled Sage <aled.s...@gmail.com> Authored: Mon Nov 7 18:03:30 2016 +0000 Committer: Aled Sage <aled.s...@gmail.com> Committed: Fri Nov 25 23:28:19 2016 +0000 ---------------------------------------------------------------------- .../org/apache/brooklyn/core/mgmt/ha/OsgiManager.java | 13 +++++++++---- .../brooklyn/core/mgmt/persist/OsgiClassPrefixer.java | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6e68d74e/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java index 56d98a0..d58dbad 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java @@ -34,6 +34,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.BrooklynVersion; +import org.apache.brooklyn.core.mgmt.persist.OsgiClassPrefixer; import org.apache.brooklyn.core.server.BrooklynServerConfig; import org.apache.brooklyn.core.server.BrooklynServerPaths; import org.apache.brooklyn.util.collections.MutableMap; @@ -53,6 +54,7 @@ import org.osgi.framework.launch.Framework; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; @@ -64,12 +66,14 @@ public class OsgiManager { /* see Osgis for info on starting framework etc */ - protected ManagementContext mgmt; + protected final ManagementContext mgmt; + protected final OsgiClassPrefixer osgiClassPrefixer; protected Framework framework; protected File osgiCacheDir; - + public OsgiManager(ManagementContext mgmt) { this.mgmt = mgmt; + this.osgiClassPrefixer = new OsgiClassPrefixer(); } public void start() { @@ -189,10 +193,11 @@ public class OsgiManager { Maybe<Bundle> bundle = findBundle(osgiBundle); if (bundle.isPresent()) { Bundle b = bundle.get(); - Class<T> clazz; + Optional<String> strippedType = osgiClassPrefixer.stripMatchingPrefix(b, type); + String typeToLoad = strippedType.isPresent() ? strippedType.get() : type; //Extension bundles don't support loadClass. //Instead load from the app classpath. - clazz = SystemFrameworkLoader.get().loadClassFromBundle(type, b); + Class<T> clazz = SystemFrameworkLoader.get().loadClassFromBundle(typeToLoad, b); return Maybe.of(clazz); } else { bundleProblems.put(osgiBundle, Maybe.getException(bundle)); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6e68d74e/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/OsgiClassPrefixer.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/OsgiClassPrefixer.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/OsgiClassPrefixer.java index a76c02a..c1650f4 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/OsgiClassPrefixer.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/OsgiClassPrefixer.java @@ -48,4 +48,12 @@ public class OsgiClassPrefixer { } return Optional.absent(); } + + public Optional<String> stripMatchingPrefix(Bundle bundle, String type) { + String symbolicName = bundle.getSymbolicName(); + if (symbolicName != null && type.startsWith(symbolicName + ":")) { + return Optional.of(type.substring((symbolicName + ":").length())); + } + return Optional.absent(); + } }