Skip to content

Commit a94c69f

Browse files
authored
[jsscripting] Await activation of OSGiScriptExtensionProvider before registering ScriptEngineFactory (openhab#21042)
* [jsscripting] Await activation of OSGiScriptExtensionProvider before registering ScriptEngineFactory This ensures that OSGiScriptExtensionProvider / `require('@runtime/osgi').bundleContext` is always available when JS ScriptEngines are created. Fixes issues such as openhab#21014. Signed-off-by: Florian Hotze <dev@florianhotze.com>
1 parent 2c5f67d commit a94c69f

3 files changed

Lines changed: 23 additions & 4 deletions

File tree

bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/GraalJSScriptEngineFactory.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.graalvm.polyglot.Engine;
2525
import org.graalvm.polyglot.Language;
2626
import org.openhab.automation.jsscripting.internal.fs.watch.JSDependencyTracker;
27+
import org.openhab.automation.jsscripting.internal.scope.OSGiScriptExtensionProvider;
2728
import org.openhab.automation.jsscripting.internal.util.ThreadLocalSlf4jOutputStream;
2829
import org.openhab.core.OpenHAB;
2930
import org.openhab.core.automation.module.script.ScriptDependencyTracker;
@@ -75,8 +76,16 @@ public class GraalJSScriptEngineFactory implements ScriptEngineFactory {
7576
private final JSDependencyTracker jsDependencyTracker;
7677

7778
@Activate
78-
public GraalJSScriptEngineFactory(final @Reference JSScriptServiceUtil jsScriptServiceUtil,
79-
final @Reference JSDependencyTracker jsDependencyTracker, Map<String, Object> config) {
79+
public GraalJSScriptEngineFactory(final @Reference JSScriptServiceUtil jsScriptServiceUtil, //
80+
final @Reference JSDependencyTracker jsDependencyTracker, //
81+
final @Reference OSGiScriptExtensionProvider osgiScriptExtensionProvider, // declare dependency on
82+
// OSGiScriptExtensionProvider to
83+
// fix a timing issue where
84+
// openhab-js attempts to lookup
85+
// OSGi services before
86+
// OSGiScriptExtensionProvider is
87+
// active
88+
Map<String, Object> config) {
8089
logger.debug("Loading GraalJSScriptEngineFactory");
8190

8291
this.jsDependencyTracker = jsDependencyTracker;

bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/scope/OSGiScriptExtensionProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*
2222
* @author Jonathan Gilbert - Initial contribution
2323
*/
24-
@Component(immediate = true, service = ScriptExtensionProvider.class)
24+
@Component(immediate = true, service = { ScriptExtensionProvider.class, OSGiScriptExtensionProvider.class })
2525
public class OSGiScriptExtensionProvider extends ScriptDisposalAwareScriptExtensionProvider {
2626

2727
@Override

itests/org.openhab.automation.jsscripting.tests/src/main/java/org/openhab/automation/jsscripting/GraalJSOSGiTest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.openhab.automation.jsscripting.internal.GraalJSScriptEngineFactory;
3131
import org.openhab.automation.jsscripting.internal.JSScriptServiceUtil;
3232
import org.openhab.automation.jsscripting.internal.fs.watch.JSDependencyTracker;
33+
import org.openhab.automation.jsscripting.internal.scope.OSGiScriptExtensionProvider;
3334
import org.openhab.core.automation.module.script.action.ScriptExecution;
3435
import org.openhab.core.scheduler.Scheduler;
3536
import org.openhab.core.service.WatchService;
@@ -63,6 +64,9 @@ public abstract class GraalJSOSGiTest extends JavaOSGiTest {
6364
@NonNullByDefault({})
6465
ScriptExecution scriptExecution;
6566

67+
@NonNullByDefault({})
68+
OSGiScriptExtensionProvider osgiScriptExtensionProvider;
69+
6670
@NonNullByDefault({})
6771
JSScriptServiceUtil jsScriptServiceUtil;
6872
@NonNullByDefault({})
@@ -82,10 +86,14 @@ public abstract class GraalJSOSGiTest extends JavaOSGiTest {
8286
public void beforeEach() throws Exception {
8387
when(watchService.getWatchPath()).thenReturn(tempDir);
8488

89+
osgiScriptExtensionProvider = new OSGiScriptExtensionProvider();
90+
osgiScriptExtensionProvider.activate(bundleContext);
91+
8592
jsScriptServiceUtil = new JSScriptServiceUtil(scheduler, scriptExecution);
8693
jsDependencyTracker = new JSDependencyTracker(watchService);
8794

88-
scriptEngineFactory = new GraalJSScriptEngineFactory(jsScriptServiceUtil, jsDependencyTracker, config);
95+
scriptEngineFactory = new GraalJSScriptEngineFactory(jsScriptServiceUtil, jsDependencyTracker,
96+
osgiScriptExtensionProvider, config);
8997
}
9098

9199
@AfterEach
@@ -96,6 +104,8 @@ public void afterEach() throws Exception {
96104
jsDependencyTracker.deactivate();
97105
jsDependencyTracker = null;
98106

107+
osgiScriptExtensionProvider = null;
108+
99109
clearInvocations(watchService, scheduler, scriptExecution);
100110
}
101111
}

0 commit comments

Comments
 (0)