From a89d522ea28589871660c6d22c6216ace37c3266 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sun, 1 Nov 2020 16:06:46 +0100 Subject: [PATCH] re-implemented Delayed Action --- pom.xml | 2 +- .../web4rail/actions/ActionList.java | 7 +- .../web4rail/actions/ConditionalAction.java | 11 +- .../web4rail/actions/DelayedAction.java | 130 ++++++++---------- 4 files changed, 65 insertions(+), 85 deletions(-) diff --git a/pom.xml b/pom.xml index f5df62d..fd4eb90 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.9.5 + 0.9.6 Web4Rail jar Java Model Railway Control diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index 7fa5c9c..466a56a 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -113,6 +113,10 @@ public class ActionList extends Vector implements Constants{ ConditionalAction ca = (ConditionalAction) action; ca.children().addTo(act, context); } + if (action instanceof DelayedAction) { + DelayedAction da = (DelayedAction) action; + da.children().addTo(act, context); + } act.addTo(ul); first = false; } @@ -130,7 +134,7 @@ public class ActionList extends Vector implements Constants{ return false; } - public void fire(Context context) { + public boolean fire(Context context) { LOG.debug("Firing {}",this); for (Action action : this) { @@ -140,6 +144,7 @@ public class ActionList extends Vector implements Constants{ LOG.warn("Action did not fire properly: {}",action,e); } } + return true; } public int id() { diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java index f2b78b9..327daae 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java @@ -60,19 +60,10 @@ public class ConditionalAction extends Action { @Override public boolean fire(Context context) throws IOException { for (Condition condition : conditions) { - if (condition.fulfilledBy(context) != condition.inverted) return fireActions(context); + if (condition.fulfilledBy(context) != condition.inverted) return actions.fire(context); } return false; } - - private boolean fireActions(Context context) { - for (Action action : actions) try { - action.fire(context); - } catch (IOException e) { - LOG.warn("Was not able to fire {}",action); - } - return true; - } @Override public JSONObject json() { diff --git a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java index 9fb5112..ed335cc 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java @@ -2,122 +2,106 @@ package de.srsoftware.web4rail.actions; import java.io.IOException; import java.util.HashMap; -import java.util.List; import org.json.JSONObject; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Window; 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.Label; -import de.srsoftware.web4rail.tags.Select; - -public class DelayedAction extends Action{ +public class DelayedAction extends Action { + + private static final String ACTIONS = "actions"; public static final String DELAY = "delay"; private static final int DEFAULT_DELAY = 1000; private int delay = DEFAULT_DELAY; - private Action action = null; + private ActionList actions = new ActionList(); + + private Tag actionsForm(HashMap params) { + Fieldset fieldset = new Fieldset(t("Actions")); + actions.addTo(fieldset, params.get(CONTEXT)); + return fieldset; + } + + public ActionList children() { + return actions; + } + + private Tag delayForm(HashMap params) { + Fieldset fieldset = new Fieldset(t("Delay")); + + Form form = new Form("action-prop-form-"+id); + 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); + + new Input(DELAY,delay).numeric().addTo(new Label(t("Delay")+NBSP)).content(" ms").addTo(form); + return new Button(t("Apply"),form).addTo(form).addTo(fieldset); + } + @Override - public boolean fire(Context context) { + public boolean fire(Context context) throws IOException { new Thread() { public void run() { try { Thread.sleep(delay); } catch (InterruptedException e) { + LOG.warn("Interrupted Exception thrown while waiting:",e); } - if (action != null) try { - action.fire(context); - } catch (IOException e) { - e.printStackTrace(); - } + actions.fire(context); }; }.start(); - return true; + return true; } + + @Override public JSONObject json() { JSONObject json = super.json(); json.put(DELAY, delay); - json.put(ACTION, action.json()); + json.put(ACTIONS, actions.json()); return json; } public static DelayedAction load(JSONObject json) { - DelayedAction da = new DelayedAction(); - da.delay = json.getInt(DELAY); - da.action = Action.load(json.getJSONObject(ACTION)); - return da; + DelayedAction action = new DelayedAction(); + action.delay = json.getInt(DELAY); + if (json.has(ACTIONS)) action.actions = ActionList.load(json.getJSONArray(ACTIONS)); + return action; } - + @Override public Window properties(HashMap params) { Window win = super.properties(params); - Form form = new Form("action-prop-form-"+id); - 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); - - if (action == null) { - Select select = new Select(TYPE); - List> classes = List.of( - ConditionalAction.class, - SetSpeed.class, - SetSignalsToStop.class, - FinishRoute.class, - TurnTrain.class, - StopAuto.class, - PowerOff.class, - SetRelay.class, - DelayedAction.class - ); - for (Class clazz : classes) select.addOption(clazz.getSimpleName()); - select.addTo(new Label(t("Action type:")+NBSP)).addTo(form); - } else { - action.link(0, params.get(CONTEXT)).addTo(new Label(t("Action: "))).addTo(form); - } - Label label = new Label(t("Delay:")+NBSP); - new Input(DELAY, delay).numeric().addTo(label).content(NBSP+t("miliseconds")); - label.addTo(form); - new Button(t("Apply"),form).addTo(form).addTo(win); + delayForm(params).addTo(win); + actionsForm(params).addTo(win); return win; } - + @Override - public String toString() { - if (action == null) return t("Click here to set up delayed action!"); - return t("Wait {} ms, then {}",delay,action); + public String toString() { + return t("Wait {} ms, then:",delay); } @Override protected Object update(HashMap params) { - LOG.debug("update: {}",params); - - String type = params.get(TYPE); - if (type != null) action = Action.create(type); - - String error = null; - String ms = params.get(DELAY); - if (ms == null) { - ms = ""+DEFAULT_DELAY; - } else { - try { - int d = Integer.parseInt(ms); - if (d<0) error = t("Delay must not be less than zero!"); - if (error == null) { - this.delay = d; - return t("Action updated!"); - } - } catch (NumberFormatException e) { - error = t("Not a valid number!"); - } - } - Window win = properties(params); - return new Tag("span").content(error).addTo(win); + String d = params.get(DELAY); + if (d != null) try { + int ms = Integer.parseInt(d); + if (ms < 0) throw new NumberFormatException(t("Delay must not be less than zero!")); + delay = ms; + } catch (NumberFormatException nfe) { + Window props = properties(params); + props.children().insertElementAt(new Tag("div").content(nfe.getMessage()), 2); + return props; + } + return super.update(params); } }