From 241a4f6ebf6bc12382ddb477b8627a2a64cd1bb7 Mon Sep 17 00:00:00 2001 From: Jonathan Gilbert Date: Fri, 25 Jun 2021 17:45:18 +1000 Subject: [PATCH] Ignore relative library directories for scripts (#2408) Signed-off-by: Jonathan Gilbert --- .../internal/loader/DependencyTracker.java | 17 +++++++---------- .../internal/loader/ScriptFileWatcher.java | 16 +++++++++++++++- .../internal/loader/ScriptLibraryWatcher.java | 8 ++------ 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/DependencyTracker.java b/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/DependencyTracker.java index d93cf15de..ead42520a 100644 --- a/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/DependencyTracker.java +++ b/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/DependencyTracker.java @@ -17,9 +17,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.openhab.core.automation.module.script.rulesupport.internal.loader.collection.BidiSetBag; -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; import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicy; @@ -27,25 +24,25 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Tracks dependencies between scripts and reloads dependees + * Tracks dependencies between scripts and reloads dependees. Can be used by script engine providers to watch library + * files. * * @author Jonathan Gilbert - Initial contribution */ -@Component(immediate = true, service = DependencyTracker.class) -public class DependencyTracker { +public abstract class DependencyTracker { private final Logger logger = LoggerFactory.getLogger(DependencyTracker.class); private final Set dependencyChangeListeners = ConcurrentHashMap.newKeySet(); private final BidiSetBag scriptToLibs = new BidiSetBag<>(); - private final ScriptLibraryWatcher scriptLibraryWatcher = new ScriptLibraryWatcher() { + private final ScriptLibraryWatcher scriptLibraryWatcher = new ScriptLibraryWatcher(getLibPath()) { @Override void updateFile(String libraryPath) { Set scripts; synchronized (scriptToLibs) { scripts = new HashSet<>(scriptToLibs.getKeys(libraryPath)); // take a copy as it will change as we - // reimport + // reimport } DependencyTracker.this.logger.debug("Library {} changed; reimporting {} scripts...", libraryPath, scripts.size()); @@ -55,12 +52,12 @@ public class DependencyTracker { } }; - @Activate + abstract String getLibPath(); + public void activate() { scriptLibraryWatcher.activate(); } - @Deactivate public void deactivate() { scriptLibraryWatcher.deactivate(); } diff --git a/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptFileWatcher.java b/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptFileWatcher.java index f4a3e7f02..2c6d68033 100644 --- a/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptFileWatcher.java +++ b/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptFileWatcher.java @@ -59,12 +59,13 @@ import org.slf4j.LoggerFactory; * * @author Simon Merschjohann - Initial contribution * @author Kai Kreuzer - improved logging and removed thread pool - * @author Jonathan Gilbert - added dependency tracking & per-script start levels + * @author Jonathan Gilbert - added dependency tracking, per-script start levels & ignore lib dirs */ @Component(immediate = true) public class ScriptFileWatcher extends AbstractWatchService implements ReadyService.ReadyTracker, DependencyTracker.DependencyChangeListener { + private static final Set KNOWN_LIB_NAMES = Set.of("node_modules"); private static final String FILE_DIRECTORY = "automation" + File.separator + "jsr223"; private static final long RECHECK_INTERVAL = 20; @@ -151,9 +152,22 @@ public class ScriptFileWatcher extends AbstractWatchService @Override protected Kind[] getWatchEventKinds(Path subDir) { + if (isLibDirectory(subDir)) { + return null; // don't watch libraries + } + return new Kind[] { ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY }; } + private Boolean isLibDirectory(Path subDir) { + for (Path segment : subDir) { + if (KNOWN_LIB_NAMES.contains(segment.toString())) { + return true; + } + } + return false; + } + @Override protected void processWatchEvent(WatchEvent event, Kind kind, Path path) { File file = path.toFile(); diff --git a/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptLibraryWatcher.java b/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptLibraryWatcher.java index 2f8ba5f0e..f30d14dc0 100644 --- a/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptLibraryWatcher.java +++ b/bundles/org.openhab.core.automation.module.script.rulesupport/src/main/java/org/openhab/core/automation/module/script/rulesupport/internal/loader/ScriptLibraryWatcher.java @@ -18,7 +18,6 @@ import java.io.File; import java.nio.file.Path; import java.nio.file.WatchEvent; -import org.openhab.core.OpenHAB; import org.openhab.core.service.AbstractWatchService; /** @@ -28,11 +27,8 @@ import org.openhab.core.service.AbstractWatchService; */ abstract class ScriptLibraryWatcher extends AbstractWatchService { - public static final String LIB_PATH = String.join(File.separator, OpenHAB.getConfigFolder(), "automation", "lib", - "javascript"); - - ScriptLibraryWatcher() { - super(LIB_PATH); + ScriptLibraryWatcher(String libPath) { + super(libPath); } @Override