This commit is contained in:
UnlegitDqrk
2026-02-10 19:24:38 +01:00
parent 93fff3ffb3
commit 86800cb166
9 changed files with 480 additions and 193 deletions

View File

@@ -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.
*
* <p>This avoids one huge "bridge" interface.</p>
* <p>All services are optional to allow different embedding scenarios.</p>
*/
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.
*
* <p>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.</p>
* @return ui host
*/
Optional<UiHost> ui();
/**
* Returns an optional DOM host.
*
* <p>Note: You should call {@link FxDomHost#ensureAllElementsHaveId()} after the WebEngine finished loading.</p>
* @return dom host
*/
Optional<DomHost> 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<EventHost> events();
/**
* @return builder
* Returns an optional resource host.
*
* @return resource host
*/
public static Builder builder() {
return new Builder();
}
Optional<ResourceHost> resources();
/**
* @return optional DomHost capability
* Returns an optional console host.
*
* @return console host
*/
public Optional<DomHost> dom() {
return Optional.ofNullable(dom);
}
Optional<ConsoleHost> console();
/**
* @return optional EventHost capability
* Simple immutable implementation.
*/
public Optional<EventHost> events() {
return Optional.ofNullable(events);
}
/**
* @return optional ResourceHost capability
*/
public Optional<ResourceHost> resources() {
return Optional.ofNullable(resources);
}
/**
* @return optional console host
*/
public Optional<ConsoleHost> console() {
return Optional.ofNullable(console);
}
/**
* @return optional ui host
*/
public Optional<UiHost> 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<UiHost> ui() {
return Optional.ofNullable(ui);
}
@Override
public Optional<DomHost> dom() {
return Optional.ofNullable(dom);
}
@Override
public Optional<EventHost> events() {
return Optional.ofNullable(events);
}
@Override
public Optional<ResourceHost> resources() {
return Optional.ofNullable(resources);
}
@Override
public Optional<ConsoleHost> 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;
}
}
}