From 86800cb166611e89b223aff3c8e9197ddb9eac3e Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Tue, 10 Feb 2026 19:24:38 +0100 Subject: [PATCH] Fx ready --- pom.xml | 2 +- .../luascript/hosts/ConsoleHost.java | 15 +- .../luascript/hosts/DomHost.java | 78 +++--- .../luascript/hosts/EventHost.java | 24 +- .../luascript/hosts/HostServices.java | 242 ++++++++---------- .../luascript/hosts/ResourceHost.java | 10 +- .../luascript/hosts/UiHost.java | 158 +++++++++++- .../luascript/runtime/FxLuaScriptEngine.java | 134 ++++++++++ .../luascript/runtime/LuaScriptBootstrap.java | 10 +- 9 files changed, 480 insertions(+), 193 deletions(-) create mode 100644 src/main/java/org/openautonomousconnection/luascript/runtime/FxLuaScriptEngine.java diff --git a/pom.xml b/pom.xml index 14506fa..ffef229 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.openautonomousconnection LuaScript - 1.0.0-BETA.1.4 + 1.0.0-BETA.1.5 Open Autonomous Connection diff --git a/src/main/java/org/openautonomousconnection/luascript/hosts/ConsoleHost.java b/src/main/java/org/openautonomousconnection/luascript/hosts/ConsoleHost.java index 10493b9..0589ea1 100644 --- a/src/main/java/org/openautonomousconnection/luascript/hosts/ConsoleHost.java +++ b/src/main/java/org/openautonomousconnection/luascript/hosts/ConsoleHost.java @@ -1,31 +1,42 @@ package org.openautonomousconnection.luascript.hosts; /** - * Host capability for console logging. + * Abstraction for script console output. */ public interface ConsoleHost { + /** + * Info log. + * * @param message message */ void info(String message); /** + * Standard log. + * * @param message message */ void log(String message); /** + * Warning log. + * * @param message message */ void warn(String message); /** + * Error-like stacktrace print. + * * @param message message */ void error(String message); /** + * Exception-like print. + * * @param message message */ void exception(String message); -} +} \ No newline at end of file diff --git a/src/main/java/org/openautonomousconnection/luascript/hosts/DomHost.java b/src/main/java/org/openautonomousconnection/luascript/hosts/DomHost.java index 6bd591f..3d181e3 100644 --- a/src/main/java/org/openautonomousconnection/luascript/hosts/DomHost.java +++ b/src/main/java/org/openautonomousconnection/luascript/hosts/DomHost.java @@ -4,79 +4,79 @@ import java.util.List; import java.util.Map; /** - * Host capability that exposes a DOM-like API. + * Abstraction over DOM access for scripting. * - *

Element identity is the (stable) element id.

+ *

All element references are by stable element {@code id}.

*/ public interface DomHost { /** - * Returns all element ids known to the renderer (must be stable). + * Returns a list of all element ids in the document. * - * @return list of element ids + * @return list of ids (never null) */ List getAllElementIds(); /** - * Returns all attributes for the given element id. + * Returns all attributes of the element. * * @param elementId element id - * @return attributes map (attributeName -> attributeValue) + * @return attributes map (never null) */ Map getAttributes(String elementId); /** - * Returns the tag name of the element (lowercase recommended), e.g. "script", "button". + * Returns the element tag name, lowercase if possible. * * @param elementId element id - * @return tag name + * @return tag name (never null) */ String getTagName(String elementId); /** - * Returns the text content of an element + * Returns the element text content. * * @param elementId element id - * @return text content (never null) + * @return text (never null) */ String getTextContent(String elementId); /** - * Sets the text content of an element. + * Sets the element text content. * * @param elementId element id - * @param text text + * @param text new text */ void setTextContent(String elementId, String text); /** - * Gets a single attribute or null if missing. + * Returns an attribute value or null if missing. * * @param elementId element id - * @param name attribute name - * @return value or null + * @param name attribute name + * @return value or null if missing */ String getAttribute(String elementId, String name); /** - * Sets an attribute (creates it if missing). + * Sets an attribute value (empty string allowed). * * @param elementId element id - * @param name attribute name - * @param value attribute value + * @param name attribute name + * @param value attribute value */ void setAttribute(String elementId, String name, String value); /** - * Removes an attribute. + * Removes an attribute from the element. * * @param elementId element id - * @param name attribute name + * @param name attribute name */ void removeAttribute(String elementId, String name); /** - * Returns parent id or null. + * Returns the parent element id or null if none. * * @param elementId element id * @return parent id or null @@ -84,48 +84,48 @@ public interface DomHost { String getParentId(String elementId); /** - * Returns direct children ids. + * Returns children element ids. * * @param elementId element id - * @return children ids + * @return list of children ids (never null) */ List getChildrenIds(String elementId); /** - * Creates a new element (detached) and returns its id. + * Creates an element and makes it addressable immediately. * - * @param tagName tag name - * @param requestedId optional requested id, may be null/blank for auto id + * @param tagName tag name + * @param requestedId requested id or null * @return created element id */ String createElement(String tagName, String requestedId); /** - * Removes an element from the DOM. + * Removes an element from the document. * * @param elementId element id */ void removeElement(String elementId); /** - * Moves/appends child under parent. + * Appends a child element to a parent. * * @param parentId parent id - * @param childId child id + * @param childId child id */ void appendChild(String parentId, String childId); /** - * Inserts child before an existing direct child. + * Inserts {@code childId} before {@code beforeChildId} within {@code parentId}. * - * @param parentId parent id - * @param childId child id + * @param parentId parent id + * @param childId child id * @param beforeChildId existing child id */ void insertBefore(String parentId, String childId, String beforeChildId); /** - * Checks if an element id exists. + * Checks if an element with the given id exists. * * @param id element id * @return true if exists @@ -133,18 +133,18 @@ public interface DomHost { boolean exists(String id); /** - * Returns element ids by tag. + * Queries elements by tag name and returns their ids. * - * @param tagName tag - * @return ids + * @param tagName tag name + * @return list of ids (never null) */ List queryByTag(String tagName); /** - * Returns element ids by class. + * Queries elements by class token and returns their ids. * - * @param className class - * @return ids + * @param className class name token + * @return list of ids (never null) */ List queryByClass(String className); } \ No newline at end of file diff --git a/src/main/java/org/openautonomousconnection/luascript/hosts/EventHost.java b/src/main/java/org/openautonomousconnection/luascript/hosts/EventHost.java index e2c65a8..c275464 100644 --- a/src/main/java/org/openautonomousconnection/luascript/hosts/EventHost.java +++ b/src/main/java/org/openautonomousconnection/luascript/hosts/EventHost.java @@ -1,37 +1,41 @@ package org.openautonomousconnection.luascript.hosts; +import java.util.Map; + /** - * Event subscription abstraction (implemented by the client UI layer). + * Abstraction over DOM event subscription for scripting. + * + *

Implementations forward DOM events into a {@code LuaEventRouter}.

*/ public interface EventHost { /** - * Subscribes to an element event. + * Adds a listener for an element's event. * * @param elementId element id - * @param eventName event name (e.g. click) + * @param eventName normalized event name */ void addListener(String elementId, String eventName); /** - * Unsubscribes from an element event. + * Removes a listener for an element's event. * * @param elementId element id - * @param eventName event name + * @param eventName normalized event name */ void removeListener(String elementId, String eventName); /** - * Subscribes to a global event (app/window scope). + * Adds a global (document-level) listener. * - * @param eventName event name + * @param eventName normalized event name */ void addGlobalListener(String eventName); /** - * Unsubscribes from a global event. + * Removes a global (document-level) listener. * - * @param eventName event name + * @param eventName normalized event name */ void removeGlobalListener(String eventName); -} +} \ No newline at end of file diff --git a/src/main/java/org/openautonomousconnection/luascript/hosts/HostServices.java b/src/main/java/org/openautonomousconnection/luascript/hosts/HostServices.java index da1b43d..d7e6b33 100644 --- a/src/main/java/org/openautonomousconnection/luascript/hosts/HostServices.java +++ b/src/main/java/org/openautonomousconnection/luascript/hosts/HostServices.java @@ -1,165 +1,145 @@ package org.openautonomousconnection.luascript.hosts; -import javafx.scene.web.WebEngine; -import org.openautonomousconnection.luascript.fx.FxDomHost; -import org.openautonomousconnection.luascript.fx.FxEventHost; -import org.openautonomousconnection.luascript.fx.FxUiHost; -import org.openautonomousconnection.luascript.fx.FxWebViewResourceHost; -import org.openautonomousconnection.luascript.runtime.LuaRuntime; - import java.util.Objects; import java.util.Optional; /** - * Service container holding optional host capabilities. + * Container for host-side services exposed to Lua. * - *

This avoids one huge "bridge" interface.

+ *

All services are optional to allow different embedding scenarios.

*/ -public final class HostServices { - - private final ConsoleHost console; - private final DomHost dom; - private final EventHost events; - private final ResourceHost resources; - private final UiHost ui; - - private HostServices(Builder b) { - this.console = b.console; - this.ui = b.ui; - this.dom = b.dom; - this.events = b.events; - this.resources = b.resources; - } +public interface HostServices { /** - * Builds a JavaFX WebView preset of HostServices (DOM + events + resources + UI). + * Returns an optional UI host. * - *

Important: This method creates the {@link EventHost} using the provided {@link LuaRuntime}'s - * {@link org.openautonomousconnection.luascript.runtime.LuaEventRouter}. Therefore, the runtime must already - * be constructed before calling this method.

+ * @return ui host + */ + Optional ui(); + + /** + * Returns an optional DOM host. * - *

Note: You should call {@link FxDomHost#ensureAllElementsHaveId()} after the WebEngine finished loading.

+ * @return dom host + */ + Optional dom(); + + /** + * Returns an optional event host. * - * @param engine JavaFX WebEngine - * @param runtime Lua runtime used for event routing - * @param console optional console host (may be null) - * @return HostServices preset for JavaFX WebView + * @return event host */ - public static HostServices fxPreset(WebEngine engine, LuaRuntime runtime, ConsoleHost console) { - Objects.requireNonNull(engine, "engine"); - Objects.requireNonNull(runtime, "runtime"); - - FxDomHost dom = new FxDomHost(engine); - FxWebViewResourceHost resources = new FxWebViewResourceHost(engine); - FxUiHost ui = new FxUiHost(engine, dom); - FxEventHost events = new FxEventHost(dom, runtime.eventRouter()); - - Builder b = builder().dom(dom).events(events).resources(resources).ui(ui); - - if (console != null) { - b.console(console); - } - - return b.build(); - } + Optional events(); /** - * @return builder + * Returns an optional resource host. + * + * @return resource host */ - public static Builder builder() { - return new Builder(); - } + Optional resources(); /** - * @return optional DomHost capability + * Returns an optional console host. + * + * @return console host */ - public Optional dom() { - return Optional.ofNullable(dom); - } + Optional console(); /** - * @return optional EventHost capability + * Simple immutable implementation. */ - public Optional events() { - return Optional.ofNullable(events); - } - - /** - * @return optional ResourceHost capability - */ - public Optional resources() { - return Optional.ofNullable(resources); - } - - /** - * @return optional console host - */ - public Optional console() { - return Optional.ofNullable(console); - } - - /** - * @return optional ui host - */ - public Optional ui() { - return Optional.ofNullable(ui); - } - - /** - * Builder for HostServices. - */ - public static final class Builder { - private ConsoleHost console; - private DomHost dom; - private EventHost events; - private ResourceHost resources; - private UiHost ui; - - public Builder console(ConsoleHost console) { - this.console = Objects.requireNonNull(console, "console"); - return this; - } - - public Builder ui(UiHost ui) { - this.ui = Objects.requireNonNull(ui, "ui"); - return this; - } + final class Default implements HostServices { + private final UiHost ui; + private final DomHost dom; + private final EventHost events; + private final ResourceHost resources; + private final ConsoleHost console; /** - * Provides dom capability. + * Creates a HostServices container. * + * @param ui ui host * @param dom dom host - * @return this - */ - public Builder dom(DomHost dom) { - this.dom = Objects.requireNonNull(dom, "dom"); - return this; - } - - /** - * Provides event subscription capability. - * * @param events event host - * @return this - */ - public Builder events(EventHost events) { - this.events = Objects.requireNonNull(events, "events"); - return this; - } - - /** - * Provides resource loading capability. - * * @param resources resource host - * @return this + * @param console console host */ - public Builder resources(ResourceHost resources) { - this.resources = Objects.requireNonNull(resources, "resources"); - return this; + public Default(UiHost ui, DomHost dom, EventHost events, ResourceHost resources, ConsoleHost console) { + this.ui = ui; + this.dom = dom; + this.events = events; + this.resources = resources; + this.console = console; } - public HostServices build() { - return new HostServices(this); + @Override + public Optional ui() { + return Optional.ofNullable(ui); + } + + @Override + public Optional dom() { + return Optional.ofNullable(dom); + } + + @Override + public Optional events() { + return Optional.ofNullable(events); + } + + @Override + public Optional resources() { + return Optional.ofNullable(resources); + } + + @Override + public Optional console() { + return Optional.ofNullable(console); } } -} + + /** + * Stdout-based console host. + */ + final class StdoutConsole implements ConsoleHost { + private final String prefix; + + /** + * Creates a new stdout console with a prefix. + * + * @param prefix prefix (may be empty) + */ + public StdoutConsole(String prefix) { + this.prefix = Objects.requireNonNull(prefix, "prefix"); + } + + @Override + public void info(String message) { + System.out.println(prefix + "[info] " + safe(message)); + } + + @Override + public void log(String message) { + System.out.println(prefix + "[log] " + safe(message)); + } + + @Override + public void warn(String message) { + System.out.println(prefix + "[warn] " + safe(message)); + } + + @Override + public void error(String message) { + System.err.println(prefix + "[error] " + safe(message)); + } + + @Override + public void exception(String message) { + System.err.println(prefix + "[exception] " + safe(message)); + } + + private static String safe(String s) { + return s == null ? "" : s; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/openautonomousconnection/luascript/hosts/ResourceHost.java b/src/main/java/org/openautonomousconnection/luascript/hosts/ResourceHost.java index 3528c48..4fb33a4 100644 --- a/src/main/java/org/openautonomousconnection/luascript/hosts/ResourceHost.java +++ b/src/main/java/org/openautonomousconnection/luascript/hosts/ResourceHost.java @@ -1,16 +1,16 @@ package org.openautonomousconnection.luascript.hosts; /** - * Resource loading abstraction for LuaScript (e.g. script src). + * Abstraction for loading external resources (e.g. {@code