summaryrefslogtreecommitdiffstats
path: root/jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2019-10-05 00:06:55 +0200
committergjoranv <gv@verizonmedia.com>2019-10-16 11:41:33 +0200
commitaf771506b97cf996dd7c25053c07e1cc8f9eba99 (patch)
treee77bdc57d861ee747f4211e638a163f394472238 /jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java
parent685704ab391abc6efdb9577c24bdf7ed48333f8e (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.java21
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)) {