diff --git a/pom.xml b/pom.xml
index 8fc934f..08e0c0a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.2.3
+ 1.2.4
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 de9a2b1..8cfb448 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -37,7 +37,7 @@ public abstract class BaseClass implements Constants{
private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
protected Id id = null;
protected String notes;
-
+ protected Context parent;
public static class Context {
@@ -331,20 +331,8 @@ public abstract class BaseClass implements Constants{
return win;
}
- 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()));
+ private Map props(Map additionalProps){
+ HashMap props = new HashMap(Map.of(REALM, realm(), ACTION, ACTION_PROPS, ID, id().toString()));
if (isSet(additionalProps)) props.putAll(additionalProps);
return props;
}
diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java
index 7205a50..33f997a 100644
--- a/src/main/java/de/srsoftware/web4rail/Constants.java
+++ b/src/main/java/de/srsoftware/web4rail/Constants.java
@@ -59,6 +59,7 @@ public interface Constants {
public static final String NBSP = " ";
public static final String NOTES = "notes";
public static final String PORT = "port";
+ public static final String RELAY = "relay";
public static final String TYPE = "type";
public static final Charset UTF8 = StandardCharsets.UTF_8;
}
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 5bc2ca7..8ec1f3f 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -807,7 +807,7 @@ public class Plan extends BaseClass{
return isNull(tile) ? null : tile.properties();
case REALM_ACTIONS:
Action action = Action.get(id);
- return (isSet(action)) ? action.properties(params) : null;
+ return (isSet(action)) ? action.properties() : null;
}
return null;
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index 1abae19..08e0a31 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -258,11 +258,11 @@ public class Route extends BaseClass implements Comparable{
Tag list = new Tag("ol");
Tag setup = new Tag("li").content(t("Setup actions")+NBSP);
- setupActions.addTo(setup, context());
+ setupActions.list().addTo(setup);
setup.addTo(list);
Tag start = new Tag("li").content(t("Start actions")+NBSP);
- startActions.addTo(start, context());
+ startActions.list().addTo(setup);
start.addTo(list);
for (Contact c : contacts) {
@@ -272,7 +272,7 @@ public class Route extends BaseClass implements Comparable{
actions = new ActionList();
triggers.put(c.trigger(), actions);
}
- actions.addTo(link,context());
+ actions.list().addTo(link);
}
list.addTo(win);
return win;
@@ -371,20 +371,21 @@ public class Route extends BaseClass implements Comparable{
}
public Route complete() {
+ Context parent = new Context(this);
if (contacts.size()>1) { // mindestens 2 Kontakte: erster Kontakt aktiviert Block, vorletzter Kontakt leitet Bremsung ein
Contact nextToLastContact = contacts.get(contacts.size()-2);
String trigger = nextToLastContact.trigger();
- add(trigger,new BrakeStart());
- add(trigger,new PreserveRoute());
- for (Signal signal : signals) add(trigger,new SetSignal().set(signal).to(Signal.STOP));
+ add(trigger,new BrakeStart(parent));
+ add(trigger,new PreserveRoute(parent));
+ for (Signal signal : signals) add(trigger,new SetSignal(parent).set(signal).to(Signal.STOP));
}
if (!contacts.isEmpty()) {
Contact lastContact = contacts.lastElement();
- add(lastContact.trigger(), new BrakeStop());
- add(lastContact.trigger(), new FinishRoute());
+ add(lastContact.trigger(), new BrakeStop(parent));
+ add(lastContact.trigger(), new FinishRoute(parent));
}
- for (Signal signal : signals) setupActions.add(new SetSignal().set(signal).to(Signal.GO));
- startActions.add(new SetSpeed().to(999));
+ for (Signal signal : signals) setupActions.add(new SetSignal(parent).set(signal).to(Signal.GO));
+ startActions.add(new SetSpeed(parent).to(999));
return this;
}
@@ -512,7 +513,7 @@ public class Route extends BaseClass implements Comparable{
JSONObject trigger = new JSONObject();
trigger.put(TRIGGER, entry.getKey());
ActionList actionList = entry.getValue();
- trigger.put(ACTIONS, actionList.json());
+ trigger.put(ACTIONS, actionList.jsonArray());
jTriggers.put(trigger);
@@ -565,8 +566,8 @@ public class Route extends BaseClass implements Comparable{
}
if (json.has(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS));
if (json.has(CONDITIONS)) conditions.load(json.getJSONArray(CONDITIONS));
- if (json.has(SETUP_ACTIONS)) setupActions = ActionList.load(json.getJSONArray(SETUP_ACTIONS));
- if (json.has(START_ACTIONS)) startActions = ActionList.load(json.getJSONArray(START_ACTIONS));
+ if (json.has(SETUP_ACTIONS)) setupActions = new ActionList().load(json.getJSONArray(SETUP_ACTIONS));
+ if (json.has(START_ACTIONS)) startActions = new ActionList().load(json.getJSONArray(START_ACTIONS));
if (json.has(DISABLED)) disabled = json.getBoolean(DISABLED);
if (json.has(BRAKE_TIMES)) {
JSONObject dummy = json.getJSONObject(BRAKE_TIMES);
@@ -579,7 +580,7 @@ public class Route extends BaseClass implements Comparable{
for (int i=0; i entry : names.entrySet()) select.addOption(entry.getValue(), entry.getKey());
return select.addTo(new Label(t("Action type:")+NBSP));
}
-
- 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);
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
index 8693653..5016c79 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
@@ -10,12 +10,8 @@ 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.Context;
-import de.srsoftware.web4rail.BaseClass.Id;
-import de.srsoftware.web4rail.Constants;
+import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Plan;
import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Button;
@@ -23,16 +19,18 @@ import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
-public class ActionList extends Vector implements Constants{
+public class ActionList extends BaseClass{
private static final Logger LOG = LoggerFactory.getLogger(ActionList.class);
- private static final long serialVersionUID = 4862000041987682112L;
private static final HashMap actionLists = new HashMap();
+ private Vector actions;
private Id id;
public ActionList() {
id = new Id();
+ actions = new Vector();
actionLists.put(id,this);
+
}
private static Id actionId(HashMap params) {
@@ -58,13 +56,18 @@ public class ActionList extends Vector implements Constants{
return new Button(t("Create action"),typeForm).addTo(typeForm).addTo(win);
}
+ public ActionList add(Action action) {
+ actions.add(action);
+ return this;
+ }
+
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);
-
- Action action = Action.create(type);
+ Context parent = new Context(this);
+ Action action = Action.create(type,parent);
if (action instanceof Action) {
add(action);
return plan.showContext(params);
@@ -75,12 +78,12 @@ public class ActionList extends Vector implements Constants{
}
public void addActionsFrom(ActionList other) {
- for (Action otherAction : other) {
+ for (Action otherAction : other.actions) {
//LOG.debug("old action ({}): {}",otherAction.getClass().getSimpleName(),otherAction);
boolean exists = false;
- int len = this.size();
+ int len = actions.size();
for (int i=0; i implements Constants{
}
}
}
-
- public void addTo(Tag link, String context) {
- Map props = new HashMap(Map.of(
- REALM,REALM_ACTIONS,
- ID,id,
- ACTION,ACTION_ADD,
- CONTEXT,context));
- new Button(t("add action"),props).addTo(link);
-
- props.put(ACTION,ACTION_PROPS);
- if (!isEmpty()) {
- Tag ul = new Tag("ol");
- boolean first = true;
- for (Action action : this) {
- props.put(ID, id+"/"+action.id());
- 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);
- }
- props.put(ACTION, ACTION_DROP);
- new Button("-",props).addTo(act);
- if (action instanceof ConditionalAction) {
- 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;
- }
- ul.addTo(link);
- }
- }
-
- public Fieldset properties() {
- Fieldset fieldset = new Fieldset(t("Actions"));
- new Tag("p").content("replace ActionList.addTo(...) by ActionsList.properties()!").addTo(fieldset);
- return fieldset;
+
+ public boolean isEmpty() {
+ return actions.isEmpty();
}
public boolean drop(Id actionId) {
- for (Action action : this) {
+ for (Action action : actions) {
if (action.id().equals(actionId)) {
- this.remove(action);
+ actions.remove(action);
return true;
}
}
@@ -151,7 +116,7 @@ public class ActionList extends Vector implements Constants{
public boolean fire(Context context) {
if (!isEmpty()) LOG.debug(t("Firing {}"),this);
- for (Action action : this) {
+ for (Action action : actions) {
if (!action.fire(context)) return false;
}
return true;
@@ -161,29 +126,59 @@ public class ActionList extends Vector implements Constants{
return id;
}
- public JSONArray json() {
+ public JSONArray jsonArray() {
JSONArray result = new JSONArray();
- for (Action action : this) result.put(action.json());
+ for (Action action : actions) result.put(action.json());
return result;
}
- public static ActionList load(JSONArray list) {
- ActionList actionList = new ActionList();
+ public Fieldset list() {
+ Fieldset fieldset = new Fieldset(t("Actions"));
+
+ Map props = new HashMap(Map.of(
+ REALM,REALM_ACTIONS,
+ ID,id,
+ ACTION,ACTION_PROPS));
+
+ if (!isEmpty()) {
+ Tag ul = new Tag("ol");
+ boolean first = true;
+ for (Action action : actions) {
+ props.put(ID, id+"/"+action.id());
+ Tag act = action.link("span", action+NBSP, Map.of(ID,id+"/"+action.id())).addTo(new Tag("li"));
+ if (!first) {
+ props.put(ACTION, ACTION_MOVE);
+ new Button("↑",props).addTo(act);
+ }
+ props.put(ACTION, ACTION_DROP);
+ new Button("-",props).addTo(act);
+// TODO: add children for conditionalActions and delayedActions
+ act.addTo(ul);
+ first = false;
+ }
+ ul.addTo(fieldset);
+ }
+
+ return fieldset;
+ }
+
+ public ActionList load(JSONArray list) {
+ Context parent = new Context(this);
for (Object o : list) {
if (o instanceof JSONObject) {
JSONObject json = (JSONObject) o;
- Action action = Action.create(json.getString(TYPE));
- if (action != null) actionList.add(action.load(json));
+ Action action = Action.create(json.getString(TYPE),parent);
+ if (action != null) add(action.load(json));
}
}
- return actionList;
+ return this;
}
public boolean moveUp(Id actionId) {
- for (int i=1; i implements Constants{
return actionList.drop(actionId) ? plan.showContext(params) : t("No action with id {} found!",actionId);
case ACTION_MOVE:
return actionList.moveUp(actionId) ? plan.showContext(params) : t("No action with id {} found!",actionId);
- case ACTION_PROPS:
- return propsOf(params);
case ACTION_UPDATE:
return update(actionId,params,plan);
}
return t("Unknown action: {}",action);
}
- private static Object propsOf(HashMap 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);
- }
-
- private static String t(String text,Object...fills) {
- return Translation.get(Application.class, text, fills);
+ @Override
+ protected Window properties(List