[jsscripting] Add type translation for Instant & Minor improvements (#14984)

* [jsscripting] Minor code improvements
* [jsscripting] Add type mapping for `Instant`
* [jsscripting] Upgrade openhab-js to 4.3.0

Signed-off-by: Florian Hotze <florianh_dev@icloud.com>
This commit is contained in:
Florian Hotze
2023-05-13 12:25:06 +02:00
committed by GitHub
parent d9c12ca659
commit aa3d6b0dc9
6 changed files with 40 additions and 34 deletions

View File

@@ -14,7 +14,6 @@ package org.openhab.automation.jsscripting.internal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.script.ScriptEngine;
@@ -49,15 +48,13 @@ public final class GraalJSScriptEngineFactory implements ScriptEngineFactory {
private static final GraalJSEngineFactory factory = new GraalJSEngineFactory();
public static final String MIME_TYPE = "application/javascript";
private static final String ALIAS = "graaljs";
private static final List<String> SCRIPT_TYPES = createScriptTypes();
private static final List<String> scriptTypes = createScriptTypes();
private static List<String> createScriptTypes() {
// Add those for backward compatibility (existing scripts may rely on those MIME types)
List<String> backwardCompat = List.of("application/javascript;version=ECMAScript-2021", ALIAS);
List<String> backwardCompat = List.of("application/javascript;version=ECMAScript-2021", "graaljs");
return Stream.of(factory.getMimeTypes(), factory.getExtensions(), backwardCompat).flatMap(List::stream)
.collect(Collectors.toUnmodifiableList());
.toList();
}
private boolean injectionEnabled = true;
@@ -76,7 +73,7 @@ public final class GraalJSScriptEngineFactory implements ScriptEngineFactory {
@Override
public List<String> getScriptTypes() {
return SCRIPT_TYPES;
return scriptTypes;
}
@Override
@@ -86,7 +83,7 @@ public final class GraalJSScriptEngineFactory implements ScriptEngineFactory {
@Override
public @Nullable ScriptEngine createScriptEngine(String scriptType) {
if (!SCRIPT_TYPES.contains(scriptType)) {
if (!scriptTypes.contains(scriptType)) {
return null;
}
return new DebuggingGraalScriptEngine<>(new OpenhabGraalJSScriptEngine(injectionEnabled, useIncludedLibrary,

View File

@@ -28,6 +28,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.time.Duration;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.Collections;
import java.util.Map;
@@ -113,6 +114,13 @@ public class OpenhabGraalJSScriptEngine
v -> v.hasMember("minusDuration") && v.hasMember("toNanos"),
v -> Duration.ofNanos(v.invokeMember("toNanos").asLong()), HostAccess.TargetMappingPrecedence.LOW)
// Translate JS-Joda Instant to java.time.Instant
.targetTypeMapping(Value.class, Instant.class,
// picking two members to check as Instant has many common function names
v -> v.hasMember("toEpochMilli") && v.hasMember("epochSecond"),
v -> Instant.ofEpochMilli(v.invokeMember("toEpochMilli").asLong()),
HostAccess.TargetMappingPrecedence.LOW)
// Translate openhab-js Item to org.openhab.core.items.Item
.targetTypeMapping(Value.class, Item.class, v -> v.hasMember("rawItem"),
v -> v.getMember("rawItem").as(Item.class), HostAccess.TargetMappingPrecedence.LOW)

View File

@@ -24,8 +24,6 @@ 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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Tracks JS module dependencies
@@ -37,8 +35,6 @@ import org.slf4j.LoggerFactory;
@NonNullByDefault
public class JSDependencyTracker extends AbstractScriptDependencyTracker {
private final Logger logger = LoggerFactory.getLogger(JSDependencyTracker.class);
private static final String LIB_PATH = String.join(File.separator, "automation", "js", "node_modules");
@Activate

View File

@@ -17,7 +17,6 @@ import java.nio.file.Path;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.automation.jsscripting.internal.GraalJSScriptEngineFactory;
import org.openhab.core.automation.module.script.ScriptDependencyTracker;
import org.openhab.core.automation.module.script.ScriptEngineManager;
import org.openhab.core.automation.module.script.rulesupport.loader.AbstractScriptFileWatcher;
@@ -49,11 +48,10 @@ public class JSScriptFileWatcher extends AbstractScriptFileWatcher {
@Override
protected Optional<String> getScriptType(Path scriptFilePath) {
if (!scriptFilePath.startsWith(getWatchPath().resolve("node_modules"))
&& "js".equals(super.getScriptType(scriptFilePath).orElse(null))) {
return Optional.of(GraalJSScriptEngineFactory.MIME_TYPE);
} else {
return Optional.empty();
String scriptType = super.getScriptType(scriptFilePath).orElse(null);
if (!scriptFilePath.startsWith(getWatchPath().resolve("node_modules")) && ("js".equals(scriptType))) {
return Optional.of(scriptType);
}
return Optional.empty();
}
}