X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.init%2Fsrc%2Forg%2Fargeo%2Finit%2FRuntimeManagerMain.java;h=f4ed507c07b37229cd73b8ccbd376deadcef8f22;hb=c7b612ca9bd7df43b0bec37c8abcae846587c978;hp=5a8331dfeeeb2cf2b4b0e32f2fd6139a7d860838;hpb=4f899ffcfd5652eb13748535353d2bd09f568bbc;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.init/src/org/argeo/init/RuntimeManagerMain.java b/org.argeo.init/src/org/argeo/init/RuntimeManagerMain.java index 5a8331dfe..f4ed507c0 100644 --- a/org.argeo.init/src/org/argeo/init/RuntimeManagerMain.java +++ b/org.argeo.init/src/org/argeo/init/RuntimeManagerMain.java @@ -2,19 +2,14 @@ package org.argeo.init; import static org.argeo.api.init.InitConstants.SYMBOLIC_NAME_INIT; -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; import java.lang.System.Logger; import java.lang.System.Logger.Level; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Map; -import java.util.Properties; import java.util.TreeMap; import java.util.function.Consumer; @@ -22,11 +17,10 @@ import org.argeo.api.init.InitConstants; import org.argeo.api.init.RuntimeContext; import org.argeo.api.init.RuntimeManager; import org.argeo.init.logging.ThinLoggerFinder; +import org.argeo.init.osgi.OsgiBoot; import org.argeo.init.osgi.OsgiRuntimeContext; import org.argeo.internal.init.InternalState; -import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.launch.Framework; @@ -43,19 +37,20 @@ public class RuntimeManagerMain implements RuntimeManager { private final static long RUNTIME_SHUTDOWN_TIMEOUT = 60 * 1000; - private final static String JVM_ARGS = "jvm.args"; - private Path baseConfigArea; - private Path baseStateArea; + private Path baseWritableArea; private Map configuration = new HashMap<>(); private Map runtimeContexts = new TreeMap<>(); RuntimeManagerMain(Path configArea, Path stateArea) { - loadConfig(configArea, configuration); - configuration.put(InitConstants.PROP_OSGI_CONFIGURATION_AREA, stateArea.toUri().toString()); + RuntimeManager.loadConfig(configArea, configuration); + configuration.put(InitConstants.PROP_OSGI_CONFIGURATION_AREA, stateArea.resolve(STATE).toUri().toString()); + // use config area if instance area is not set + if (!configuration.containsKey(InitConstants.PROP_OSGI_INSTANCE_AREA)) + configuration.put(InitConstants.PROP_OSGI_INSTANCE_AREA, stateArea.resolve(DATA).toUri().toString()); this.baseConfigArea = configArea.getParent(); - this.baseStateArea = stateArea.getParent(); + this.baseWritableArea = stateArea.getParent(); logger.log(Level.TRACE, () -> "Runtime manager configuration: " + configuration); @@ -63,18 +58,6 @@ public class RuntimeManagerMain implements RuntimeManager { } public void run() { -// try { -// for (Path p : Files.newDirectoryStream(Paths.get("/usr/local/lib/a2"), "*.so")) { -// try { -// System.load(p.toString()); -// } catch (UnsatisfiedLinkError e) { -// e.printStackTrace(); -// } -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } - OsgiRuntimeContext managerRuntimeContext = new OsgiRuntimeContext(configuration); try { managerRuntimeContext.run(); @@ -85,16 +68,12 @@ public class RuntimeManagerMain implements RuntimeManager { BundleContext bc = managerRuntimeContext.getFramework().getBundleContext(); // uninstall init as a bundle since it will be available via OSGi system - for (Bundle b : bc.getBundles()) { - if (b.getSymbolicName().equals(SYMBOLIC_NAME_INIT)) { - b.uninstall(); - } - } + OsgiBoot.uninstallBundles(bc, SYMBOLIC_NAME_INIT); bc.registerService(RuntimeManager.class, this, new Hashtable<>(configuration)); logger.log(Level.DEBUG, "Registered runtime manager"); managerRuntimeContext.waitForStop(0); - } catch (InterruptedException | BundleException e) { + } catch (InterruptedException e) { e.printStackTrace(); System.exit(1); } @@ -129,44 +108,20 @@ public class RuntimeManagerMain implements RuntimeManager { } } - public static void loadConfig(Path dir, Map config) { - try { -// System.out.println("Load from " + dir); - Path jvmArgsPath = dir.resolve(JVM_ARGS); - if (!Files.exists(jvmArgsPath)) { - // load from parent directory - loadConfig(dir.getParent(), config); - } - - if (Files.exists(dir)) - for (Path p : Files.newDirectoryStream(dir, "*.ini")) { - Properties props = new Properties(); - try (InputStream in = Files.newInputStream(p)) { - props.load(in); - } - for (Object key : props.keySet()) { - config.put(key.toString(), props.getProperty(key.toString())); - } - } - } catch (IOException e) { - throw new UncheckedIOException("Cannot load configuration from " + dir, e); - } - } - OsgiRuntimeContext loadRuntime(String relPath, Consumer> configCallback) { closeRuntime(relPath, false); - Path stateArea = baseStateArea.resolve(relPath); + Path writableArea = baseWritableArea.resolve(relPath); Path configArea = baseConfigArea.resolve(relPath); Map config = new HashMap<>(); - loadConfig(configArea, config); - config.put(InitConstants.PROP_OSGI_CONFIGURATION_AREA, stateArea.toUri().toString()); + RuntimeManager.loadConfig(configArea, config); + config.put(InitConstants.PROP_OSGI_CONFIGURATION_AREA, writableArea.resolve(STATE).toUri().toString()); if (configCallback != null) configCallback.accept(config); // use config area if instance area is not set if (!config.containsKey(InitConstants.PROP_OSGI_INSTANCE_AREA)) - config.put(InitConstants.PROP_OSGI_INSTANCE_AREA, config.get(InitConstants.PROP_OSGI_CONFIGURATION_AREA)); + config.put(InitConstants.PROP_OSGI_INSTANCE_AREA, writableArea.resolve(DATA).toUri().toString()); OsgiRuntimeContext runtimeContext = new OsgiRuntimeContext(config); runtimeContexts.put(relPath, runtimeContext);