X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.init%2Fsrc%2Forg%2Fargeo%2Finit%2FService.java;h=cab85d02ff3e8eefa19317916ebf0de3f286af30;hb=6bf0278e427c0a9fe9d922fe19593b89892cb03e;hp=ef65d02cf14f46b35c805dc5ca5a8574c8136d63;hpb=dea32138f55d1c80f75515793ed15be0e89e6d61;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.init/src/org/argeo/init/Service.java b/org.argeo.init/src/org/argeo/init/Service.java index ef65d02cf..cab85d02f 100644 --- a/org.argeo.init/src/org/argeo/init/Service.java +++ b/org.argeo.init/src/org/argeo/init/Service.java @@ -1,67 +1,112 @@ package org.argeo.init; +import java.io.IOException; +import java.io.InputStream; import java.lang.System.Logger; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import org.argeo.init.logging.ThinLoggerFinder; +import org.argeo.init.osgi.OsgiBoot; import org.argeo.init.osgi.OsgiRuntimeContext; /** Configure and launch an Argeo service. */ -public class Service implements Runnable, AutoCloseable { - private final static Logger log = System.getLogger(Service.class.getName()); +public class Service { + private final static Logger logger = System.getLogger(Service.class.getName()); + + public final static String PROP_ARGEO_INIT_MAIN = "argeo.init.main"; private static RuntimeContext runtimeContext = null; protected Service(String[] args) { } - @Override - public void run() { - } - - @Override - public void close() throws Exception { - } - public static void main(String[] args) { - long pid = ProcessHandle.current().pid(); - log.log(Logger.Level.DEBUG, "Starting with PID " + pid); + final long pid = ProcessHandle.current().pid(); + logger.log(Logger.Level.DEBUG, () -> "Argeo Init starting with PID " + pid); // shutdown on exit Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { if (Service.runtimeContext != null) { +// System.out.println("Argeo Init stopping with PID " + pid); Service.runtimeContext.close(); - //Service.runtimeContext.waitForStop(0); + Service.runtimeContext.waitForStop(0); } } catch (Exception e) { e.printStackTrace(); - System.exit(1); + Runtime.getRuntime().halt(1); } }, "Runtime shutdown")); + // TODO use args as well + String dataArea = System.getProperty(OsgiBoot.PROP_OSGI_INSTANCE_AREA); + String stateArea = System.getProperty(OsgiBoot.PROP_OSGI_CONFIGURATION_AREA); + String configArea = System.getProperty(OsgiBoot.PROP_OSGI_SHARED_CONFIGURATION_AREA); + + if (configArea != null) { + Path configAreaPath = Paths.get(configArea); + Path additionalSystemPropertiesPath = configAreaPath.resolve("system.properties"); + if (Files.exists(additionalSystemPropertiesPath)) { + Properties properties = new Properties(); + try (InputStream in = Files.newInputStream(additionalSystemPropertiesPath)) { + properties.load(in); + } catch (IOException e) { + logger.log(Logger.Level.ERROR, + "Cannot load additional system properties " + additionalSystemPropertiesPath, e); + } + + for (Object key : properties.keySet()) { + String currentValue = System.getProperty(key.toString()); + String value = properties.getProperty(key.toString()); + if (currentValue != null) { + if (!Objects.equals(value, currentValue)) + logger.log(Logger.Level.WARNING, "System property " + key + " already set with value " + + currentValue + " instead of " + value + ". Ignoring new value."); + } else { + System.setProperty(key.toString(), value); + } + } + ThinLoggerFinder.reloadConfiguration(); + } + } + Map config = new HashMap<>(); - config.put("osgi.framework.useSystemProperties", "true"); -// for (Object key : System.getProperties().keySet()) { -// config.put(key.toString(), System.getProperty(key.toString())); -// log.log(Logger.Level.DEBUG, key + "=" + System.getProperty(key.toString())); -// } + config.put(PROP_ARGEO_INIT_MAIN, "true"); + try { - try (OsgiRuntimeContext osgiRuntimeContext = new OsgiRuntimeContext((Map) config)) { + try { + if (stateArea != null) + config.put(OsgiBoot.PROP_OSGI_CONFIGURATION_AREA, stateArea); + if (configArea != null) + config.put(OsgiBoot.PROP_OSGI_SHARED_CONFIGURATION_AREA, configArea); + if (dataArea != null) + config.put(OsgiBoot.PROP_OSGI_INSTANCE_AREA, dataArea); + // config.put(OsgiBoot.PROP_OSGI_USE_SYSTEM_PROPERTIES, "true"); + + OsgiRuntimeContext osgiRuntimeContext = new OsgiRuntimeContext(config); osgiRuntimeContext.run(); Service.runtimeContext = osgiRuntimeContext; Service.runtimeContext.waitForStop(0); } catch (NoClassDefFoundError e) { - try (StaticRuntimeContext staticRuntimeContext = new StaticRuntimeContext((Map) config)) { - staticRuntimeContext.run(); - Service.runtimeContext = staticRuntimeContext; - Service.runtimeContext.waitForStop(0); - } + StaticRuntimeContext staticRuntimeContext = new StaticRuntimeContext((Map) config); + staticRuntimeContext.run(); + Service.runtimeContext = staticRuntimeContext; + Service.runtimeContext.waitForStop(0); } } catch (Exception e) { e.printStackTrace(); System.exit(1); } + logger.log(Logger.Level.DEBUG, "Argeo Init stopped with PID " + pid); } + public static RuntimeContext getRuntimeContext() { + return runtimeContext; + } }