X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.init%2Fsrc%2Forg%2Fargeo%2Finit%2Fosgi%2FOsgiRuntimeContext.java;h=186577b4dba40dda3ee7169b0d2bb4c863489c10;hb=38c49024a04a79f275bfcee6098b7ec44fab2157;hp=7f44f6b2746dccc914312180b493d56e7328ce3c;hpb=1010bff4f1ffadbf3f7988fbd3eba70f5d672c88;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 7f44f6b27..186577b4d 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java @@ -1,5 +1,6 @@ package org.argeo.init.osgi; +import java.lang.System.LoggerFinder; import java.util.Collections; import java.util.Hashtable; import java.util.Map; @@ -11,29 +12,32 @@ import java.util.function.Consumer; import org.argeo.init.RuntimeContext; import org.argeo.init.logging.ThinLoggerFinder; +import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.Constants; -import org.osgi.framework.ServiceRegistration; import org.osgi.framework.launch.Framework; import org.osgi.framework.launch.FrameworkFactory; /** An OSGi runtime context. */ -public class OsgiRuntimeContext implements RuntimeContext { +public class OsgiRuntimeContext implements RuntimeContext, AutoCloseable { private Map config; private Framework framework; private OsgiBoot osgiBoot; - @SuppressWarnings("rawtypes") - private ServiceRegistration loggingConfigurationSr; - @SuppressWarnings("rawtypes") - private ServiceRegistration logEntryPublisherSr; - + /** + * Constructor to use when the runtime context will create the OSGi + * {@link Framework}. + */ public OsgiRuntimeContext(Map config) { this.config = config; } - public OsgiRuntimeContext(BundleContext bundleContext) { + /** + * Constructor to use when the OSGi {@link Framework} has been created by other + * means. + */ + OsgiRuntimeContext(BundleContext bundleContext) { start(bundleContext); } @@ -54,16 +58,21 @@ public class OsgiRuntimeContext implements RuntimeContext { } public void start(BundleContext bundleContext) { + // preferences +// SystemRootPreferences systemRootPreferences = ThinPreferencesFactory.getInstance().getSystemRootPreferences(); +// bundleContext.registerService(AbstractPreferences.class, systemRootPreferences, new Hashtable<>()); + + // Make sure LoggerFinder has been searched for, since it is lazily loaded + LoggerFinder.getLoggerFinder(); + // logging - loggingConfigurationSr = bundleContext.registerService(Consumer.class, - ThinLoggerFinder.getConfigurationConsumer(), + bundleContext.registerService(Consumer.class, ThinLoggerFinder.getConfigurationConsumer(), new Hashtable<>(Collections.singletonMap(Constants.SERVICE_PID, "argeo.logging.configuration"))); - logEntryPublisherSr = bundleContext.registerService(Flow.Publisher.class, - ThinLoggerFinder.getLogEntryPublisher(), + bundleContext.registerService(Flow.Publisher.class, ThinLoggerFinder.getLogEntryPublisher(), new Hashtable<>(Collections.singletonMap(Constants.SERVICE_PID, "argeo.logging.publisher"))); osgiBoot = new OsgiBoot(bundleContext); - osgiBoot.bootstrap(); + osgiBoot.bootstrap(config); } @@ -73,25 +82,47 @@ public class OsgiRuntimeContext implements RuntimeContext { } public void stop(BundleContext bundleContext) { - if (loggingConfigurationSr != null) - loggingConfigurationSr.unregister(); - if (logEntryPublisherSr != null) - logEntryPublisherSr.unregister(); - +// if (loggingConfigurationSr != null) +// try { +// loggingConfigurationSr.unregister(); +// } catch (Exception e) { +// // silent +// } +// if (logEntryPublisherSr != null) +// try { +// logEntryPublisherSr.unregister(); +// } catch (Exception e) { +// // silent +// } } @Override public void waitForStop(long timeout) throws InterruptedException { if (framework == null) throw new IllegalStateException("Framework is not initialised"); - stop(framework.getBundleContext()); + framework.waitForStop(timeout); } - @Override public void close() throws Exception { + // TODO make shutdown of dynamic service more robust + Bundle scrBundle = osgiBoot.getBundlesBySymbolicName().get("org.apache.felix.scr"); + if (scrBundle != null) { + scrBundle.stop(); + while (!(scrBundle.getState() <= Bundle.RESOLVED)) { + Thread.sleep(500); + } + Thread.sleep(1000); + } + + stop(framework.getBundleContext()); if (framework != null) framework.stop(); + + } + + public Framework getFramework() { + return framework; } }