diff --git a/pom.xml b/pom.xml
index 341f677..50daf35 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.1.11
+ 1.2.0
Web4Rail
jar
Java Model Railway Control
diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java
index eefc442..5d5f2ad 100644
--- a/src/main/java/de/srsoftware/web4rail/Application.java
+++ b/src/main/java/de/srsoftware/web4rail/Application.java
@@ -13,7 +13,6 @@ import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URLDecoder;
import java.nio.file.Files;
-import java.util.Date;
import java.util.HashMap;
import org.slf4j.Logger;
@@ -23,7 +22,6 @@ import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
import de.keawe.localconfig.Configuration;
-import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.conditions.Condition;
@@ -81,19 +79,6 @@ public class Application extends BaseClass{
Desktop.getDesktop().browse(URI.create("http://"+InetAddress.getLocalHost().getHostName()+":"+config.getInt(PORT)+"/plan"));
}
- /**
- * helper class creating unique ids for use throuout the application
- * @return
- */
- public static int createId() {
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return new Date().hashCode();
- }
-
/**
* handles request from clients by delegating them to respective classes
* @param params
@@ -275,14 +260,4 @@ public class Application extends BaseClass{
OutputStreamWriter sseWriter = new OutputStreamWriter(client.getResponseBody());
plan.addClient(sseWriter);
}
-
- /**
- * shorthand for Translations.get(text,fills)
- * @param text
- * @param fills
- * @return
- */
- private static String t(String text, Object...fills) {
- return Translation.get(Application.class, text, fills);
- }
}
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index 91ddf05..bf19489 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -2,14 +2,25 @@ package de.srsoftware.web4rail;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.json.JSONObject;
+import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
+import de.srsoftware.web4rail.Plan.Direction;
+import de.srsoftware.web4rail.actions.Action;
+import de.srsoftware.web4rail.conditions.Condition;
+import de.srsoftware.web4rail.moving.Car;
+import de.srsoftware.web4rail.moving.Locomotive;
+import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tags.Button;
+import de.srsoftware.web4rail.tiles.Block;
+import de.srsoftware.web4rail.tiles.Contact;
+import de.srsoftware.web4rail.tiles.Tile;
public abstract class BaseClass implements Constants{
protected static Plan plan; // the track layout in use
@@ -17,18 +28,162 @@ public abstract class BaseClass implements Constants{
public static String speedUnit = DEFAULT_SPEED_UNIT;
public static String lengthUnit = DEFAULT_LENGTH_UNIT;
private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
- public static Button contextButton(String context,String text) {
- String[] parts = context.split(":");
- String realm = parts[0];
- String id = parts.length>1 ? parts[1] : null;
- return new Button(text,Map.of(REALM,realm,ID,id,ACTION,ACTION_PROPS));
- }
+ protected Id id = null;
- public static Tag link(String tagClass,Map params,Object caption) {
- String json = new JSONObject(params).toString().replace("\"", "'");
- return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(caption.toString());
+ public static class Context {
+ private BaseClass main = null;
+ private Tile tile;
+ private Block block;
+ private Train train;
+ private Route route;
+ private Action action;
+ private Condition condition;
+ private Car car;
+ private Contact contact;
+ private Direction direction = null;
+
+ public Context(BaseClass object) {
+ main = object;
+ if (main instanceof Tile) this.tile = (Tile) main;
+ if (main instanceof Contact) this.contact = (Contact) main;
+ if (main instanceof Block) this.block = (Block) main;
+ if (main instanceof Train) this.train = (Train) main;
+ if (main instanceof Route) this.route = (Route) main;
+ if (main instanceof Action) this.action = (Action) main;
+ if (main instanceof Condition) this.condition = (Condition) main;
+ if (main instanceof Car) this.car = (Car) main;
+ }
+
+ public Action action() {
+ return action;
+ }
+
+ public Block block() {
+ return block;
+ }
+
+ public Context block(Block newBlock) {
+ block = newBlock;
+ return this;
+ }
+
+ public Car car() {
+ return car;
+ }
+
+ public Context clone() {
+ return new Context(main);
+ }
+
+ public Condition condition() {
+ return condition;
+ }
+
+ public Contact contact() {
+ return contact;
+ }
+
+ public Direction direction() {
+ return direction;
+ }
+
+ public Context direction(Direction newDirection) {
+ direction = newDirection;
+ return this;
+ }
+
+ public Route route() {
+ return route;
+ }
+
+ public Context route(Route newRoute) {
+ route = newRoute;
+ return this;
+ }
+
+ public Tile tile() {
+ return tile;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer(getClass().getSimpleName());
+ sb.append("(");
+ sb.append(t("Train: {}",train));
+ if (isSet(route)) sb.append(", "+t("Route: {}",route));
+ if (isSet(contact)) sb.append(", "+t("Contact: {}",contact));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ public Train train() {
+ return train;
+ }
+
+ public void train(Train newTrain) {
+ train = newTrain;
+ }
}
+
+ public static class Id implements Comparable{
+ private String internalId;
+
+ public Id() {
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ internalId = md5sum(new Date());
+ }
+
+
+ public Id(String id) {
+ internalId = id;
+ }
+
+ @Override
+ public String toString() {
+ return internalId;
+ }
+
+ @Override
+ public int compareTo(Id other) {
+ return internalId.compareTo(other.internalId);
+ }
+ public static Id from(JSONObject json) {
+ return Id.from(json,ID);
+ }
+
+ public static Id from(JSONObject json,String key) {
+ return json.has(key) ? new Id(""+json.get(key)) : null;
+ }
+
+ public static Id from(Map params) {
+ return Id.from(params,ID);
+ }
+
+
+ public static Id from(Map params, String key) {
+ String sid = params.get(key);
+ return sid == null ? null : new Id(sid);
+ }
+ }
+
+ public Button button(String text,Map additionalProps) {
+ return new Button(text,props(additionalProps));
+ }
+
+ public Button button(String text) {
+ return button(text,null);
+ }
+
+ public Id id() {
+ if (isNull(id)) id = new Id();
+ return id;
+ }
+
public static boolean isNull(Object o) {
return o==null;
}
@@ -37,6 +192,16 @@ public abstract class BaseClass implements Constants{
return o != null;
}
+ public Tag link(String tagClass,Object caption) {
+ return link(tagClass,caption,null);
+ }
+
+ public Tag link(String tagClass,Object caption,Map additionalProps) {
+ String json = new JSONObject(props(additionalProps)).toString().replace("\"", "'");
+ return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(caption.toString());
+ }
+
+
public static String md5sum(Object o) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
@@ -57,4 +222,30 @@ public abstract class BaseClass implements Constants{
overlay.entrySet().stream().forEach(entry -> merged.put(entry.getKey(), entry.getValue()));
return merged;
}
+
+ public Window properties() {
+ return new Window(getClass().getSimpleName()+"-properties", t("Properties of {}",this));
+ }
+
+ public Map props(Map additionalProps){
+ String realm = null;
+ if (this instanceof Tile) realm = REALM_PLAN;
+ if (this instanceof Contact) realm = REALM_CONTACT;
+
+ if (this instanceof Car) realm = REALM_CAR;
+ if (this instanceof Locomotive) realm = REALM_LOCO;
+
+ if (this instanceof Train) realm = REALM_TRAIN;
+ if (this instanceof Route) realm = REALM_ROUTE;
+ if (this instanceof Action) realm = REALM_ACTIONS;
+ if (this instanceof Condition) realm = REALM_CONDITION;
+
+ HashMap props = new HashMap(Map.of(REALM, realm, ACTION, ACTION_PROPS, ID, id().toString()));
+ if (isSet(additionalProps)) props.putAll(additionalProps);
+ return props;
+ }
+
+ protected static String t(String txt, Object...fills) {
+ return Translation.get(Application.class, txt, fills);
+ }
}
diff --git a/src/main/java/de/srsoftware/web4rail/Context.java b/src/main/java/de/srsoftware/web4rail/Context.java
new file mode 100644
index 0000000..79c6034
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/Context.java
@@ -0,0 +1,5 @@
+package de.srsoftware.web4rail;
+
+public class Context {
+
+}
diff --git a/src/main/java/de/srsoftware/web4rail/PathFinder.java b/src/main/java/de/srsoftware/web4rail/PathFinder.java
index d46d7df..d386ebb 100644
--- a/src/main/java/de/srsoftware/web4rail/PathFinder.java
+++ b/src/main/java/de/srsoftware/web4rail/PathFinder.java
@@ -10,7 +10,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.srsoftware.web4rail.Plan.Direction;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tiles.Block;
@@ -24,12 +23,12 @@ public class PathFinder extends BaseClass{
for (int i=0; i> forwardRoutes = availableRoutes(forwardContext,visitedRoutes);
visitedRoutes.remove(routeCandidate);
@@ -112,5 +112,4 @@ public class PathFinder extends BaseClass{
return selectetRoute;
}
-
}
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 98c35bb..d8da9af 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -26,7 +26,6 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.moving.Car;
@@ -141,10 +140,10 @@ public class Plan extends BaseClass{
private static final String SPEED_UNIT = "speed_unit";
private static final String LENGTH_UNIT = "length_unit";
- public HashMap tiles = new HashMap(); // The list of tiles of this plan, i.e. the Track layout
+ public HashMap tiles = new HashMap(); // The list of tiles of this plan, i.e. the Track layout
private HashSet blocks = new HashSet(); // the list of tiles, that are blocks
private HashSet signals = new HashSet(); // the list of tiles, that are signals
- private HashMap routes = new HashMap(); // the list of routes of the track layout
+ private HashMap routes = new HashMap(); // the list of routes of the track layout
private ControlUnit controlUnit = new ControlUnit(this); // the control unit, to which the plan is connected
private Contact learningContact;
@@ -175,13 +174,13 @@ public class Plan extends BaseClass{
case ACTION_ANALYZE:
return analyze();
case ACTION_CLICK:
- return click(get(params.get(ID),true));
+ return click(get(Id.from(params),true));
case ACTION_CONNECT:
- Tile tile = get(params.get(ID), false);
+ Tile tile = get(Id.from(params), false);
if (tile instanceof Bridge) return ((Bridge)tile).requestConnect();
break;
case ACTION_MOVE:
- return moveTile(params.get(DIRECTION),params.get(ID));
+ return moveTile(params.get(DIRECTION),Id.from(params));
case ACTION_PROPS:
return properties(params);
case ACTION_SAVE:
@@ -341,7 +340,7 @@ public class Plan extends BaseClass{
* @param resolveShadows if this is set to true, this function will return the overlaying tiles, if the id belongs to a shadow tile.
* @return the tile belonging to the id, or the overlaying tile if the respective tile is a shadow tile.
*/
- public Tile get(String tileId,boolean resolveShadows) {
+ public Tile get(Id tileId,boolean resolveShadows) {
if (isNull(tileId)) return null;
Tile tile = tiles.get(tileId);
if (resolveShadows && tile instanceof Shadow) tile = ((Shadow)tile).overlay();
@@ -508,7 +507,7 @@ public class Plan extends BaseClass{
* @throws NumberFormatException
* @throws IOException
*/
- private String moveTile(String direction, String tileId) throws NumberFormatException, IOException {
+ private String moveTile(String direction, Id tileId) throws NumberFormatException, IOException {
switch (direction) {
case "south":
return moveTile(get(tileId,false),Direction.SOUTH);
@@ -611,7 +610,7 @@ public class Plan extends BaseClass{
private Window properties(HashMap params) {
if (params.containsKey(ID)) {
- Tile tile = get(params.get(ID), true);
+ Tile tile = get(Id.from(params), true);
if (isSet(tile)) return tile.propMenu();
}
@@ -659,7 +658,7 @@ public class Plan extends BaseClass{
*/
Route registerRoute(Route newRoute) {
newRoute.path().stream().filter(Tile::isSet).forEach(tile -> tile.add(newRoute));
- int newRouteId = newRoute.id();
+ Id newRouteId = newRoute.id();
Route existingRoute = routes.get(newRouteId);
if (isSet(existingRoute)) newRoute.addPropertiesFrom(existingRoute);
routes.put(newRouteId, newRoute);
@@ -707,7 +706,7 @@ public class Plan extends BaseClass{
* @param routeId the id of the route requestd
* @return
*/
- public Route route(int routeId) {
+ public Route route(Id routeId) {
return routes.get(routeId);
}
@@ -798,15 +797,15 @@ public class Plan extends BaseClass{
public Tag showContext(HashMap params) {
String[] parts = params.get(CONTEXT).split(":");
String realm = parts[0];
- String id = parts.length>1 ? parts[1] : null;
+ Id id = parts.length>1 ? new Id(parts[1]) : null;
switch (realm) {
case REALM_ROUTE:
- return route(Integer.parseInt(id)).properties(params);
+ return route(id).properties(params);
case REALM_PLAN:
Tile tile = get(id, false);
return isNull(tile) ? null : tile.propMenu();
case REALM_ACTIONS:
- Action action = Action.get(Integer.parseInt(id));
+ Action action = Action.get(id);
return (isSet(action)) ? action.properties(params) : null;
}
@@ -849,16 +848,6 @@ public class Plan extends BaseClass{
}
}
- /**
- * shorthand for Translations.get(message,fills)
- * @param message
- * @param fills
- * @return
- */
- private String t(String message, Object...fills) {
- return Translation.get(Application.class, message, fills);
- }
-
/**
* generates the menu for selecting tiles to be added to the layout
* @return
@@ -931,7 +920,7 @@ public class Plan extends BaseClass{
* @throws IOException
*/
private Object update(HashMap params) throws IOException {
- Tile tile = get(params.get(ID),true);
+ Tile tile = get(Id.from(params),true);
if (isSet(tile)) return tile.update(params);
if (params.containsKey(LENGTH_UNIT)) lengthUnit = params.get(LENGTH_UNIT);
@@ -942,7 +931,7 @@ public class Plan extends BaseClass{
}
private Object updateTimes(HashMap params) throws IOException {
- Tile tile = get(params.get(ID),false);
+ Tile tile = get(Id.from(params),false);
if (tile instanceof Block) {
Block block = (Block) tile;
place(block.updateTimes(params));
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index f0bb78a..68314ff 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -23,7 +23,6 @@ import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.actions.Action;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.actions.BrakeStart;
import de.srsoftware.web4rail.actions.BrakeStop;
@@ -72,7 +71,7 @@ public class Route extends BaseClass implements Comparable{
static final String SIGNALS = "signals";
static final String TURNOUTS = "turnouts";
- private static HashMap names = new HashMap(); // maps id to name. needed to keep names during plan.analyze()
+ private static HashMap names = new HashMap(); // maps id to name. needed to keep names during plan.analyze()
private class BrakeProcessor extends Thread {
private int startSpeed;
@@ -144,7 +143,7 @@ public class Route extends BaseClass implements Comparable{
private boolean disabled = false;
private Block endBlock = null;
public Direction endDirection;
- private int id;
+ private Id id;
private Vector path;
private Vector signals;
public Train train;
@@ -163,12 +162,12 @@ public class Route extends BaseClass implements Comparable{
* @throws IOException
*/
public static Object action(HashMap params) throws IOException {
- Route route = plan.route(Integer.parseInt(params.get(ID)));
+ Route route = plan.route(Id.from(params));
if (isNull(route)) return t("Unknown route: {}",params.get(ID));
switch (params.get(ACTION)) {
case ACTION_DROP:
String message = plan.remove(route);
- String tileId = params.get(Tile.class.getSimpleName());
+ Id tileId = Id.from(params,Tile.class.getSimpleName());
if (isSet(tileId)) {
Tile tile = plan.get(tileId, false);
if (isSet(tile)) {
@@ -228,7 +227,7 @@ public class Route extends BaseClass implements Comparable{
}
private void addBasicPropertiesTo(Window win) {
- if (isSet(train)) link("span",Map.of(REALM,REALM_TRAIN,ID,train.id,ACTION,ACTION_PROPS),t("Train: {}",train)).addTo(win);
+ if (isSet(train)) link("span",t("Train: {}",train)).addTo(win);
new Tag("h4").content(t("Origin and destination")).addTo(win);
Tag list = new Tag("ul");
Plan.addLink(startBlock, t("Origin: {} to {}",startBlock.name,startDirection), list);
@@ -441,8 +440,8 @@ public class Route extends BaseClass implements Comparable{
}
private Object dropCodition(HashMap params) {
- String condId = params.get(REALM_CONDITION);
- if (isSet(condId)) conditions.removeById(Integer.parseInt(condId));
+ Id condId = Id.from(params,REALM_CONDITION);
+ if (isSet(condId)) conditions.removeById(condId);
return properties(params);
}
@@ -492,8 +491,8 @@ public class Route extends BaseClass implements Comparable{
return sb.toString().trim();
}
- public int id() {
- if (id == 0) id = generateName().hashCode();
+ public Id id() {
+ if (id == null) id = new Id(generateName());
return id;
}
@@ -512,11 +511,11 @@ public class Route extends BaseClass implements Comparable{
JSONObject json = new JSONObject();
json.put(ID, id());
- Vector tileIds = new Vector();
+ Vector tileIds = new Vector();
for (Tile t : this.path) tileIds.add(t.id());
json.put(PATH, tileIds);
- Vector signalIds = new Vector(); // list all signals affecting this route
+ Vector signalIds = new Vector(); // list all signals affecting this route
for (Tile t : this.signals) signalIds.add(t.id());
json.put(SIGNALS, signalIds);
@@ -556,13 +555,13 @@ public class Route extends BaseClass implements Comparable{
}
private Route load(JSONObject json,Plan plan) {
- if (json.has(ID)) id = json.getInt(ID);
+ if (json.has(ID)) id = Id.from(json);
if (json.has(NAME)) name(json.getString(NAME));
JSONArray pathIds = json.getJSONArray(PATH);
startDirection = Direction.valueOf(json.getString(START_DIRECTION));
endDirection = Direction.valueOf(json.getString(END_DIRECTION));
for (Object tileId : pathIds) {
- Tile tile = plan.get((String) tileId,false);
+ Tile tile = plan.get(new Id((String) tileId),false);
if (isNull(tile)) {
continue;
}
@@ -582,12 +581,12 @@ public class Route extends BaseClass implements Comparable{
JSONArray turnouts = json.getJSONArray(TURNOUTS);
for (int i=0; i actions = new HashMap();
+ private static final HashMap actions = new HashMap();
public static final Logger LOG = LoggerFactory.getLogger(Action.class);
private static final String PREFIX = Action.class.getPackageName();
- protected int id;
-
- public static class Context {
- public Contact contact = null;
- public Route route = null;
- public Train train = null;
- public Block block = null;
- public Direction direction = null;
-
- public Context(Contact c, Route r, Train t, Block b, Direction d) {
- contact = c;
- route = r;
- train = t;
- block = b;
- direction = d;
- }
-
- public Context(Contact c) {
- contact = c;
- setRoute(contact.route());
- }
-
- public Context(Train train) {
- setTrain(train);
- }
-
- public Context(Route route) {
- setRoute(route);
- }
-
- protected Context clone() {
- return new Context(contact, route, train, block, direction);
- }
-
- private void setRoute(Route route) {
- this.route = route;
- if (isSet(route)) setTrain(route.train);
-
- }
-
- private void setTrain(Train train) {
- this.train = train;
- if (isSet(train)) {
- if (isNull(route)) route = train.route;
- setBlock(train.currentBlock());
- setDirection(train.direction());
- }
- }
-
- private void setDirection(Direction dir) {
- direction = dir;
- }
-
- private void setBlock(Block block) {
- this.block = block;
- }
-
- @Override
- public String toString() {
- StringBuffer sb = new StringBuffer(getClass().getSimpleName());
- sb.append("(");
- sb.append(t("Train: {}",train));
- if (isSet(route)) sb.append(", "+t("Route: {}",route));
- if (isSet(contact)) sb.append(", "+t("Contact: {}",contact));
- sb.append(")");
- return sb.toString();
- }
- }
public Action() {
- id = Application.createId();
- actions.put(id, this);
+ actions.put(id(), this);
}
public static Action create(String type) {
@@ -120,13 +46,9 @@ public abstract class Action extends BaseClass {
public abstract boolean fire(Context context);
- public static Action get(int actionId) {
+ public static Action get(Id actionId) {
return actions.get(actionId);
}
-
- public int id() {
- return id;
- }
public JSONObject json() {
return new JSONObject().put(TYPE, getClass().getSimpleName());
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
index 822b49d..18cdb76 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
@@ -13,11 +13,11 @@ import org.slf4j.LoggerFactory;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application;
-import de.srsoftware.web4rail.BaseClass;
+import de.srsoftware.web4rail.BaseClass.Context;
+import de.srsoftware.web4rail.BaseClass.Id;
import de.srsoftware.web4rail.Constants;
import de.srsoftware.web4rail.Plan;
import de.srsoftware.web4rail.Window;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
@@ -26,25 +26,25 @@ public class ActionList extends Vector implements Constants{
private static final Logger LOG = LoggerFactory.getLogger(ActionList.class);
private static final long serialVersionUID = 4862000041987682112L;
- private static final HashMap actionLists = new HashMap();
- private int id;
+ private static final HashMap actionLists = new HashMap();
+ private Id id;
public ActionList() {
- id = Application.createId();
+ id = new Id();
actionLists.put(id,this);
}
- private static Integer actionId(HashMap params) {
+ private static Id actionId(HashMap params) {
if (!params.containsKey(ID)) return null;
String[] parts = params.get(ID).split("/");
if (parts.length<2) return null;
- return Integer.parseInt(parts[1]);
+ return new Id(parts[1]);
}
- private static Integer actionListId(HashMap params) {
+ private static Id actionListId(HashMap params) {
if (!params.containsKey(ID)) return null;
String[] parts = params.get(ID).split("/");
- return Integer.parseInt(parts[0]);
+ return new Id(parts[0]);
}
private Object actionTypeForm(Window win, String context) {
@@ -110,7 +110,7 @@ public class ActionList extends Vector implements Constants{
boolean first = true;
for (Action action : this) {
props.put(ID, id+"/"+action.id());
- Tag act = BaseClass.link("span", Map.of(REALM,REALM_ACTIONS,ID,id+"/"+action.id(),ACTION,ACTION_PROPS,CONTEXT,context), action+NBSP).addTo(new Tag("li"));;
+ Tag act = action.link("span", action+NBSP, Map.of(CONTEXT,context,ID,id+"/"+action.id())).addTo(new Tag("li"));
if (!first) {
props.put(ACTION, ACTION_MOVE);
new Button("↑",props).addTo(act);
@@ -132,9 +132,9 @@ public class ActionList extends Vector implements Constants{
}
}
- public boolean drop(int actionId) {
+ public boolean drop(Id actionId) {
for (Action action : this) {
- if (action.id() == actionId) {
+ if (action.id().equals(actionId)) {
this.remove(action);
return true;
}
@@ -150,7 +150,7 @@ public class ActionList extends Vector implements Constants{
return true;
}
- public int id() {
+ public Id id() {
return id;
}
@@ -172,9 +172,9 @@ public class ActionList extends Vector implements Constants{
return actionList;
}
- public boolean moveUp(int actionId) {
+ public boolean moveUp(Id actionId) {
for (int i=1; i implements Constants{
}
public static Object process(HashMap params, Plan plan) {
- Integer listId = actionListId(params);
+ Id listId = actionListId(params);
if (listId == null) return t("No action list id passed to ActionList.process()!");
ActionList actionList = actionLists.get(listId);
- Integer actionId = actionId(params);
+ Id actionId = actionId(params);
String action = params.get(ACTION);
if (action == null) return t("No action passed to ActionList.process()!");
if (actionList == null && !List.of(ACTION_UPDATE,ACTION_PROPS).contains(action)) return t("No action list with id {} found!",listId);
@@ -209,7 +209,7 @@ public class ActionList extends Vector implements Constants{
}
private static Object propsOf(HashMap params) {
- int actionId = actionId(params);
+ Id actionId = actionId(params);
Action action = Action.get(actionId);
if (action != null) return action.properties(params);
return t("No action with id {} found!",actionId);
@@ -219,7 +219,7 @@ public class ActionList extends Vector implements Constants{
return Translation.get(Application.class, text, fills);
}
- private static Object update(int actionId, HashMap params, Plan plan) {
+ private static Object update(Id actionId, HashMap params, Plan plan) {
Action action = Action.get(actionId);
if (action != null) {
plan.stream(action.update(params).toString());
diff --git a/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java b/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java
index a3f40d5..ae9f74b 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java
@@ -4,8 +4,8 @@ public class BrakeCancel extends Action {
@Override
public boolean fire(Context context) {
- if (isNull(context.route)) return false;
- context.route.brakeCancel();
+ if (isNull(context.route())) return false;
+ context.route().brakeCancel();
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java b/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java
index e779f26..9c9f7f6 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java
@@ -4,8 +4,8 @@ public class BrakeStart extends Action {
@Override
public boolean fire(Context context) {
- if (isNull(context.route)) return false;
- context.route.brakeStart();
+ if (isNull(context.route())) return false;
+ context.route().brakeStart();
LOG.debug("Started brake process...");
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java b/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java
index 81d5b2a..8f06616 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java
@@ -4,8 +4,8 @@ public class BrakeStop extends Action {
@Override
public boolean fire(Context context) {
- if (isNull(context.route)) return false;
- context.route.brakeStop();
+ if (isNull(context.route())) return false;
+ context.route().brakeStop();
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
index 3917005..d19d471 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
@@ -49,10 +49,8 @@ public class ConditionalAction extends Action {
if (!conditions.isEmpty()) {
Tag list = new Tag("ul");
for (Condition condition : conditions) {
- HashMap props = new HashMap(Map.of(REALM,REALM_CONDITION,ID,condition.id(),ACTION,ACTION_PROPS,CONTEXT, context));
- Tag li = link("span", props, condition+NBSP).addTo(new Tag("li"));
- props.put(ACTION, ACTION_DROP);
- props.put(CONTEXT,REALM_ACTIONS+":"+id());
+ Tag li = link("span", condition+NBSP,Map.of(CONTEXT,context)).addTo(new Tag("li"));
+ HashMap props = new HashMap(Map.of(REALM,REALM_CONDITION,ID,condition.id(),ACTION,ACTION_DROP,CONTEXT, REALM_ACTIONS+":"+id()));
new Button(t("delete"), props).addTo(li).addTo(list);
}
list.addTo(fieldset);
@@ -67,7 +65,7 @@ public class ConditionalAction extends Action {
Condition.selector().addTo(form);
new Button(t("Add condition"),form).addTo(form);
- return contextButton(context,t("Back")).addTo(form).addTo(fieldset);
+ return button(t("Back")).addTo(form).addTo(fieldset);
}
public boolean equals(ConditionalAction other) {
diff --git a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
index 2e37bf0..75b1779 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
@@ -18,8 +18,8 @@ public class DetermineTrainInBlock extends Action {
@Override
public boolean fire(Context context) {
- context.block = block;
- context.train = block.train();
+ context.block(block);
+ context.train(block.train());
return true;
}
@@ -33,7 +33,7 @@ public class DetermineTrainInBlock extends Action {
@Override
public Action load(JSONObject json) {
super.load(json);
- String blockId = json.getString(BLOCK);
+ Id blockId = Id.from(json,BLOCK);
if (isSet(blockId)) block = Block.get(blockId);
return this;
}
@@ -61,7 +61,7 @@ public class DetermineTrainInBlock extends Action {
@Override
protected Object update(HashMap params) {
LOG.debug("update: {}",params);
- String blockId = params.get(Block.class.getSimpleName());
+ Id blockId = Id.from(params,Block.class.getSimpleName());
if (isSet(blockId)) block = Block.get(blockId);
return properties(params);
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java b/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java
index 02302f2..983aa42 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java
@@ -6,7 +6,7 @@ public class FinishRoute extends Action {
@Override
public boolean fire(Context context) {
- Route route = context.route;
+ Route route = context.route();
if (isSet(route)) route.finish();
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java b/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java
index f812911..859cc46 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java
@@ -8,20 +8,20 @@ public class PreserveRoute extends Action {
@Override
public boolean fire(Context context) {
- Train train = context.train;
- Route route = context.route;
+ Train train = context.train();
+ Route route = context.route();
// These are errors:
if (isNull(train)) return false;
if (isNull(route)) return false;
- Range waitTime = context.route.endBlock().getWaitTime(context.train,context.route.endDirection);
+ Range waitTime = route.endBlock().getWaitTime(train,route.endDirection);
// These are NOT errors:
- if (!context.train.usesAutopilot()) return true;
+ if (!train.usesAutopilot()) return true;
if (waitTime.max > 0) return true; // train is expected to wait in next block.
if (train.destination() == route.endBlock()) return true;
- context.train.reserveNext();
+ train.reserveNext();
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java b/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java
index 789d974..d9e7b60 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java
@@ -18,14 +18,14 @@ public class SetContextTrain extends Action {
@Override
public boolean fire(Context context) {
- context.train = train;
+ context.train(train);
return true;
}
@Override
public JSONObject json() {
JSONObject json = super.json();
- if (isSet(train)) json.put(REALM_TRAIN, train.id);
+ if (isSet(train)) json.put(REALM_TRAIN, train.id());
return json;
}
@@ -37,7 +37,7 @@ public class SetContextTrain extends Action {
public void run() {
try {
sleep(1000);
- int trainId = json.getInt(REALM_TRAIN);
+ Id trainId = Id.from(json,REALM_TRAIN);
if (isSet(trainId)) train = Train.get(trainId);
} catch (InterruptedException e) {}
};
@@ -69,8 +69,8 @@ public class SetContextTrain extends Action {
@Override
protected Object update(HashMap params) {
LOG.debug("update: {}",params);
- String trainId = params.get(Train.class.getSimpleName());
- if (isSet(trainId)) train = Train.get(Integer.parseInt(trainId));
+ Id trainId = Id.from(params,Train.class.getSimpleName());
+ if (isSet(trainId)) train = Train.get(trainId);
return properties(params);
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
index 4ec9b9e..db596c5 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
@@ -39,7 +39,7 @@ public class SetDisplayText extends TextAction{
public void run() {
try {
sleep(1000);
- display = (TextDisplay) plan.get(json.getString(DISPLAY), false);
+ display = (TextDisplay) plan.get(Id.from(json,DISPLAY), false);
} catch (InterruptedException e) {}
};
}.start();
@@ -72,7 +72,7 @@ public class SetDisplayText extends TextAction{
protected Object update(HashMap params) {
super.update(params);
String displayId = params.get(TextDisplay.class.getSimpleName());
- if (isSet(displayId)) display = (TextDisplay) plan.get(displayId, false);
+ if (isSet(displayId)) display = (TextDisplay) plan.get(new Id(displayId), false);
return properties(params);
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
index 7010fb8..4bd853c 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
@@ -41,7 +41,7 @@ public class SetRelay extends Action {
super.load(json);
String relayId = json.getString(RELAY);
if (isSet(relayId)) {
- relay = Relay.get(relayId);
+ relay = Relay.get(new Id(relayId));
state = json.getBoolean(Relay.STATE);
}
return this;
@@ -81,7 +81,7 @@ public class SetRelay extends Action {
@Override
protected Object update(HashMap params) {
LOG.debug("update: {}",params);
- String relayId = params.get(RELAY);
+ Id relayId = new Id(params.get(RELAY));
relay = Relay.get(relayId);
String st = params.get(Relay.STATE);
if (isSet(st)) state = st.equals("true");
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java b/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
index 8b8be9c..498638b 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
@@ -39,7 +39,7 @@ public class SetSignal extends Action {
@Override
public Action load(JSONObject json) {
super.load(json);
- Tile tile = plan.get(json.getString(SIGNAL), false);
+ Tile tile = plan.get(new Id(json.getString(SIGNAL)), false);
if (tile instanceof Signal) signal = (Signal) tile;
state = json.getString(Signal.STATE);
return this;
@@ -91,7 +91,7 @@ public class SetSignal extends Action {
@Override
protected Object update(HashMap params) {
LOG.debug("update: {}",params);
- Tile tile = plan.get(params.get(SIGNAL), false);
+ Tile tile = plan.get(new Id(params.get(SIGNAL)), false);
if (tile instanceof Signal) signal = (Signal) tile;
String st = params.get(Signal.STATE);
if (isSet(st)) state = st;
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java
index 28002a6..d52e7e1 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java
@@ -18,8 +18,8 @@ public class SetSpeed extends Action{
@Override
public boolean fire(Context context) {
- if (isNull(context.train)) return false;
- context.train.setSpeed(speed);
+ if (isNull(context.train())) return false;
+ context.train().setSpeed(speed);
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java b/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java
index a86e1a3..b71970e 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java
@@ -4,8 +4,8 @@ public class StopAuto extends Action {
@Override
public boolean fire(Context context) {
- if (isNull(context.train)) return false;
- context.train.quitAutopilot();
+ if (isNull(context.train())) return false;
+ context.train().quitAutopilot();
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/TextAction.java b/src/main/java/de/srsoftware/web4rail/actions/TextAction.java
index 2d783bd..195e821 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/TextAction.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/TextAction.java
@@ -18,11 +18,11 @@ public abstract class TextAction extends Action {
public String fill(String tx,Context context) {
- if (isSet(context.block)) tx = tx.replace("%block%", context.block.name);
- if (isSet(context.contact)) tx = tx.replace("%contact%", context.contact.id());
- if (isSet(context.direction)) tx = tx.replace("%dir%", context.direction.name());
- if (isSet(context.route)) tx = tx.replace("%route%", context.route.name());
- if (isSet(context.train)) tx = tx.replace("%train%", context.train.name());
+ if (isSet(context.block())) tx = tx.replace("%block%", context.block().name);
+ if (isSet(context.contact())) tx = tx.replace("%contact%", context.contact().id().toString());
+ if (isSet(context.direction())) tx = tx.replace("%dir%", context.direction().name());
+ if (isSet(context.route())) tx = tx.replace("%route%", context.route().name());
+ if (isSet(context.train())) tx = tx.replace("%train%", context.train().name());
return tx;
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
index ec2b0a2..30500ee 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
@@ -32,7 +32,7 @@ public class TriggerContact extends Action {
@Override
public Action load(JSONObject json) {
super.load(json);
- String contactId = json.getString(CONTACT);
+ Id contactId = Id.from(json,CONTACT);
if (isSet(contactId)) contact = Contact.get(contactId);
return this;
}
@@ -60,7 +60,7 @@ public class TriggerContact extends Action {
@Override
protected Object update(HashMap params) {
LOG.debug("update: {}",params);
- String contactId = params.get(CONTACT);
+ Id contactId = Id.from(params,CONTACT);
if (isSet(contactId)) contact = Contact.get(contactId);
return properties(params);
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java b/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java
index 5089ee8..9878fe8 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java
@@ -4,8 +4,8 @@ public class TurnTrain extends Action{
@Override
public boolean fire(Context context) {
- if (context.train != null) {
- context.train.turn();
+ if (context.train() != null) {
+ context.train().turn();
return true;
}
return false;
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java
index 3b054ab..b8244b1 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java
@@ -5,7 +5,6 @@ import java.util.HashMap;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tiles.Block;
@@ -26,7 +25,7 @@ public class BlockFree extends Condition {
public Condition load(JSONObject json) {
super.load(json);
- block(Block.get(json.getString(BLOCK)));
+ block(Block.get(new Id(json.getString(BLOCK))));
return this;
}
@@ -52,7 +51,7 @@ public class BlockFree extends Condition {
@Override
protected Object update(HashMap params) {
if (!params.containsKey(BLOCK)) return t("No block id passed to BlockFree.update()!");
- String bid = params.get(BLOCK);
+ Id bid = new Id(params.get(BLOCK));
Block block = Block.get(bid);
if (block == null) return t("No block with id {} found!",bid);
this.block = block;
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
index e77bd6f..9e22747 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
@@ -17,7 +17,6 @@ import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Plan;
import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ConditionalAction;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Checkbox;
@@ -30,16 +29,15 @@ public abstract class Condition extends BaseClass {
public static final Logger LOG = LoggerFactory.getLogger(Condition.class);
private static final String INVERTED = "inverted";
private static final String PREFIX = Condition.class.getPackageName();
- private static HashMap conditions = new HashMap();
+ private static HashMap conditions = new HashMap();
public boolean inverted = false;
- protected int id;
private Object parent;
public Condition() {
- this(Application.createId());
+ this(new Id());
}
- public Condition(int id) {
+ public Condition(Id id) {
this.id = id;
conditions.put(id, this);
}
@@ -48,7 +46,7 @@ public abstract class Condition extends BaseClass {
String action = params.get(ACTION);
if (action == null) return t("No action passed to Condition.action!");
- Integer cid = (params.containsKey(ID)) ? Integer.parseInt(params.get(ID)) : null;
+ Id cid = Id.from(params);
if (isSet(cid)) {
Condition condition = conditions.get(cid);
@@ -85,14 +83,14 @@ public abstract class Condition extends BaseClass {
Condition condition = Condition.create(type);
if (isNull(condition)) return t("Unknown type \"{}\" of condition!",type);
String[] parts = context.split(":");
- String contextId = parts[1];
+ Id contextId = new Id(parts[1]);
String realm = parts[0];
switch (realm) {
case REALM_ROUTE:
- Route route = plan.route(Integer.parseInt(contextId));
+ Route route = plan.route(contextId);
if (isNull(route)) return t("Unknown route: {}",contextId);
route.add(condition);
- return route.properties(new HashMap(Map.of(REALM,REALM_ROUTE,ACTION,ACTION_PROPS,ID,contextId)));
+ return route.properties(new HashMap(Map.of(REALM,REALM_ROUTE,ACTION,ACTION_PROPS,ID,contextId.toString())));
default:
break;
@@ -124,10 +122,6 @@ public abstract class Condition extends BaseClass {
}
public abstract boolean fulfilledBy(Context context);
-
- public int id() {
- return id;
- }
public JSONObject json() {
JSONObject json = new JSONObject().put(TYPE, getClass().getSimpleName());
@@ -146,7 +140,7 @@ public abstract class Condition extends BaseClass {
String tx = args.length<1 ? toString()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1];
String context = args.length<3 ? null : args[2];
- return link(type, Map.of(REALM,REALM_CONDITION,ID,id(),ACTION,ACTION_PROPS,CONTEXT,context), tx);
+ return link(type, tx,Map.of(CONTEXT,context));
}
private static List> list() {
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
index 78f049d..2fc1cfe 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
@@ -8,8 +8,9 @@ import org.json.JSONObject;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application;
+import de.srsoftware.web4rail.BaseClass.Context;
+import de.srsoftware.web4rail.BaseClass.Id;
import de.srsoftware.web4rail.Constants;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
@@ -39,9 +40,9 @@ public class ConditionList extends Vector implements Constants{
}
}
- public void removeById(int cid) {
+ public void removeById(Id cid) {
for (Condition condition : this) {
- if (condition.id() == cid) {
+ if (condition.id().equals(cid)) {
remove(condition);
break;
}
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java b/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java
index 037771c..08028d4 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java
@@ -6,7 +6,6 @@ import java.util.stream.Collectors;
import org.json.JSONObject;
import de.srsoftware.web4rail.Window;
-import de.srsoftware.web4rail.actions.Action.Context;
public class OrCondition extends Condition{
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java b/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java
index 109853c..1850dca 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java
@@ -1,12 +1,10 @@
package de.srsoftware.web4rail.conditions;
-import de.srsoftware.web4rail.actions.Action.Context;
-
public class PushPullTrain extends Condition {
@Override
public boolean fulfilledBy(Context context) {
- return context.train.pushPull != inverted;
+ return context.train().pushPull != inverted;
}
@Override
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java
index 390602f..34a4f21 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java
@@ -5,7 +5,6 @@ import java.util.HashMap;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label;
@@ -17,7 +16,7 @@ public class TrainHasTag extends Condition {
@Override
public boolean fulfilledBy(Context context) {
if (tag == null) return true;
- return context.train.tags().contains(tag) != inverted;
+ return context.train().tags().contains(tag) != inverted;
}
@Override
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java
index 4e62d41..0b0b79d 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java
@@ -6,7 +6,6 @@ import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Window;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label;
@@ -17,8 +16,8 @@ public class TrainLength extends Condition {
@Override
public boolean fulfilledBy(Context context) {
- if (isNull(context.train)) return false;
- return (context.train.length() < maxLength) != inverted;
+ if (isNull(context.train())) return false;
+ return (context.train().length() < maxLength) != inverted;
}
@Override
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java
index efd34fc..ca45b97 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java
@@ -5,7 +5,6 @@ import java.util.HashMap;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tags.Label;
@@ -16,17 +15,17 @@ public class TrainSelect extends Condition {
@Override
public boolean fulfilledBy(Context context) {
- return (context.train == train) != inverted;
+ return (context.train() == train) != inverted;
}
@Override
public JSONObject json() {
- return super.json().put(REALM_TRAIN, train.id);
+ return super.json().put(REALM_TRAIN, train.id());
}
public Condition load(JSONObject json) {
super.load(json);
- train(Train.get(json.getInt(REALM_TRAIN)));
+ train(Train.get(new Id(json.getString(REALM_TRAIN))));
return this;
}
@@ -52,7 +51,7 @@ public class TrainSelect extends Condition {
@Override
protected Object update(HashMap params) {
if (!params.containsKey(TRAIN)) return t("No train id passed to TrainSelect.update()!");
- int tid = Integer.parseInt(params.get(TRAIN));
+ Id tid = new Id(params.get(TRAIN));
Train train = Train.get(tid);
if (train == null) return t("No train with id {} found!",tid);
this.train = train;
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java
index 4283a5e..399a19f 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Car.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java
@@ -32,7 +32,7 @@ import de.srsoftware.web4rail.tags.TextArea;
public class Car extends BaseClass implements Comparable{
protected static final Logger LOG = LoggerFactory.getLogger(Car.class);
- static HashMap cars = new HashMap();
+ static HashMap cars = new HashMap();
public static final String NAME = "name";
private static final String LENGTH = "length";
@@ -41,7 +41,6 @@ public class Car extends BaseClass implements Comparable{
private static final String MAX_SPEED = "max_speed";
protected HashSet tags = new HashSet();
- private int id;
private String name;
public int length;
protected String stockId = "";
@@ -54,14 +53,9 @@ public class Car extends BaseClass implements Comparable{
this(name,null);
}
- public Car(String name, Integer id) {
+ public Car(String name, Id id) {
this.name = name;
- if (id == null) {
- try { // make sure multiple consecutive creations get different ids
- Thread.sleep(1);
- } catch (InterruptedException e) {}
- id = Application.createId();
- }
+ if (isNull(id)) id = new Id();
this.id = id;
cars.put(id, this);
}
@@ -100,12 +94,7 @@ public class Car extends BaseClass implements Comparable{
}
public static Car get(Object id) {
- return isNull(id) ? null : cars.get(Integer.parseInt(""+id)); // try to get by id
- }
-
-
- public int id() {
- return id;
+ return isNull(id) ? null : cars.get(new Id(""+id)); // try to get by id
}
public JSONObject json() {
@@ -130,7 +119,7 @@ public class Car extends BaseClass implements Comparable{
public Tag link(String...args) {
String tx = args.length<1 ? name()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1];
- return link(type, Map.of(REALM,REALM_CAR,ID,id,ACTION,ACTION_PROPS), tx);
+ return link(type, tx);
}
static Vector list() {
@@ -148,7 +137,7 @@ public class Car extends BaseClass implements Comparable{
while (line != null) {
JSONObject json = new JSONObject(line);
String name = json.getString(Car.NAME);
- int id = json.getInt(ID);
+ Id id = Id.from(json);
Car car = json.has(Locomotive.LOCOMOTIVE) ? new Locomotive(name, id) : new Car(name,id);
car.load(json).plan(plan);
@@ -158,7 +147,7 @@ public class Car extends BaseClass implements Comparable{
}
protected Car load(JSONObject json) {
- if (json.has(ID)) id = json.getInt(ID);
+ if (json.has(ID)) id = Id.from(json);
if (json.has(LENGTH)) length = json.getInt(LENGTH);
if (json.has(MAX_SPEED)) maxSpeed = json.getInt(MAX_SPEED);
if (json.has(NOTES)) notes = json.getString(NOTES);
@@ -249,7 +238,7 @@ public class Car extends BaseClass implements Comparable{
public static void saveAll(String filename) throws IOException {
BufferedWriter file = new BufferedWriter(new FileWriter(filename));
- for (Entry entry: cars.entrySet()) file.write(entry.getValue().json()+"\n");
+ for (Entry entry: cars.entrySet()) file.write(entry.getValue().json()+"\n");
file.close();
}
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java
index db08849..35b49bc 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java
@@ -39,7 +39,7 @@ public class Locomotive extends Car implements Constants,Device{
super(name);
}
- public Locomotive(String name, Integer id) {
+ public Locomotive(String name, Id id) {
super(name,id);
}
@@ -82,7 +82,7 @@ public class Locomotive extends Car implements Constants,Device{
}
public static Tag cockpit(Object locoOrTrain) {
- int id = 0;
+ Id id = null;
int speed = 0;
String realm = null;
Train train = null;
@@ -95,7 +95,7 @@ public class Locomotive extends Car implements Constants,Device{
} else if (locoOrTrain instanceof Train) {
train = (Train)locoOrTrain;
realm = REALM_TRAIN;
- id = train.id;
+ id = train.id();
speed = train.speed;
}
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java
index 28c22ff..37ac7c8 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Train.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java
@@ -20,9 +20,7 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
-import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.PathFinder;
import de.srsoftware.web4rail.Plan;
@@ -30,7 +28,6 @@ import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.Range;
import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Checkbox;
import de.srsoftware.web4rail.tags.Fieldset;
@@ -49,9 +46,8 @@ public class Train extends BaseClass implements Comparable {
private static final String CAR_ID = "carId";
public static final String LOCO_ID = "locoId";
private static final String TRACE = "trace";
- private static final HashMap trains = new HashMap<>();
+ private static final HashMap trains = new HashMap<>();
public static final String ID = "id";
- public int id;
private static final String NAME = "name";
private String name = null;
@@ -117,8 +113,8 @@ public class Train extends BaseClass implements Comparable {
this(loco,null);
}
- public Train(Locomotive loco, Integer id) {
- if (isNull(id)) id = Application.createId();
+ public Train(Locomotive loco, Id id) {
+ if (isNull(id)) id = new Id();
this.id = id;
add(loco);
trains.put(id, this);
@@ -136,7 +132,7 @@ public class Train extends BaseClass implements Comparable {
}
return t("No train id passed!");
}
- int id = Integer.parseInt(params.get(Train.ID));
+ Id id = Id.from(params);
Train train = trains.get(id);
if (isNull(train)) return(t("No train with id {}!",id));
switch (action) {
@@ -320,7 +316,7 @@ public class Train extends BaseClass implements Comparable {
return properties();
}
- public static Train get(int id) {
+ public static Train get(Id id) {
return trains.get(id);
}
@@ -344,15 +340,15 @@ public class Train extends BaseClass implements Comparable {
if (isSet(route)) json.put(ROUTE, route.id());
if (isSet(direction)) json.put(DIRECTION, direction);
- Vector locoIds = new Vector();
+ Vector locoIds = new Vector();
for (Locomotive loco : locos) locoIds.add(loco.id());
json.put(LOCOS, locoIds);
- Vector carIds = new Vector();
+ Vector carIds = new Vector();
for (Car car : cars) carIds.add(car.id());
json.put(CARS,carIds);
- Vector tileIds = new Vector();
+ Vector tileIds = new Vector();
for (Tile tile : trace) tileIds.add(tile.id());
json.put(TRACE, tileIds);
@@ -377,7 +373,7 @@ public class Train extends BaseClass implements Comparable {
public Tag link(String...args) {
String tx = args.length<1 ? name()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1];
- return link(type, Map.of(REALM,REALM_TRAIN,ID,id,ACTION,ACTION_PROPS), tx);
+ return link(type, tx);
}
public static TreeSet list() {
@@ -390,9 +386,7 @@ public class Train extends BaseClass implements Comparable {
while (isSet(line)) {
JSONObject json = new JSONObject(line);
- int id = json.getInt(ID);
-
- Train train = new Train(null,id);
+ Train train = new Train(null,Id.from(json));
train.plan(plan).load(json);
line = file.readLine();
@@ -405,8 +399,8 @@ public class Train extends BaseClass implements Comparable {
if (json.has(DIRECTION)) direction = Direction.valueOf(json.getString(DIRECTION));
if (json.has(NAME)) name = json.getString(NAME);
if (json.has(TAGS)) json.getJSONArray(TAGS ).forEach(elem -> { tags.add(elem.toString()); });
- if (json.has(TRACE)) json.getJSONArray(TRACE).forEach(elem -> { trace.add(plan.get(elem.toString(), false).set(this)); });
- if (json.has(BLOCK)) currentBlock = (Block) plan.get(json.getString(BLOCK), false).set(this); // do not move this up! during set, other fields will be referenced!
+ if (json.has(TRACE)) json.getJSONArray(TRACE).forEach(elem -> { trace.add(plan.get(new Id(elem.toString()), false).set(this)); });
+ if (json.has(BLOCK)) currentBlock = (Block) plan.get(new Id(json.getString(BLOCK)), false).set(this); // do not move this up! during set, other fields will be referenced!
for (Object id : json.getJSONArray(CARS)) add(Car.get(id));
for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get(id));
return this;
@@ -516,7 +510,8 @@ public class Train extends BaseClass implements Comparable {
return this;
}
- public Tag properties() {
+ @Override
+ public Window properties() {
Window window = new Window("train-properties",t("Properties of {}",this));
Locomotive.cockpit(this).addTo(window);
@@ -547,14 +542,12 @@ public class Train extends BaseClass implements Comparable {
if (isNull(destination)) {
new Button(t("Select from plan"),"return selectDest("+id+");").addTo(dest);
} else {
- link("span",Map.of(REALM,REALM_PLAN,ID,destination.id(),ACTION,ACTION_CLICK),destination.toString()).addTo(dest);
+ link("span",destination,Map.of(REALM,REALM_PLAN,ID,destination.id().toString(),ACTION,ACTION_CLICK)).addTo(dest);
new Button(t("Drop"),Map.of(REALM,REALM_TRAIN,ID,id,ACTION,ACTION_MOVE,DESTINATION,"")).addTo(dest);
}
dest.addTo(propList);
- if (isSet(route)) {
- link("li", Map.of(REALM,REALM_ROUTE,ID,route.id(),ACTION,ACTION_PROPS), route).addTo(propList);
- }
+ if (isSet(route)) link("li", route).addTo(propList);
int ms = maxSpeed();
if (ms < Integer.MAX_VALUE) new Tag("li").content(t("Max. Speed")+": "+maxSpeed()+NBSP+speedUnit).addTo(propList);
@@ -594,7 +587,10 @@ public class Train extends BaseClass implements Comparable {
}
public void reserveNext() {
- Context context = new Context(null, route, this, route.endBlock(), route.endDirection);
+ Context context = new Context(this)
+ .route(route)
+ .block(route.endBlock())
+ .direction(route.endDirection);
Route nextRoute = PathFinder.chooseRoute(context);
if (isNull(nextRoute)) return;
@@ -622,7 +618,7 @@ public class Train extends BaseClass implements Comparable {
public static void saveAll(String filename) throws IOException {
BufferedWriter file = new BufferedWriter(new FileWriter(filename));
- for (Entry entry:trains.entrySet()) {
+ for (Entry entry:trains.entrySet()) {
Train train = entry.getValue();
file.write(train.json()+"\n");
}
@@ -653,7 +649,7 @@ public class Train extends BaseClass implements Comparable {
destination = null;
return t("Dropped destination of {}.",this);
}
- Tile tile = plan.get(dest, true);
+ Tile tile = plan.get(new Id(dest), true);
if (isNull(tile)) return t("Tile {} not known!",dest);
if (tile instanceof Block) {
destination = (Block) tile;
@@ -781,11 +777,6 @@ public class Train extends BaseClass implements Comparable {
return properties();
}
-
- private static String t(String message, Object...fills) {
- return Translation.get(Application.class, message, fills);
- }
-
public SortedSet tags() {
TreeSet list = new TreeSet(tags);
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
index 6a78430..2e09ba2 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
@@ -151,7 +151,7 @@ public abstract class Block extends StretchableTile implements Comparable
return this;
}
- public static Block get(String blockId) {
+ public static Block get(Id blockId) {
Tile tile = plan.get(blockId, false);
if (tile instanceof Block) return (Block) tile;
return null;
@@ -195,7 +195,7 @@ public abstract class Block extends StretchableTile implements Comparable
public Tag link(String...args) {
String tx = args.length<1 ? name+NBSP : args[0];
String type = args.length<2 ? "span" : args[1];
- return link(type, Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_PROPS), tx).clazz("link","block");
+ return link(type, tx).clazz("link","block");
}
@Override
@@ -267,7 +267,7 @@ public abstract class Block extends StretchableTile implements Comparable
new Input("min."+wt.tag+"."+dB,wt.get(dB).min).numeric().addTo(new Tag("td")).addTo(row);
new Input("max."+wt.tag+"."+dB,wt.get(dB).max).numeric().addTo(new Tag("td")).addTo(row);
Tag actions = new Tag("td");
- Map props = Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_TIMES);
+ Map props = Map.of(REALM,REALM_PLAN,ID,id().toString(),ACTION,ACTION_TIMES);
switch (count) {
case 1:
actions.content(""); break;
@@ -348,8 +348,8 @@ public abstract class Block extends StretchableTile implements Comparable
public Tile update(HashMap params) throws IOException {
if (params.containsKey(NAME)) name=params.get(NAME);
if (params.containsKey(Train.class.getSimpleName())) {
- int trainId = Integer.parseInt(params.get(Train.class.getSimpleName()));
- if (trainId == 0) {
+ Id trainId = Id.from(params,Train.class.getSimpleName());
+ if (trainId == null) { // TODO: this is rubbish
if (isSet(train)) train.dropTrace();
train = null;
} else {
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
index 45e812d..a890233 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
@@ -6,7 +6,6 @@ import java.util.Map;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Window;
-import de.srsoftware.web4rail.tags.Button;
public abstract class Bridge extends Tile {
private static Bridge pendingConnection = null;
@@ -37,10 +36,9 @@ public abstract class Bridge extends Tile {
@Override
public Window propMenu() {
Window win = super.propMenu();
- Map props = Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_CONNECT);
new Tag("h4").content("Counterpart").addTo(win);
new Tag("p").content(isSet(counterpart) ? t("Connected to {}.",counterpart) : t("Not connected to other bridge part!")).addTo(win);
- new Button(t("Select counterpart"), props).addTo(win);
+ button(t("Select counterpart"),Map.of(ACTION,ACTION_CONNECT)).addTo(win);
return win;
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
index 78e5ed3..6503db3 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
@@ -11,9 +11,7 @@ import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Window;
-import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ActionList;
-import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label;
@@ -22,7 +20,7 @@ import de.srsoftware.web4rail.tags.Select;
public class Contact extends Tile{
private static final String ADDRESS = "address";
- private static final HashMap contactsById = new HashMap();
+ private static final HashMap contactsById = new HashMap();
private static final HashMap contactsByAddr = new HashMap();
private boolean state = false;
private String trigger = null;
@@ -101,7 +99,7 @@ public class Contact extends Tile{
return contactsByAddr.get(addr);
}
- public static Contact get(String contactId) {
+ public static Contact get(Id contactId) {
return contactsById.get(contactId);
}
@@ -135,7 +133,7 @@ public class Contact extends Tile{
public static Object process(HashMap params) {
String action = params.get(ACTION);
- String id = params.get(ID);
+ Id id = Id.from(params);
if (action == null) return t("Missing ACTION on call to {}.process()",Contact.class.getSimpleName());
Contact contact;
switch (action) {
@@ -157,9 +155,7 @@ public class Contact extends Tile{
Form form = super.propForm(formId);
new Tag("h4").content(t("Hardware settings")).addTo(form);
Tag label = new Input(ADDRESS, addr).numeric().addTo(new Label(t("Address:")+NBSP));
- Map props = Map.of(REALM,REALM_CONTACT,ID,id(),ACTION,ACTION_ANALYZE);
- new Button(t("learn"), props).addTo(label).addTo(form);
-
+ button(t("learn"),Map.of(ACTION,ACTION_ANALYZE)).addTo(label).addTo(form);
return form;
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java
index c3d7230..2a6161b 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java
@@ -38,7 +38,7 @@ public class Relay extends Tile implements Device{
private String name = t("Relay");
protected boolean state = true;
- private static final HashMap relays = new HashMap();
+ private static final HashMap relays = new HashMap();
public static final boolean STATE_A = true,STATE_B=false;
private static final String LABEL_A = "label_a";
private static final String LABEL_B = "label_b";
@@ -242,7 +242,7 @@ public class Relay extends Tile implements Device{
return relays.values();
}
- public static Relay get(String relayId) {
+ public static Relay get(Id relayId) {
return relays.get(relayId);
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
index 627d184..0fa7365 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
@@ -31,8 +31,8 @@ public abstract class Signal extends Tile implements Comparable{
@Override
public int compareTo(Signal other) {
- String tid = this.id();
- String oid = other.id();
+ Id tid = this.id();
+ Id oid = other.id();
return tid.compareTo(oid);
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
index b953ad7..48e82ad 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
@@ -19,9 +19,7 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
-import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Plan;
@@ -101,12 +99,12 @@ public abstract class Tile extends BaseClass{
return 1;
}
- public String id() {
+ public Id id() {
return Tile.id(x, y);
}
- public static String id(int x, int y) {
- return x+"-"+y;
+ public static Id id(int x, int y) {
+ return new Id(x+"-"+y);
}
private static void inflate(String clazz, JSONObject json, Plan plan) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, IOException {
@@ -131,7 +129,7 @@ public abstract class Tile extends BaseClass{
if (isSet(route)) json.put(ROUTE, route.id());
if (isSet(oneWay)) json.put(ONEW_WAY, oneWay);
if (disabled) json.put(DISABLED, true);
- if (isSet(train)) json.put(REALM_TRAIN, train.id);
+ if (isSet(train)) json.put(REALM_TRAIN, train.id());
json.put(LENGTH, length);
return json;
}
@@ -155,7 +153,7 @@ public abstract class Tile extends BaseClass{
public Tag link(String...args) {
String tx = args.length<1 ? id()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1];
- return link(type, Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_CLICK), tx);
+ return super.link(type, tx, Map.of(ACTION,ACTION_CLICK));
}
@@ -216,7 +214,7 @@ public abstract class Tile extends BaseClass{
Window window = new Window("tile-properties",t("Properties of {} @ ({},{})",title(),x,y));
if (isSet(train)) {
- HashMap props = new HashMap(Map.of(REALM,REALM_TRAIN,ID,train.id));
+ HashMap props = new HashMap(Map.of(REALM,REALM_TRAIN,ID,train.id()));
if (isSet(train.route)) {
props.put(ACTION, ACTION_STOP);
window.children().insertElementAt(new Button(t("stop"),props), 1);
@@ -236,7 +234,7 @@ public abstract class Tile extends BaseClass{
window.children().insertElementAt(new Tag("h4").content(t("Train:")), 1);
}
- if (isSet(route)) link("p",Map.of(REALM,REALM_ROUTE,ID,route.id(),ACTION,ACTION_PROPS),t("Locked by {}",route)).addTo(window);
+ if (isSet(route)) link("p",t("Locked by {}",route)).addTo(window);
Form form = propForm("tile-properties-"+id());
if (isTrack) {
@@ -295,7 +293,7 @@ public abstract class Tile extends BaseClass{
return routes;
}
- public static void saveAll(HashMap tiles ,String filename) throws IOException {
+ public static void saveAll(HashMap tiles ,String filename) throws IOException {
BufferedWriter file = new BufferedWriter(new FileWriter(filename));
for (Tile tile : tiles.values()) {
if (isNull(tile) || tile instanceof Shadow) continue;
@@ -317,10 +315,6 @@ public abstract class Tile extends BaseClass{
return plan.place(this);
}
- protected static String t(String txt, Object...fills) {
- return Translation.get(Application.class, txt, fills);
- }
-
public Tag tag(Map replacements) throws IOException {
int width = 100*width();
int height = 100*height();
@@ -329,7 +323,7 @@ public abstract class Tile extends BaseClass{
replacements.put("%height%",height);
String style = "";
Tag svg = new Tag("svg")
- .id(isSet(x) && isSet(y) ? id() : getClass().getSimpleName())
+ .id(isSet(x) && isSet(y) ? id().toString() : getClass().getSimpleName())
.clazz(classes())
.size(100,100)
.attr("name", getClass().getSimpleName())