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 {