package org.argeo.init.osgi; import java.lang.System.Logger; import java.lang.System.Logger.Level; import java.lang.reflect.InvocationTargetException; import java.util.Objects; import org.argeo.api.init.RuntimeManager; import org.argeo.init.logging.ThinLoggerFinder; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import org.osgi.framework.connect.ConnectFrameworkFactory; import org.osgi.framework.launch.Framework; /** * An OSGi configurator. See * http: * //wiki.eclipse.org/Configurator */ public class InitActivator implements BundleActivator { static { // must be called first ThinLoggerFinder.lazyInit(); } private final static Logger logger = System.getLogger(InitActivator.class.getName()); private Long checkpoint = null; // TODO use framework factory SR // @Deprecated // private boolean argeoInit = false; /** Not null if we created it ourselves. */ private OsgiRuntimeContext runtimeContext; private ServiceRegistration frameworkFactorySr = null; private static OsgiRuntimeManager runtimeManager; public void start(final BundleContext bundleContext) throws Exception { ConnectFrameworkFactory frameworkFactory = OsgiRuntimeContext.getFrameworkFactory(bundleContext); if (frameworkFactory == null) { // argeoInit = false; frameworkFactory = newFrameworkFactory(); frameworkFactorySr = bundleContext.registerService(ConnectFrameworkFactory.class, frameworkFactory, null); } // The OSGi runtime was created by us, and therefore already initialized // argeoInit = Boolean.parseBoolean(bundleContext.getProperty(ServiceMain.PROP_ARGEO_INIT_MAIN)); if (!isArgeoInit()) { if (runtimeContext == null) { runtimeContext = new OsgiRuntimeContext(bundleContext); logger.log(Level.DEBUG, () -> "Argeo init via OSGi activator"); } // admin thread // Thread adminThread = new AdminThread(bundleContext); // adminThread.start(); // bootstrap // OsgiBoot osgiBoot = new OsgiBoot(bundleContext); if (checkpoint == null) { // osgiBoot.bootstrap(); checkpoint = System.currentTimeMillis(); } else { runtimeContext.update(); checkpoint = System.currentTimeMillis(); } } else { if (runtimeManager != null) throw new IllegalArgumentException("Runtime manager is already set"); runtimeManager = new OsgiRuntimeManager(bundleContext); } } public void stop(BundleContext context) throws Exception { if (!isArgeoInit()) { frameworkFactorySr.unregister(); Objects.nonNull(runtimeContext); runtimeContext.stop(context); runtimeContext = null; } runtimeManager = null; } /** Whether it wa sinitialised by an Argeo Init main class. */ private boolean isArgeoInit() { return frameworkFactorySr == null; } public static RuntimeManager getRuntimeManager() { return runtimeManager; } /** * Workaround to explicitly instantiate an Equinox * {@link ConnectFrameworkFactory} when running in a pure OSGi runtime. */ private ConnectFrameworkFactory newFrameworkFactory() { final String EQUINOX_FRAMEWORK_FACTORY_CLASS = "org.eclipse.osgi.launch.EquinoxFactory"; try { @SuppressWarnings("unchecked") Class frameworkFactoryClass = (Class) Framework.class .getClassLoader().loadClass(EQUINOX_FRAMEWORK_FACTORY_CLASS); return frameworkFactoryClass.getConstructor().newInstance(); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { throw new IllegalStateException("Cannot create OSGi framework factory", e); } } }