From 22c28595abd9de2f3fc9b8bb2492b768c958d082 Mon Sep 17 00:00:00 2001 From: Jonathan Gilbert Date: Sat, 15 Jan 2022 12:15:46 +0000 Subject: [PATCH] Script engines now unloaded if replaced, and closed if AutoCloseable (#2681) Signed-off-by: Jonathan Gilbert --- .../internal/ScriptEngineManagerImpl.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineManagerImpl.java b/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineManagerImpl.java index fe0e438e9a..5194771118 100644 --- a/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineManagerImpl.java +++ b/bundles/org.openhab.core.automation.module.script/src/main/java/org/openhab/core/automation/module/script/internal/ScriptEngineManagerImpl.java @@ -122,6 +122,11 @@ public class ScriptEngineManagerImpl implements ScriptEngineManager { public @Nullable ScriptEngineContainer createScriptEngine(String scriptType, String engineIdentifier) { ScriptEngineContainer result = null; ScriptEngineFactory engineFactory = findEngineFactory(scriptType); + + if (loadedScriptEngineInstances.containsKey(engineIdentifier)) { + removeEngine(engineIdentifier); + } + if (engineFactory == null) { logger.error("ScriptEngine for language '{}' could not be found for identifier: {}", scriptType, engineIdentifier); @@ -195,8 +200,9 @@ public class ScriptEngineManagerImpl implements ScriptEngineManager { public void removeEngine(String engineIdentifier) { ScriptEngineContainer container = loadedScriptEngineInstances.get(engineIdentifier); if (container != null) { - if (container.getScriptEngine() instanceof Invocable) { - Invocable inv = (Invocable) container.getScriptEngine(); + ScriptEngine scriptEngine = container.getScriptEngine(); + if (scriptEngine instanceof Invocable) { + Invocable inv = (Invocable) scriptEngine; try { inv.invokeFunction("scriptUnloaded"); } catch (NoSuchMethodException e) { @@ -207,6 +213,18 @@ public class ScriptEngineManagerImpl implements ScriptEngineManager { } else { logger.trace("ScriptEngine does not support Invocable interface"); } + + if (scriptEngine instanceof AutoCloseable) { + AutoCloseable closeable = (AutoCloseable) scriptEngine; + try { + closeable.close(); + } catch (Exception e) { + logger.error("Error while closing script engine", e); + } + } else { + logger.trace("ScriptEngine does not support AutoCloseable interface"); + } + removeScriptExtensions(engineIdentifier); } }