Browse Source

started major refactoring

lookup-tables
Stephan Richter 5 years ago
parent
commit
72db5da58f
  1. 2
      pom.xml
  2. 25
      src/main/java/de/srsoftware/web4rail/Application.java
  3. 207
      src/main/java/de/srsoftware/web4rail/BaseClass.java
  4. 5
      src/main/java/de/srsoftware/web4rail/Context.java
  5. 17
      src/main/java/de/srsoftware/web4rail/PathFinder.java
  6. 41
      src/main/java/de/srsoftware/web4rail/Plan.java
  7. 31
      src/main/java/de/srsoftware/web4rail/Route.java
  8. 84
      src/main/java/de/srsoftware/web4rail/actions/Action.java
  9. 38
      src/main/java/de/srsoftware/web4rail/actions/ActionList.java
  10. 4
      src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java
  11. 4
      src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java
  12. 4
      src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java
  13. 8
      src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
  14. 8
      src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
  15. 2
      src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java
  16. 10
      src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java
  17. 10
      src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java
  18. 4
      src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
  19. 4
      src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
  20. 4
      src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
  21. 4
      src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java
  22. 4
      src/main/java/de/srsoftware/web4rail/actions/StopAuto.java
  23. 10
      src/main/java/de/srsoftware/web4rail/actions/TextAction.java
  24. 4
      src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
  25. 4
      src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java
  26. 5
      src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java
  27. 22
      src/main/java/de/srsoftware/web4rail/conditions/Condition.java
  28. 7
      src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
  29. 1
      src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java
  30. 4
      src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java
  31. 3
      src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java
  32. 5
      src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java
  33. 9
      src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java
  34. 27
      src/main/java/de/srsoftware/web4rail/moving/Car.java
  35. 6
      src/main/java/de/srsoftware/web4rail/moving/Locomotive.java
  36. 53
      src/main/java/de/srsoftware/web4rail/moving/Train.java
  37. 10
      src/main/java/de/srsoftware/web4rail/tiles/Block.java
  38. 4
      src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
  39. 12
      src/main/java/de/srsoftware/web4rail/tiles/Contact.java
  40. 4
      src/main/java/de/srsoftware/web4rail/tiles/Relay.java
  41. 4
      src/main/java/de/srsoftware/web4rail/tiles/Signal.java
  42. 24
      src/main/java/de/srsoftware/web4rail/tiles/Tile.java

2
pom.xml

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.srsoftware</groupId> <groupId>de.srsoftware</groupId>
<artifactId>web4rail</artifactId> <artifactId>web4rail</artifactId>
<version>1.1.11</version> <version>1.2.0</version>
<name>Web4Rail</name> <name>Web4Rail</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<description>Java Model Railway Control</description> <description>Java Model Railway Control</description>

25
src/main/java/de/srsoftware/web4rail/Application.java

@ -13,7 +13,6 @@ import java.net.InetSocketAddress;
import java.net.URI; import java.net.URI;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -23,7 +22,6 @@ import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpServer;
import de.keawe.localconfig.Configuration; import de.keawe.localconfig.Configuration;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.ActionList; import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.conditions.Condition; 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")); 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 * handles request from clients by delegating them to respective classes
* @param params * @param params
@ -275,14 +260,4 @@ public class Application extends BaseClass{
OutputStreamWriter sseWriter = new OutputStreamWriter(client.getResponseBody()); OutputStreamWriter sseWriter = new OutputStreamWriter(client.getResponseBody());
plan.addClient(sseWriter); 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);
}
} }

207
src/main/java/de/srsoftware/web4rail/BaseClass.java

