diff options
author | gjoranv <gv@verizonmedia.com> | 2019-10-05 00:06:55 +0200 |
---|---|---|
committer | gjoranv <gv@verizonmedia.com> | 2019-10-16 11:41:33 +0200 |
commit | af771506b97cf996dd7c25053c07e1cc8f9eba99 (patch) | |
tree | e77bdc57d861ee747f4211e638a163f394472238 /jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java | |
parent | 685704ab391abc6efdb9577c24bdf7ed48333f8e (diff) |
Allow duplicate bsn+version for a given set of bundles.
- Set 'org.osgi.framework.bsnversion' to 'managed'
- Add bundle collision/event hook to handle duplicates and their
lifecycle.
- Add unit tests for duplicate bundles.
o Add bundle 'l1-dup' which is a duplicate of the existing 'l1',
but returns a different value from its implemented class.
o Add bundle 'ml-dup' that is exactly the same as 'ml'
Diffstat (limited to 'jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java')
-rw-r--r-- | jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java b/jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java index 96fc0c91d2d..6c382153944 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java @@ -15,6 +15,7 @@ import org.osgi.framework.wiring.FrameworkWiring; import java.io.File; import java.util.Arrays; +import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -26,6 +27,7 @@ import java.util.logging.Logger; /** * @author Simon Thoresen Hult + * @author gjoranv */ public class FelixFramework implements OsgiFramework { @@ -35,11 +37,14 @@ public class FelixFramework implements OsgiFramework { private final ConsoleLogManager logListener; private final Felix felix; + private final BundleCollisionHook collisionHook; + @Inject public FelixFramework(FelixParams params) { deleteDirContents(new File(params.getCachePath())); felix = new Felix(params.toConfig()); logListener = params.isLoggerEnabled() ? new ConsoleLogManager() : null; + collisionHook = new BundleCollisionHook(); } @Override @@ -48,6 +53,7 @@ public class FelixFramework implements OsgiFramework { felix.start(); BundleContext ctx = felix.getBundleContext(); + collisionHook.start(ctx); logService.start(ctx); logHandler.install(ctx); if (logListener != null) { @@ -65,6 +71,7 @@ public class FelixFramework implements OsgiFramework { } logHandler.uninstall(); logService.stop(); + collisionHook.stop(); } felix.stop(); try { @@ -90,8 +97,8 @@ public class FelixFramework implements OsgiFramework { for (Bundle bundle : bundles) { if (!privileged && OsgiHeader.isSet(bundle, OsgiHeader.PRIVILEGED_ACTIVATOR)) { log.log(Level.INFO, "OSGi bundle '" + bundle.getSymbolicName() + "' " + - "states that it requires privileged " + - "initialization, but privileges are not available. YMMV."); + "states that it requires privileged " + + "initialization, but privileges are not available. YMMV."); } if (bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null) { continue; // fragments can not be started @@ -102,7 +109,7 @@ public class FelixFramework implements OsgiFramework { } private String startedBundlesMessage(List<Bundle> bundles) { - StringBuilder sb = new StringBuilder("Started bundles: {" ); + StringBuilder sb = new StringBuilder("Started bundles: {"); for (Bundle b : bundles) sb.append("[" + b.getBundleId() + "]" + b.getSymbolicName() + ":" + b.getVersion() + ", "); sb.setLength(sb.length() - 2); @@ -127,9 +134,9 @@ public class FelixFramework implements OsgiFramework { }); try { long TIMEOUT_SECONDS = 60L; - if ( ! latch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS)) { + if (!latch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS)) { log.warning("No PACKAGES_REFRESHED FrameworkEvent received within " + TIMEOUT_SECONDS + - " seconds of calling FrameworkWiring.refreshBundles()"); + " seconds of calling FrameworkWiring.refreshBundles()"); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -146,6 +153,10 @@ public class FelixFramework implements OsgiFramework { return Arrays.asList(felix.getBundleContext().getBundles()); } + public void allowDuplicateBundles(Collection<Bundle> bundles) { + collisionHook.allowDuplicateBundles(bundles); + } + private void installBundle(String bundleLocation, Set<String> mask, List<Bundle> out) throws BundleException { bundleLocation = BundleLocationResolver.resolve(bundleLocation); if (mask.contains(bundleLocation)) { |