Improve nested OSGi runtimes
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / osgi / ForeignBundleClassLoader.java
diff --git a/org.argeo.init/src/org/argeo/init/osgi/ForeignBundleClassLoader.java b/org.argeo.init/src/org/argeo/init/osgi/ForeignBundleClassLoader.java
new file mode 100644 (file)
index 0000000..545dbd1
--- /dev/null
@@ -0,0 +1,45 @@
+package org.argeo.init.osgi;
+
+import java.util.Optional;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.wiring.BundleWiring;
+
+/**
+ * A {@link ClassLoader} based on a {@link Bundle} from another OSGi runtime.
+ */
+class ForeignBundleClassLoader extends ClassLoader {// implements BundleReference {
+       private BundleContext localBundleContext;
+       private Bundle foreignBundle;
+
+       public ForeignBundleClassLoader(BundleContext localBundleContext, Bundle foreignBundle) {
+               super("Foreign bundle " + foreignBundle.toString(), Optional.ofNullable(foreignBundle.adapt(BundleWiring.class))
+                               .map((bw) -> bw.getClassLoader()).orElse(null));
+               this.localBundleContext = localBundleContext;
+               this.foreignBundle = foreignBundle;
+       }
+
+//             @Override
+       protected Bundle getBundle() {
+               return localBundleContext.getBundle(foreignBundle.getLocation());
+       }
+
+//             @Override
+//             public URL getResource(String resName) {
+//                     URL res = super.getResource(resName);
+//                     return res;
+//             }
+//
+//             @Override
+//             protected URL findResource(String resName) {
+//                     Bundle localBundle = getBundle();
+//                     if (localBundle != null) {
+//                             URL res = localBundle.getEntry(resName);
+//                             if (res != null)
+//                                     return res;
+//                     }
+//                     return null;
+//             }
+
+}