404390 Rework EquinoxUtils to no longer use Equinox internal API
Getting the bundle classloader is done with BundleWiring now.
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxUtils.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxUtils.java
index 1bc62f2..dc2a8c8 100644
--- a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxUtils.java
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxUtils.java
@@ -11,12 +11,9 @@
package org.eclipse.virgo.kernel.userregion.internal.equinox;
-import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
-import org.eclipse.osgi.framework.internal.core.BundleHost;
-import org.eclipse.osgi.internal.loader.BundleLoader;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.service.resolver.ExportPackageDescription;
import org.eclipse.osgi.service.resolver.PlatformAdmin;
@@ -24,6 +21,7 @@
import org.eclipse.virgo.kernel.osgi.framework.BundleClassLoaderUnavailableException;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.wiring.BundleWiring;
/**
* Utility methods for working with Equinox internals.
@@ -42,33 +40,14 @@
* @param bundle the bundle.
* @return the bundle <code>ClassLoader</code>.
*/
- public static ClassLoader getBundleClassLoader(Bundle bundle) {
- ClassLoader classLoader = null;
- if (BundleHost.class.isAssignableFrom(bundle.getClass())) {
- BundleHost bundleHost = (BundleHost) bundle;
-
- Class<?>[] parmTypes = {};
- Method checkLoaderMethod;
- try {
- checkLoaderMethod = BundleHost.class.getDeclaredMethod("checkLoader", parmTypes);
- Object[] args = {};
- checkLoaderMethod.setAccessible(true);
- BundleLoader bundleLoader = (BundleLoader) checkLoaderMethod.invoke(bundleHost, args);
-
- if (bundleLoader == null) {
- throw new IllegalStateException("Unable to access BundleLoader for bundle '" + bundle.getSymbolicName() + "'.");
- }
-
- Method createClassLoaderMethod = BundleLoader.class.getDeclaredMethod("createClassLoader", parmTypes);
- createClassLoaderMethod.setAccessible(true);
-
- classLoader = (ClassLoader) createClassLoaderMethod.invoke(bundleLoader, args);
- } catch (Exception e) {
- throw new BundleClassLoaderUnavailableException("Failed to get class loader for bundle '" + bundle
- + "' - possible resolution problem.", e);
- }
+ static ClassLoader getBundleClassLoader(Bundle bundle) {
+ // TODO is there a way to get the ClassLoader when the bundle is in state installed?
+ BundleWiring wiring = bundle.adapt(BundleWiring.class);
+ if (wiring == null) {
+ throw new BundleClassLoaderUnavailableException("Failed to get class loader for bundle '" + bundle
+ + "' - maybe not started or possible resolution problem.");
}
- return classLoader;
+ return wiring.getClassLoader();
}
/**
@@ -95,12 +74,12 @@
* @param includeFragments whether to include fragments or no
* @return an array of {@link Bundle}s which are direct dependencies
*/
- public static Bundle[] getDirectDependencies(Bundle bundle, BundleContext bundleContext, PlatformAdmin serverAdmin, boolean includeFragments) {
+ static Bundle[] getDirectDependencies(Bundle bundle, BundleContext bundleContext, PlatformAdmin serverAdmin, boolean includeFragments) {
State state = serverAdmin.getState(false);
ExportPackageDescription[] exportPackageDescriptions = serverAdmin.getStateHelper().getVisiblePackages(state.getBundle(bundle.getBundleId()));
- Set<Bundle> dependencies = new HashSet<Bundle>();
+ Set<Bundle> dependencies = new HashSet<>();
for (ExportPackageDescription exportPackageDescription : exportPackageDescriptions) {
BundleDescription bundleDescription = exportPackageDescription.getExporter();
@@ -122,7 +101,7 @@
}
}
- return dependencies.toArray(new Bundle[dependencies.size()]);
+ return dependencies.toArray(new Bundle[0]);
}
/**
@@ -131,7 +110,7 @@
* @param bundle the <code>Bundle</code>.
* @return <code>true</code> if <code>bundle</code> is the system bundle, otherwise <code>false</code>.
*/
- public static boolean isSystemBundle(Bundle bundle) {
+ static boolean isSystemBundle(Bundle bundle) {
return bundle != null && bundle.getBundleId() == 0;
}
}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFrameworkTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFrameworkTests.java
index 774f94a..c6a1ad0 100644
--- a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFrameworkTests.java
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFrameworkTests.java
@@ -66,6 +66,7 @@
@Test
public void testAddClassFileTransformer() throws Exception {
Bundle bundle = installSpringCore(this.framework);
+ bundle.start();
ClassLoader bundleClassLoader = this.framework.getBundleClassLoader(bundle);
assertNotNull(bundleClassLoader);
InstrumentableClassLoader icl = (InstrumentableClassLoader) bundleClassLoader;
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoaderTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoaderTests.java
index 91b4bb7..5a4404c 100644
--- a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoaderTests.java
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoaderTests.java
@@ -76,6 +76,7 @@
@Before
public void installDependant() throws BundleException {
this.dependant = this.framework.getBundleContext().installBundle(new File("src/test/resources/KernelBundleClassLoaderTests/dependant.jar").toURI().toString());
+ this.dependant.start();
}
@After
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/LoadTimeWeavingTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/LoadTimeWeavingTests.java
index 5570fa0..b3317f6 100644
--- a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/LoadTimeWeavingTests.java
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/LoadTimeWeavingTests.java
@@ -54,6 +54,7 @@
this.framework.getBundleContext().installBundle(new File("src/test/resources/ltw/ltw-domain.jar").toURI().toString());
this.includeBundle = this.framework.getBundleContext().installBundle(new File("src/test/resources/ltw/ltw-include.jar").toURI().toString());
this.emBundle = this.framework.getBundleContext().installBundle(new File("src/test/resources/ltw/ltw-em.jar").toURI().toString());
+ this.emBundle.start();
}
@Test public void instrumentPackageIncludes() throws ClassNotFoundException {