Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
Expand All @@ -39,7 +38,6 @@
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.module.script.profile.ScriptProfile;
import org.openhab.core.common.ThreadPoolManager;
import org.openhab.core.common.registry.RegistryChangeListener;
import org.openhab.core.config.core.ConfigDescription;
import org.openhab.core.config.core.ConfigDescriptionBuilder;
Expand Down Expand Up @@ -82,9 +80,6 @@ public class ScriptTransformationService implements TransformationService, Confi

private final Logger logger = LoggerFactory.getLogger(ScriptTransformationService.class);

private final ScheduledExecutorService scheduler = ThreadPoolManager
.getScheduledPool(ThreadPoolManager.THREAD_POOL_NAME_COMMON);

private final String scriptType;
private final URI profileConfigUri;

Expand Down Expand Up @@ -140,7 +135,8 @@ public void deactivate() {
params = configMatcher.group("params");
}

ScriptRecord scriptRecord = scriptCache.computeIfAbsent(scriptUid, k -> new ScriptRecord());
ScriptRecord scriptRecord = Objects
.requireNonNull(scriptCache.computeIfAbsent(scriptUid, k -> new ScriptRecord()));
scriptRecord.lock.lock();
try {
if (scriptRecord.script.isBlank()) {
Expand All @@ -162,9 +158,6 @@ public void deactivate() {

if (!scriptEngineManager.isSupported(scriptType)) {
// language has been removed, clear container and compiled scripts if found
if (scriptRecord.scriptEngineContainer != null) {
scriptEngineManager.removeEngine(OPENHAB_TRANSFORMATION_SCRIPT + scriptUid);
}
clearCache(scriptUid);
throw new TransformationException(
"Script type '" + scriptType + "' is not supported by any available script engine.");
Expand Down Expand Up @@ -308,29 +301,9 @@ private void clearCache(String uid) {
private void disposeScriptRecord(ScriptRecord scriptRecord) {
ScriptEngineContainer scriptEngineContainer = scriptRecord.scriptEngineContainer;
if (scriptEngineContainer != null) {
disposeScriptEngine(scriptEngineContainer.getScriptEngine());
}
CompiledScript compiledScript = scriptRecord.compiledScript;
if (compiledScript != null) {
disposeScriptEngine(compiledScript.getEngine());
}
}

private void disposeScriptEngine(ScriptEngine scriptEngine) {
if (scriptEngine instanceof AutoCloseable closableScriptEngine) {
// we cannot not use ScheduledExecutorService.execute here as it might execute the task in the calling
// thread (calling ScriptEngine.close in the same thread may result in a deadlock if the ScriptEngine
// tries to Thread.join)
scheduler.schedule(() -> {
try {
closableScriptEngine.close();
} catch (Exception e) {
logger.error("Error while closing script engine", e);
}
}, 0, TimeUnit.SECONDS);
} else {
logger.trace("ScriptEngine does not support AutoCloseable interface");
scriptEngineManager.removeEngine(scriptEngineContainer.getIdentifier());
}
scriptRecord.compiledScript = null;
}

private static class ScriptRecord {
Expand Down