From 500af0a5474e011899fd46e44b8815f2bc180bd6 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 3 Dec 2020 22:55:02 +0100 Subject: [PATCH] refactoring of load/save processes --- pom.xml | 2 +- .../de/srsoftware/web4rail/BaseClass.java | 4 +- .../java/de/srsoftware/web4rail/Route.java | 169 +++++++++++++----- .../srsoftware/web4rail/actions/Action.java | 5 +- .../web4rail/actions/ActionList.java | 32 ++-- .../web4rail/actions/ConditionalAction.java | 19 +- .../web4rail/actions/DelayedAction.java | 8 +- .../web4rail/conditions/ConditionList.java | 30 ++-- .../de/srsoftware/web4rail/tiles/Contact.java | 23 ++- 9 files changed, 193 insertions(+), 99 deletions(-) diff --git a/pom.xml b/pom.xml index 22b2222..7747cf7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.2.10 + 1.2.11 Web4Rail jar Java Model Railway Control diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java index 14aaff4..21078cb 100644 --- a/src/main/java/de/srsoftware/web4rail/BaseClass.java +++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java @@ -352,7 +352,7 @@ public abstract class BaseClass implements Constants{ protected Window properties(List
preForm,FormInput formInputs,List
postForm) { - Window win = new Window(getClass().getSimpleName()+"-properties", t("Properties of {} ({})",this.title(),id)); + Window win = new Window(getClass().getSimpleName()+"-properties", t("Properties of {}",this.title())); preForm.forEach(fieldset -> fieldset.addTo(win)); @@ -372,7 +372,7 @@ public abstract class BaseClass implements Constants{ } private String title() { - return getClass().getSimpleName(); + return toString(); } private Map props(Map additionalProps){ diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 5c5c7c6..67cb26f 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -53,19 +53,21 @@ public class Route extends BaseClass implements Comparable{ private static final Logger LOG = LoggerFactory.getLogger(Route.class); private static final String ACTIONS = "actions"; - private static final String ACTION_LISTS = "action_lists"; private static final String BRAKE_TIMES = "brake_times"; - private static final String CONDITIONS = "conditions"; + private static final String CONDITION_LIST = "condition_list"; private static final String END_DIRECTION = "direction_end"; private static final String ROUTES = "routes"; private static final String SETUP_ACTIONS = "setup_actions"; private static final String START_ACTIONS = "start_actions"; private static final String START_DIRECTION = "direction_start"; - private static final String TRIGGER = "trigger"; static final String NAME = "name"; static final String PATH = "path"; static final String SIGNALS = "signals"; static final String TURNOUTS = "turnouts"; + + private static final String ROUTE_START = "route_start"; + + private static final String ROUTE_SETUP = "route_setup"; private static HashMap names = new HashMap(); // maps id to name. needed to keep names during plan.analyze() @@ -144,17 +146,10 @@ public class Route extends BaseClass implements Comparable{ public Train train; private HashMap triggers = new HashMap(); private HashMap turnouts; - private ActionList setupActions; - private ActionList startActions; private Block startBlock = null; public Direction startDirection; private HashSet triggeredContacts = new HashSet<>(); - - public Route() { - setupActions = new ActionList(this); - startActions = new ActionList(this); - } - + /** * process commands from the client * @param params @@ -253,10 +248,10 @@ public class Route extends BaseClass implements Comparable{ Tag list = new Tag("ol"); Tag setup = new Tag("li").content(t("Setup actions")+NBSP); - setupActions.list().addTo(setup).addTo(list); + triggers.get(ROUTE_SETUP).list().addTo(setup).addTo(list); Tag start = new Tag("li").content(t("Start actions")+NBSP); - startActions.list().addTo(start).addTo(list); + triggers.get(ROUTE_START).list().addTo(start).addTo(list); for (Contact c : contacts) { Tag item = c.link("span", c).addTo(new Tag("li")).content(NBSP); @@ -277,7 +272,6 @@ public class Route extends BaseClass implements Comparable{ conditions.addAll(existingRoute.conditions); - setupActions.addActionsFrom(existingRoute.setupActions); for (Entry entry : triggers.entrySet()) { String trigger = entry.getKey(); ActionList existingActionList = existingRoute.triggers.get(trigger); @@ -376,8 +370,8 @@ public class Route extends BaseClass implements Comparable{ add(lastContact.trigger(), new BrakeStop(this)); add(lastContact.trigger(), new FinishRoute(this)); } - for (Signal signal : signals) setupActions.add(new SetSignal(this).set(signal).to(Signal.GO)); - startActions.add(new SetSpeed(this).to(999)); + for (Signal signal : signals) add(ROUTE_SETUP,new SetSignal(this).set(signal).to(Signal.GO)); + add(ROUTE_START,new SetSpeed(this).to(999)); return this; } @@ -437,7 +431,7 @@ public class Route extends BaseClass implements Comparable{ } public boolean fireSetupActions(Context context) { - return setupActions.fire(context); + return triggers.get(ROUTE_SETUP).fire(context); } private String generateName() { @@ -492,21 +486,17 @@ public class Route extends BaseClass implements Comparable{ json.put(BRAKE_TIMES, brakeTimes); - if (!conditions.isEmpty()) json.put(CONDITIONS, conditions.jsonArray()); + if (!conditions.isEmpty()) { + json.put(CONDITION_LIST, conditions.json()); + } - JSONArray jTriggers = new JSONArray(); + JSONObject jActions = new JSONObject(); for (Entry entry : triggers.entrySet()) { - JSONObject trigger = new JSONObject(); - trigger.put(TRIGGER, entry.getKey()); - ActionList actionList = entry.getValue(); - trigger.put(ACTIONS, actionList.jsonArray()); - - jTriggers.put(trigger); - + String trigger = entry.getKey(); + ActionList lst = entry.getValue(); + jActions.put(trigger,lst.json()); } - if (!jTriggers.isEmpty()) json.put(ACTION_LISTS, jTriggers); - if (!setupActions.isEmpty()) json.put(SETUP_ACTIONS, setupActions.json()); - if (!startActions.isEmpty()) json.put(START_ACTIONS, startActions.json()); + json.put(ACTIONS, jActions); String name = name(); if (isSet(name)) json.put(NAME, name); @@ -550,10 +540,96 @@ public class Route extends BaseClass implements Comparable{ if (json.has(SIGNALS)) { for (Object signalId : json.getJSONArray(SIGNALS)) addSignal((Signal) plan.get(new Id((String) signalId), false)); } - if (json.has(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS)); - if (json.has(CONDITIONS)) conditions.load(json.getJSONArray(CONDITIONS)).parent(this); - if (json.has(SETUP_ACTIONS)) setupActions.load(json.getJSONArray(SETUP_ACTIONS)).parent(this); - if (json.has(START_ACTIONS)) startActions.load(json.getJSONArray(START_ACTIONS)).parent(this); + if (json.has(ACTIONS)) { + loadActions(json.getJSONObject(ACTIONS)); + } + if (json.has("action_lists")) { // TODO: this is legacy! + JSONArray jarr = json.getJSONArray("action_lists"); + for (Object o : jarr) { + if (o instanceof JSONObject) { + JSONObject jo = (JSONObject) o; + ActionList aList = new ActionList(this); + String trigger = jo.getString("trigger"); + JSONArray jActions = jo.getJSONArray(ACTIONS); + for (Object ja : jActions) { + JSONObject jao = (JSONObject) ja; + String type = jao.getString(TYPE); + Action action = Action.create(type, aList); + if (isSet(action)) { + action.load(jao); + aList.add(action); + } + } + triggers.put(trigger, aList); + } + } + } + if (json.has("conditions")) { // TODO: this is legacy! + JSONArray jConditions = json.getJSONArray("conditions"); + for (Object o : jConditions) { + if (o instanceof JSONObject) { + JSONObject jo = (JSONObject) o; + String type = jo.getString(TYPE); + Condition condition = Condition.create(type); + if (isSet(condition)) { + condition.load(jo); + conditions.add(condition); + } + } + } + } + if (json.has(CONDITION_LIST)) conditions.load(json.getJSONObject(CONDITION_LIST)).parent(this); + if (json.has(SETUP_ACTIONS)) { // TODO: this is legacy! + Object so = json.get(SETUP_ACTIONS); + if (so instanceof JSONObject) { + JSONObject jo = (JSONObject) so; + ActionList setupActions = new ActionList(this); + setupActions.load(jo).parent(this); + triggers.put(ROUTE_SETUP, setupActions); + } + if (so instanceof JSONArray) { + JSONArray ja = (JSONArray) so; + ActionList setupActions = new ActionList(this); + for (Object o : ja) { + if (o instanceof JSONObject) { + JSONObject jo = (JSONObject) o; + String type = jo.getString(TYPE); + Action action = Action.create(type, setupActions); + if (isSet(action)) { + action.load(jo); + setupActions.add(action); + } + } + } + triggers.put(ROUTE_SETUP, setupActions); + } + } + if (json.has(START_ACTIONS)) { // TODO: this is legacy! + Object so = json.get(START_ACTIONS); + if (so instanceof JSONObject) { + JSONObject jo = (JSONObject) so; + ActionList startActions = new ActionList(this); + startActions.load(jo).parent(this); + triggers.put(ROUTE_START, startActions); + } + if (so instanceof JSONArray) { + JSONArray ja = (JSONArray) so; + ActionList startActions = new ActionList(this); + for (Object o : ja) { + if (o instanceof JSONObject) { + JSONObject jo = (JSONObject) o; + String type = jo.getString(TYPE); + Action action = Action.create(type, startActions); + if (isSet(action)) { + action.load(jo); + startActions.add(action); + } + } + } + triggers.put(ROUTE_START, startActions); + } + + } if (json.has(DISABLED)) disabled = json.getBoolean(DISABLED); if (json.has(BRAKE_TIMES)) { JSONObject dummy = json.getJSONObject(BRAKE_TIMES); @@ -561,15 +637,16 @@ public class Route extends BaseClass implements Comparable{ } return plan.registerRoute(this); } - - private void loadActions(JSONArray arr) { - for (int i=0; i{ JSONObject json = new JSONObject(tokener); JSONArray routes = json.getJSONArray(ROUTES); for (Object o : routes) { - if (o instanceof JSONObject) new Route().load((JSONObject)o, plan); + if (o instanceof JSONObject) { + new Route().load((JSONObject)o, plan); + } } fis.close(); } @@ -659,8 +738,6 @@ public class Route extends BaseClass implements Comparable{ ActionList actionList = triggers.remove(key); if (isSet(actionList)) actionList.remove(); }; - setupActions.remove(); - startActions.remove(); return this; } @@ -674,8 +751,6 @@ public class Route extends BaseClass implements Comparable{ if (child == train) train = null; for (ActionList list : triggers.values()) list.removeChild(child); turnouts.remove(child); - setupActions.removeChild(child); - startActions.removeChild(child); if (child == startBlock) startBlock = null; triggeredContacts.remove(child); } @@ -771,7 +846,7 @@ public class Route extends BaseClass implements Comparable{ public boolean train(Train newTrain) { if (isSet(train) && newTrain != train) return false; train = newTrain; - return isSet(train) ? startActions.fire(new Context(this).train(train)) : true; + return isSet(train) ? triggers.get(ROUTE_START).fire(new Context(this).train(train)) : true; } public Route unlock() throws IOException { diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index 45abda3..ce58d21 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -37,9 +37,10 @@ public abstract class Action extends BaseClass { return context; } - public static Action create(String type,BaseClass parent) { + @SuppressWarnings("unchecked") + public static T create(String type,BaseClass parent) { try { - return (Action) Class.forName(PREFIX+"."+type).getDeclaredConstructor(BaseClass.class).newInstance(parent); + return (T) Class.forName(PREFIX+"."+type).getDeclaredConstructor(BaseClass.class).newInstance(parent); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index 24510e7..80f1d4f 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -22,7 +22,8 @@ import de.srsoftware.web4rail.tags.Input; public class ActionList extends Action implements Iterable{ static final Logger LOG = LoggerFactory.getLogger(ActionList.class); - + private static final String ACTIONS = "actions"; + protected Vector actions; public ActionList(BaseClass parent) { @@ -104,14 +105,11 @@ public class ActionList extends Action implements Iterable{ @Override public JSONObject json() { - String cls = getClass().getSimpleName(); - throw new UnsupportedOperationException(cls+".json() not supported, use "+cls+".jsonArray instead!"); - } - - public JSONArray jsonArray() { - JSONArray result = new JSONArray(); - for (Action action : actions) result.put(action.json()); - return result; + JSONObject json = super.json(); + JSONArray jActions = new JSONArray(); + actions.forEach(action -> jActions.put(action.json())); + json.put(ACTIONS,jActions); + return json; } public Tag list() { @@ -136,12 +134,16 @@ public class ActionList extends Action implements Iterable{ return span; } - public ActionList load(JSONArray list) { - for (Object o : list) { - if (o instanceof JSONObject) { - JSONObject json = (JSONObject) o; - Action action = Action.create(json.getString(TYPE),this); - if (action != null) add(action.load(json)); + public Action load(JSONObject json) { + super.load(json); + if (json.has(ACTIONS)) { + JSONArray list = json.getJSONArray(ACTIONS); + for (Object o : list) { + if (o instanceof JSONObject) { + JSONObject jsonObject = (JSONObject) o; + Action action = Action.create(jsonObject.getString(TYPE),this); + if (action != null) add(action.load(jsonObject)); + } } } return this; diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java index 1aa88a3..73c191e 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java @@ -15,7 +15,6 @@ import de.srsoftware.web4rail.tags.Fieldset; public class ConditionalAction extends ActionList { private static final String CONDITIONS = "conditions"; - private static final String ACTIONS = "actions"; private ConditionList conditions = new ConditionList(); public ConditionalAction(BaseClass parent) { @@ -41,24 +40,24 @@ public class ConditionalAction extends ActionList { JSONArray conditions = new JSONArray(); for (Condition condition : this.conditions) conditions.put(condition.json()); json.put(CONDITIONS, conditions); - json.put(ACTIONS, super.jsonArray()); return json; } @Override public Action load(JSONObject json) { super.load(json); - for (Object o : json.getJSONArray(CONDITIONS)) { - if (o instanceof JSONObject) { - JSONObject j = (JSONObject) o; - Condition condition = Condition.create(j.getString(TYPE)); - if (isSet(condition)) { - condition.parent(this); - conditions.add(condition.load(j)); + if (json.has(CONDITIONS)) { + for (Object o : json.getJSONArray(CONDITIONS)) { + if (o instanceof JSONObject) { + JSONObject j = (JSONObject) o; + Condition condition = Condition.create(j.getString(TYPE)); + if (isSet(condition)) { + condition.parent(this); + conditions.add(condition.load(j)); + } } } } - super.load(json.getJSONArray(ACTIONS)); return this; } diff --git a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java index aee2eb3..9ef3ec4 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java @@ -13,8 +13,6 @@ import de.srsoftware.web4rail.tags.Input; public class DelayedAction extends ActionList { - - private static final String ACTIONS = "actions"; public static final String DELAY = "delay"; private static final int DEFAULT_DELAY = 1000; private int delay = DEFAULT_DELAY; @@ -45,16 +43,12 @@ public class DelayedAction extends ActionList { @Override public JSONObject json() { - JSONObject json = super.json(); - json.put(DELAY, delay); - json.put(ACTIONS, jsonArray()); - return json; + return super.json().put(DELAY, delay); } public DelayedAction load(JSONObject json) { super.load(json); delay = json.getInt(DELAY); - if (json.has(ACTIONS)) super.load(json.getJSONArray(ACTIONS)); return this; } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java index 50eaedf..72c8fe2 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java @@ -18,6 +18,7 @@ import de.srsoftware.web4rail.tags.Input; public class ConditionList extends Condition implements Iterable{ + private static final String CONDITIONS = "conditions"; private Vector conditions = new Vector(); public ConditionList add(Condition condition) { @@ -53,13 +54,10 @@ public class ConditionList extends Condition implements Iterable{ @Override public JSONObject json() { - String cls = getClass().getSimpleName(); - throw new UnsupportedOperationException(cls+".json() not supported, use "+cls+".jsonArray instead!"); - } - - public JSONArray jsonArray() { - JSONArray json = new JSONArray(); - for (Condition condition : conditions) json.put(condition.json()); + JSONObject json = super.json(); + JSONArray jConditions = new JSONArray(); + conditions.stream().map(Condition::json).forEach(js -> jConditions.put(js)); + json.put(CONDITIONS, jConditions); return json; } @@ -89,13 +87,17 @@ public class ConditionList extends Condition implements Iterable{ } - public ConditionList load(JSONArray arr) { - for (int i=0; i