[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:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user