]> git.basschouten.com Git - openhab-addons.git/commitdiff
[jsscripting] JS script engine no longer watches node_modules for scripts (#11830)
authorJonathan Gilbert <jpg@trillica.com>
Sun, 23 Jan 2022 10:46:13 +0000 (10:46 +0000)
committerGitHub <noreply@github.com>
Sun, 23 Jan 2022 10:46:13 +0000 (11:46 +0100)
Signed-off-by: Jonathan Gilbert <jpg@trillica.com>
bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/fs/watch/JSDependencyTracker.java
bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/fs/watch/JSFileWatcher.java [new file with mode: 0644]
bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/fs/watch/JSScriptFileWatcher.java

index 00831f2643aa288c91320174f17ba5c791263ab9..f4cb934d9dc28122562638afa61bf8e90ecfca86 100644 (file)
@@ -16,9 +16,6 @@ import java.io.File;
 
 import org.openhab.core.OpenHAB;
 import org.openhab.core.automation.module.script.rulesupport.loader.DependencyTracker;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,7 +24,6 @@ import org.slf4j.LoggerFactory;
  *
  * @author Jonathan Gilbert - Initial contribution
  */
-@Component(immediate = true, service = JSDependencyTracker.class)
 public class JSDependencyTracker extends DependencyTracker {
 
     private final Logger logger = LoggerFactory.getLogger(JSDependencyTracker.class);
@@ -39,7 +35,6 @@ public class JSDependencyTracker extends DependencyTracker {
         super(LIB_PATH);
     }
 
-    @Activate
     public void activate() {
         File directory = new File(LIB_PATH);
         if (!directory.exists()) {
@@ -52,9 +47,4 @@ public class JSDependencyTracker extends DependencyTracker {
 
         super.activate();
     }
-
-    @Deactivate
-    public void deactivate() {
-        super.deactivate();
-    }
 }
diff --git a/bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/fs/watch/JSFileWatcher.java b/bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/fs/watch/JSFileWatcher.java
new file mode 100644 (file)
index 0000000..c801c3f
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2010-2022 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.automation.jsscripting.internal.fs.watch;
+
+import org.openhab.core.automation.module.script.ScriptEngineManager;
+import org.openhab.core.service.ReadyService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+
+/**
+ * Monitors <openHAB-conf>/automation/js for Javascript files & libraries.
+ *
+ * This class is required to ensure that the *order* of set up is correct. Specifically, the dependency tracker must
+ * be activated after the script file watcher. This is because AbstractWatchService only allows a single service to
+ * watch a single directory, and given that the watchers are nested and the last registration wins, the one we want to
+ * monitor the libraries must be registered last.
+ *
+ * @author Jonathan Gilbert - Initial contribution
+ */
+@Component(immediate = true, service = JSFileWatcher.class)
+public class JSFileWatcher {
+
+    private final JSScriptFileWatcher jsScriptFileWatcher;
+    private final JSDependencyTracker jsDependencyTracker;
+
+    @Activate
+    public JSFileWatcher(final @Reference ScriptEngineManager manager, final @Reference ReadyService readyService) {
+        jsDependencyTracker = new JSDependencyTracker();
+        jsScriptFileWatcher = new JSScriptFileWatcher(manager, readyService, jsDependencyTracker);
+    }
+
+    @Activate
+    public void activate() {
+        jsScriptFileWatcher.activate();
+        jsDependencyTracker.activate();
+        jsDependencyTracker.addChangeTracker(jsScriptFileWatcher);
+    }
+
+    @Deactivate
+    void deactivate() {
+        jsDependencyTracker.removeChangeTracker(jsScriptFileWatcher);
+        jsDependencyTracker.deactivate();
+        jsScriptFileWatcher.deactivate();
+    }
+}
index 7c9d9baa54a6c822efb02e2e0ba5cdb1fdd968a2..3b728cc1f34e6210baab4ea2e5d14c4d8b7134a3 100644 (file)
 package org.openhab.automation.jsscripting.internal.fs.watch;
 
 import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.WatchEvent;
 import java.util.Optional;
 
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.automation.jsscripting.internal.GraalJSScriptEngineFactory;
 import org.openhab.core.automation.module.script.ScriptEngineManager;
 import org.openhab.core.automation.module.script.rulesupport.loader.ScriptFileReference;
 import org.openhab.core.automation.module.script.rulesupport.loader.ScriptFileWatcher;
 import org.openhab.core.service.ReadyService;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Reference;
 
 /**
- * Monitors <openHAB-conf>/automation/js for Javascript files
+ * Monitors <openHAB-conf>/automation/js for Javascript files, but not libraries
  *
  * @author Jonathan Gilbert - Initial contribution
  */
-@Component(immediate = true)
 public class JSScriptFileWatcher extends ScriptFileWatcher {
     private static final String FILE_DIRECTORY = "automation" + File.separator + "js";
+    private static final String IGNORE_DIR_NAME = "node_modules";
 
-    @Activate
-    public JSScriptFileWatcher(final @Reference ScriptEngineManager manager, final @Reference ReadyService readyService,
-            final @Reference JSDependencyTracker jsDependencyTracker) {
-        super(manager, jsDependencyTracker, readyService, FILE_DIRECTORY);
-    }
+    private final String ignorePath;
 
-    @Activate
-    @Override
-    public void activate() {
-        super.activate();
+    public JSScriptFileWatcher(final ScriptEngineManager manager, final ReadyService readyService,
+            JSDependencyTracker dependencyTracker) {
+        super(manager, dependencyTracker, readyService, FILE_DIRECTORY);
+
+        ignorePath = pathToWatch + File.separator + "node_modules";
     }
 
-    @Deactivate
     @Override
-    public void deactivate() {
-        super.deactivate();
+    protected void processWatchEvent(@Nullable WatchEvent<?> event, WatchEvent.@Nullable Kind<?> kind,
+            @Nullable Path path) {
+        if (!path.startsWith(ignorePath)) {
+            super.processWatchEvent(event, kind, path);
+        }
     }
 
     @Override
@@ -62,4 +60,9 @@ public class JSScriptFileWatcher extends ScriptFileWatcher {
             }
         });
     }
+
+    @Override
+    protected boolean watchSubDirectories() {
+        return false;
+    }
 }