From 6a0b268c3e3ced6322d0c3c4a23128a0c316332b Mon Sep 17 00:00:00 2001 From: J-N-K Date: Thu, 6 Jul 2023 08:25:13 +0200 Subject: [PATCH] Fix wrong ready marker in ScriptEngineFactoryBundleTracker (#3683) * Fix wrong ready marker in ScriptEngineFactoryBundleTracker * fix ready marker handling Signed-off-by: Jan N. Klug --- .../ScriptEngineFactoryBundleTracker.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineFactoryBundleTracker.java b/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineFactoryBundleTracker.java index 3b4f6f4dd9f..69c23fecc66 100644 --- a/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineFactoryBundleTracker.java +++ b/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineFactoryBundleTracker.java @@ -50,22 +50,19 @@ public class ScriptEngineFactoryBundleTracker extends BundleTracker impl private final Logger logger = LoggerFactory.getLogger(ScriptEngineFactoryBundleTracker.class); private final ReadyService readyService; - private final StartLevelService startLevelService; private final Map bundles = new ConcurrentHashMap<>(); + private boolean startLevel = false; private boolean ready = false; @Activate - public ScriptEngineFactoryBundleTracker(final @Reference ReadyService readyService, - final @Reference StartLevelService startLevelService, BundleContext bc) { + public ScriptEngineFactoryBundleTracker(final @Reference ReadyService readyService, BundleContext bc) { super(bc, STATE_MASK, null); this.readyService = readyService; - this.startLevelService = startLevelService; - this.open(); readyService.registerTracker(this, new ReadyMarkerFilter().withType(StartLevelService.STARTLEVEL_MARKER_TYPE) - .withIdentifier(Integer.toString(StartLevelService.STARTLEVEL_OSGI))); + .withIdentifier(Integer.toString(StartLevelService.STARTLEVEL_MODEL))); } @Deactivate @@ -85,8 +82,8 @@ public Bundle addingBundle(@NonNullByDefault({}) Bundle bundle, @Nullable Bundle if (isScriptingBundle(bundle)) { logger.debug("Added {}: {} ", bsn, stateToString(state)); bundles.put(bsn, state); + checkReady(); } - checkReady(); return bundle; } @@ -99,8 +96,8 @@ public void modifiedBundle(@NonNullByDefault({}) Bundle bundle, @Nullable Bundle if (isScriptingBundle(bundle)) { logger.debug("Modified {}: {}", bsn, stateToString(state)); bundles.put(bsn, state); + checkReady(); } - checkReady(); } @Override @@ -110,27 +107,35 @@ public void removedBundle(@NonNullByDefault({}) Bundle bundle, @Nullable BundleE if (isScriptingBundle(bundle)) { logger.debug("Removed {}", bsn); bundles.remove(bsn); + checkReady(); } - checkReady(); } @Override public void onReadyMarkerAdded(ReadyMarker readyMarker) { + logger.debug("Readymarker {} added", readyMarker); + startLevel = true; checkReady(); } @Override public void onReadyMarkerRemoved(ReadyMarker readyMarker) { + logger.debug("Readymarker {} removed", readyMarker); + startLevel = false; ready = false; readyService.unmarkReady(READY_MARKER); } - private void checkReady() { - if (!ready && startLevelService.getStartLevel() > StartLevelService.STARTLEVEL_OSGI && allBundlesActive()) { - logger.info("All automation bundles ready."); + private synchronized void checkReady() { + boolean allBundlesActive = allBundlesActive(); + logger.trace("ready: {}, startlevel: {}, allActive: {}", ready, startLevel, allBundlesActive); + + if (!ready && startLevel && allBundlesActive) { + logger.debug("Adding ready marker: All automation bundles ready ({})", bundles); readyService.markReady(READY_MARKER); ready = true; - } else if (ready && !allBundlesActive()) { + } else if (ready && !allBundlesActive) { + logger.debug("Removing ready marker: Not all automation bundles ready ({})", bundles); readyService.unmarkReady(READY_MARKER); ready = false; }