X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.init%2Fsrc%2Forg%2Fargeo%2Finit%2Fosgi%2FOsgiRuntimeContext.java;h=2e8c1042ca7d20e21d749fecd7eb418833f9f07b;hb=faeeb8f0ba92b640942d88782ca6f5cfc332597e;hp=268fb221b3e54796d46cea0775ba2e35bdf62258;hpb=f92ba77466d18fcd0e7a9386ae0f16b530337f9f;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java b/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java index 268fb221b..2e8c1042c 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java @@ -14,12 +14,12 @@ import java.util.function.Consumer; import java.util.function.Supplier; import org.argeo.api.init.RuntimeContext; -import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.connect.ConnectFrameworkFactory; import org.osgi.framework.launch.Framework; -import org.osgi.framework.launch.FrameworkFactory; /** An OSGi runtime context. */ public class OsgiRuntimeContext implements RuntimeContext, AutoCloseable { @@ -28,8 +28,9 @@ public class OsgiRuntimeContext implements RuntimeContext, AutoCloseable { private final static long STOP_FOR_UPDATE_TIMEOUT = 60 * 1000; private final static long CLOSE_TIMEOUT = 60 * 1000; - private final static String SYMBOLIC_NAME_FELIX_SCR = "org.apache.felix.scr"; + // private final static String SYMBOLIC_NAME_FELIX_SCR = "org.apache.felix.scr"; + private ConnectFrameworkFactory frameworkFactory; private Map config; private Framework framework; // private OsgiBoot osgiBoot; @@ -38,7 +39,8 @@ public class OsgiRuntimeContext implements RuntimeContext, AutoCloseable { * Constructor to use when the runtime context will create the OSGi * {@link Framework}. */ - public OsgiRuntimeContext(Map config) { + public OsgiRuntimeContext(ConnectFrameworkFactory frameworkFactory, Map config) { + this.frameworkFactory = frameworkFactory; this.config = config; } @@ -56,16 +58,18 @@ public class OsgiRuntimeContext implements RuntimeContext, AutoCloseable { throw new IllegalStateException("OSGi framework is already started"); if (framework == null) { - ServiceLoader sl = ServiceLoader.load(FrameworkFactory.class); - Optional opt = sl.findFirst(); - if (opt.isEmpty()) - throw new IllegalStateException("Cannot find OSGi framework"); - framework = opt.get().newFramework(config); +// ServiceLoader sl = ServiceLoader.load(FrameworkFactory.class); +// Optional opt = sl.findFirst(); +// if (opt.isEmpty()) +// throw new IllegalStateException("Cannot find OSGi framework"); +// framework = opt.get().newFramework(config); + framework = frameworkFactory.newFramework(config, null); } try { framework.start(); BundleContext bundleContext = framework.getBundleContext(); + bundleContext.registerService(ConnectFrameworkFactory.class, frameworkFactory, null); start(bundleContext); } catch (BundleException e) { throw new IllegalStateException("Cannot start OSGi framework", e); @@ -101,7 +105,7 @@ public class OsgiRuntimeContext implements RuntimeContext, AutoCloseable { Thread osgiBootThread = new Thread("OSGi boot framework " + frameworkUuuid) { @Override public void run() { - osgiBoot.bootstrap(config); + osgiBoot.bootstrap(); } }; osgiBootThread.start(); @@ -190,4 +194,23 @@ public class OsgiRuntimeContext implements RuntimeContext, AutoCloseable { return framework; } + /** + * Load {@link ConnectFrameworkFactory} from Java service loader. This will not + * work within a pure OSGi runtime, so the reference should be passed to child + * runtimes as an OSGi service. + */ + public static ConnectFrameworkFactory loadFrameworkFactory() { + ServiceLoader sl = ServiceLoader.load(ConnectFrameworkFactory.class); + Optional opt = sl.findFirst(); + if (opt.isEmpty()) + throw new IllegalStateException("Cannot find OSGi framework factory"); + return opt.get(); + } + + public static ConnectFrameworkFactory getFrameworkFactory(BundleContext bundleContext) { + ServiceReference sr = bundleContext.getServiceReference(ConnectFrameworkFactory.class); + if (sr == null) + return null; + return bundleContext.getService(sr); + } }