From 3547b515c8970a5e24568f12df04a1ab06922ffc Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 1 Oct 2020 22:49:13 +0200 Subject: [PATCH] restructuring remote calls --- pom.xml | 2 +- .../de/srsoftware/web4rail/Application.java | 1 - .../de/srsoftware/web4rail/ControlUnit.java | 91 ++++++++++++------- .../java/de/srsoftware/web4rail/Plan.java | 63 ++++++++----- .../java/de/srsoftware/web4rail/Route.java | 6 +- .../de/srsoftware/web4rail/moving/Car.java | 5 +- .../de/srsoftware/web4rail/tiles/Tile.java | 5 +- 7 files changed, 112 insertions(+), 61 deletions(-) diff --git a/pom.xml b/pom.xml index be8d44b..6f6ae5d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.5.2 + 0.5.3 Web4Rail Java Model Railway Control https://github.com/StephanRichter/Web4Rail diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java index ac20da0..bbbb58c 100644 --- a/src/main/java/de/srsoftware/web4rail/Application.java +++ b/src/main/java/de/srsoftware/web4rail/Application.java @@ -47,7 +47,6 @@ public class Application { } catch (FileNotFoundException e) { plan = new Plan(); } - Desktop.getDesktop().browse(URI.create("http://localhost:"+config.getInt(PORT)+"/plan")); } diff --git a/src/main/java/de/srsoftware/web4rail/ControlUnit.java b/src/main/java/de/srsoftware/web4rail/ControlUnit.java index 295e250..79b51a7 100644 --- a/src/main/java/de/srsoftware/web4rail/ControlUnit.java +++ b/src/main/java/de/srsoftware/web4rail/ControlUnit.java @@ -3,12 +3,20 @@ package de.srsoftware.web4rail; import java.io.IOException; import java.net.Socket; import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.LinkedList; import java.util.Scanner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import de.keawe.tools.translations.Translation; +import de.srsoftware.web4rail.tags.Button; +import de.srsoftware.web4rail.tags.Fieldset; +import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tags.Label; + public class ControlUnit extends Thread{ private static final Logger LOG = LoggerFactory.getLogger(ControlUnit.class); private static final String DEFAULT_HOST = "localhost"; @@ -16,6 +24,8 @@ public class ControlUnit extends Thread{ private static final int OK_PROTO = 201; private static final int OK_MODE = 202; private static final int OK = 200; + private static final String HOST = "host"; + private static final String PORT = "port"; private class Reply{ private long secs; @@ -56,6 +66,31 @@ public class ControlUnit extends Thread{ return this; } + private void handshake() throws IOException { + String proto = null; + if (scanner.hasNext()) { + String line = scanner.nextLine(); + LOG.debug("recv: "+line); + for (String part : line.split(";")) { + part = part.trim(); + if (part.startsWith("SRCP ")) proto = part.substring(5); + } + if (proto == null) throw new IOException("Handshake failed: "+line); + if (!proto.startsWith("0.8.")) throw new IOException("Unsupported protocol: "+proto); + writeln("SET PROTOCOL SRCP "+proto); + } else throw new IOException("Handshake expected."); + + Reply reply = new Reply(scanner); + if (reply.code != OK_PROTO) throw new IOException("Handshake failed: "+reply); + + writeln("SET CONNECTIONMODE SRCP COMMAND"); // preset following mode: COMMAND MODE + reply = new Reply(scanner); + if (reply.code != OK_MODE) throw new IOException("Handshake failed: "+reply); + writeln("GO"); // switch mode + reply = new Reply(scanner); + if (reply.code != OK) throw new IOException("Handshake failed: "+reply); + + } public static void main(String[] args) throws InterruptedException { ControlUnit cu = new ControlUnit().setEndpoint("Modellbahn", DEFAULT_PORT).setBus(1).restart(); @@ -66,16 +101,21 @@ public class ControlUnit extends Thread{ cu.end(); } - private ControlUnit setBus(int bus) { - this.bus = bus; - return this; + public Object properties() { + Window win = new Window("cu-props", t("Properties of the control unit")); + Form form = new Form(); + new Input(Plan.ACTION,Plan.ACTION_UPDATE).hideIn(form); + new Input(Plan.REALM,Plan.REALM_CU).hideIn(form); + Fieldset fieldset = new Fieldset(t("Server connection")); + new Input(HOST,host).addTo(new Label(t("Hostname"))).addTo(fieldset); + new Input(PORT,port).attr("type", "numeric").addTo(new Label(t("Port"))).addTo(fieldset); + return new Button(t("Save")).addTo(fieldset).addTo(form).addTo(win); } - public void queue(String command) { queue.add(command); } - + /** * Should close the server connection and establish new server connection * @return @@ -103,7 +143,7 @@ public class ControlUnit extends Thread{ e.printStackTrace(); } } - + /** * send command to Server * @param command @@ -116,6 +156,11 @@ public class ControlUnit extends Thread{ return new Reply(scanner); } + private ControlUnit setBus(int bus) { + this.bus = bus; + return this; + } + public ControlUnit setEndpoint(String newHost, int newPort){ host = newHost; port = newPort; @@ -134,32 +179,9 @@ public class ControlUnit extends Thread{ } super.start(); } - - - private void handshake() throws IOException { - String proto = null; - if (scanner.hasNext()) { - String line = scanner.nextLine(); - LOG.debug("recv: "+line); - for (String part : line.split(";")) { - part = part.trim(); - if (part.startsWith("SRCP ")) proto = part.substring(5); - } - if (proto == null) throw new IOException("Handshake failed: "+line); - if (!proto.startsWith("0.8.")) throw new IOException("Unsupported protocol: "+proto); - writeln("SET PROTOCOL SRCP "+proto); - } else throw new IOException("Handshake expected."); - - Reply reply = new Reply(scanner); - if (reply.code != OK_PROTO) throw new IOException("Handshake failed: "+reply); - - writeln("SET CONNECTIONMODE SRCP COMMAND"); // preset following mode: COMMAND MODE - reply = new Reply(scanner); - if (reply.code != OK_MODE) throw new IOException("Handshake failed: "+reply); - writeln("GO"); // switch mode - reply = new Reply(scanner); - if (reply.code != OK) throw new IOException("Handshake failed: "+reply); - + + private String t(String text,Object...fills) { + return Translation.get(Application.class, text, fills); } private void writeln(String data) throws IOException { @@ -167,4 +189,9 @@ public class ControlUnit extends Thread{ socket.getOutputStream().write((data+"\n").getBytes(StandardCharsets.US_ASCII)); LOG.debug("sent {}.",data); } + + public void update(HashMap params) { + // TODO Auto-generated method stub + + } } diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 26f44b4..a08a64e 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -94,7 +94,7 @@ public class Plan { private static final String ACTION_MOVE = "move"; private static final String ACTION_CLICK = "click"; private static final String ACTION_SAVE = "save"; - private static final String ACTION_UPDATE = "update"; + public static final String ACTION_UPDATE = "update"; private static final String TILE = "tile"; private static final Logger LOG = LoggerFactory.getLogger(Plan.class); private static final String X = "x"; @@ -102,7 +102,7 @@ public class Plan { private static final String FILE = "file"; private static final String DIRECTION = "direction"; private static final String ACTION_ROUTE = "openRoute"; - private static final String ID = "id"; + public static final String ID = "id"; private static final String ROUTE = "route"; private static final HashMap clients = new HashMap(); private static final String ACTION_TRAIN = "train"; @@ -111,12 +111,18 @@ public class Plan { private static final String ACTION_CAR = "car"; public static final String ACTION_ADD_LOCO = "addLoco"; public static final String ACTION_ADD_TRAIN = "addTrain"; - public static final String ACTION_UPDATE_CAR = "updateCar"; - private static final String ACTION_CONTROL_UNIT = "controlProps"; + public static final String ACTION_CU_PROPS = "cuProps"; + public static final String ACTION_UPDATE_CU = "update-cu"; + public static final String REALM = "realm"; + public static final String REALM_CU = "cu"; + public static final String REALM_ROUTE = "route"; + public static final String REALM_TILE = "tile"; + public static final String REALM_CAR = "car"; public HashMap tiles = new HashMap(); private HashSet blocks = new HashSet(); private HashMap routes = new HashMap(); + private ControlUnit controlUnit = new ControlUnit(); public Plan() { new Heartbeat().start(); @@ -179,20 +185,17 @@ public class Plan { Car car = Car.get(params.get(Car.ID)); if (car == null) return t("No car with id {} found!",params.get(Car.ID)); - switch (params.get(ACTION)) { - case ACTION_CAR: - return car.properties(); - case ACTION_UPDATE_CAR: - car.update(params); - break; - } - return html(); + return car.properties(); } private Object click(Tile tile) throws IOException { if (tile == null) return null; return tile.click(); } + + private Object cuProps(HashMap params) { + return controlUnit.properties(); + } private Collection follow(Route route, Connector connector) { Tile tile = get(Tile.id(connector.x,connector.y),false); @@ -239,7 +242,7 @@ public class Plan { private Tag hardwareMenu() throws IOException { Tag tileMenu = new Tag("div").clazz("hardware").content(t("Hardware")); Tag list = new Tag("div").clazz("list").content(""); - new Div(ACTION_CONTROL_UNIT).content(t("Control unit")).addTo(list); + new Div(ACTION_CU_PROPS).content(t("Control unit")).addTo(list); return list.addTo(tileMenu); } @@ -395,10 +398,11 @@ public class Plan { case ACTION_TRAIN: return trainAction(params); case ACTION_CAR: - case ACTION_UPDATE_CAR: return carAction(params); case ACTION_CLICK: return click(get(params.get(Tile.ID),true)); + case ACTION_CU_PROPS: + return cuProps(params); case ACTION_ANALYZE: return analyze(); case ACTION_LOCOS: @@ -412,7 +416,7 @@ public class Plan { case ACTION_TRAINS: return Train.manager(); case ACTION_UPDATE: - return update(params); + return update(params); default: LOG.warn("Unknown action: {}",action); } @@ -570,12 +574,29 @@ public class Plan { } private Object update(HashMap params) throws IOException { - if (params.containsKey(ROUTE)) { - Route route = routes.get(Integer.parseInt(params.get(ROUTE))); - if (route == null) return t("Unknown route: {}",params.get(ROUTE)); - route.update(params); - } else update(get(params.get(Tile.ID),true),params); - return this.html(); + if (params.containsKey(REALM)) { + switch (params.get(REALM)) { + case REALM_CAR: + Car car = Car.get(params.get(Car.ID)); + if (car == null) return t("No car with id {} found!",params.get(Car.ID)); + car.update(params); + break; + case REALM_CU: + controlUnit.update(params); + break; + case REALM_ROUTE: + Route route = routes.get(Integer.parseInt(params.get(ID))); + if (route == null) return t("Unknown route: {}",params.get(ROUTE)); + route.update(params); + break; + case REALM_TILE: + update(get(params.get(Tile.ID),true),params); + break; + default: + return t("Unknown realm \"{}\"",params.get(REALM)); + } + } + return html(); } private void update(Tile tile, HashMap params) throws IOException { diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 708a6e1..a09eee8 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -29,6 +29,7 @@ import de.srsoftware.web4rail.actions.SetSignalsToStop; import de.srsoftware.web4rail.actions.SpeedReduction; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tiles.Block; import de.srsoftware.web4rail.tiles.Contact; import de.srsoftware.web4rail.tiles.Shadow; @@ -366,8 +367,9 @@ public class Route { public Tag propForm() { Form form = new Form(); - new Tag("input").attr("type", "hidden").attr("name","action").attr("value", "update").addTo(form); - new Tag("input").attr("type", "hidden").attr("name","route").attr("value", ""+id()).addTo(form); + new Input(Plan.ACTION, Plan.ACTION_UPDATE).hideIn(form); + new Input(Plan.REALM,Plan.REALM_ROUTE).hideIn(form); + new Input(Plan.ID,id()).hideIn(form); Tag label = new Tag("label").content(t("name:")); new Tag("input").attr("type", "text").attr(NAME,"name").attr("value", name()).addTo(label); diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index e2875b1..f799c69 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -112,8 +112,9 @@ public class Car { public Tag propertyForm() { Form form = new Form(); - new Input("action", Plan.ACTION_UPDATE_CAR).hideIn(form); - new Input(ID,id()).hideIn(form); + new Input(Plan.ACTION, Plan.ACTION_UPDATE).hideIn(form); + new Input(Plan.REALM,Plan.REALM_CAR).hideIn(form); + new Input(Plan.ID,id()).hideIn(form); Fieldset fieldset = new Fieldset("Basic properties"); new Input(NAME,name).addTo(new Label(t("Name"))).addTo(fieldset); new Input(STOCK_ID,stockId).addTo(new Label(t("Stock ID"))).addTo(fieldset); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index a8e4f43..5c19da1 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -179,8 +179,9 @@ public abstract class Tile { public Tag propForm() { Form form = new Form(); - new Input("action", "update").hideIn(form); - new Input(ID,id()).hideIn(form); + new Input(Plan.ACTION, Plan.ACTION_UPDATE).hideIn(form); + new Input(Plan.REALM, Plan.REALM_TILE).hideIn(form); + new Input(Plan.ID,id()).hideIn(form); List pd = possibleDirections(); if (!pd.isEmpty()) {