Improve OSGi initialisation
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 29 May 2022 06:50:44 +0000 (08:50 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 29 May 2022 06:50:44 +0000 (08:50 +0200)
org.argeo.init/src/org/argeo/init/osgi/Activator.java
org.argeo.init/src/org/argeo/init/osgi/BundlesSet.java
org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java
org.argeo.init/src/org/argeo/init/osgi/OsgiBootUtils.java
org.argeo.init/src/org/argeo/init/osgi/OsgiBuilder.java
org.argeo.init/src/org/argeo/init/osgi/OsgiRuntimeContext.java

index a4f5a371d9d4c8ab708762b6be70156208510741..518751f91e655f27bcadda1e4ea02e21d0e056fa 100644 (file)
@@ -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);
        }
 }
index 73ab9afa7706d303aee96e874021aafb1a4f15d2..863ee00841f335957baa25d8fbac2448eed2d977 100644 (file)
@@ -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);
index 8fbe4b2386f8577b37629a4d3020be185beb9a2f..ae343f05b606a472e28beb492584cddfa4f7da01 100644 (file)
@@ -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
+        * <code>null</code>, system properties are used instead.
+        */
+       public void bootstrap(Map<String, String> 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<String, Set<String>> duplicatePackages = diagnostics.findPackagesExportedTwice();
@@ -159,6 +199,16 @@ public class OsgiBoot implements OsgiBootConstants {
                System.out.println();
        }
 
+       /**
+        * Calls {@link #bootstrap(Map)} with <code>null</code>.
+        * 
+        * @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<String, String> 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<String, String> 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<Integer, List<String>> startLevels, Properties properties,
+       private static void computeStartLevels(SortedMap<Integer, List<String>> startLevels, Map<String, String> 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<Object> keys = properties.keySet().iterator();
+               Iterator<String> 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<String> bundlesToStart) {
-               if (bundlesToStart.size() == 0)
-                       return true;
-
-               // used to monitor ACTIVE states
-               List<Bundle> startedBundles = new ArrayList<Bundle>();
-               // used to log the bundles not found
-               List<String> notFoundBundles = new ArrayList<String>(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<String> notStarted = new ArrayList<String>();
-               while (!allStarted && (System.currentTimeMillis() - beginMonitor) < defaultTimeout) {
-                       notStarted = new ArrayList<String>();
-                       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<String> bundlesToStart) {
+//             if (bundlesToStart.size() == 0)
+//                     return true;
+//
+//             // used to monitor ACTIVE states
+//             List<Bundle> startedBundles = new ArrayList<Bundle>();
+//             // used to log the bundles not found
+//             List<String> notFoundBundles = new ArrayList<String>(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<String> notStarted = new ArrayList<String>();
+//             while (!allStarted && (System.currentTimeMillis() - beginMonitor) < defaultTimeout) {
+//                     notStarted = new ArrayList<String>();
+//                     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;
index d8efe83435bb8b745a51ab977dde354b4b4b058d..e0b2f155105c83aa7402fa8cadfbd32ccc2dfb2b 100644 (file)
@@ -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<String, String> equinoxArgsToConfiguration(String[] args) {
                // FIXME implement it
                return new HashMap<>();
index 39c42cbf3c5c127595dfe29e313ef0d9b5453e10..cd2c80acb556792558ba6f316362932e3898b08b 100644 (file)
@@ -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())
index 9bb59ef1dc5c87744291fe3213f4c181ced12b51..64c588d19a347a0ac90204fc36faa336d59eff97 100644 (file)
@@ -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<String, String> config;
        private Framework framework;
        private OsgiBoot osgiBoot;
@@ -31,11 +31,19 @@ public class OsgiRuntimeContext implements RuntimeContext {
        @SuppressWarnings("rawtypes")
        private ServiceRegistration<Flow.Publisher> logEntryPublisherSr;
 
+       /**
+        * Constructor to use when the runtime context will create the OSGi
+        * {@link Framework}.
+        */
        public OsgiRuntimeContext(Map<String, String> 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);
 
        }