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