diff --git a/bundles/org.eclipse.osgi/META-INF/services/org.osgi.framework.connect.FrameworkUtilHelper b/bundles/org.eclipse.osgi/META-INF/services/org.osgi.framework.connect.FrameworkUtilHelper new file mode 100644 index 00000000000..aff953ccd7a --- /dev/null +++ b/bundles/org.eclipse.osgi/META-INF/services/org.osgi.framework.connect.FrameworkUtilHelper @@ -0,0 +1 @@ +org.eclipse.osgi.internal.framework.ConnectFrameworkUtilHelper \ No newline at end of file diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/ConnectFrameworkUtilHelper.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/ConnectFrameworkUtilHelper.java new file mode 100644 index 00000000000..f7702b4985a --- /dev/null +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/ConnectFrameworkUtilHelper.java @@ -0,0 +1,26 @@ +package org.eclipse.osgi.internal.framework; + +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.osgi.framework.Bundle; +import org.osgi.framework.connect.FrameworkUtilHelper; + +public class ConnectFrameworkUtilHelper implements FrameworkUtilHelper { + static final Set connectHelpers = ConcurrentHashMap.newKeySet(); + + @Override + public Optional getBundle(Class classFromBundle) { + return connectHelpers.stream().filter(Objects::nonNull) + .flatMap(helper -> helper.getBundle(classFromBundle).stream()).findFirst(); + } + + public static void add(FrameworkUtilHelper moduleConnector) { + connectHelpers.add(moduleConnector); + } + + public static void remove(FrameworkUtilHelper moduleConnector) { + connectHelpers.remove(moduleConnector); + } +} diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java index 0f7beb764c0..264223ca425 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java @@ -25,6 +25,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; @@ -57,6 +58,7 @@ import org.osgi.framework.FrameworkUtil; import org.osgi.framework.connect.ConnectContent; import org.osgi.framework.connect.ConnectModule; +import org.osgi.framework.connect.FrameworkUtilHelper; import org.osgi.framework.connect.ModuleConnector; import org.osgi.util.tracker.ServiceTracker; @@ -154,6 +156,9 @@ private static void initConnectFramework(ModuleConnector moduleConnector, Equino final File fwkStore = new File(configUrl.getPath()); @SuppressWarnings({"rawtypes", "unchecked"}) Map config = (Map) equinoxConfig.getInitialConfig(); + if (moduleConnector instanceof FrameworkUtilHelper) { + ConnectFrameworkUtilHelper.add((FrameworkUtilHelper) moduleConnector); + } moduleConnector.initialize(fwkStore, Collections.unmodifiableMap(config)); } @@ -174,6 +179,13 @@ public EquinoxLogServices getLogServices() { } public Bundle getBundle(Class clazz) { + if (connectModules.moduleConnector instanceof FrameworkUtilHelper) { + FrameworkUtilHelper helper = (FrameworkUtilHelper) connectModules.moduleConnector; + Optional bundle = helper.getBundle(clazz); + if (bundle.isPresent()) { + return bundle.get(); + } + } Bundle b = FrameworkUtil.getBundle(clazz); if (b != null) { return b; @@ -214,6 +226,10 @@ public boolean isProcessClassRecursionSupportedByAll() { } void init() { + if (connectModules.moduleConnector instanceof FrameworkUtilHelper) { + FrameworkUtilHelper helper = (FrameworkUtilHelper) connectModules.moduleConnector; + ConnectFrameworkUtilHelper.add(helper); + } eventPublisher.init(); synchronized (this.monitor) { serviceRegistry = new ServiceRegistry(this); @@ -240,6 +256,12 @@ void close() { currentStorage.close(); // Must be done last since it will result in termination of the // framework active thread. + if (connectModules.moduleConnector instanceof FrameworkUtilHelper) { + FrameworkUtilHelper helper = (FrameworkUtilHelper) connectModules.moduleConnector; + currentExecutor.execute(() -> { + ConnectFrameworkUtilHelper.remove(helper); + }); + } currentExecutor.shutdown(); }