From e57ee18ac7b8cfd2bdf4b2e56a65275ce24732b3 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 3 Nov 2022 09:05:47 +0100 Subject: [PATCH] Make OSGi init more robust --- .../argeo/init/a2/ProvisioningManager.java | 4 +-- .../src/org/argeo/init/osgi/OsgiBoot.java | 31 +++++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java b/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java index a237fdf48..cbb296f4c 100644 --- a/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java +++ b/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java @@ -55,8 +55,8 @@ public class ProvisioningManager { updatedBundles.add(bundle); } } - FrameworkWiring frameworkWiring = bc.getBundle(0).adapt(FrameworkWiring.class); - frameworkWiring.refreshBundles(updatedBundles); +// FrameworkWiring frameworkWiring = bc.getBundle(0).adapt(FrameworkWiring.class); +// frameworkWiring.refreshBundles(updatedBundles); } public void registerSource(String uri) { 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 9f3bd25f7..223effb54 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java @@ -19,6 +19,7 @@ import java.util.Set; import java.util.SortedMap; import java.util.StringTokenizer; import java.util.TreeMap; +import java.util.concurrent.ForkJoinPool; import org.argeo.init.a2.A2Source; import org.argeo.init.a2.ProvisioningManager; @@ -357,6 +358,14 @@ public class OsgiBoot implements OsgiBootConstants { // default and active start levels from System properties Integer defaultStartLevel = Integer.parseInt(getProperty(PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL, "4")); Integer activeStartLevel = Integer.parseInt(getProperty(PROP_OSGI_STARTLEVEL, "6")); + if (OsgiBootUtils.isDebug()) { + OsgiBootUtils.debug("OSGi default start level: " + + getProperty(PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL, "") + ", using " + defaultStartLevel); + OsgiBootUtils.debug("OSGi active start level: " + getProperty(PROP_OSGI_STARTLEVEL, "") + + ", using " + activeStartLevel); + OsgiBootUtils.debug("Framework start level: " + frameworkStartLevel.getStartLevel() + " (initial: " + + frameworkStartLevel.getInitialBundleStartLevel() + ")"); + } SortedMap> startLevels = new TreeMap>(); computeStartLevels(startLevels, properties, defaultStartLevel); @@ -383,12 +392,21 @@ public class OsgiBoot implements OsgiBootConstants { } } } - frameworkStartLevel.setStartLevel(activeStartLevel, (FrameworkEvent event) -> { - if (OsgiBootUtils.isDebug()) - OsgiBootUtils.debug("Framework event: " + event); - int initialStartLevel = frameworkStartLevel.getInitialBundleStartLevel(); - int startLevel = frameworkStartLevel.getStartLevel(); - OsgiBootUtils.debug("Framework start level: " + startLevel + " (initial: " + initialStartLevel + ")"); + + if (OsgiBootUtils.isDebug()) + OsgiBootUtils.debug("About to set framework start level to " + activeStartLevel + " ..."); + + // Start the framework asynchronously + ForkJoinPool.commonPool().execute(() -> { + frameworkStartLevel.setStartLevel(activeStartLevel, (FrameworkEvent event) -> { + if (OsgiBootUtils.isDebug()) + OsgiBootUtils.debug("Framework event: " + event); + int initialStartLevel = frameworkStartLevel.getInitialBundleStartLevel(); + int startLevel = frameworkStartLevel.getStartLevel(); + if (OsgiBootUtils.isDebug()) + OsgiBootUtils + .debug("Framework start level: " + startLevel + " (initial: " + initialStartLevel + ")"); + }); }); } @@ -666,6 +684,7 @@ public class OsgiBoot implements OsgiBootConstants { private void refreshFramework() { Bundle systemBundle = bundleContext.getBundle(0); FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class); + // TODO deal with refresh breaking native loading (e.g SWT) frameworkWiring.refreshBundles(null); } -- 2.30.2