@ -2,14 +2,25 @@ package de.srsoftware.web4rail;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import org.json.JSONObject; import org.json.JSONObject;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; 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.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{ public abstract class BaseClass implements Constants{
protected static Plan plan; // the track layout in use protected static Plan plan; // the track layout in use
@ -17,16 +28,160 @@ public abstract class BaseClass implements Constants{
public static String speedUnit = DEFAULT_SPEED_UNIT; public static String speedUnit = DEFAULT_SPEED_UNIT;
public static String lengthUnit = DEFAULT_LENGTH_UNIT; public static String lengthUnit = DEFAULT_LENGTH_UNIT;
private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray(); private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
public static Button contextButton(String context,String text) { protected Id id = null;
String[] parts = context.split(":");
String realm = parts[0]; public static class Context {
String id = parts.length>1 ? parts[1] : null; private BaseClass main = null;
return new Button(text,Map.of(REALM,realm,ID,id,ACTION,ACTION_PROPS)); 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 static Tag link(String tagClass,Map<String,Object> params,Object caption) { public Action action() {
String json = new JSONObject(params).toString().replace("\"", "'"); return action;
return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(caption.toString()); }
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<Id>{
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<String,String> params) {
return Id.from(params,ID);
}
public static Id from(Map<String, String> params, String key) {
String sid = params.get(key);
return sid == null ? null : new Id(sid);
}
}
public Button button(String text,Map<String,String> 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) { public static boolean isNull(Object o) {
@ -37,6 +192,16 @@ public abstract class BaseClass implements Constants{
return o != null; return o != null;
} }
public Tag link(String tagClass,Object caption) {
return link(tagClass,caption,null);
}
public Tag link(String tagClass,Object caption,Map<String,String> 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) { public static String md5sum(Object o) {
try { try {
MessageDigest digest = MessageDigest.getInstance("MD5"); 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())); overlay.entrySet().stream().forEach(entry -> merged.put(entry.getKey(), entry.getValue()));
return merged; return merged;
} }
public Window properties() {
return new Window(getClass().getSimpleName()+"-properties", t("Properties of {}",this));
}
public Map<String,String> props(Map<String,String> 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<String,String> props = new HashMap<String, String>(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);
}
} }

5
src/main/java/de/srsoftware/web4rail/Context.java

@ -0,0 +1,5 @@
package de.srsoftware.web4rail;
public class Context {
}

17
src/main/java/de/srsoftware/web4rail/PathFinder.java

@ -10,7 +10,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tiles.Block; import de.srsoftware.web4rail.tiles.Block;
@ -24,12 +23,12 @@ public class PathFinder extends BaseClass{
for (int i=0; i<visitedRoutes.size(); i++) inset+=" "; for (int i=0; i<visitedRoutes.size(); i++) inset+=" ";
boolean error = false; boolean error = false;
Block block = context.block; Block block = context.block();
if (isNull(block)) { if (isNull(block)) {
LOG.warn("{} → {}.availableRoutes called without context.block!",inset,Train.class.getSimpleName()); LOG.warn("{} → {}.availableRoutes called without context.block!",inset,Train.class.getSimpleName());
error = true; error = true;
} }
Train train = context.train; Train train = context.train();
if (isNull(train)) { if (isNull(train)) {
LOG.warn("{}→ {}.availableRoutes called without context.train!",inset,Train.class.getSimpleName()); LOG.warn("{}→ {}.availableRoutes called without context.train!",inset,Train.class.getSimpleName());
error = true; error = true;
@ -37,7 +36,7 @@ public class PathFinder extends BaseClass{
if (error) return availableRoutes; if (error) return availableRoutes;
Block destination = train.destination(); Block destination = train.destination();
Direction direction = context.direction; Direction direction = context.direction();
/* if (isSet(direction)) { /* if (isSet(direction)) {
LOG.debug("{}Looking for {}-bound routes from {}",inset,direction,block); LOG.debug("{}Looking for {}-bound routes from {}",inset,direction,block);
} else { } else {
@ -45,7 +44,7 @@ public class PathFinder extends BaseClass{
}*/ }*/
if (isSet(destination) && visitedRoutes.isEmpty()) LOG.debug("{}- Destination: {}",inset,destination); if (isSet(destination) && visitedRoutes.isEmpty()) LOG.debug("{}- Destination: {}",inset,destination);
Route currentRoute = context.route; Route currentRoute = context.route();
for (Route routeCandidate : block.routes()) { for (Route routeCandidate : block.routes()) {
if (routeCandidate.path().firstElement() != block) continue; // Routen, die nicht vom aktuellen Block starten sind bubu if (routeCandidate.path().firstElement() != block) continue; // Routen, die nicht vom aktuellen Block starten sind bubu
@ -70,9 +69,10 @@ public class PathFinder extends BaseClass{
} else { } else {
LOG.debug("{}- Candidate: {}",inset,routeCandidate.shortName()); LOG.debug("{}- Candidate: {}",inset,routeCandidate.shortName());
Context forwardContext = new Context(train); Context forwardContext = new Context(train);
forwardContext.block = routeCandidate.endBlock(); forwardContext
forwardContext.direction = routeCandidate.endDirection; .block(routeCandidate.endBlock())
forwardContext.route = null; .direction(routeCandidate.endDirection)
.route(null);
visitedRoutes.add(routeCandidate); visitedRoutes.add(routeCandidate);
TreeMap<Integer, List<Route>> forwardRoutes = availableRoutes(forwardContext,visitedRoutes); TreeMap<Integer, List<Route>> forwardRoutes = availableRoutes(forwardContext,visitedRoutes);
visitedRoutes.remove(routeCandidate); visitedRoutes.remove(routeCandidate);
@ -112,5 +112,4 @@ public class PathFinder extends BaseClass{
return selectetRoute; return selectetRoute;
} }
} }

41
src/main/java/de/srsoftware/web4rail/Plan.java

@ -26,7 +26,6 @@ import org.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.Action; import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.moving.Car; 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 SPEED_UNIT = "speed_unit";
private static final String LENGTH_UNIT = "length_unit"; private static final String LENGTH_UNIT = "length_unit";
public HashMap<String,Tile> tiles = new HashMap<String,Tile>(); // The list of tiles of this plan, i.e. the Track layout public HashMap<Id,Tile> tiles = new HashMap<Id,Tile>(); // The list of tiles of this plan, i.e. the Track layout
private HashSet<Block> blocks = new HashSet<Block>(); // the list of tiles, that are blocks private HashSet<Block> blocks = new HashSet<Block>(); // the list of tiles, that are blocks
private HashSet<Signal> signals = new HashSet<Signal>(); // the list of tiles, that are signals private HashSet<Signal> signals = new HashSet<Signal>(); // the list of tiles, that are signals
private HashMap<Integer, Route> routes = new HashMap<Integer, Route>(); // the list of routes of the track layout private HashMap<Id, Route> routes = new HashMap<Id, Route>(); // the list of routes of the track layout
private ControlUnit controlUnit = new ControlUnit(this); // the control unit, to which the plan is connected private ControlUnit controlUnit = new ControlUnit(this); // the control unit, to which the plan is connected
private Contact learningContact; private Contact learningContact;
@ -175,13 +174,13 @@ public class Plan extends BaseClass{
case ACTION_ANALYZE: case ACTION_ANALYZE:
return analyze(); return analyze();
case ACTION_CLICK: case ACTION_CLICK:
return click(get(params.get(ID),true)); return click(get(Id.from(params),true));
case ACTION_CONNECT: 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(); if (tile instanceof Bridge) return ((Bridge)tile).requestConnect();
break; break;
case ACTION_MOVE: case ACTION_MOVE:
return moveTile(params.get(DIRECTION),params.get(ID)); return moveTile(params.get(DIRECTION),Id.from(params));
case ACTION_PROPS: case ACTION_PROPS:
return properties(params); return properties(params);
case ACTION_SAVE: 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. * @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. * @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; if (isNull(tileId)) return null;
Tile tile = tiles.get(tileId); Tile tile = tiles.get(tileId);
if (resolveShadows && tile instanceof Shadow) tile = ((Shadow)tile).overlay(); if (resolveShadows && tile instanceof Shadow) tile = ((Shadow)tile).overlay();
@ -508,7 +507,7 @@ public class Plan extends BaseClass{
* @throws NumberFormatException * @throws NumberFormatException
* @throws IOException * @throws IOException
*/ */
private String moveTile(String direction, String tileId) throws NumberFormatException, IOException { private String moveTile(String direction, Id tileId) throws NumberFormatException, IOException {
switch (direction) { switch (direction) {
case "south": case "south":
return moveTile(get(tileId,false),Direction.SOUTH); return moveTile(get(tileId,false),Direction.SOUTH);
@ -611,7 +610,7 @@ public class Plan extends BaseClass{
private Window properties(HashMap<String, String> params) { private Window properties(HashMap<String, String> params) {
if (params.containsKey(ID)) { if (params.containsKey(ID)) {
Tile tile = get(params.get(ID), true); Tile tile = get(Id.from(params), true);
if (isSet(tile)) return tile.propMenu(); if (isSet(tile)) return tile.propMenu();
} }
@ -659,7 +658,7 @@ public class Plan extends BaseClass{
*/ */
Route registerRoute(Route newRoute) { Route registerRoute(Route newRoute) {
newRoute.path().stream().filter(Tile::isSet).forEach(tile -> tile.add(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); Route existingRoute = routes.get(newRouteId);
if (isSet(existingRoute)) newRoute.addPropertiesFrom(existingRoute); if (isSet(existingRoute)) newRoute.addPropertiesFrom(existingRoute);
routes.put(newRouteId, newRoute); routes.put(newRouteId, newRoute);
@ -707,7 +706,7 @@ public class Plan extends BaseClass{
* @param routeId the id of the route requestd * @param routeId the id of the route requestd
* @return * @return
*/ */
public Route route(int routeId) { public Route route(Id routeId) {
return routes.get(routeId); return routes.get(routeId);
} }
@ -798,15 +797,15 @@ public class Plan extends BaseClass{
public Tag showContext(HashMap<String, String> params) { public Tag showContext(HashMap<String, String> params) {
String[] parts = params.get(CONTEXT).split(":"); String[] parts = params.get(CONTEXT).split(":");
String realm = parts[0]; String realm = parts[0];
String id = parts.length>1 ? parts[1] : null; Id id = parts.length>1 ? new Id(parts[1]) : null;
switch (realm) { switch (realm) {
case REALM_ROUTE: case REALM_ROUTE:
return route(Integer.parseInt(id)).properties(params); return route(id).properties(params);
case REALM_PLAN: case REALM_PLAN:
Tile tile = get(id, false); Tile tile = get(id, false);
return isNull(tile) ? null : tile.propMenu(); return isNull(tile) ? null : tile.propMenu();
case REALM_ACTIONS: case REALM_ACTIONS:
Action action = Action.get(Integer.parseInt(id)); Action action = Action.get(id);
return (isSet(action)) ? action.properties(params) : null; 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 * generates the menu for selecting tiles to be added to the layout
* @return * @return
@ -931,7 +920,7 @@ public class Plan extends BaseClass{
* @throws IOException * @throws IOException
*/ */
private Object update(HashMap<String, String> params) throws IOException { private Object update(HashMap<String, String> 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 (isSet(tile)) return tile.update(params);
if (params.containsKey(LENGTH_UNIT)) lengthUnit = params.get(LENGTH_UNIT); if (params.containsKey(LENGTH_UNIT)) lengthUnit = params.get(LENGTH_UNIT);
@ -942,7 +931,7 @@ public class Plan extends BaseClass{
} }
private Object updateTimes(HashMap<String, String> params) throws IOException { private Object updateTimes(HashMap<String, String> params) throws IOException {
Tile tile = get(params.get(ID),false); Tile tile = get(Id.from(params),false);
if (tile instanceof Block) { if (tile instanceof Block) {
Block block = (Block) tile; Block block = (Block) tile;
place(block.updateTimes(params)); place(block.updateTimes(params));

31
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.tools.Tag;
import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.actions.Action; import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ActionList; import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.actions.BrakeStart; import de.srsoftware.web4rail.actions.BrakeStart;
import de.srsoftware.web4rail.actions.BrakeStop; import de.srsoftware.web4rail.actions.BrakeStop;
@ -72,7 +71,7 @@ public class Route extends BaseClass implements Comparable<Route>{
static final String SIGNALS = "signals"; static final String SIGNALS = "signals";
static final String TURNOUTS = "turnouts"; static final String TURNOUTS = "turnouts";
private static HashMap<Integer, String> names = new HashMap<Integer, String>(); // maps id to name. needed to keep names during plan.analyze() private static HashMap<Id, String> names = new HashMap<Id, String>(); // maps id to name. needed to keep names during plan.analyze()
private class BrakeProcessor extends Thread { private class BrakeProcessor extends Thread {
private int startSpeed; private int startSpeed;
@ -144,7 +143,7 @@ public class Route extends BaseClass implements Comparable<Route>{
private boolean disabled = false; private boolean disabled = false;
private Block endBlock = null; private Block endBlock = null;
public Direction endDirection; public Direction endDirection;
private int id; private Id id;
private Vector<Tile> path; private Vector<Tile> path;
private Vector<Signal> signals; private Vector<Signal> signals;
public Train train; public Train train;
@ -163,12 +162,12 @@ public class Route extends BaseClass implements Comparable<Route>{
* @throws IOException * @throws IOException
*/ */
public static Object action(HashMap<String, String> params) throws IOException { public static Object action(HashMap<String, String> 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)); if (isNull(route)) return t("Unknown route: {}",params.get(ID));
switch (params.get(ACTION)) { switch (params.get(ACTION)) {
case ACTION_DROP: case ACTION_DROP:
String message = plan.remove(route); String message = plan.remove(route);
String tileId = params.get(Tile.class.getSimpleName()); Id tileId = Id.from(params,Tile.class.getSimpleName());
if (isSet(tileId)) { if (isSet(tileId)) {
Tile tile = plan.get(tileId, false); Tile tile = plan.get(tileId, false);
if (isSet(tile)) { if (isSet(tile)) {
@ -228,7 +227,7 @@ public class Route extends BaseClass implements Comparable<Route>{
} }
private void addBasicPropertiesTo(Window win) { 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); new Tag("h4").content(t("Origin and destination")).addTo(win);
Tag list = new Tag("ul"); Tag list = new Tag("ul");
Plan.addLink(startBlock, t("Origin: {} to {}",startBlock.name,startDirection), list); Plan.addLink(startBlock, t("Origin: {} to {}",startBlock.name,startDirection), list);
@ -441,8 +440,8 @@ public class Route extends BaseClass implements Comparable<Route>{
} }
private Object dropCodition(HashMap<String, String> params) { private Object dropCodition(HashMap<String, String> params) {
String condId = params.get(REALM_CONDITION); Id condId = Id.from(params,REALM_CONDITION);
if (isSet(condId)) conditions.removeById(Integer.parseInt(condId)); if (isSet(condId)) conditions.removeById(condId);
return properties(params); return properties(params);
} }
@ -492,8 +491,8 @@ public class Route extends BaseClass implements Comparable<Route>{
return sb.toString().trim(); return sb.toString().trim();
} }
public int id() { public Id id() {
if (id == 0) id = generateName().hashCode(); if (id == null) id = new Id(generateName());
return id; return id;
} }
@ -512,11 +511,11 @@ public class Route extends BaseClass implements Comparable<Route>{
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put(ID, id()); json.put(ID, id());
Vector<String> tileIds = new Vector<String>(); Vector<Id> tileIds = new Vector<Id>();
for (Tile t : this.path) tileIds.add(t.id()); for (Tile t : this.path) tileIds.add(t.id());
json.put(PATH, tileIds); json.put(PATH, tileIds);
Vector<String> signalIds = new Vector<String>(); // list all signals affecting this route Vector<Id> signalIds = new Vector<Id>(); // list all signals affecting this route
for (Tile t : this.signals) signalIds.add(t.id()); for (Tile t : this.signals) signalIds.add(t.id());
json.put(SIGNALS, signalIds); json.put(SIGNALS, signalIds);
@ -556,13 +555,13 @@ public class Route extends BaseClass implements Comparable<Route>{
} }
private Route load(JSONObject json,Plan plan) { 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)); if (json.has(NAME)) name(json.getString(NAME));
JSONArray pathIds = json.getJSONArray(PATH); JSONArray pathIds = json.getJSONArray(PATH);
startDirection = Direction.valueOf(json.getString(START_DIRECTION)); startDirection = Direction.valueOf(json.getString(START_DIRECTION));
endDirection = Direction.valueOf(json.getString(END_DIRECTION)); endDirection = Direction.valueOf(json.getString(END_DIRECTION));
for (Object tileId : pathIds) { for (Object tileId : pathIds) {
Tile tile = plan.get((String) tileId,false); Tile tile = plan.get(new Id((String) tileId),false);
if (isNull(tile)) { if (isNull(tile)) {
continue; continue;
} }
@ -582,12 +581,12 @@ public class Route extends BaseClass implements Comparable<Route>{
JSONArray turnouts = json.getJSONArray(TURNOUTS); JSONArray turnouts = json.getJSONArray(TURNOUTS);
for (int i=0; i<turnouts.length();i++) { for (int i=0; i<turnouts.length();i++) {
JSONObject jTurnout = turnouts.getJSONObject(i); JSONObject jTurnout = turnouts.getJSONObject(i);
Turnout turnout = (Turnout) plan.get(jTurnout.getString(Turnout.ID), false); Turnout turnout = (Turnout) plan.get(new Id(jTurnout.getString(Turnout.ID)), false);
addTurnout(turnout, Turnout.State.valueOf(jTurnout.getString(Turnout.STATE))); addTurnout(turnout, Turnout.State.valueOf(jTurnout.getString(Turnout.STATE)));
} }
} }
if (json.has(SIGNALS)) { if (json.has(SIGNALS)) {
for (Object signalId : json.getJSONArray(SIGNALS)) addSignal((Signal) plan.get((String) signalId, false)); for (Object signalId : json.getJSONArray(SIGNALS)) addSignal((Signal) plan.get(new Id((String) signalId), false));
} }
if (json.has(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS)); if (json.has(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS));
if (json.has(CONDITIONS)) conditions.load(json.getJSONArray(CONDITIONS)); if (json.has(CONDITIONS)) conditions.load(json.getJSONArray(CONDITIONS));

84
src/main/java/de/srsoftware/web4rail/actions/Action.java

@ -13,14 +13,9 @@ import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application; import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tags.Select; import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tiles.Block;
import de.srsoftware.web4rail.tiles.Contact;
/** /**
* Base Class for all other actions * Base Class for all other actions
@ -28,81 +23,12 @@ import de.srsoftware.web4rail.tiles.Contact;
* *
*/ */
public abstract class Action extends BaseClass { public abstract class Action extends BaseClass {
private static final HashMap<Integer,Action> actions = new HashMap<Integer, Action>(); private static final HashMap<Id,Action> actions = new HashMap<Id, Action>();
public static final Logger LOG = LoggerFactory.getLogger(Action.class); public static final Logger LOG = LoggerFactory.getLogger(Action.class);
private static final String PREFIX = Action.class.getPackageName(); 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() { public Action() {
id = Application.createId(); actions.put(id(), this);
actions.put(id, this);
} }
public static Action create(String type) { public static Action create(String type) {
@ -120,14 +46,10 @@ public abstract class Action extends BaseClass {
public abstract boolean fire(Context context); public abstract boolean fire(Context context);
public static Action get(int actionId) { public static Action get(Id actionId) {
return actions.get(actionId); return actions.get(actionId);
} }
public int id() {
return id;
}
public JSONObject json() { public JSONObject json() {
return new JSONObject().put(TYPE, getClass().getSimpleName()); return new JSONObject().put(TYPE, getClass().getSimpleName());
} }

38
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.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application; 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.Constants;
import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Plan;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Input;
@ -26,25 +26,25 @@ public class ActionList extends Vector<Action> implements Constants{
private static final Logger LOG = LoggerFactory.getLogger(ActionList.class); private static final Logger LOG = LoggerFactory.getLogger(ActionList.class);
private static final long serialVersionUID = 4862000041987682112L; private static final long serialVersionUID = 4862000041987682112L;
private static final HashMap<Integer, ActionList> actionLists = new HashMap<Integer, ActionList>(); private static final HashMap<Id, ActionList> actionLists = new HashMap<Id, ActionList>();
private int id; private Id id;
public ActionList() { public ActionList() {
id = Application.createId(); id = new Id();
actionLists.put(id,this); actionLists.put(id,this);
} }
private static Integer actionId(HashMap<String, String> params) { private static Id actionId(HashMap<String, String> params) {
if (!params.containsKey(ID)) return null; if (!params.containsKey(ID)) return null;
String[] parts = params.get(ID).split("/"); String[] parts = params.get(ID).split("/");
if (parts.length<2) return null; if (parts.length<2) return null;
return Integer.parseInt(parts[1]); return new Id(parts[1]);
} }
private static Integer actionListId(HashMap<String, String> params) { private static Id actionListId(HashMap<String, String> params) {
if (!params.containsKey(ID)) return null; if (!params.containsKey(ID)) return null;
String[] parts = params.get(ID).split("/"); String[] parts = params.get(ID).split("/");
return Integer.parseInt(parts[0]); return new Id(parts[0]);
} }
private Object actionTypeForm(Window win, String context) { private Object actionTypeForm(Window win, String context) {
@ -110,7 +110,7 @@ public class ActionList extends Vector<Action> implements Constants{
boolean first = true; boolean first = true;
for (Action action : this) { for (Action action : this) {
props.put(ID, id+"/"+action.id()); 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) { if (!first) {
props.put(ACTION, ACTION_MOVE); props.put(ACTION, ACTION_MOVE);
new Button("↑",props).addTo(act); new Button("↑",props).addTo(act);
@ -132,9 +132,9 @@ public class ActionList extends Vector<Action> implements Constants{
} }
} }
public boolean drop(int actionId) { public boolean drop(Id actionId) {
for (Action action : this) { for (Action action : this) {
if (action.id() == actionId) { if (action.id().equals(actionId)) {
this.remove(action); this.remove(action);
return true; return true;
} }
@ -150,7 +150,7 @@ public class ActionList extends Vector<Action> implements Constants{
return true; return true;
} }
public int id() { public Id id() {
return id; return id;
} }
@ -172,9 +172,9 @@ public class ActionList extends Vector<Action> implements Constants{
return actionList; return actionList;
} }
public boolean moveUp(int actionId) { public boolean moveUp(Id actionId) {
for (int i=1; i<size(); i++) { for (int i=1; i<size(); i++) {
if (actionId == elementAt(i).id()) { if (actionId.equals(elementAt(i).id())) {
Action action = remove(i); Action action = remove(i);
insertElementAt(action, i-1); insertElementAt(action, i-1);
return true; return true;
@ -184,11 +184,11 @@ public class ActionList extends Vector<Action> implements Constants{
} }
public static Object process(HashMap<String, String> params, Plan plan) { public static Object process(HashMap<String, String> params, Plan plan) {
Integer listId = actionListId(params); Id listId = actionListId(params);
if (listId == null) return t("No action list id passed to ActionList.process()!"); if (listId == null) return t("No action list id passed to ActionList.process()!");
ActionList actionList = actionLists.get(listId); ActionList actionList = actionLists.get(listId);
Integer actionId = actionId(params); Id actionId = actionId(params);
String action = params.get(ACTION); String action = params.get(ACTION);
if (action == null) return t("No action passed to ActionList.process()!"); 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); 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<Action> implements Constants{
} }
private static Object propsOf(HashMap<String, String> params) { private static Object propsOf(HashMap<String, String> params) {
int actionId = actionId(params); Id actionId = actionId(params);
Action action = Action.get(actionId); Action action = Action.get(actionId);
if (action != null) return action.properties(params); if (action != null) return action.properties(params);
return t("No action with id {} found!",actionId); return t("No action with id {} found!",actionId);
@ -219,7 +219,7 @@ public class ActionList extends Vector<Action> implements Constants{
return Translation.get(Application.class, text, fills); return Translation.get(Application.class, text, fills);
} }
private static Object update(int actionId, HashMap<String, String> params, Plan plan) { private static Object update(Id actionId, HashMap<String, String> params, Plan plan) {
Action action = Action.get(actionId); Action action = Action.get(actionId);
if (action != null) { if (action != null) {
plan.stream(action.update(params).toString()); plan.stream(action.update(params).toString());

4
src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java

@ -4,8 +4,8 @@ public class BrakeCancel extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
if (isNull(context.route)) return false; if (isNull(context.route())) return false;
context.route.brakeCancel(); context.route().brakeCancel();
return true; return true;
} }

4
src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java

@ -4,8 +4,8 @@ public class BrakeStart extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
if (isNull(context.route)) return false; if (isNull(context.route())) return false;
context.route.brakeStart(); context.route().brakeStart();
LOG.debug("Started brake process..."); LOG.debug("Started brake process...");
return true; return true;
} }

4
src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java

@ -4,8 +4,8 @@ public class BrakeStop extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
if (isNull(context.route)) return false; if (isNull(context.route())) return false;
context.route.brakeStop(); context.route().brakeStop();
return true; return true;
} }

8
src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java

@ -49,10 +49,8 @@ public class ConditionalAction extends Action {
if (!conditions.isEmpty()) { if (!conditions.isEmpty()) {
Tag list = new Tag("ul"); Tag list = new Tag("ul");
for (Condition condition : conditions) { for (Condition condition : conditions) {
HashMap<String,Object> props = new HashMap<String, Object>(Map.of(REALM,REALM_CONDITION,ID,condition.id(),ACTION,ACTION_PROPS,CONTEXT, context)); Tag li = link("span", condition+NBSP,Map.of(CONTEXT,context)).addTo(new Tag("li"));
Tag li = link("span", props, condition+NBSP).addTo(new Tag("li")); HashMap<String,Object> props = new HashMap<String, Object>(Map.of(REALM,REALM_CONDITION,ID,condition.id(),ACTION,ACTION_DROP,CONTEXT, REALM_ACTIONS+":"+id()));
props.put(ACTION, ACTION_DROP);
props.put(CONTEXT,REALM_ACTIONS+":"+id());
new Button(t("delete"), props).addTo(li).addTo(list); new Button(t("delete"), props).addTo(li).addTo(list);
} }
list.addTo(fieldset); list.addTo(fieldset);
@ -67,7 +65,7 @@ public class ConditionalAction extends Action {
Condition.selector().addTo(form); Condition.selector().addTo(form);
new Button(t("Add condition"),form).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) { public boolean equals(ConditionalAction other) {

8
src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java

@ -18,8 +18,8 @@ public class DetermineTrainInBlock extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
context.block = block; context.block(block);
context.train = block.train(); context.train(block.train());
return true; return true;
} }
@ -33,7 +33,7 @@ public class DetermineTrainInBlock extends Action {
@Override @Override
public Action load(JSONObject json) { public Action load(JSONObject json) {
super.load(json); super.load(json);
String blockId = json.getString(BLOCK); Id blockId = Id.from(json,BLOCK);
if (isSet(blockId)) block = Block.get(blockId); if (isSet(blockId)) block = Block.get(blockId);
return this; return this;
} }
@ -61,7 +61,7 @@ public class DetermineTrainInBlock extends Action {
@Override @Override
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",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); if (isSet(blockId)) block = Block.get(blockId);
return properties(params); return properties(params);
} }

2
src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java

@ -6,7 +6,7 @@ public class FinishRoute extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
Route route = context.route; Route route = context.route();
if (isSet(route)) route.finish(); if (isSet(route)) route.finish();
return true; return true;
} }

10
src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java

@ -8,20 +8,20 @@ public class PreserveRoute extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
Train train = context.train; Train train = context.train();
Route route = context.route; Route route = context.route();
// These are errors: // These are errors:
if (isNull(train)) return false; if (isNull(train)) return false;
if (isNull(route)) 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: // 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 (waitTime.max > 0) return true; // train is expected to wait in next block.
if (train.destination() == route.endBlock()) return true; if (train.destination() == route.endBlock()) return true;
context.train.reserveNext(); train.reserveNext();
return true; return true;
} }

10
src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java

@ -18,14 +18,14 @@ public class SetContextTrain extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
context.train = train; context.train(train);
return true; return true;
} }
@Override @Override
public JSONObject json() { public JSONObject json() {
JSONObject json = super.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; return json;
} }
@ -37,7 +37,7 @@ public class SetContextTrain extends Action {
public void run() { public void run() {
try { try {
sleep(1000); sleep(1000);
int trainId = json.getInt(REALM_TRAIN); Id trainId = Id.from(json,REALM_TRAIN);
if (isSet(trainId)) train = Train.get(trainId); if (isSet(trainId)) train = Train.get(trainId);
} catch (InterruptedException e) {} } catch (InterruptedException e) {}
}; };
@ -69,8 +69,8 @@ public class SetContextTrain extends Action {
@Override @Override
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",params); LOG.debug("update: {}",params);
String trainId = params.get(Train.class.getSimpleName()); Id trainId = Id.from(params,Train.class.getSimpleName());
if (isSet(trainId)) train = Train.get(Integer.parseInt(trainId)); if (isSet(trainId)) train = Train.get(trainId);
return properties(params); return properties(params);
} }

4
src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java

@ -39,7 +39,7 @@ public class SetDisplayText extends TextAction{
public void run() { public void run() {
try { try {
sleep(1000); sleep(1000);
display = (TextDisplay) plan.get(json.getString(DISPLAY), false); display = (TextDisplay) plan.get(Id.from(json,DISPLAY), false);
} catch (InterruptedException e) {} } catch (InterruptedException e) {}
}; };
}.start(); }.start();
@ -72,7 +72,7 @@ public class SetDisplayText extends TextAction{
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
super.update(params); super.update(params);
String displayId = params.get(TextDisplay.class.getSimpleName()); 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); return properties(params);
} }
} }

4
src/main/java/de/srsoftware/web4rail/actions/SetRelay.java

@ -41,7 +41,7 @@ public class SetRelay extends Action {
super.load(json); super.load(json);
String relayId = json.getString(RELAY); String relayId = json.getString(RELAY);
if (isSet(relayId)) { if (isSet(relayId)) {
relay = Relay.get(relayId); relay = Relay.get(new Id(relayId));
state = json.getBoolean(Relay.STATE); state = json.getBoolean(Relay.STATE);
} }
return this; return this;
@ -81,7 +81,7 @@ public class SetRelay extends Action {
@Override @Override
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",params); LOG.debug("update: {}",params);
String relayId = params.get(RELAY); Id relayId = new Id(params.get(RELAY));
relay = Relay.get(relayId); relay = Relay.get(relayId);
String st = params.get(Relay.STATE); String st = params.get(Relay.STATE);
if (isSet(st)) state = st.equals("true"); if (isSet(st)) state = st.equals("true");

4
src/main/java/de/srsoftware/web4rail/actions/SetSignal.java

@ -39,7 +39,7 @@ public class SetSignal extends Action {
@Override @Override
public Action load(JSONObject json) { public Action load(JSONObject json) {
super.load(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; if (tile instanceof Signal) signal = (Signal) tile;
state = json.getString(Signal.STATE); state = json.getString(Signal.STATE);
return this; return this;
@ -91,7 +91,7 @@ public class SetSignal extends Action {
@Override @Override
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",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; if (tile instanceof Signal) signal = (Signal) tile;
String st = params.get(Signal.STATE); String st = params.get(Signal.STATE);
if (isSet(st)) state = st; if (isSet(st)) state = st;

4
src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java

@ -18,8 +18,8 @@ public class SetSpeed extends Action{
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
if (isNull(context.train)) return false; if (isNull(context.train())) return false;
context.train.setSpeed(speed); context.train().setSpeed(speed);
return true; return true;
} }

4
src/main/java/de/srsoftware/web4rail/actions/StopAuto.java

@ -4,8 +4,8 @@ public class StopAuto extends Action {
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
if (isNull(context.train)) return false; if (isNull(context.train())) return false;
context.train.quitAutopilot(); context.train().quitAutopilot();
return true; return true;
} }

10
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) { public String fill(String tx,Context context) {
if (isSet(context.block)) tx = tx.replace("%block%", context.block.name); 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.contact())) tx = tx.replace("%contact%", context.contact().id().toString());
if (isSet(context.direction)) tx = tx.replace("%dir%", context.direction.name()); 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.route())) tx = tx.replace("%route%", context.route().name());
if (isSet(context.train)) tx = tx.replace("%train%", context.train.name()); if (isSet(context.train())) tx = tx.replace("%train%", context.train().name());
return tx; return tx;
} }

4
src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java

@ -32,7 +32,7 @@ public class TriggerContact extends Action {
@Override @Override
public Action load(JSONObject json) { public Action load(JSONObject json) {
super.load(json); super.load(json);
String contactId = json.getString(CONTACT); Id contactId = Id.from(json,CONTACT);
if (isSet(contactId)) contact = Contact.get(contactId); if (isSet(contactId)) contact = Contact.get(contactId);
return this; return this;
} }
@ -60,7 +60,7 @@ public class TriggerContact extends Action {
@Override @Override
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",params); LOG.debug("update: {}",params);
String contactId = params.get(CONTACT); Id contactId = Id.from(params,CONTACT);
if (isSet(contactId)) contact = Contact.get(contactId); if (isSet(contactId)) contact = Contact.get(contactId);
return properties(params); return properties(params);
} }

4
src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java

@ -4,8 +4,8 @@ public class TurnTrain extends Action{
@Override @Override
public boolean fire(Context context) { public boolean fire(Context context) {
if (context.train != null) { if (context.train() != null) {
context.train.turn(); context.train().turn();
return true; return true;
} }
return false; return false;

5
src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java

@ -5,7 +5,6 @@ import java.util.HashMap;
import org.json.JSONObject; import org.json.JSONObject;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tiles.Block; import de.srsoftware.web4rail.tiles.Block;
@ -26,7 +25,7 @@ public class BlockFree extends Condition {
public Condition load(JSONObject json) { public Condition load(JSONObject json) {
super.load(json); super.load(json);
block(Block.get(json.getString(BLOCK))); block(Block.get(new Id(json.getString(BLOCK))));
return this; return this;
} }
@ -52,7 +51,7 @@ public class BlockFree extends Condition {
@Override @Override
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
if (!params.containsKey(BLOCK)) return t("No block id passed to BlockFree.update()!"); 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); Block block = Block.get(bid);
if (block == null) return t("No block with id {} found!",bid); if (block == null) return t("No block with id {} found!",bid);
this.block = block; this.block = block;

22
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.Plan;
import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ConditionalAction; import de.srsoftware.web4rail.actions.ConditionalAction;
import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Checkbox; 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); public static final Logger LOG = LoggerFactory.getLogger(Condition.class);
private static final String INVERTED = "inverted"; private static final String INVERTED = "inverted";
private static final String PREFIX = Condition.class.getPackageName(); private static final String PREFIX = Condition.class.getPackageName();
private static HashMap<Integer, Condition> conditions = new HashMap<Integer, Condition>(); private static HashMap<Id, Condition> conditions = new HashMap<Id, Condition>();
public boolean inverted = false; public boolean inverted = false;
protected int id;
private Object parent; private Object parent;
public Condition() { public Condition() {
this(Application.createId()); this(new Id());
} }
public Condition(int id) { public Condition(Id id) {
this.id = id; this.id = id;
conditions.put(id, this); conditions.put(id, this);
} }
@ -48,7 +46,7 @@ public abstract class Condition extends BaseClass {
String action = params.get(ACTION); String action = params.get(ACTION);
if (action == null) return t("No action passed to Condition.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)) { if (isSet(cid)) {
Condition condition = conditions.get(cid); Condition condition = conditions.get(cid);
@ -85,14 +83,14 @@ public abstract class Condition extends BaseClass {
Condition condition = Condition.create(type); Condition condition = Condition.create(type);
if (isNull(condition)) return t("Unknown type \"{}\" of condition!",type); if (isNull(condition)) return t("Unknown type \"{}\" of condition!",type);
String[] parts = context.split(":"); String[] parts = context.split(":");
String contextId = parts[1]; Id contextId = new Id(parts[1]);
String realm = parts[0]; String realm = parts[0];
switch (realm) { switch (realm) {
case REALM_ROUTE: case REALM_ROUTE:
Route route = plan.route(Integer.parseInt(contextId)); Route route = plan.route(contextId);
if (isNull(route)) return t("Unknown route: {}",contextId); if (isNull(route)) return t("Unknown route: {}",contextId);
route.add(condition); route.add(condition);
return route.properties(new HashMap<String,String>(Map.of(REALM,REALM_ROUTE,ACTION,ACTION_PROPS,ID,contextId))); return route.properties(new HashMap<String,String>(Map.of(REALM,REALM_ROUTE,ACTION,ACTION_PROPS,ID,contextId.toString())));
default: default:
break; break;
@ -125,10 +123,6 @@ public abstract class Condition extends BaseClass {
public abstract boolean fulfilledBy(Context context); public abstract boolean fulfilledBy(Context context);
public int id() {
return id;
}
public JSONObject json() { public JSONObject json() {
JSONObject json = new JSONObject().put(TYPE, getClass().getSimpleName()); JSONObject json = new JSONObject().put(TYPE, getClass().getSimpleName());
if (inverted) json.put(INVERTED, true); if (inverted) json.put(INVERTED, true);
@ -146,7 +140,7 @@ public abstract class Condition extends BaseClass {
String tx = args.length<1 ? toString()+NBSP : args[0]; String tx = args.length<1 ? toString()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1]; String type = args.length<2 ? "span" : args[1];
String context = args.length<3 ? null : args[2]; 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<Class<? extends Condition>> list() { private static List<Class<? extends Condition>> list() {

7
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.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application; 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.Constants;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Input;
@ -39,9 +40,9 @@ public class ConditionList extends Vector<Condition> implements Constants{
} }
} }
public void removeById(int cid) { public void removeById(Id cid) {
for (Condition condition : this) { for (Condition condition : this) {
if (condition.id() == cid) { if (condition.id().equals(cid)) {
remove(condition); remove(condition);
break; break;
} }

1
src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java

@ -6,7 +6,6 @@ import java.util.stream.Collectors;
import org.json.JSONObject; import org.json.JSONObject;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action.Context;
public class OrCondition extends Condition{ public class OrCondition extends Condition{

4
src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java

@ -1,12 +1,10 @@
package de.srsoftware.web4rail.conditions; package de.srsoftware.web4rail.conditions;
import de.srsoftware.web4rail.actions.Action.Context;
public class PushPullTrain extends Condition { public class PushPullTrain extends Condition {
@Override @Override
public boolean fulfilledBy(Context context) { public boolean fulfilledBy(Context context) {
return context.train.pushPull != inverted; return context.train().pushPull != inverted;
} }
@Override @Override

3
src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java

@ -5,7 +5,6 @@ import java.util.HashMap;
import org.json.JSONObject; import org.json.JSONObject;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Label;
@ -17,7 +16,7 @@ public class TrainHasTag extends Condition {
@Override @Override
public boolean fulfilledBy(Context context) { public boolean fulfilledBy(Context context) {
if (tag == null) return true; if (tag == null) return true;
return context.train.tags().contains(tag) != inverted; return context.train().tags().contains(tag) != inverted;
} }
@Override @Override

5
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.tools.Tag;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Label;
@ -17,8 +16,8 @@ public class TrainLength extends Condition {
@Override @Override
public boolean fulfilledBy(Context context) { public boolean fulfilledBy(Context context) {
if (isNull(context.train)) return false; if (isNull(context.train())) return false;
return (context.train.length() < maxLength) != inverted; return (context.train().length() < maxLength) != inverted;
} }
@Override @Override

9
src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java

@ -5,7 +5,6 @@ import java.util.HashMap;
import org.json.JSONObject; import org.json.JSONObject;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Label;
@ -16,17 +15,17 @@ public class TrainSelect extends Condition {
@Override @Override
public boolean fulfilledBy(Context context) { public boolean fulfilledBy(Context context) {
return (context.train == train) != inverted; return (context.train() == train) != inverted;
} }
@Override @Override
public JSONObject json() { public JSONObject json() {
return super.json().put(REALM_TRAIN, train.id); return super.json().put(REALM_TRAIN, train.id());
} }
public Condition load(JSONObject json) { public Condition load(JSONObject json) {
super.load(json); super.load(json);
train(Train.get(json.getInt(REALM_TRAIN))); train(Train.get(new Id(json.getString(REALM_TRAIN))));
return this; return this;
} }
@ -52,7 +51,7 @@ public class TrainSelect extends Condition {
@Override @Override
protected Object update(HashMap<String, String> params) { protected Object update(HashMap<String, String> params) {
if (!params.containsKey(TRAIN)) return t("No train id passed to TrainSelect.update()!"); 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); Train train = Train.get(tid);
if (train == null) return t("No train with id {} found!",tid); if (train == null) return t("No train with id {} found!",tid);
this.train = train; this.train = train;

27
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<Car>{ public class Car extends BaseClass implements Comparable<Car>{
protected static final Logger LOG = LoggerFactory.getLogger(Car.class); protected static final Logger LOG = LoggerFactory.getLogger(Car.class);
static HashMap<Integer,Car> cars = new HashMap<Integer, Car>(); static HashMap<Id,Car> cars = new HashMap<Id, Car>();
public static final String NAME = "name"; public static final String NAME = "name";
private static final String LENGTH = "length"; private static final String LENGTH = "length";
@ -41,7 +41,6 @@ public class Car extends BaseClass implements Comparable<Car>{
private static final String MAX_SPEED = "max_speed"; private static final String MAX_SPEED = "max_speed";
protected HashSet<String> tags = new HashSet<String>(); protected HashSet<String> tags = new HashSet<String>();
private int id;
private String name; private String name;
public int length; public int length;
protected String stockId = ""; protected String stockId = "";
@ -54,14 +53,9 @@ public class Car extends BaseClass implements Comparable<Car>{
this(name,null); this(name,null);
} }
public Car(String name, Integer id) { public Car(String name, Id id) {
this.name = name; this.name = name;
if (id == null) { if (isNull(id)) id = new Id();
try { // make sure multiple consecutive creations get different ids
Thread.sleep(1);
} catch (InterruptedException e) {}
id = Application.createId();
}
this.id = id; this.id = id;
cars.put(id, this); cars.put(id, this);
} }
@ -100,12 +94,7 @@ public class Car extends BaseClass implements Comparable<Car>{
} }
public static Car get(Object id) { public static Car get(Object id) {
return isNull(id) ? null : cars.get(Integer.parseInt(""+id)); // try to get by id return isNull(id) ? null : cars.get(new Id(""+id)); // try to get by id
}
public int id() {
return id;
} }
public JSONObject json() { public JSONObject json() {
@ -130,7 +119,7 @@ public class Car extends BaseClass implements Comparable<Car>{
public Tag link(String...args) { public Tag link(String...args) {
String tx = args.length<1 ? name()+NBSP : args[0]; String tx = args.length<1 ? name()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1]; 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<Car> list() { static Vector<Car> list() {
@ -148,7 +137,7 @@ public class Car extends BaseClass implements Comparable<Car>{
while (line != null) { while (line != null) {
JSONObject json = new JSONObject(line); JSONObject json = new JSONObject(line);
String name = json.getString(Car.NAME); 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 car = json.has(Locomotive.LOCOMOTIVE) ? new Locomotive(name, id) : new Car(name,id);
car.load(json).plan(plan); car.load(json).plan(plan);
@ -158,7 +147,7 @@ public class Car extends BaseClass implements Comparable<Car>{
} }
protected Car load(JSONObject json) { 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(LENGTH)) length = json.getInt(LENGTH);
if (json.has(MAX_SPEED)) maxSpeed = json.getInt(MAX_SPEED); if (json.has(MAX_SPEED)) maxSpeed = json.getInt(MAX_SPEED);
if (json.has(NOTES)) notes = json.getString(NOTES); if (json.has(NOTES)) notes = json.getString(NOTES);
@ -249,7 +238,7 @@ public class Car extends BaseClass implements Comparable<Car>{
public static void saveAll(String filename) throws IOException { public static void saveAll(String filename) throws IOException {
BufferedWriter file = new BufferedWriter(new FileWriter(filename)); BufferedWriter file = new BufferedWriter(new FileWriter(filename));
for (Entry<Integer, Car> entry: cars.entrySet()) file.write(entry.getValue().json()+"\n"); for (Entry<Id, Car> entry: cars.entrySet()) file.write(entry.getValue().json()+"\n");
file.close(); file.close();
} }

6
src/main/java/de/srsoftware/web4rail/moving/Locomotive.java

@ -39,7 +39,7 @@ public class Locomotive extends Car implements Constants,Device{
super(name); super(name);
} }
public Locomotive(String name, Integer id) { public Locomotive(String name, Id id) {
super(name,id); super(name,id);
} }
@ -82,7 +82,7 @@ public class Locomotive extends Car implements Constants,Device{
} }
public static Tag cockpit(Object locoOrTrain) { public static Tag cockpit(Object locoOrTrain) {
int id = 0; Id id = null;
int speed = 0; int speed = 0;
String realm = null; String realm = null;
Train train = null; Train train = null;
@ -95,7 +95,7 @@ public class Locomotive extends Car implements Constants,Device{
} else if (locoOrTrain instanceof Train) { } else if (locoOrTrain instanceof Train) {
train = (Train)locoOrTrain; train = (Train)locoOrTrain;
realm = REALM_TRAIN; realm = REALM_TRAIN;
id = train.id; id = train.id();
speed = train.speed; speed = train.speed;
} }

53
src/main/java/de/srsoftware/web4rail/moving/Train.java

@ -20,9 +20,7 @@ import org.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.PathFinder; import de.srsoftware.web4rail.PathFinder;
import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Plan;
@ -30,7 +28,6 @@ import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.Range; import de.srsoftware.web4rail.Range;
import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Checkbox; import de.srsoftware.web4rail.tags.Checkbox;
import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Fieldset;
@ -49,9 +46,8 @@ public class Train extends BaseClass implements Comparable<Train> {
private static final String CAR_ID = "carId"; private static final String CAR_ID = "carId";
public static final String LOCO_ID = "locoId"; public static final String LOCO_ID = "locoId";
private static final String TRACE = "trace"; private static final String TRACE = "trace";
private static final HashMap<Integer, Train> trains = new HashMap<>(); private static final HashMap<Id, Train> trains = new HashMap<>();
public static final String ID = "id"; public static final String ID = "id";
public int id;
private static final String NAME = "name"; private static final String NAME = "name";
private String name = null; private String name = null;
@ -117,8 +113,8 @@ public class Train extends BaseClass implements Comparable<Train> {
this(loco,null); this(loco,null);
} }
public Train(Locomotive loco, Integer id) { public Train(Locomotive loco, Id id) {
if (isNull(id)) id = Application.createId(); if (isNull(id)) id = new Id();
this.id = id; this.id = id;
add(loco); add(loco);
trains.put(id, this); trains.put(id, this);
@ -136,7 +132,7 @@ public class Train extends BaseClass implements Comparable<Train> {
} }
return t("No train id passed!"); return t("No train id passed!");
} }
int id = Integer.parseInt(params.get(Train.ID)); Id id = Id.from(params);
Train train = trains.get(id); Train train = trains.get(id);
if (isNull(train)) return(t("No train with id {}!",id)); if (isNull(train)) return(t("No train with id {}!",id));
switch (action) { switch (action) {
@ -320,7 +316,7 @@ public class Train extends BaseClass implements Comparable<Train> {
return properties(); return properties();
} }
public static Train get(int id) { public static Train get(Id id) {
return trains.get(id); return trains.get(id);
} }
@ -344,15 +340,15 @@ public class Train extends BaseClass implements Comparable<Train> {
if (isSet(route)) json.put(ROUTE, route.id()); if (isSet(route)) json.put(ROUTE, route.id());
if (isSet(direction)) json.put(DIRECTION, direction); if (isSet(direction)) json.put(DIRECTION, direction);
Vector<Integer> locoIds = new Vector<Integer>(); Vector<Id> locoIds = new Vector<Id>();
for (Locomotive loco : locos) locoIds.add(loco.id()); for (Locomotive loco : locos) locoIds.add(loco.id());
json.put(LOCOS, locoIds); json.put(LOCOS, locoIds);
Vector<Integer> carIds = new Vector<Integer>(); Vector<Id> carIds = new Vector<Id>();
for (Car car : cars) carIds.add(car.id()); for (Car car : cars) carIds.add(car.id());
json.put(CARS,carIds); json.put(CARS,carIds);
Vector<String> tileIds = new Vector<String>(); Vector<Id> tileIds = new Vector<Id>();
for (Tile tile : trace) tileIds.add(tile.id()); for (Tile tile : trace) tileIds.add(tile.id());
json.put(TRACE, tileIds); json.put(TRACE, tileIds);
@ -377,7 +373,7 @@ public class Train extends BaseClass implements Comparable<Train> {
public Tag link(String...args) { public Tag link(String...args) {
String tx = args.length<1 ? name()+NBSP : args[0]; String tx = args.length<1 ? name()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1]; 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<Train> list() { public static TreeSet<Train> list() {
@ -390,9 +386,7 @@ public class Train extends BaseClass implements Comparable<Train> {
while (isSet(line)) { while (isSet(line)) {
JSONObject json = new JSONObject(line); JSONObject json = new JSONObject(line);
int id = json.getInt(ID); Train train = new Train(null,Id.from(json));
Train train = new Train(null,id);
train.plan(plan).load(json); train.plan(plan).load(json);
line = file.readLine(); line = file.readLine();
@ -405,8 +399,8 @@ public class Train extends BaseClass implements Comparable<Train> {
if (json.has(DIRECTION)) direction = Direction.valueOf(json.getString(DIRECTION)); if (json.has(DIRECTION)) direction = Direction.valueOf(json.getString(DIRECTION));
if (json.has(NAME)) name = json.getString(NAME); if (json.has(NAME)) name = json.getString(NAME);
if (json.has(TAGS)) json.getJSONArray(TAGS ).forEach(elem -> { tags.add(elem.toString()); }); 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(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(json.getString(BLOCK), false).set(this); // do not move this up! during set, other fields will be referenced! 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(CARS)) add(Car.get(id));
for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get(id)); for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get(id));
return this; return this;
@ -516,7 +510,8 @@ public class Train extends BaseClass implements Comparable<Train> {
return this; return this;
} }
public Tag properties() { @Override
public Window properties() {
Window window = new Window("train-properties",t("Properties of {}",this)); Window window = new Window("train-properties",t("Properties of {}",this));
Locomotive.cockpit(this).addTo(window); Locomotive.cockpit(this).addTo(window);
@ -547,14 +542,12 @@ public class Train extends BaseClass implements Comparable<Train> {
if (isNull(destination)) { if (isNull(destination)) {
new Button(t("Select from plan"),"return selectDest("+id+");").addTo(dest); new Button(t("Select from plan"),"return selectDest("+id+");").addTo(dest);
} else { } 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); new Button(t("Drop"),Map.of(REALM,REALM_TRAIN,ID,id,ACTION,ACTION_MOVE,DESTINATION,"")).addTo(dest);
} }
dest.addTo(propList); dest.addTo(propList);
if (isSet(route)) { if (isSet(route)) link("li", route).addTo(propList);
link("li", Map.of(REALM,REALM_ROUTE,ID,route.id(),ACTION,ACTION_PROPS), route).addTo(propList);
}
int ms = maxSpeed(); int ms = maxSpeed();
if (ms < Integer.MAX_VALUE) new Tag("li").content(t("Max. Speed")+": "+maxSpeed()+NBSP+speedUnit).addTo(propList); 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<Train> {
} }
public void reserveNext() { 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); Route nextRoute = PathFinder.chooseRoute(context);
if (isNull(nextRoute)) return; if (isNull(nextRoute)) return;
@ -622,7 +618,7 @@ public class Train extends BaseClass implements Comparable<Train> {
public static void saveAll(String filename) throws IOException { public static void saveAll(String filename) throws IOException {
BufferedWriter file = new BufferedWriter(new FileWriter(filename)); BufferedWriter file = new BufferedWriter(new FileWriter(filename));
for (Entry<Integer, Train> entry:trains.entrySet()) { for (Entry<Id, Train> entry:trains.entrySet()) {
Train train = entry.getValue(); Train train = entry.getValue();
file.write(train.json()+"\n"); file.write(train.json()+"\n");
} }
@ -653,7 +649,7 @@ public class Train extends BaseClass implements Comparable<Train> {
destination = null; destination = null;
return t("Dropped destination of {}.",this); 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 (isNull(tile)) return t("Tile {} not known!",dest);
if (tile instanceof Block) { if (tile instanceof Block) {
destination = (Block) tile; destination = (Block) tile;
@ -782,11 +778,6 @@ public class Train extends BaseClass implements Comparable<Train> {
return properties(); return properties();
} }
private static String t(String message, Object...fills) {
return Translation.get(Application.class, message, fills);
}
public SortedSet<String> tags() { public SortedSet<String> tags() {
TreeSet<String> list = new TreeSet<String>(tags); TreeSet<String> list = new TreeSet<String>(tags);
for (Locomotive loco : locos) list.addAll(loco.tags()); for (Locomotive loco : locos) list.addAll(loco.tags());

10
src/main/java/de/srsoftware/web4rail/tiles/Block.java

@ -151,7 +151,7 @@ public abstract class Block extends StretchableTile implements Comparable<Block>
return this; return this;
} }
public static Block get(String blockId) { public static Block get(Id blockId) {
Tile tile = plan.get(blockId, false); Tile tile = plan.get(blockId, false);
if (tile instanceof Block) return (Block) tile; if (tile instanceof Block) return (Block) tile;
return null; return null;
@ -195,7 +195,7 @@ public abstract class Block extends StretchableTile implements Comparable<Block>
public Tag link(String...args) { public Tag link(String...args) {
String tx = args.length<1 ? name+NBSP : args[0]; String tx = args.length<1 ? name+NBSP : args[0];
String type = args.length<2 ? "span" : args[1]; 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 @Override
@ -267,7 +267,7 @@ public abstract class Block extends StretchableTile implements Comparable<Block>
new Input("min."+wt.tag+"."+dB,wt.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); 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); new Input("max."+wt.tag+"."+dB,wt.get(dB).max).numeric().addTo(new Tag("td")).addTo(row);
Tag actions = new Tag("td"); Tag actions = new Tag("td");
Map<String, String> props = Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_TIMES); Map<String, String> props = Map.of(REALM,REALM_PLAN,ID,id().toString(),ACTION,ACTION_TIMES);
switch (count) { switch (count) {
case 1: case 1:
actions.content(""); break; actions.content(""); break;
@ -348,8 +348,8 @@ public abstract class Block extends StretchableTile implements Comparable<Block>
public Tile update(HashMap<String, String> params) throws IOException { public Tile update(HashMap<String, String> params) throws IOException {
if (params.containsKey(NAME)) name=params.get(NAME); if (params.containsKey(NAME)) name=params.get(NAME);
if (params.containsKey(Train.class.getSimpleName())) { if (params.containsKey(Train.class.getSimpleName())) {
int trainId = Integer.parseInt(params.get(Train.class.getSimpleName())); Id trainId = Id.from(params,Train.class.getSimpleName());
if (trainId == 0) { if (trainId == null) { // TODO: this is rubbish
if (isSet(train)) train.dropTrace(); if (isSet(train)) train.dropTrace();
train = null; train = null;
} else { } else {

4
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.tools.Tag;
import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Button;
public abstract class Bridge extends Tile { public abstract class Bridge extends Tile {
private static Bridge pendingConnection = null; private static Bridge pendingConnection = null;
@ -37,10 +36,9 @@ public abstract class Bridge extends Tile {
@Override @Override
public Window propMenu() { public Window propMenu() {
Window win = super.propMenu(); Window win = super.propMenu();
Map<String, String> props = Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_CONNECT);
new Tag("h4").content("Counterpart").addTo(win); 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 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; return win;
} }

12
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.tools.Tag;
import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ActionList; import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Label;
@ -22,7 +20,7 @@ import de.srsoftware.web4rail.tags.Select;
public class Contact extends Tile{ public class Contact extends Tile{
private static final String ADDRESS = "address"; private static final String ADDRESS = "address";
private static final HashMap<String, Contact> contactsById = new HashMap<String, Contact>(); private static final HashMap<Id, Contact> contactsById = new HashMap<Id, Contact>();
private static final HashMap<Integer, Contact> contactsByAddr = new HashMap<Integer, Contact>(); private static final HashMap<Integer, Contact> contactsByAddr = new HashMap<Integer, Contact>();
private boolean state = false; private boolean state = false;
private String trigger = null; private String trigger = null;
@ -101,7 +99,7 @@ public class Contact extends Tile{
return contactsByAddr.get(addr); return contactsByAddr.get(addr);
} }
public static Contact get(String contactId) { public static Contact get(Id contactId) {
return contactsById.get(contactId); return contactsById.get(contactId);
} }
@ -135,7 +133,7 @@ public class Contact extends Tile{
public static Object process(HashMap<String, String> params) { public static Object process(HashMap<String, String> params) {
String action = params.get(ACTION); 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()); if (action == null) return t("Missing ACTION on call to {}.process()",Contact.class.getSimpleName());
Contact contact; Contact contact;
switch (action) { switch (action) {
@ -157,9 +155,7 @@ public class Contact extends Tile{
Form form = super.propForm(formId); Form form = super.propForm(formId);
new Tag("h4").content(t("Hardware settings")).addTo(form); new Tag("h4").content(t("Hardware settings")).addTo(form);
Tag label = new Input(ADDRESS, addr).numeric().addTo(new Label(t("Address:")+NBSP)); Tag label = new Input(ADDRESS, addr).numeric().addTo(new Label(t("Address:")+NBSP));
Map<String, String> props = Map.of(REALM,REALM_CONTACT,ID,id(),ACTION,ACTION_ANALYZE); button(t("learn"),Map.of(ACTION,ACTION_ANALYZE)).addTo(label).addTo(form);
new Button(t("learn"), props).addTo(label).addTo(form);
return form; return form;
} }

4
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"); private String name = t("Relay");
protected boolean state = true; protected boolean state = true;
private static final HashMap<String,Relay> relays = new HashMap<String, Relay>(); private static final HashMap<Id,Relay> relays = new HashMap<Id, Relay>();
public static final boolean STATE_A = true,STATE_B=false; public static final boolean STATE_A = true,STATE_B=false;
private static final String LABEL_A = "label_a"; private static final String LABEL_A = "label_a";
private static final String LABEL_B = "label_b"; private static final String LABEL_B = "label_b";
@ -242,7 +242,7 @@ public class Relay extends Tile implements Device{
return relays.values(); return relays.values();
} }
public static Relay get(String relayId) { public static Relay get(Id relayId) {
return relays.get(relayId); return relays.get(relayId);
} }
} }

4
src/main/java/de/srsoftware/web4rail/tiles/Signal.java

@ -31,8 +31,8 @@ public abstract class Signal extends Tile implements Comparable<Signal>{
@Override @Override
public int compareTo(Signal other) { public int compareTo(Signal other) {
String tid = this.id(); Id tid = this.id();
String oid = other.id(); Id oid = other.id();
return tid.compareTo(oid); return tid.compareTo(oid);
} }

24
src/main/java/de/srsoftware/web4rail/tiles/Tile.java

@ -19,9 +19,7 @@ import org.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Plan;
@ -101,12 +99,12 @@ public abstract class Tile extends BaseClass{
return 1; return 1;
} }
public String id() { public Id id() {
return Tile.id(x, y); return Tile.id(x, y);
} }
public static String id(int x, int y) { public static Id id(int x, int y) {
return x+"-"+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 { 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(route)) json.put(ROUTE, route.id());
if (isSet(oneWay)) json.put(ONEW_WAY, oneWay); if (isSet(oneWay)) json.put(ONEW_WAY, oneWay);
if (disabled) json.put(DISABLED, true); 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); json.put(LENGTH, length);
return json; return json;
} }
@ -155,7 +153,7 @@ public abstract class Tile extends BaseClass{
public Tag link(String...args) { public Tag link(String...args) {
String tx = args.length<1 ? id()+NBSP : args[0]; String tx = args.length<1 ? id()+NBSP : args[0];
String type = args.length<2 ? "span" : args[1]; 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)); Window window = new Window("tile-properties",t("Properties of {} @ ({},{})",title(),x,y));
if (isSet(train)) { if (isSet(train)) {
HashMap<String, Object> props = new HashMap<String,Object>(Map.of(REALM,REALM_TRAIN,ID,train.id)); HashMap<String, Object> props = new HashMap<String,Object>(Map.of(REALM,REALM_TRAIN,ID,train.id()));
if (isSet(train.route)) { if (isSet(train.route)) {
props.put(ACTION, ACTION_STOP); props.put(ACTION, ACTION_STOP);
window.children().insertElementAt(new Button(t("stop"),props), 1); 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); 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()); Form form = propForm("tile-properties-"+id());
if (isTrack) { if (isTrack) {
@ -295,7 +293,7 @@ public abstract class Tile extends BaseClass{
return routes; return routes;
} }
public static void saveAll(HashMap<String, Tile> tiles ,String filename) throws IOException { public static void saveAll(HashMap<Id, Tile> tiles ,String filename) throws IOException {
BufferedWriter file = new BufferedWriter(new FileWriter(filename)); BufferedWriter file = new BufferedWriter(new FileWriter(filename));
for (Tile tile : tiles.values()) { for (Tile tile : tiles.values()) {
if (isNull(tile) || tile instanceof Shadow) continue; if (isNull(tile) || tile instanceof Shadow) continue;
@ -317,10 +315,6 @@ public abstract class Tile extends BaseClass{
return plan.place(this); return plan.place(this);
} }
protected static String t(String txt, Object...fills) {
return Translation.get(Application.class, txt, fills);
}
public Tag tag(Map<String,Object> replacements) throws IOException { public Tag tag(Map<String,Object> replacements) throws IOException {
int width = 100*width(); int width = 100*width();
int height = 100*height(); int height = 100*height();
@ -329,7 +323,7 @@ public abstract class Tile extends BaseClass{
replacements.put("%height%",height); replacements.put("%height%",height);
String style = ""; String style = "";
Tag svg = new Tag("svg") Tag svg = new Tag("svg")
.id(isSet(x) && isSet(y) ? id() : getClass().getSimpleName()) .id(isSet(x) && isSet(y) ? id().toString() : getClass().getSimpleName())
.clazz(classes()) .clazz(classes())
.size(100,100) .size(100,100)
.attr("name", getClass().getSimpleName()) .attr("name", getClass().getSimpleName())

Loading…
Cancel
Save