diff --git a/pom.xml b/pom.xml index ed6d913..c1b9e29 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.7.13 + 0.7.14 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 a4836a5..6496e54 100644 --- a/src/main/java/de/srsoftware/web4rail/Application.java +++ b/src/main/java/de/srsoftware/web4rail/Application.java @@ -122,7 +122,7 @@ public class Application implements Constants{ case REALM_PLAN: return plan.action(params); case REALM_ROUTE: - return plan.routeAction(params); + return Route.action(params,plan); case REALM_TRAIN: return Train.action(params,plan); } diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index 9b36195..e7607c9 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -3,8 +3,6 @@ package de.srsoftware.web4rail; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import de.keawe.tools.translations.Translation; - /** * this interface collects constants inherited to other classes of this application * diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 4275fda..d5cfe82 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -606,19 +606,6 @@ public class Plan implements Constants{ return routes.get(routeId); } - Object routeAction(HashMap params) throws IOException { - Route route = route(Integer.parseInt(params.get(ID))); - if (route == null) return t("Unknown route: {}",params.get(ID)); - switch (params.get(ACTION)) { - case ACTION_PROPS: - return route.properties(); - case ACTION_UPDATE: - route.update(params); - return html(); - } - return t("Unknown action: {}",params.get(ACTION)); - } - /** * saves the plan to a set of files, along with its cars, tiles, trains, routes and control unit settings * @param name diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index c64d9c5..5a2b668 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -29,7 +29,7 @@ import de.srsoftware.web4rail.actions.ActionList; import de.srsoftware.web4rail.actions.ActivateRoute; import de.srsoftware.web4rail.actions.FinishRoute; import de.srsoftware.web4rail.actions.SetSignalsToStop; -import de.srsoftware.web4rail.actions.SpeedReduction; +import de.srsoftware.web4rail.actions.SetSpeed; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; @@ -41,6 +41,12 @@ import de.srsoftware.web4rail.tiles.Tile; import de.srsoftware.web4rail.tiles.Turnout; import de.srsoftware.web4rail.tiles.Turnout.State; +/** + * A route is a vector of tiles that leads from one block to another. + * + * @author Stephan Richter, SRSoftware + * + */ public class Route implements Constants{ private static final Logger LOG = LoggerFactory.getLogger(Route.class); static final String NAME = "name"; @@ -64,6 +70,26 @@ public class Route implements Constants{ private static final String TRIGGER = "trigger"; private static final String ACTIONS = "actions"; + private static final String ACTION_LISTS = "action_lists"; + + /** + * process commands from the client + * @param params + * @return + * @throws IOException + */ + public static Object action(HashMap params,Plan plan) throws IOException { + Route route = plan.route(Integer.parseInt(params.get(ID))); + if (route == null) return t("Unknown route: {}",params.get(ID)); + switch (params.get(ACTION)) { + case ACTION_PROPS: + return route.properties(); + case ACTION_UPDATE: + route.update(params); + return plan.html(); + } + return t("Unknown action: {}",params.get(ACTION)); + } /** * Route wurde von Zug betreten @@ -74,6 +100,12 @@ public class Route implements Constants{ for (Tile tile : path) tile.train(train); } + /** + * adds a tile to the route + * @param tile + * @param direrction + * @return + */ public Tile add(Tile tile, Direction direrction) { if (tile instanceof Shadow) tile = ((Shadow)tile).overlay(); if (tile instanceof Block) { @@ -90,7 +122,12 @@ public class Route implements Constants{ return tile; } - public void addAction(String trigger, Action action) { + /** + * adds a action to the action list of the given trigger + * @param trigger + * @param action + */ + public void add(String trigger, Action action) { ActionList actions = triggers.get(trigger); if (actions == null) { actions = new ActionList(); @@ -180,15 +217,15 @@ public class Route implements Constants{ public void complete() { if (contacts.size()>1) { // mindestens 2 Kontakte: erster Kontakt aktiviert Block, vorletzter Kontakt leitet Bremsung ein - addAction(contacts.firstElement().trigger(),new ActivateRoute()); + add(contacts.firstElement().trigger(),new ActivateRoute()); Contact nextToLastContact = contacts.get(contacts.size()-2); - addAction(nextToLastContact.trigger(),new SpeedReduction(30)); - addAction(nextToLastContact.trigger(),new SetSignalsToStop()); + add(nextToLastContact.trigger(),new SetSpeed(30)); + add(nextToLastContact.trigger(),new SetSignalsToStop()); } if (!contacts.isEmpty()) { Contact lastContact = contacts.lastElement(); - addAction(lastContact.trigger(), new SpeedReduction(0)); - addAction(lastContact.trigger(), new FinishRoute()); + add(lastContact.trigger(), new SetSpeed(0)); + add(lastContact.trigger(), new FinishRoute()); } } @@ -248,6 +285,10 @@ public class Route implements Constants{ return id; } + /** + * creates a json representation of this route + * @return + */ public String json() { JSONObject json = new JSONObject(); @@ -273,17 +314,13 @@ public class Route implements Constants{ for (Entry entry : triggers.entrySet()) { JSONObject trigger = new JSONObject(); trigger.put(TRIGGER, entry.getKey()); - - JSONArray jActions = new JSONArray(); - for (Action action : entry.getValue()) { - jActions.put(action.json()); - } - trigger.put(ACTIONS, jActions); + ActionList actionList = entry.getValue(); + trigger.put(ACTIONS, actionList.json()); jTriggers.put(trigger); } - if (!jTriggers.isEmpty()) json.put(ACTIONS, jTriggers); + if (!jTriggers.isEmpty()) json.put(ACTION_LISTS, jTriggers); String name = name(); if (name != null) json.put(NAME, name); @@ -319,6 +356,7 @@ public class Route implements Constants{ for (Object signalId : json.getJSONArray(SIGNALS)) addSignal((Signal) plan.get((String) signalId, false)); } if (json.has(ACTIONS)) loadActions(json.getJSONArray(ACTIONS)); + if (json.has(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS)); return plan.registerRoute(this); } @@ -326,12 +364,12 @@ public class Route implements Constants{ for (int i=0; i routes, String filename) throws IOException { BufferedWriter file = new BufferedWriter(new FileWriter(filename)); - for (Route route : routes) file.write(route.json()+"\n"); + file.write("[\n"); + int count = 0; + for (Route route : routes) { + file.write(route.json()); + if (++count < routes.size()) file.write(","); + file.write("\n"); + } + file.write("]"); file.close(); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index e2d3cd7..aea56e0 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -48,9 +48,7 @@ public abstract class Action implements Constants { } public JSONObject json() { - JSONObject json = new JSONObject(); - json.put(TYPE, getClass().getSimpleName()); - return json; + return new JSONObject().put(TYPE, getClass().getSimpleName()); } protected Tag link(int actionId, String context) { @@ -69,7 +67,7 @@ public abstract class Action implements Constants { case "SetSignalsToStop": return new SetSignalsToStop(); case "SpeedReduction": - return new SpeedReduction(json.getInt(SpeedReduction.MAX_SPEED)); + return new SetSpeed(json.getInt(SetSpeed.MAX_SPEED)); case "TurnTrain": return new TurnTrain(); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index 67fb066..f32083b 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Vector; +import org.json.JSONArray; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,7 +58,7 @@ public class ActionList extends Vector implements Constants{ Select select = new Select(TYPE); List> classes = List.of( ConditionalAction.class, - SpeedReduction.class, + SetSpeed.class, SetSignalsToStop.class, FinishRoute.class, TurnTrain.class, @@ -85,8 +86,8 @@ public class ActionList extends Vector implements Constants{ case "SetSignalsToStop": add(new SetSignalsToStop()); break; - case "SpeedReduction": - add(new SpeedReduction(0)); + case "SetSpeed": + add(new SetSpeed(0)); break; case "TurnTrain": add(new TurnTrain()); @@ -170,6 +171,12 @@ public class ActionList extends Vector implements Constants{ return id; } + public JSONArray json() { + JSONArray result = new JSONArray(); + for (Action action : this) result.put(action.json()); + return result; + } + public boolean moveUp(int actionId) { for (int i=1; i conditions = new Vector(); private ActionList actions = new ActionList(); @@ -26,6 +31,10 @@ public class ConditionalAction extends Action { return fieldset; } + public ActionList children() { + return actions; + } + private Tag conditionForm(HashMap params) { Fieldset fieldset = new Fieldset(t("Conditions")); @@ -64,6 +73,16 @@ public class ConditionalAction extends Action { } return true; } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + JSONArray conditions = new JSONArray(); + for (Condition condition : this.conditions) conditions.put(condition.json()); + json.put(CONDITIONS, conditions); + json.put(ACTIONS, actions.json()); + return json; + } @Override public Window properties(HashMap params) { @@ -99,8 +118,4 @@ public class ConditionalAction extends Action { } return super.update(params); } - - public ActionList children() { - return actions; - } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/SpeedReduction.java b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java similarity index 96% rename from src/main/java/de/srsoftware/web4rail/actions/SpeedReduction.java rename to src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java index 8c2ba3c..500c828 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SpeedReduction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java @@ -11,12 +11,12 @@ import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Label; -public class SpeedReduction extends Action{ +public class SetSpeed extends Action{ public static final String MAX_SPEED = "max_speed"; private int maxSpeed = -1; - public SpeedReduction(int kmh) { + public SetSpeed(int kmh) { super(); maxSpeed = kmh; } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java index 87c022a..a1410cd 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java @@ -48,6 +48,10 @@ public abstract class Condition implements Constants { return t("Unknown action: {}",action); } + public JSONObject json() { + return new JSONObject().put(TYPE, getClass().getSimpleName()); + } + public Tag link(String tagClass,String context) { String json = new JSONObject(Map.of(REALM,REALM_CONDITION,ID,id,ACTION,ACTION_PROPS,CONTEXT,context)).toString().replace("\"", "'"); return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(toString()); diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java index 3079b4e..8a018cf 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java @@ -2,6 +2,8 @@ package de.srsoftware.web4rail.conditions; import java.util.HashMap; +import org.json.JSONObject; + import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.actions.Action.Context; import de.srsoftware.web4rail.moving.Train; @@ -20,6 +22,11 @@ public class TrainSelect extends Condition { return context.train == train; } + @Override + public JSONObject json() { + return super.json().put(REALM_TRAIN, train.id); + } + @Override protected Window properties(HashMap params) { Window win = new Window("condition-props", t("Properties of {}",getClass().getSimpleName()));