package org.argeo.api.init; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; import java.util.Properties; import java.util.function.Consumer; /** Dynamically manages multiple runtimes within a single JVM. */ public interface RuntimeManager { String JVM_ARGS = "jvm.args"; String STATE = "state"; String DATA = "data"; public void startRuntime(String relPath, Consumer> configCallback); public void closeRuntime(String relPath, boolean async); static void loadConfig(Path dir, Map config) { try { // System.out.println("Load from " + dir); Path jvmArgsPath = dir.resolve(RuntimeManager.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); } } }