From 8321a31f879e6998ed4fe9c70f3cd3faa21e4a0f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 29 May 2022 08:50:44 +0200 Subject: [PATCH] Improve OSGi initialisation --- .../src/org/argeo/init/osgi/Activator.java | 4 +- .../src/org/argeo/init/osgi/BundlesSet.java | 2 +- .../src/org/argeo/init/osgi/OsgiBoot.java | 341 +++++++++++------- .../org/argeo/init/osgi/OsgiBootUtils.java | 43 ++- .../src/org/argeo/init/osgi/OsgiBuilder.java | 6 +- .../argeo/init/osgi/OsgiRuntimeContext.java | 14 +- 6 files changed, 253 insertions(+), 157 deletions(-) diff --git a/org.argeo.init/src/org/argeo/init/osgi/Activator.java b/org.argeo.init/src/org/argeo/init/osgi/Activator.java index a4f5a371d..518751f91 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/Activator.java +++ b/org.argeo.init/src/org/argeo/init/osgi/Activator.java @@ -21,6 +21,8 @@ public class Activator implements BundleActivator { private Logger logger = System.getLogger(Activator.class.getName()); private Long checkpoint = null; + + /** Not null if we created it ourselves. */ private OsgiRuntimeContext runtimeContext; public void start(final BundleContext bundleContext) throws Exception { @@ -45,7 +47,7 @@ public class Activator implements BundleActivator { } public void stop(BundleContext context) throws Exception { - Objects.requireNonNull(runtimeContext); + Objects.nonNull(runtimeContext); runtimeContext.stop(context); } } diff --git a/org.argeo.init/src/org/argeo/init/osgi/BundlesSet.java b/org.argeo.init/src/org/argeo/init/osgi/BundlesSet.java index 73ab9afa7..863ee0084 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/BundlesSet.java +++ b/org.argeo.init/src/org/argeo/init/osgi/BundlesSet.java @@ -25,7 +25,7 @@ class BundlesSet { dirPath = dirPath.substring("file:".length()); dir = new File(dirPath.replace('/', File.separatorChar)).getCanonicalPath(); - if (OsgiBootUtils.debug) + if (OsgiBootUtils.isDebug()) OsgiBootUtils.debug("Base dir: " + dir); } catch (IOException e) { throw new RuntimeException("Cannot convert to absolute path", e); diff --git a/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java b/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java index 8fbe4b238..ae343f05b 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java @@ -4,6 +4,8 @@ import static org.argeo.init.osgi.OsgiBootUtils.debug; import static org.argeo.init.osgi.OsgiBootUtils.warn; import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; @@ -57,11 +59,12 @@ public class OsgiBoot implements OsgiBootConstants { public final static String DEFAULT_BASE_URL = "reference:file:"; // public final static String EXCLUDES_SVN_PATTERN = "**/.svn/**"; - // OSGi system properties + // OSGi standard properties final static String PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL = "osgi.bundles.defaultStartLevel"; final static String PROP_OSGI_STARTLEVEL = "osgi.startLevel"; - final static String INSTANCE_AREA_PROP = "osgi.instance.area"; - final static String CONFIGURATION_AREA_PROP = "osgi.configuration.area"; + final static String PROP_OSGI_INSTANCE_AREA = "osgi.instance.area"; + final static String PROP_OSGI_CONFIGURATION_AREA = "osgi.configuration.area"; + final static String PROP_OSGI_USE_SYSTEM_PROPERTIES = "osgi.framework.useSystemProperties"; // Symbolic names public final static String SYMBOLIC_NAME_OSGI_BOOT = "org.argeo.osgi.boot"; @@ -73,9 +76,9 @@ public class OsgiBoot implements OsgiBootConstants { // "false")) // .booleanValue(); - /** Default is 10s */ - @Deprecated - private long defaultTimeout = 10000l; +// /** Default is 10s */ +// @Deprecated +// private long defaultTimeout = 10000l; private final BundleContext bundleContext; private final String localCache; @@ -100,8 +103,8 @@ public class OsgiBoot implements OsgiBootConstants { for (String source : sources.split(",")) { if (source.trim().equals(A2Source.DEFAULT_A2_URI)) { if (Files.exists(homePath)) - provisioningManager.registerSource( - A2Source.SCHEME_A2 + "://" + homePath.toString() + "/.local/share/a2"); + provisioningManager + .registerSource(A2Source.SCHEME_A2 + "://" + homePath.toString() + "/.local/share/a2"); provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/share/a2"); provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/share/a2"); } else { @@ -118,18 +121,55 @@ public class OsgiBoot implements OsgiBootConstants { /* * HIGH-LEVEL METHODS */ - /** Bootstraps the OSGi runtime */ - public void bootstrap() { + /** + * Bootstraps the OSGi runtime using these properties, which MUST be consistent + * with {@link BundleContext#getProperty(String)}. If these properties are + * null, system properties are used instead. + */ + public void bootstrap(Map properties) { try { long begin = System.currentTimeMillis(); + // check properties + if (properties != null) { + for (String property : properties.keySet()) { + String value = properties.get(property); + String bcValue = bundleContext.getProperty(property); + if (PROP_OSGI_CONFIGURATION_AREA.equals(property) || PROP_OSGI_INSTANCE_AREA.equals(property)) { + try { + URL uri = new URL(value); + URL bcUri = new URL(bcValue); + if (!uri.equals(bcUri)) + throw new IllegalArgumentException("Property " + property + "=" + uri + + " is inconsistent with bundle context : " + bcUri); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Malformed property " + property, e); + } + + } else { + if (!value.equals(bcValue)) + throw new IllegalArgumentException("Property " + property + "=" + value + + " is inconsistent with bundle context : " + bcValue); + } + } + } else { + String useSystemProperties = bundleContext.getProperty(PROP_OSGI_USE_SYSTEM_PROPERTIES); + if (useSystemProperties == null || !useSystemProperties.equals("true")) { + OsgiBootUtils.warn("No properties passed but " + PROP_OSGI_USE_SYSTEM_PROPERTIES + " is not set."); + } + } + + // notify start System.out.println(); - String osgiInstancePath = bundleContext.getProperty(INSTANCE_AREA_PROP); + String osgiInstancePath = bundleContext.getProperty(PROP_OSGI_INSTANCE_AREA); OsgiBootUtils .info("OSGi bootstrap starting" + (osgiInstancePath != null ? " (" + osgiInstancePath + ")" : "")); installUrls(getBundlesUrls()); installUrls(getDistributionUrls()); provisioningManager.install(null); - startBundles(); + if (properties != null) + startBundles(properties); + else + startBundles(); long duration = System.currentTimeMillis() - begin; OsgiBootUtils.info("OSGi bootstrap completed in " + Math.round(((double) duration) / 1000) + "s (" + duration + "ms), " + bundleContext.getBundles().length + " bundles"); @@ -139,7 +179,7 @@ public class OsgiBoot implements OsgiBootConstants { } // diagnostics - if (OsgiBootUtils.debug) { + if (OsgiBootUtils.isDebug()) { OsgiBootDiagnostics diagnostics = new OsgiBootDiagnostics(bundleContext); diagnostics.checkUnresolved(); Map> duplicatePackages = diagnostics.findPackagesExportedTwice(); @@ -159,6 +199,16 @@ public class OsgiBoot implements OsgiBootConstants { System.out.println(); } + /** + * Calls {@link #bootstrap(Map)} with null. + * + * @see #bootstrap(Map) + */ + @Deprecated + public void bootstrap() { + bootstrap(null); + } + public void update() { provisioningManager.update(); } @@ -189,11 +239,11 @@ public class OsgiBoot implements OsgiBootConstants { try { if (installedBundles.containsKey(url)) { Bundle bundle = (Bundle) installedBundles.get(url); - if (OsgiBootUtils.debug) + if (OsgiBootUtils.isDebug()) debug("Bundle " + bundle.getSymbolicName() + " already installed from " + url); } else if (url.contains("/" + SYMBOLIC_NAME_EQUINOX + "/") || url.contains("/" + SYMBOLIC_NAME_OSGI_BOOT + "/")) { - if (OsgiBootUtils.debug) + if (OsgiBootUtils.isDebug()) warn("Skip " + url); return; } else { @@ -201,7 +251,7 @@ public class OsgiBoot implements OsgiBootConstants { if (url.startsWith("http")) OsgiBootUtils .info("Installed " + bundle.getSymbolicName() + "-" + bundle.getVersion() + " from " + url); - else if (OsgiBootUtils.debug) + else if (OsgiBootUtils.isDebug()) OsgiBootUtils.debug( "Installed " + bundle.getSymbolicName() + "-" + bundle.getVersion() + " from " + url); assert bundle.getSymbolicName() != null; @@ -250,7 +300,7 @@ public class OsgiBoot implements OsgiBootConstants { } else OsgiBootUtils.warn("Could not install bundle from " + url + ": " + message); } - if (OsgiBootUtils.debug && !message.contains(ALREADY_INSTALLED)) + if (OsgiBootUtils.isDebug() && !message.contains(ALREADY_INSTALLED)) e.printStackTrace(); } } @@ -258,11 +308,34 @@ public class OsgiBoot implements OsgiBootConstants { /* * START */ + /** + * Start bundles based on system properties. + * + * @see OsgiBoot#startBundles(Map) + */ public void startBundles() { - startBundles(System.getProperties()); + Properties properties = System.getProperties(); + startBundles(properties); } + /** + * Start bundles based on these properties. + * + * @see OsgiBoot#startBundles(Map) + */ public void startBundles(Properties properties) { + Map map = new TreeMap<>(); + for (Object key : properties.keySet()) { + String property = key.toString(); + if (property.startsWith(PROP_ARGEO_OSGI_START)) { + map.put(property, properties.getProperty(property)); + } + } + startBundles(map); + } + + /** Start bundle based on keys starting with {@link #PROP_ARGEO_OSGI_START}. */ + public void startBundles(Map properties) { FrameworkStartLevel frameworkStartLevel = bundleContext.getBundle(0).adapt(FrameworkStartLevel.class); // default and active start levels from System properties @@ -289,13 +362,13 @@ public class OsgiBoot implements OsgiBootConstants { } catch (BundleException e) { OsgiBootUtils.error("Cannot mark " + bsn + " as started", e); } - if (getDebug()) + if (OsgiBootUtils.isDebug()) OsgiBootUtils.debug(bsn + " starts at level " + level); } } } frameworkStartLevel.setStartLevel(activeStartLevel, (FrameworkEvent event) -> { - if (getDebug()) + if (OsgiBootUtils.isDebug()) OsgiBootUtils.debug("Framework event: " + event); int initialStartLevel = frameworkStartLevel.getInitialBundleStartLevel(); int startLevel = frameworkStartLevel.getStartLevel(); @@ -303,17 +376,17 @@ public class OsgiBoot implements OsgiBootConstants { }); } - private static void computeStartLevels(SortedMap> startLevels, Properties properties, + private static void computeStartLevels(SortedMap> startLevels, Map properties, Integer defaultStartLevel) { // default (and previously, only behaviour) - appendToStartLevels(startLevels, defaultStartLevel, properties.getProperty(PROP_ARGEO_OSGI_START, "")); + appendToStartLevels(startLevels, defaultStartLevel, properties.getOrDefault(PROP_ARGEO_OSGI_START, "")); // list argeo.osgi.start.* system properties - Iterator keys = properties.keySet().iterator(); + Iterator keys = properties.keySet().iterator(); final String prefix = PROP_ARGEO_OSGI_START + "."; while (keys.hasNext()) { - String key = keys.next().toString(); + String key = keys.next(); if (key.startsWith(prefix)) { Integer startLevel; String suffix = key.substring(prefix.length()); @@ -329,7 +402,7 @@ public class OsgiBoot implements OsgiBootConstants { startLevel = defaultStartLevel; // append bundle names - String bundleNames = properties.getProperty(key); + String bundleNames = properties.get(key); appendToStartLevels(startLevels, startLevel, bundleNames); } } @@ -350,108 +423,108 @@ public class OsgiBoot implements OsgiBootConstants { } } - /** - * Start the provided list of bundles - * - * @return whether all bundles are now in active state - * @deprecated - */ - @Deprecated - public boolean startBundles(List bundlesToStart) { - if (bundlesToStart.size() == 0) - return true; - - // used to monitor ACTIVE states - List startedBundles = new ArrayList(); - // used to log the bundles not found - List notFoundBundles = new ArrayList(bundlesToStart); - - Bundle[] bundles = bundleContext.getBundles(); - long startBegin = System.currentTimeMillis(); - for (int i = 0; i < bundles.length; i++) { - Bundle bundle = bundles[i]; - String symbolicName = bundle.getSymbolicName(); - if (bundlesToStart.contains(symbolicName)) - try { - try { - bundle.start(); - if (OsgiBootUtils.debug) - debug("Bundle " + symbolicName + " started"); - } catch (Exception e) { - OsgiBootUtils.warn("Start of bundle " + symbolicName + " failed because of " + e - + ", maybe bundle is not yet resolved," + " waiting and trying again."); - waitForBundleResolvedOrActive(startBegin, bundle); - bundle.start(); - startedBundles.add(bundle); - } - notFoundBundles.remove(symbolicName); - } catch (Exception e) { - OsgiBootUtils.warn("Bundle " + symbolicName + " cannot be started: " + e.getMessage()); - if (OsgiBootUtils.debug) - e.printStackTrace(); - // was found even if start failed - notFoundBundles.remove(symbolicName); - } - } - - for (int i = 0; i < notFoundBundles.size(); i++) - OsgiBootUtils.warn("Bundle '" + notFoundBundles.get(i) + "' not started because it was not found."); - - // monitors that all bundles are started - long beginMonitor = System.currentTimeMillis(); - boolean allStarted = !(startedBundles.size() > 0); - List notStarted = new ArrayList(); - while (!allStarted && (System.currentTimeMillis() - beginMonitor) < defaultTimeout) { - notStarted = new ArrayList(); - allStarted = true; - for (int i = 0; i < startedBundles.size(); i++) { - Bundle bundle = (Bundle) startedBundles.get(i); - // TODO check behaviour of lazs bundles - if (bundle.getState() != Bundle.ACTIVE) { - allStarted = false; - notStarted.add(bundle.getSymbolicName()); - } - } - try { - Thread.sleep(100); - } catch (InterruptedException e) { - // silent - } - } - long duration = System.currentTimeMillis() - beginMonitor; - - if (!allStarted) - for (int i = 0; i < notStarted.size(); i++) - OsgiBootUtils.warn("Bundle '" + notStarted.get(i) + "' not ACTIVE after " + (duration / 1000) + "s"); - - return allStarted; - } - - /** Waits for a bundle to become active or resolved */ - @Deprecated - private void waitForBundleResolvedOrActive(long startBegin, Bundle bundle) throws Exception { - int originalState = bundle.getState(); - if ((originalState == Bundle.RESOLVED) || (originalState == Bundle.ACTIVE)) - return; - - String originalStateStr = OsgiBootUtils.stateAsString(originalState); - - int currentState = bundle.getState(); - while (!(currentState == Bundle.RESOLVED || currentState == Bundle.ACTIVE)) { - long now = System.currentTimeMillis(); - if ((now - startBegin) > defaultTimeout * 10) - throw new Exception("Bundle " + bundle.getSymbolicName() + " was not RESOLVED or ACTIVE after " - + (now - startBegin) + "ms (originalState=" + originalStateStr + ", currentState=" - + OsgiBootUtils.stateAsString(currentState) + ")"); - - try { - Thread.sleep(100l); - } catch (InterruptedException e) { - // silent - } - currentState = bundle.getState(); - } - } +// /** +// * Start the provided list of bundles +// * +// * @return whether all bundles are now in active state +// * @deprecated +// */ +// @Deprecated +// public boolean startBundles(List bundlesToStart) { +// if (bundlesToStart.size() == 0) +// return true; +// +// // used to monitor ACTIVE states +// List startedBundles = new ArrayList(); +// // used to log the bundles not found +// List notFoundBundles = new ArrayList(bundlesToStart); +// +// Bundle[] bundles = bundleContext.getBundles(); +// long startBegin = System.currentTimeMillis(); +// for (int i = 0; i < bundles.length; i++) { +// Bundle bundle = bundles[i]; +// String symbolicName = bundle.getSymbolicName(); +// if (bundlesToStart.contains(symbolicName)) +// try { +// try { +// bundle.start(); +// if (OsgiBootUtils.isDebug()) +// debug("Bundle " + symbolicName + " started"); +// } catch (Exception e) { +// OsgiBootUtils.warn("Start of bundle " + symbolicName + " failed because of " + e +// + ", maybe bundle is not yet resolved," + " waiting and trying again."); +// waitForBundleResolvedOrActive(startBegin, bundle); +// bundle.start(); +// startedBundles.add(bundle); +// } +// notFoundBundles.remove(symbolicName); +// } catch (Exception e) { +// OsgiBootUtils.warn("Bundle " + symbolicName + " cannot be started: " + e.getMessage()); +// if (OsgiBootUtils.isDebug()) +// e.printStackTrace(); +// // was found even if start failed +// notFoundBundles.remove(symbolicName); +// } +// } +// +// for (int i = 0; i < notFoundBundles.size(); i++) +// OsgiBootUtils.warn("Bundle '" + notFoundBundles.get(i) + "' not started because it was not found."); +// +// // monitors that all bundles are started +// long beginMonitor = System.currentTimeMillis(); +// boolean allStarted = !(startedBundles.size() > 0); +// List notStarted = new ArrayList(); +// while (!allStarted && (System.currentTimeMillis() - beginMonitor) < defaultTimeout) { +// notStarted = new ArrayList(); +// allStarted = true; +// for (int i = 0; i < startedBundles.size(); i++) { +// Bundle bundle = (Bundle) startedBundles.get(i); +// // TODO check behaviour of lazs bundles +// if (bundle.getState() != Bundle.ACTIVE) { +// allStarted = false; +// notStarted.add(bundle.getSymbolicName()); +// } +// } +// try { +// Thread.sleep(100); +// } catch (InterruptedException e) { +// // silent +// } +// } +// long duration = System.currentTimeMillis() - beginMonitor; +// +// if (!allStarted) +// for (int i = 0; i < notStarted.size(); i++) +// OsgiBootUtils.warn("Bundle '" + notStarted.get(i) + "' not ACTIVE after " + (duration / 1000) + "s"); +// +// return allStarted; +// } + +// /** Waits for a bundle to become active or resolved */ +// @Deprecated +// private void waitForBundleResolvedOrActive(long startBegin, Bundle bundle) throws Exception { +// int originalState = bundle.getState(); +// if ((originalState == Bundle.RESOLVED) || (originalState == Bundle.ACTIVE)) +// return; +// +// String originalStateStr = OsgiBootUtils.stateAsString(originalState); +// +// int currentState = bundle.getState(); +// while (!(currentState == Bundle.RESOLVED || currentState == Bundle.ACTIVE)) { +// long now = System.currentTimeMillis(); +// if ((now - startBegin) > defaultTimeout * 10) +// throw new Exception("Bundle " + bundle.getSymbolicName() + " was not RESOLVED or ACTIVE after " +// + (now - startBegin) + "ms (originalState=" + originalStateStr + ", currentState=" +// + OsgiBootUtils.stateAsString(currentState) + ")"); +// +// try { +// Thread.sleep(100l); +// } catch (InterruptedException e) { +// // silent +// } +// currentState = bundle.getState(); +// } +// } /* * BUNDLE PATTERNS INSTALLATION @@ -484,7 +557,7 @@ public class OsgiBoot implements OsgiBootConstants { return urls; // bundlePatterns = SystemPropertyUtils.resolvePlaceholders(bundlePatterns); - if (OsgiBootUtils.debug) + if (OsgiBootUtils.isDebug()) debug(PROP_ARGEO_OSGI_BUNDLES + "=" + bundlePatterns); StringTokenizer st = new StringTokenizer(bundlePatterns, ","); @@ -597,7 +670,7 @@ public class OsgiBoot implements OsgiBootConstants { File[] files = baseDir.listFiles(); if (files == null) { - if (OsgiBootUtils.debug) + if (OsgiBootUtils.isDebug()) OsgiBootUtils.warn("Base dir " + baseDir + " has no children, exists=" + baseDir.exists() + ", isDirectory=" + baseDir.isDirectory()); return; @@ -630,13 +703,13 @@ public class OsgiBoot implements OsgiBootConstants { // FIXME recurse only if start matches ? match(matched, base, newCurrentPath, pattern); // } else { -// if (OsgiBootUtils.debug) +// if (OsgiBootUtils.isDebug()) // debug(newCurrentPath + " does not start match with " + pattern); // // } } else { boolean nonDirectoryOk = matcher.matches(Paths.get(newCurrentPath)); - if (OsgiBootUtils.debug) + if (OsgiBootUtils.isDebug()) debug(currentPath + " " + (ok ? "" : " not ") + " matched with " + pattern); if (nonDirectoryOk) matched.add(relativeToFullPath(base, newCurrentPath)); @@ -717,9 +790,9 @@ public class OsgiBoot implements OsgiBootConstants { * BEAN METHODS */ - public boolean getDebug() { - return OsgiBootUtils.debug; - } +// public boolean getDebug() { +// return OsgiBootUtils.debug; +// } // public void setDebug(boolean debug) { // this.debug = debug; diff --git a/org.argeo.init/src/org/argeo/init/osgi/OsgiBootUtils.java b/org.argeo.init/src/org/argeo/init/osgi/OsgiBootUtils.java index d8efe8343..e0b2f1551 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiBootUtils.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiBootUtils.java @@ -1,12 +1,12 @@ package org.argeo.init.osgi; -import java.text.DateFormat; -import java.text.SimpleDateFormat; +import java.lang.System.Logger; +import java.lang.System.Logger.Level; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.ServiceLoader; import java.util.StringTokenizer; @@ -18,33 +18,45 @@ import org.osgi.framework.launch.FrameworkFactory; /** Utilities, mostly related to logging. */ public class OsgiBootUtils { - /** ISO8601 (as per log4j) and difference to UTC */ - private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS Z"); + private final static Logger logger = System.getLogger(OsgiBootUtils.class.getName()); - static boolean debug = System.getProperty(OsgiBoot.PROP_ARGEO_OSGI_BOOT_DEBUG) == null ? false - : !System.getProperty(OsgiBoot.PROP_ARGEO_OSGI_BOOT_DEBUG).trim().equals("false"); +// /** ISO8601 (as per log4j) and difference to UTC */ +// private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS Z"); +// static boolean debug = System.getProperty(OsgiBoot.PROP_ARGEO_OSGI_BOOT_DEBUG) == null ? false +// : !System.getProperty(OsgiBoot.PROP_ARGEO_OSGI_BOOT_DEBUG).trim().equals("false"); + + @Deprecated public static void info(Object obj) { - System.out.println("# OSGiBOOT # " + dateFormat.format(new Date()) + " # " + obj); +// System.out.println("# OSGiBOOT # " + dateFormat.format(new Date()) + " # " + obj); + logger.log(Level.INFO, () -> Objects.toString(obj)); } + @Deprecated public static void debug(Object obj) { - if (debug) - System.out.println("# OSGiBOOT DBG # " + dateFormat.format(new Date()) + " # " + obj); +// if (debug) +// System.out.println("# OSGiBOOT DBG # " + dateFormat.format(new Date()) + " # " + obj); + logger.log(Level.TRACE, () -> Objects.toString(obj)); } + @Deprecated public static void warn(Object obj) { - System.out.println("# OSGiBOOT WARN # " + dateFormat.format(new Date()) + " # " + obj); +// System.out.println("# OSGiBOOT WARN # " + dateFormat.format(new Date()) + " # " + obj); + logger.log(Level.WARNING, () -> Objects.toString(obj)); } + @Deprecated public static void error(Object obj, Throwable e) { - System.err.println("# OSGiBOOT ERR # " + dateFormat.format(new Date()) + " # " + obj); - if (e != null) - e.printStackTrace(); +// System.err.println("# OSGiBOOT ERR # " + dateFormat.format(new Date()) + " # " + obj); +// if (e != null) +// e.printStackTrace(); + logger.log(Level.ERROR, () -> Objects.toString(obj), e); } + @Deprecated public static boolean isDebug() { - return debug; +// return debug; + return logger.isLoggable(Level.TRACE); } public static String stateAsString(int state) { @@ -137,6 +149,7 @@ public class OsgiBootUtils { return framework; } + @Deprecated public static Map equinoxArgsToConfiguration(String[] args) { // FIXME implement it return new HashMap<>(); diff --git a/org.argeo.init/src/org/argeo/init/osgi/OsgiBuilder.java b/org.argeo.init/src/org/argeo/init/osgi/OsgiBuilder.java index 39c42cbf3..cd2c80acb 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiBuilder.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiBuilder.java @@ -38,8 +38,8 @@ public class OsgiBuilder { public OsgiBuilder() { // configuration.put("osgi.clean", "true"); - configuration.put(OsgiBoot.CONFIGURATION_AREA_PROP, System.getProperty(OsgiBoot.CONFIGURATION_AREA_PROP)); - configuration.put(OsgiBoot.INSTANCE_AREA_PROP, System.getProperty(OsgiBoot.INSTANCE_AREA_PROP)); + configuration.put(OsgiBoot.PROP_OSGI_CONFIGURATION_AREA, System.getProperty(OsgiBoot.PROP_OSGI_CONFIGURATION_AREA)); + configuration.put(OsgiBoot.PROP_OSGI_INSTANCE_AREA, System.getProperty(OsgiBoot.PROP_OSGI_INSTANCE_AREA)); configuration.put(PROP_OSGI_CLEAN, System.getProperty(PROP_OSGI_CLEAN)); } @@ -48,7 +48,7 @@ public class OsgiBuilder { framework = OsgiBootUtils.launch(configuration); BundleContext bc = framework.getBundleContext(); - String osgiData = bc.getProperty(OsgiBoot.INSTANCE_AREA_PROP); + String osgiData = bc.getProperty(OsgiBoot.PROP_OSGI_INSTANCE_AREA); // String osgiConf = bc.getProperty(OsgiBoot.CONFIGURATION_AREA_PROP); String osgiConf = framework.getDataFile("").getAbsolutePath(); if (OsgiBootUtils.isDebug()) 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 9bb59ef1d..64c588d19 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java @@ -21,7 +21,7 @@ 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; @@ -31,11 +31,19 @@ public class OsgiRuntimeContext implements RuntimeContext { @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); } @@ -68,7 +76,7 @@ public class OsgiRuntimeContext implements RuntimeContext { new Hashtable<>(Collections.singletonMap(Constants.SERVICE_PID, "argeo.logging.publisher"))); osgiBoot = new OsgiBoot(bundleContext); - osgiBoot.bootstrap(); + osgiBoot.bootstrap(config); } -- 2.30.2