From e199482c07ed44190b86bb762604689d145e7a03 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 29 Oct 2020 23:53:57 +0100 Subject: [PATCH] refactored condition management --- pom.xml | 2 +- .../de/srsoftware/web4rail/Application.java | 14 +- .../de/srsoftware/web4rail/Constants.java | 1 + .../java/de/srsoftware/web4rail/Plan.java | 11 + .../java/de/srsoftware/web4rail/Route.java | 2 +- .../srsoftware/web4rail/actions/Action.java | 30 ++- .../web4rail/actions/ActionList.java | 229 +++++++++++------- .../web4rail/actions/ConditionalAction.java | 90 +++---- .../web4rail/actions/SpeedReduction.java | 47 ++-- .../web4rail/conditions/Condition.java | 45 ++-- .../web4rail/conditions/TrainSelect.java | 3 +- .../de/srsoftware/web4rail/moving/Train.java | 3 +- 12 files changed, 281 insertions(+), 196 deletions(-) diff --git a/pom.xml b/pom.xml index 08445b7..cadcf4f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.7.10 + 0.7.11 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 deafca0..084100f 100644 --- a/src/main/java/de/srsoftware/web4rail/Application.java +++ b/src/main/java/de/srsoftware/web4rail/Application.java @@ -13,6 +13,7 @@ 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 java.util.concurrent.CompletableFuture; @@ -54,6 +55,15 @@ public class Application implements Constants{ Desktop.getDesktop().browse(URI.create("http://"+InetAddress.getLocalHost().getHostName()+":"+config.getInt(PORT)+"/plan")); } + public static int createId() { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return new Date().hashCode(); + } + private static Object handle(HashMap params) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { String realm = params.get(REALM); @@ -64,11 +74,11 @@ public class Application implements Constants{ switch (realm) { case REALM_ACTIONS: - return ActionList.process(params); + return ActionList.process(params,plan); case REALM_CAR: return Car.action(params); case REALM_CONDITION: - return Condition.action(params); + return Condition.action(params,plan); case REALM_CU: return plan.controlUnit().process(params); case REALM_LOCO: diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index 89745e2..8d0892b 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -45,4 +45,5 @@ public interface Constants { public static final String CONTACT = "contact"; public static final String TYPE = "type"; public static final String NBSP = " "; + public static final String CONTEXT = "context"; } diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 3e2aec5..df93249 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -448,6 +448,17 @@ public class Plan implements Constants{ tile.position(x, y).plan(this); tiles.put(tile.id(),tile); } + + public Window showContext(HashMap params) { + String[] parts = params.get(CONTEXT).split(":"); + String realm = parts[0]; + String id = parts.length>1 ? parts[1] : null; + switch (realm) { + case REALM_ROUTE: + return route(Integer.parseInt(id)).properties(); + } + return null; + } public synchronized void stream(String data) { data = data.replaceAll("\n", "").replaceAll("\r", ""); diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 2c60baa..c64d9c5 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -125,7 +125,7 @@ public class Route implements Constants{ actions = new ActionList(); triggers.put(c.trigger(), actions); } - actions.addTo(link); + actions.addTo(link,REALM_ROUTE+":"+id()); } list.addTo(win); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index 597006e..a0ead83 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -2,14 +2,15 @@ package de.srsoftware.web4rail.actions; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.Date; import java.util.HashMap; +import java.util.Map; 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.Constants; import de.srsoftware.web4rail.Plan; @@ -20,7 +21,7 @@ import de.srsoftware.web4rail.tiles.Contact; public abstract class Action implements Constants { public static final Logger LOG = LoggerFactory.getLogger(Action.class); - private int id; + protected int id; public static class Context { public Plan plan = null; @@ -37,7 +38,7 @@ public abstract class Action implements Constants { } public Action() { - id = new Date().hashCode(); + id = Application.createId(); } public abstract boolean fire(Context context) throws IOException; @@ -46,18 +47,18 @@ public abstract class Action implements Constants { return id; } - public JSONObject json() { JSONObject json = new JSONObject(); json.put(TYPE, getClass().getSimpleName()); return json; } - @Override - public String toString() { - return getClass().getSimpleName(); + protected Tag link(int actionId, String context) { + Map props = Map.of(REALM,REALM_ACTIONS,ID,actionId+"/"+id,ACTION,ACTION_PROPS,CONTEXT,context); + String action = "request("+(new JSONObject(props).toString().replace("\"", "'"))+")"; + return new Tag("span").content(toString()).attr("onclick", action); } - + public static Action load(JSONObject json) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException { String clazz = json.getString(TYPE); switch (clazz) { @@ -75,11 +76,20 @@ public abstract class Action implements Constants { return null; } - public static Window propForm(HashMap params) { - return new Window("action-props", "Action properties"); + public Window properties(HashMap params) { + return new Window("action-props-"+id, t("Properties of {}",this.getClass().getSimpleName())); } protected static String t(String tex,Object...fills) { return Translation.get(Application.class, tex, fills); } + + @Override + public String toString() { + return getClass().getSimpleName(); + } + + protected Object update(HashMap params) { + return t("Nothing changed"); + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index 84cae38..ea11ea3 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -1,7 +1,6 @@ package de.srsoftware.web4rail.actions; import java.io.IOException; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -14,6 +13,7 @@ import de.keawe.tools.translations.Translation; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Application; 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; @@ -30,48 +30,78 @@ public class ActionList extends Vector implements Constants{ private static final HashMap actionLists = new HashMap(); public ActionList() { - id = new Date().hashCode(); + id = Application.createId(); actionLists.put(id,this); } - - public void fire(Context context) { - LOG.debug("Firing {}",this); - - for (Action action : this) { - try { - action.fire(context); - } catch (IOException e) { - LOG.warn("Action did not fire properly: {}",action,e); - } - } + + private static Integer 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]); } - public boolean drop(int actionId) { - for (Action action : this) { - if (action.id() == actionId) { - this.remove(action); - return true; - } - } - return false; + private static Integer actionListId(HashMap params) { + if (!params.containsKey(ID)) return null; + String[] parts = params.get(ID).split("/"); + return Integer.parseInt(parts[0]); } - - public boolean moveUp(int actionId) { - for (int i=1; i> classes = List.of( + SpeedReduction.class, + SetSignalsToStop.class, + FinishRoute.class, + TurnTrain.class, + ConditionalAction.class); + for (Class clazz : classes) select.addOption(clazz.getSimpleName()); + select.addTo(new Label("Action type:")).addTo(typeForm); + return new Button(t("Create action"),"return submitForm('"+formId+"');").addTo(typeForm).addTo(win); + } + + private Object addActionForm(HashMap params, Plan plan) { + Window win = new Window("add-action-form", t("Add action to action list")); + String type = params.get(TYPE); + String context = params.get(CONTEXT); + if (type == null) return actionTypeForm(win,context); + + switch (type) { + case "ConditionalAction": + add(new ConditionalAction()); + break; + case "FinishRoute": + add(new FinishRoute()); + break; + case "SetSignalsToStop": + add(new SetSignalsToStop()); + break; + case "SpeedReduction": + add(new SpeedReduction(0)); + break; + case "TurnTrain": + add(new TurnTrain()); + break; + default: + actionTypeForm(win,context); + new Tag("span").content(t("Unknown action type: {}",type)).addTo(win); + return win; } - return false; + return plan.showContext(params); } - - public void addTo(Tag link) { + + public void addTo(Tag link, String context) { Map props = new HashMap(Map.of( REALM,REALM_ACTIONS, ID,id, - ACTION,ACTION_ADD)); + ACTION,ACTION_ADD, + CONTEXT,context)); new Button(t("add action"),props).addTo(link); props.put(ACTION,ACTION_PROPS); @@ -80,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 = new Tag("li").content(action.toString()); + Tag act = action.link(id,context).addTo(new Tag("li")); if (!first) { props.put(ACTION, ACTION_MOVE); new Button("↑",props).addTo(act); @@ -94,79 +124,92 @@ public class ActionList extends Vector implements Constants{ } } - private static String t(String text,Object...fills) { - return Translation.get(Application.class, text, fills); + public boolean drop(int actionId) { + for (Action action : this) { + if (action.id() == actionId) { + this.remove(action); + return true; + } + } + return false; + } + + public void fire(Context context) { + LOG.debug("Firing {}",this); + + for (Action action : this) { + try { + action.fire(context); + } catch (IOException e) { + LOG.warn("Action did not fire properly: {}",action,e); + } + } + } + + private Action getAction(int actionId) { + for (Action action : this) { + if (action.id == actionId) return action; + } + return null; } - public static Object process(HashMap params) { - if (!params.containsKey(ID)) return t("No action list id passed to ActionList.process()!"); - String[] parts = params.get(ID).split("/"); - int listId = Integer.parseInt(parts[0]); - int actionId = parts.length>1 ? Integer.parseInt(parts[1]) : 0; + public int id() { + return id; + } + + public boolean moveUp(int actionId) { + for (int i=1; i params, Plan plan) { + Integer listId = actionListId(params); + if (listId == null) return t("No action list id passed to ActionList.process()!"); ActionList actionList = actionLists.get(listId); if (actionList == null) return t("No action list with id {} found!",listId); + + Integer actionId = actionId(params); String action = params.get(ACTION); if (action == null) return t("No action passed to ActionList.process()!"); + switch (action) { case ACTION_ADD: - return actionList.addActionForm(params); + return actionList.addActionForm(params,plan); case ACTION_DROP: - return actionList.drop(actionId) ? t("Action removed") : t("No action with id {} found!",actionId); + return actionList.drop(actionId) ? plan.showContext(params) : t("No action with id {} found!",actionId); case ACTION_MOVE: - return actionList.moveUp(actionId) ? t("Action moved") : t("No action with id {} found!",actionId); + return actionList.moveUp(actionId) ? plan.showContext(params) : t("No action with id {} found!",actionId); + case ACTION_PROPS: + return actionList.propsOf(params); + case ACTION_UPDATE: + return actionList.update(actionId,params,plan); } return t("Unknown action: {}",action); } - - private Object addActionForm(HashMap params) { - Window win = new Window("add-action-form", t("Add action to action list")); - String formId ="add-action-to-"+id; - Tag typeForm = new Form(formId); - new Input(REALM, REALM_ACTIONS).hideIn(typeForm); - new Input(ID,id).hideIn(typeForm); - new Input(ACTION,ACTION_ADD).hideIn(typeForm); - String type = params.get(TYPE); - if (type == null) return actionTypeForm(win); - - switch (type) { - case "FinishRoute": - add(new FinishRoute()); - break; - case "SetSignalsToStop": - add(new SetSignalsToStop()); - break; - case "SpeedReduction": - return SpeedReduction.propForm(this,params); - case "TurnTrain": - add(new TurnTrain()); - break; - default: - actionTypeForm(win); - new Tag("span").content(t("Unknown action type: {}",type)).addTo(win); - return win; - } - return t("Action added!"); + + private Object propsOf(HashMap params) { + int actionId = actionId(params); + Action action = getAction(actionId); + if (action != null) return action.properties(params); + return t("No action with id {} found!",actionId); } - - private Object actionTypeForm(Window win) { - String formId ="add-action-to-"+id; - Tag typeForm = new Form(formId); - new Input(REALM, REALM_ACTIONS).hideIn(typeForm); - new Input(ID,id).hideIn(typeForm); - new Input(ACTION,ACTION_ADD).hideIn(typeForm); - Select select = new Select(TYPE); - List> classes = List.of( - SpeedReduction.class, - SetSignalsToStop.class, - FinishRoute.class, - TurnTrain.class, - ConditionalAction.class); - for (Class clazz : classes) select.addOption(clazz.getSimpleName()); - select.addTo(new Label("Action type:")).addTo(typeForm); - return new Button(t("Create action"),"return submitForm('"+formId+"');").addTo(typeForm).addTo(win); + + private static String t(String text,Object...fills) { + return Translation.get(Application.class, text, fills); } - - public int id() { - return id; + + private Object update(int actionId, HashMap params, Plan plan) { + Action action = getAction(actionId); + if (action != null) { + plan.stream(action.update(params).toString()); + return plan.showContext(params); + } + return t("No action with id {} found.",actionId); } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java index 0791e5d..520ac46 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java @@ -1,44 +1,47 @@ package de.srsoftware.web4rail.actions; -import static de.srsoftware.web4rail.Constants.TYPE; - import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Vector; import de.srsoftware.tools.Tag; -import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.conditions.Condition; import de.srsoftware.web4rail.conditions.TrainSelect; import de.srsoftware.web4rail.tags.Button; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Select; -import de.srsoftware.web4rail.tiles.Contact; public class ConditionalAction extends Action { private Vector conditions = new Vector(); - private Vector actions = new Vector(); + private ActionList actions = new ActionList(); - private ConditionalAction addCondition(Condition condition) { - conditions.add(new TrainSelect()); - return this; - } - - private static void addToContact(Route route, Contact contact, String conditionType) { - Condition condition = null; - switch (conditionType) { - case "TrainSelect": - condition = new TrainSelect(); - break; - default: return; + private Tag conditionForm(HashMap params) { + Fieldset fieldset = new Fieldset("Conditions"); + + if (!conditions.isEmpty()) { + Tag list = new Tag("ul"); + for (Condition condition : conditions) condition.link("li",params.get(CONTEXT)).addTo(list); + list.addTo(fieldset); } - route.addAction(contact.trigger(), new ConditionalAction().addCondition(condition)); + String formId = "action-prop-form-"+id; + Form form = new Form(formId); + new Input(REALM,REALM_ACTIONS).hideIn(form); + new Input(ID,params.get(ID)).hideIn(form); + new Input(ACTION,ACTION_UPDATE).hideIn(form); + new Input(CONTEXT,params.get(CONTEXT)).hideIn(form); + + Select select = new Select(REALM_CONDITION); + List> classes = List.of(TrainSelect.class); + for (Class clazz : classes) select.addOption(clazz.getSimpleName()); + select.addTo(form); + return new Button(t("Add condition"),"return submitForm('"+formId+"');").addTo(form).addTo(fieldset); } - + @Override public boolean fire(Context context) throws IOException { for (Condition condition : conditions) { @@ -55,39 +58,38 @@ public class ConditionalAction extends Action { } return true; } - - public static Window propForm(HashMap params, Route route, Contact contact) { - String condition = params.get(REALM_CONDITION); - if (condition != null) { - addToContact(route,contact,condition); - return route.properties(); - } - Window win = Action.propForm(params); - String formId = "add-action-to-contact-"+contact.id(); - Tag form = new Form(formId); - new Tag("div").content(t("Add Action {} to contact {} on route {}:",ConditionalAction.class.getSimpleName(),contact,route)).addTo(win); - new Input(REALM, REALM_ROUTE).hideIn(form); - new Input(ID,route.id()).hideIn(form); - new Input(ACTION,ACTION_ADD_ACTION).hideIn(form); - new Input(CONTACT,contact.id()).hideIn(form); - new Input(TYPE,ConditionalAction.class.getSimpleName()).hideIn(form); - Select select = new Select(REALM_CONDITION); - List> conditionTypes = List.of(TrainSelect.class); - for (Class clazz : conditionTypes) select.addOption(clazz.getSimpleName()); - select.addTo(form); - new Button(t("Create action"),"return submitForm('"+formId+"');").addTo(form).addTo(win); + + @Override + public Window properties(HashMap params) { + Window win = super.properties(params); + conditionForm(params).addTo(win); return win; } - + @Override public String toString() { if (conditions.isEmpty()) return t("Invalid condition"); StringBuffer sb = new StringBuffer(); for (int i = 0; i0) sb.append(t(" or ")); + sb.append(conditions.get(i).toString()); } return t("if ({}):",sb); } + + @Override + protected Object update(HashMap params) { + String conditionClass = params.get(REALM_CONDITION); + if (conditionClass != null) { + switch (conditionClass) { + case "TrainSelect": + conditions.add(new TrainSelect()); + break; + + default: + return t("Unknown type of condition: {}",conditionClass); + } + } + return super.update(params); + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/SpeedReduction.java b/src/main/java/de/srsoftware/web4rail/actions/SpeedReduction.java index df20ac5..8c2ba3c 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SpeedReduction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SpeedReduction.java @@ -37,7 +37,30 @@ public class SpeedReduction extends Action{ return json; } - public static Object propForm(ActionList actionList, HashMap params) { + @Override + public Window properties(HashMap params) { + Window win = super.properties(params); + String formId = "action-prop-form-"+id; + Form form = new Form(formId); + new Input(REALM,REALM_ACTIONS).hideIn(form); + new Input(ID,params.get(ID)).hideIn(form); + new Input(ACTION,ACTION_UPDATE).hideIn(form); + new Input(CONTEXT,params.get(CONTEXT)).hideIn(form); + Label label = new Label(t("Set speed to")+NBSP); + new Input(MAX_SPEED, maxSpeed).addTo(label).content(NBSP+t("km/h")); + label.addTo(form); + new Button(t("Save"),"return submitForm('"+formId+"');").addTo(form).addTo(win); + return win; + } + + @Override + public String toString() { + return t("Reduce speed to {} km/h",maxSpeed); + } + + @Override + protected Object update(HashMap params) { + LOG.debug("update: {}",params); String error = null; String ms = params.get(MAX_SPEED); if (ms == null) { @@ -47,28 +70,14 @@ public class SpeedReduction extends Action{ int s = Integer.parseInt(ms); if (s<0) error = t("Speed must not be less than zero!"); if (error == null) { - actionList.add(new SpeedReduction(s)); - return t("Action added!"); + this.maxSpeed = s; + return t("Action updated!"); } } catch (NumberFormatException e) { error = t("Not a valid number!"); } } - Window win = Action.propForm(params); - String formId = "edit-speedreduction"; - Tag form = new Form(formId); - new Input(REALM, REALM_ACTIONS).hideIn(form); - new Input(ID,actionList.id()).hideIn(form); - new Input(ACTION,ACTION_ADD).hideIn(form); - new Input(TYPE,SpeedReduction.class.getSimpleName()).hideIn(form); - new Input(MAX_SPEED, ms).addTo(new Label("new speed")).addTo(form); - //if (error != null) new Tag("div").content(error).addTo(form); - new Button(t("Create action"),"return submitForm('"+formId+"');").addTo(form).addTo(win); - return win; - } - - @Override - public String toString() { - return t("Reduce speed to {} km/h",maxSpeed); + Window win = properties(params); + return new Tag("span").content(error).addTo(win); } } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java index a523ad3..87c022a 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java @@ -1,6 +1,5 @@ package de.srsoftware.web4rail.conditions; -import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -10,6 +9,7 @@ import de.keawe.tools.translations.Translation; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Application; import de.srsoftware.web4rail.Constants; +import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.actions.Action.Context; @@ -19,8 +19,17 @@ public abstract class Condition implements Constants { public abstract boolean fulfilledBy(Context context); protected int id; + + public Condition() { + this(Application.createId()); + } + + public Condition(int id) { + this.id = id; + conditions.put(id, this); + } - public static Object action(HashMap params) { + public static Object action(HashMap params,Plan plan) { if (!params.containsKey(ID)) return t("No id passed to Condition.action!"); int cid = Integer.parseInt(params.get(ID)); Condition condition = conditions.get(cid); @@ -31,39 +40,29 @@ public abstract class Condition implements Constants { switch (action) { case ACTION_PROPS: - return condition.properties(); + return condition.properties(params); case ACTION_UPDATE: - return condition.update(params); + condition.update(params); + return plan.showContext(params); } return t("Unknown action: {}",action); } - - protected abstract Window properties(); - - - public Condition() { - this(new Date().hashCode()); - } - public Condition(int id) { - this.id = id; - conditions.put(id, this); - } - - public Tag link(String tagClass) { - String json = new JSONObject(Map.of(REALM,REALM_CONDITION,ID,id,ACTION,ACTION_PROPS)).toString().replace("\"", "'"); + 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()); } + protected abstract Window properties(HashMap params); + public static String t(String text, Object...fills) { + return Translation.get(Application.class, text, fills); + } + @Override public String toString() { return t("invalid condition"); } - - public static String t(String text, Object...fills) { - return Translation.get(Application.class, text, fills); - } - + protected abstract Object update(HashMap params); } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java index a0b349c..502d4bb 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java @@ -22,13 +22,14 @@ public class TrainSelect extends Condition { } @Override - protected Window properties() { + protected Window properties(HashMap params) { Window win = new Window("condition-props", t("Properties of {}",getClass().getSimpleName())); String formId = "conditional-props-"+id; Form form = new Form(formId); new Input(REALM,REALM_CONDITION).hideIn(form); new Input(ACTION,ACTION_UPDATE).hideIn(form); new Input(ID,id).hideIn(form); + new Input(CONTEXT,params.get(CONTEXT)).hideIn(form); Train.selector(train, null).addTo(new Label(t("Select train:")+NBSP)).addTo(form); new Button(t("Save"),"return submitForm('"+formId+"');").addTo(form).addTo(win); return win; diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index a64abad..3d20b29 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -6,7 +6,6 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -99,7 +98,7 @@ public class Train implements Constants { } public Train(Locomotive loco, Integer id) { - if (id == null) id = new Date().hashCode(); + if (id == null) id = Application.createId(); this.id = id; add(loco); trains.put(id, this);