From 50a5508a33ff4f529be8935bdcc5bdfc9c6b6ab7 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 3 Dec 2020 12:11:27 +0100 Subject: [PATCH] overhauled registry --- pom.xml | 2 +- .../translations/Application.de.translation | 2 +- .../de/srsoftware/web4rail/Application.java | 5 + .../de/srsoftware/web4rail/BaseClass.java | 49 ++++++- .../de/srsoftware/web4rail/Constants.java | 27 ++-- .../de/srsoftware/web4rail/PathFinder.java | 5 + .../java/de/srsoftware/web4rail/Plan.java | 126 ++++-------------- .../java/de/srsoftware/web4rail/Range.java | 5 + .../java/de/srsoftware/web4rail/Route.java | 64 ++++----- .../srsoftware/web4rail/actions/Action.java | 14 +- .../web4rail/actions/ActionList.java | 43 ++++-- .../web4rail/actions/BrakeCancel.java | 4 + .../web4rail/actions/BrakeStart.java | 6 +- .../web4rail/actions/BrakeStop.java | 4 + .../web4rail/actions/ConditionalAction.java | 22 ++- .../web4rail/actions/DelayedAction.java | 16 +-- .../actions/DetermineTrainInBlock.java | 5 + .../web4rail/actions/FinishRoute.java | 5 + .../web4rail/actions/PreserveRoute.java | 6 +- .../web4rail/actions/SendCommand.java | 5 + .../web4rail/actions/SetContextTrain.java | 9 +- .../web4rail/actions/SetDisplayText.java | 11 +- .../srsoftware/web4rail/actions/SetPower.java | 5 + .../srsoftware/web4rail/actions/SetRelay.java | 5 + .../web4rail/actions/SetSignal.java | 7 +- .../srsoftware/web4rail/actions/SetSpeed.java | 5 + .../srsoftware/web4rail/actions/ShowText.java | 5 + .../web4rail/actions/StopAllTrains.java | 5 + .../srsoftware/web4rail/actions/StopAuto.java | 4 + .../web4rail/actions/TriggerContact.java | 5 + .../web4rail/actions/TurnTrain.java | 5 + .../web4rail/conditions/BlockFree.java | 16 ++- .../web4rail/conditions/Condition.java | 56 ++------ .../web4rail/conditions/ConditionList.java | 84 ++++++++---- .../web4rail/conditions/OrCondition.java | 33 +---- .../web4rail/conditions/PushPullTrain.java | 7 + .../web4rail/conditions/TrainHasTag.java | 6 + .../web4rail/conditions/TrainLength.java | 8 +- .../web4rail/conditions/TrainSelect.java | 6 + .../de/srsoftware/web4rail/moving/Car.java | 6 + .../de/srsoftware/web4rail/moving/Train.java | 14 +- .../de/srsoftware/web4rail/tiles/Block.java | 8 +- .../de/srsoftware/web4rail/tiles/Bridge.java | 7 + .../de/srsoftware/web4rail/tiles/Contact.java | 6 + .../de/srsoftware/web4rail/tiles/Cross.java | 6 + .../srsoftware/web4rail/tiles/CrossPlus.java | 6 + .../de/srsoftware/web4rail/tiles/DiagES.java | 6 + .../de/srsoftware/web4rail/tiles/DiagNE.java | 6 + .../de/srsoftware/web4rail/tiles/DiagSW.java | 6 + .../de/srsoftware/web4rail/tiles/DiagWN.java | 7 + .../de/srsoftware/web4rail/tiles/EndE.java | 6 + .../de/srsoftware/web4rail/tiles/EndN.java | 7 + .../de/srsoftware/web4rail/tiles/EndS.java | 6 + .../de/srsoftware/web4rail/tiles/EndW.java | 9 +- .../de/srsoftware/web4rail/tiles/Eraser.java | 7 +- .../de/srsoftware/web4rail/tiles/Relay.java | 18 +-- .../de/srsoftware/web4rail/tiles/Shadow.java | 9 ++ .../de/srsoftware/web4rail/tiles/Signal.java | 6 + .../srsoftware/web4rail/tiles/StraightH.java | 18 ++- .../srsoftware/web4rail/tiles/StraightV.java | 6 + .../web4rail/tiles/TextDisplay.java | 15 ++- .../de/srsoftware/web4rail/tiles/Tile.java | 12 +- .../de/srsoftware/web4rail/tiles/Turnout.java | 6 + .../srsoftware/web4rail/tiles/TurnoutL.java | 2 +- .../srsoftware/web4rail/tiles/TurnoutR.java | 2 +- 65 files changed, 552 insertions(+), 352 deletions(-) diff --git a/pom.xml b/pom.xml index 88a5fbc..eb1ae21 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.2.6 + 1.2.7 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 1566dae..0854789 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -146,7 +146,7 @@ Right port\: : Port für rechts Routes using this tile : Fahrstraßen, die diesen Abschnitt verwenden Route will only be available, if all conditions are fulfilled. : Route ist nur verfügbar, wenn alle Bedingungen erfüllt sind. Save : speichern -Select block\: : Block auswählen: +Select block : Block auswählen Select contact\: : Kotakt auswählen: Select display\: : Anzeige auswählen: Select from plan : Auf Plan auswählen diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java index 5d5f2ad..fd27b13 100644 --- a/src/main/java/de/srsoftware/web4rail/Application.java +++ b/src/main/java/de/srsoftware/web4rail/Application.java @@ -164,6 +164,11 @@ public class Application extends BaseClass{ return Files.probeContentType(file.toPath()); } + @Override + protected void removeChild(BaseClass child) { + throw new RuntimeException(this.getClass().getSimpleName()+".removeChild should never be called!"); + } + /** * sends a response generated from the application to a given client * @param client diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java index 1ae7dbd..1c83504 100644 --- a/src/main/java/de/srsoftware/web4rail/BaseClass.java +++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java @@ -39,6 +39,7 @@ public abstract class BaseClass implements Constants{ private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray(); protected Id id = null; protected String notes; + private static HashMap registry = new HashMap(); public static final Logger LOG = LoggerFactory.getLogger(BaseClass.class); private BaseClass parent; @@ -259,6 +260,17 @@ public abstract class BaseClass implements Constants{ return form; } + @SuppressWarnings("unchecked") + public static T get(Id id) { + BaseClass element = registry.get(id); + if (isNull(element)) return null; + try { + return (T) element; + } catch (ClassCastException e) { + return null; + } + } + public Id id() { if (isNull(id)) id = new Id(); return id; @@ -288,6 +300,25 @@ public abstract class BaseClass implements Constants{ return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(caption.toString()); } + @SuppressWarnings("unchecked") + public static List listElements(Class cls) { + ArrayList result = new ArrayList(); + for (BaseClass object : registry.values()) { + if (isSet(object) && cls.isAssignableFrom(object.getClass())) { + result.add((T) object); + } + } + return result; + } + + public BaseClass load(JSONObject json) { + if (json.has(ID)) { + id = Id.from(json); + register(); + } + if (json.has(NOTES)) notes = json.getString(NOTES); + return this; + } public static String md5sum(Object o) { try { @@ -349,7 +380,19 @@ public abstract class BaseClass implements Constants{ if (isSet(additionalProps)) props.putAll(additionalProps); return props; } + + public BaseClass register() { + registry.put(id(),this); + return this; + } + + public BaseClass remove() { + if (isSet(parent)) parent.removeChild(this); + return registry.remove(id()); + } + protected abstract void removeChild(BaseClass child); + protected static String t(String txt, Object...fills) { return Translation.get(Application.class, txt, fills); } @@ -359,10 +402,4 @@ public abstract class BaseClass implements Constants{ if (params.containsKey(NOTES)) notes = params.get(NOTES).trim(); return this; } - - public BaseClass load(JSONObject json) { - if (json.has(ID)) id = Id.from(json); - if (json.has(NOTES)) notes = json.getString(NOTES); - return this; - } } diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index 33f997a..ef474f7 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -48,18 +48,19 @@ public interface Constants { public static final String REALM_TRAIN = "train"; - public static final String BLOCK = "block"; - public static final String CONTACT = "contact"; - public static final String CONTEXT = "context"; - public static final String DEFAULT_SPEED_UNIT = "km/h"; + public static final String BLOCK = "block"; + public static final String CONTACT = "contact"; + public static final String CONTEXT = "context"; + public static final String DEFAULT_SPEED_UNIT = "km/h"; public static final String DEFAULT_LENGTH_UNIT = "mm"; - public static final String DISABLED = "disabled"; - public static final String GITHUB_URL = "https://github.com/srsoftware-de/Web4Rail"; - public static final String ID = "id"; - 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; + public static final String DISABLED = "disabled"; + public static final String GITHUB_URL = "https://github.com/srsoftware-de/Web4Rail"; + public static final String ID = "id"; + public static final String NBSP = " "; + public static final String NOTES = "notes"; + public static final String PARENT = "parent"; + 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/PathFinder.java b/src/main/java/de/srsoftware/web4rail/PathFinder.java index cdffd96..00bb2c7 100644 --- a/src/main/java/de/srsoftware/web4rail/PathFinder.java +++ b/src/main/java/de/srsoftware/web4rail/PathFinder.java @@ -109,4 +109,9 @@ public class PathFinder extends BaseClass{ return selectetRoute; } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 8ec1f3f..4059c7d 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -12,13 +12,10 @@ import java.util.Collection; import java.util.Comparator; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.SortedSet; import java.util.Stack; -import java.util.TreeSet; import java.util.Vector; import org.json.JSONArray; @@ -27,7 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.srsoftware.tools.Tag; -import de.srsoftware.web4rail.actions.Action; import de.srsoftware.web4rail.moving.Car; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tags.Button; @@ -61,7 +57,6 @@ import de.srsoftware.web4rail.tiles.EndW; import de.srsoftware.web4rail.tiles.Eraser; import de.srsoftware.web4rail.tiles.Relay; import de.srsoftware.web4rail.tiles.Shadow; -import de.srsoftware.web4rail.tiles.Signal; import de.srsoftware.web4rail.tiles.SignalE; import de.srsoftware.web4rail.tiles.SignalN; import de.srsoftware.web4rail.tiles.SignalS; @@ -140,10 +135,6 @@ public class Plan extends BaseClass{ private static final String SPEED_UNIT = "speed_unit"; private static final String LENGTH_UNIT = "length_unit"; - public HashMap tiles = new HashMap(); // The list of tiles of this plan, i.e. the Track layout - private HashSet blocks = new HashSet(); // the list of tiles, that are blocks - private HashSet signals = new HashSet(); // the list of tiles, that are signals - private HashMap routes = new HashMap(); // the list of routes of the track layout private ControlUnit controlUnit = new ControlUnit(this); // the control unit, to which the plan is connected private Contact learningContact; @@ -241,8 +232,11 @@ public class Plan extends BaseClass{ Tile tile = (Tile) tc.getClassLoader().loadClass(clazz).getDeclaredConstructor().newInstance(); if (tile instanceof Eraser) { Tile erased = get(Tile.id(x,y),true); - remove(erased); - return erased == null ? null : t("Removed {}.",erased); + if (isSet(erased)) { + erased.remove(); + return t("Removed {}.",erased); + } + return null; } //if (configJson != null) tile.configure(new JSONObject(configJson)); set(x, y, tile); @@ -255,7 +249,7 @@ public class Plan extends BaseClass{ */ private String analyze() { Vector routes = new Vector(); - for (Block block : blocks) { + for (Block block : BaseClass.listElements(Block.class)) { if (block.name.equals("Huhu")) { System.err.println("Here we go!"); } @@ -263,18 +257,11 @@ public class Plan extends BaseClass{ routes.addAll(follow(new Route().begin(block,con.from.inverse()),con)); } } - for (Tile tile : tiles.values()) tile.routes().clear(); + for (Tile tile : BaseClass.listElements(Tile.class)) tile.routes().clear(); for (Route route : routes) registerRoute(route.complete()); return t("Found {} routes.",routes.size()); } - /** - * @return the list of blocks known to the plan, ordered by name - */ - public Collection blocks() { - return new TreeSet(blocks); - } - /** * calls tile.click() * @param tile @@ -342,7 +329,7 @@ public class Plan extends BaseClass{ */ public Tile get(Id tileId,boolean resolveShadows) { if (isNull(tileId)) return null; - Tile tile = tiles.get(tileId); + Tile tile = BaseClass.get(tileId); if (resolveShadows && tile instanceof Shadow) tile = ((Shadow)tile).overlay(); return tile; } @@ -391,7 +378,7 @@ public class Plan extends BaseClass{ */ public Page html() throws IOException { Page page = new Page().append("
"); - for (Tile tile: tiles.values()) { + for (Tile tile: BaseClass.listElements(Tile.class)) { if (tile == null) continue; page.append("\t\t"+tile.tag(null)+"\n"); } @@ -570,7 +557,7 @@ public class Plan extends BaseClass{ tile = stack.pop(); if (!(tile instanceof Shadow)) { LOG.debug("altering position of {}",tile); - remove(tile); + tile.remove(); set(tile.x+xstep,tile.y+ystep,tile); } } @@ -628,7 +615,7 @@ public class Plan extends BaseClass{ new Tag("h4").content(t("turnout properties")).addTo(win); Table table = new Table(); table.addHead(t("Address"),t("Relay/Turnout")); - tiles.values() + BaseClass.listElements(Tile.class) .stream() .filter(tile -> tile instanceof Device ) .map(tile -> (Device) tile) @@ -658,38 +645,19 @@ public class Plan extends BaseClass{ */ Route registerRoute(Route newRoute) { newRoute.path().stream().filter(Tile::isSet).forEach(tile -> tile.add(newRoute)); - Id newRouteId = newRoute.id(); - Route existingRoute = routes.get(newRouteId); + Route existingRoute = BaseClass.get(newRoute.id()); if (isSet(existingRoute)) newRoute.addPropertiesFrom(existingRoute); - routes.put(newRouteId, newRoute); + newRoute.register(); return newRoute; } - /** - * removes a tile from the track layout - * @param tile - */ - private void remove(Tile tile) { - if (isNull(tile)) return; - removeTile(tile.x,tile.y); - if (tile instanceof Block) blocks.remove(tile); - for (int i=1; i isSet(tile)) + BaseClass.listElements(Tile.class) + .stream() .filter(tile -> !(tile instanceof Shadow)) .map(tile -> tile.json()) .forEach(jTiles::put); @@ -754,8 +715,6 @@ public class Plan extends BaseClass{ */ public void set(int x,int y,Tile tile) throws IOException { if (tile == null) return; - if (tile instanceof Block) blocks.add((Block) tile); - if (tile instanceof Signal) signals .add((Signal) tile); for (int i=1; i params) { - String[] parts = params.get(CONTEXT).split(":"); - String realm = parts[0]; - Id id = parts.length>1 ? new Id(parts[1]) : null; - switch (realm) { - case REALM_ROUTE: - return route(id).properties(); - case REALM_CONTACT: - case REALM_PLAN: - Tile tile = get(id, false); - return isNull(tile) ? null : tile.properties(); - case REALM_ACTIONS: - Action action = Action.get(id); - return (isSet(action)) ? action.properties() : null; - - } - return null; - } - - public SortedSet signals() { - return new TreeSet(signals); - } /** * sends some data to the clients diff --git a/src/main/java/de/srsoftware/web4rail/Range.java b/src/main/java/de/srsoftware/web4rail/Range.java index 2b37776..bc1631c 100644 --- a/src/main/java/de/srsoftware/web4rail/Range.java +++ b/src/main/java/de/srsoftware/web4rail/Range.java @@ -28,6 +28,11 @@ public class Range extends BaseClass{ if (max - min == 0) return max - min; return min + random.nextInt(max - min); } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } @Override public String toString() { diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index d98bf21..2c6e991 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -4,7 +4,6 @@ import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; -import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -57,7 +56,6 @@ public class Route extends BaseClass implements Comparable{ 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 DROP_CONDITION = "drop_condition"; private static final String END_DIRECTION = "direction_end"; private static final String ROUTES = "routes"; private static final String SETUP_ACTIONS = "setup_actions"; @@ -141,7 +139,6 @@ public class Route extends BaseClass implements Comparable{ private boolean disabled = false; private Block endBlock = null; public Direction endDirection; - private Id id; private Vector path; private Vector signals; public Train train; @@ -151,7 +148,7 @@ public class Route extends BaseClass implements Comparable{ private ActionList startActions; private Block startBlock = null; public Direction startDirection; - private HashSet triggeredContacts = new HashSet<>(); + private HashSet triggeredContacts = new HashSet<>(); public Route() { setupActions = new ActionList(this); @@ -165,23 +162,17 @@ public class Route extends BaseClass implements Comparable{ * @throws IOException */ public static Object action(HashMap params) throws IOException { - Route route = plan.route(Id.from(params)); + Route route = BaseClass.get(Id.from(params)); if (isNull(route)) return t("Unknown route: {}",params.get(ID)); switch (params.get(ACTION)) { case ACTION_DROP: - String message = plan.remove(route); - String context = params.get(CONTEXT); - if (isSet(context)) { - plan.stream(message); - return plan.showContext(params); - } - return message; + route.remove(); + return t("Removed {}.",route); + case ACTION_PROPS: return route.properties(); case ACTION_UPDATE: return route.update(params,plan); - case DROP_CONDITION: - return route.dropCodition(params); } return t("Unknown action: {}",params.get(ACTION)); } @@ -419,12 +410,6 @@ public class Route extends BaseClass implements Comparable{ return disabled; } - private Object dropCodition(HashMap params) { - Id condId = Id.from(params,REALM_CONDITION); - if (isSet(condId)) conditions.removeById(condId); - return properties(); - } - public Block endBlock() { return endBlock; } @@ -435,7 +420,7 @@ public class Route extends BaseClass implements Comparable{ Tile lastTile = path.lastElement(); if (lastTile instanceof Contact) { lastTile.set(null); - if (isSet(train)) train.removeFromTrace(lastTile); + if (isSet(train)) train.removeChild(lastTile); } if (isSet(train)) { train.set(endBlock); @@ -508,7 +493,7 @@ public class Route extends BaseClass implements Comparable{ json.put(BRAKE_TIMES, brakeTimes); - if (!conditions.isEmpty()) json.put(CONDITIONS, conditions.json()); + if (!conditions.isEmpty()) json.put(CONDITIONS, conditions.jsonArray()); JSONArray jTriggers = new JSONArray(); for (Entry entry : triggers.entrySet()) { @@ -652,20 +637,32 @@ public class Route extends BaseClass implements Comparable{ @Override protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + preForm.add(conditions.list(t("Route will only be available, if all conditions are fulfilled."))); + preForm.add(contactsAndActions()); + formInputs.add(t("Name"),new Input(NAME, name())); formInputs.add(t("State"),new Checkbox(DISABLED, t("disabled"), disabled)); postForm.add(basicProperties()); if (!turnouts.isEmpty()) postForm.add(turnouts()); - preForm.add(conditions.list(t("Route will only be available, if all conditions are fulfilled."))); - preForm.add(contactsAndActions()); postForm.add(brakeTimes()); return super.properties(preForm, formInputs, postForm); } - public Route remove(Condition condition) { - conditions.remove(condition); - return this; + @Override + protected void removeChild(BaseClass child) { + conditions.remove(child); + contacts.remove(child); + if (child == endBlock) endBlock = null; + path.remove(child); + signals.remove(child); + 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); } public boolean reset() { @@ -674,7 +671,7 @@ public class Route extends BaseClass implements Comparable{ Tile lastTile = path.lastElement(); if (lastTile instanceof Contact) { lastTile.set(null); - if (isSet(train)) train.removeFromTrace(lastTile); + if (isSet(train)) train.removeChild(lastTile); } if (isSet(train)) { train.set(startBlock); @@ -686,10 +683,11 @@ public class Route extends BaseClass implements Comparable{ return true; } - public static void saveAll(Collection routes, String filename) throws IOException { + public static void saveAll(String filename) throws IOException { BufferedWriter file = new BufferedWriter(new FileWriter(filename)); file.write("{\""+ROUTES+"\":[\n"); int count = 0; + List routes = BaseClass.listElements(Route.class); for (Route route : routes) { file.write(route.json().toString()); if (++count < routes.size()) file.write(","); @@ -777,13 +775,7 @@ public class Route extends BaseClass implements Comparable{ if (isSet(condition)) { condition.parent(this); conditions.add(condition); - return properties(); - } - String message = t("{} updated.",this); - if (params.containsKey(CONTEXT)) { - plan.stream(message); - return plan.showContext(params); } - return message; + return properties(); } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index 21de10b..8204102 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -13,6 +13,7 @@ import de.keawe.tools.translations.Translation; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Application; import de.srsoftware.web4rail.BaseClass; +import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Select; @@ -103,6 +104,10 @@ public abstract class Action extends BaseClass { return false; } + @Override + public Window properties() { // goes up to first ancestor, which is not an Action + return parent().properties(); + } public static Tag selector() { Select select = new Select(TYPE); @@ -129,13 +134,6 @@ public abstract class Action extends BaseClass { @Override protected Object update(HashMap params) { super.update(params); - BaseClass parent = parent(); - if (isNull(parent)) return properties(); - if (parent instanceof ActionList) { - ActionList al = (ActionList) parent; - return al.parent().properties(); - } - return parent.properties(); - + return properties(); } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index a9ca820..1151838 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.actions; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Vector; @@ -18,10 +19,10 @@ import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; -public class ActionList extends Action{ - private static final Logger LOG = LoggerFactory.getLogger(ActionList.class); +public class ActionList extends Action implements Iterable{ + static final Logger LOG = LoggerFactory.getLogger(ActionList.class); - private Vector actions; + protected Vector actions; public ActionList(BaseClass parent) { super(parent); @@ -51,7 +52,7 @@ public class ActionList extends Action{ Action action = Action.create(type,this); if (action instanceof Action) { add(action); - return plan.showContext(params); + return parent().properties(); } actionTypeForm(win,context); new Tag("span").content(t("Unknown action type: {}",type)).addTo(win); @@ -80,15 +81,11 @@ public class ActionList extends Action{ } } } - - public boolean isEmpty() { - return actions.isEmpty(); - } public boolean drop(Action action) { return actions.remove(action); } - + public boolean fire(Context context) { if (!isEmpty()) LOG.debug(t("Firing {}"),this); for (Action action : actions) { @@ -97,6 +94,22 @@ public class ActionList extends Action{ return true; } + @Override + public Iterator iterator() { + return actions.iterator(); + } + + public boolean isEmpty() { + return actions.isEmpty(); + } + + + @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()); @@ -104,7 +117,7 @@ public class ActionList extends Action{ } public Tag list() { - Button button = button(t("Add action"), contextAction(ACTION_ADD_ACTION)); + Button button = button(t("add action"), contextAction(ACTION_ADD_ACTION)); Tag span = new Tag("span"); button.addTo(span); @@ -116,6 +129,7 @@ public class ActionList extends Action{ if (first) { first = false; } else action.button("↑", contextAction(ACTION_MOVE)).addTo(item.content(NBSP)); + if (action instanceof ActionList) ((ActionList) action).list().addTo(item); item.addTo(list); } list.addTo(span); @@ -160,9 +174,9 @@ public class ActionList extends Action{ if (isNull(actionList)) return t("Id ({}) does not belong to ActionList!",actionId); return actionList.addActionForm(params,plan); case ACTION_DROP: - return action.drop() ? action.parent().properties() : t("No action with id {} found!",actionId); + return action.drop() ? action.properties() : t("No action with id {} found!",actionId); case ACTION_MOVE: - return action.moveUp() ? action.parent().properties() : t("No action with id {} found!",actionId); + return action.moveUp() ? action.properties() : t("No action with id {} found!",actionId); case ACTION_PROPS: return action.properties(); case ACTION_UPDATE: @@ -178,4 +192,9 @@ public class ActionList extends Action{ preForm.add(fieldset); return super.properties(preForm, formInputs, postForm); } + + @Override + public void removeChild(BaseClass child) { + actions.remove(child); + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java b/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java index e606a33..8cd8563 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java +++ b/src/main/java/de/srsoftware/web4rail/actions/BrakeCancel.java @@ -15,4 +15,8 @@ public class BrakeCancel extends Action { return true; } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java b/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java index d53b8e8..a573bd2 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java +++ b/src/main/java/de/srsoftware/web4rail/actions/BrakeStart.java @@ -15,5 +15,9 @@ public class BrakeStart extends Action { LOG.debug("Started brake process..."); return true; } - + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java b/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java index 6183bcd..1b2b517 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java +++ b/src/main/java/de/srsoftware/web4rail/actions/BrakeStop.java @@ -15,4 +15,8 @@ public class BrakeStop extends Action { return true; } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java index b545dbe..c3c72d9 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java @@ -17,22 +17,16 @@ import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; -public class ConditionalAction extends Action { +public class ConditionalAction extends ActionList { private static final String CONDITIONS = "conditions"; private static final String ACTIONS = "actions"; private Vector conditions = new Vector(); - private ActionList actions; public ConditionalAction(BaseClass parent) { super(parent); - actions = new ActionList(this); } - public ActionList children() { - return actions; - } - private StringBuffer conditions() { StringBuffer sb = new StringBuffer(); for (int i = 0; i preForm, FormInput formInputs, List
postForm) { preForm.add(conditionForm()); Fieldset fieldset = new Fieldset(t("Actions")); - actions.list().addTo(fieldset); + list().addTo(fieldset); postForm.add(fieldset); return super.properties(preForm, formInputs, postForm); } - public ConditionalAction remove(Condition condition) { - conditions.remove(condition); - return this; + @Override + public void removeChild(BaseClass child) { + conditions.remove(child); } @Override diff --git a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java index e23245c..2600a31 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java @@ -11,22 +11,16 @@ import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; -public class DelayedAction extends Action { +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; - private ActionList actions; public DelayedAction(BaseClass parent) { super(parent); - actions = new ActionList(this); - } - - public ActionList children() { - return actions; } public boolean equals(DelayedAction other) { @@ -43,7 +37,7 @@ public class DelayedAction extends Action { } catch (InterruptedException e) { LOG.warn("Interrupted Exception thrown while waiting:",e); } - actions.fire(context); + DelayedAction.super.fire(context); }; }.start(); return true; @@ -53,14 +47,14 @@ public class DelayedAction extends Action { public JSONObject json() { JSONObject json = super.json(); json.put(DELAY, delay); - json.put(ACTIONS, actions.jsonArray()); + json.put(ACTIONS, jsonArray()); return json; } public DelayedAction load(JSONObject json) { super.load(json); delay = json.getInt(DELAY); - if (json.has(ACTIONS)) actions.load(json.getJSONArray(ACTIONS)); + if (json.has(ACTIONS)) super.load(json.getJSONArray(ACTIONS)); return this; } @@ -68,7 +62,7 @@ public class DelayedAction extends Action { protected Window properties(List
preForm, FormInput formInputs, List
postForm) { formInputs.add(t("Delay"),new Input(DELAY,delay).numeric().addTo(new Tag("span")).content(NBSP+"ms")); Fieldset fieldset = new Fieldset(t("Actions")); - actions.list().addTo(fieldset); + list().addTo(fieldset); postForm.add(fieldset); return super.properties(preForm, formInputs, postForm); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java index 65551ec..321a80f 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java +++ b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java @@ -46,6 +46,11 @@ public class DetermineTrainInBlock extends Action { return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + if (child == block) block = null; + } + public String toString() { return isSet(block) ? t("Determine, which train is in {}",block) : t("[Click here to select block!]"); }; diff --git a/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java b/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java index fda2739..7aa9698 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java +++ b/src/main/java/de/srsoftware/web4rail/actions/FinishRoute.java @@ -15,4 +15,9 @@ public class FinishRoute extends Action { if (isSet(route)) route.finish(); return true; } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java b/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java index bc4c153..ee84ca9 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java +++ b/src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java @@ -29,5 +29,9 @@ public class PreserveRoute extends Action { train.reserveNext(); return true; } - + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java b/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java index 51cf4cf..8425d48 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java @@ -53,6 +53,11 @@ public class SendCommand extends Action{ formInputs.add(t("Command to send to control unit"),new Input(COMMAND, command)); return super.properties(preForm, formInputs, postForm); } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } @Override public String toString() { diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java b/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java index 39a26dc..ed40bd1 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java @@ -12,11 +12,11 @@ import de.srsoftware.web4rail.tags.Fieldset; public class SetContextTrain extends Action { + private Train train = null; + public SetContextTrain(BaseClass parent) { super(parent); } - - private Train train = null; @Override public boolean fire(Context context) { @@ -55,6 +55,11 @@ public class SetContextTrain extends Action { return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + if (child == train) train = null; + } + public String toString() { return isSet(train) ? t("Set {} as context",train) : "["+t("Click here to select train!")+"]"; }; diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java index 5c990f3..84784f5 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java @@ -13,12 +13,12 @@ import de.srsoftware.web4rail.tiles.TextDisplay; public class SetDisplayText extends TextAction{ + private TextDisplay display; + private static final String DISPLAY = "display"; + public SetDisplayText(BaseClass parent) { super(parent); } - - private TextDisplay display; - private static final String DISPLAY = "display"; @Override public boolean fire(Context context) { @@ -51,6 +51,11 @@ public class SetDisplayText extends TextAction{ return super.load(json); } + @Override + protected void removeChild(BaseClass child) { + if (child == display) display = null; + } + @Override protected Window properties(List
preForm, FormInput formInputs, List
postForm) { formInputs.add(t("Select display"),TextDisplay.selector(display, null)); diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetPower.java b/src/main/java/de/srsoftware/web4rail/actions/SetPower.java index c0443da..64014a9 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetPower.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetPower.java @@ -68,6 +68,11 @@ public class SetPower extends Action{ return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + @Override public String toString() { switch (pc) { diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java index 4dc1641..504d71a 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java @@ -61,6 +61,11 @@ public class SetRelay extends Action { return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + if (child == relay) relay = null; + } + public String toString() { if (isNull(relay)) return "["+t("click here to setup relay")+"]"; return t("Set {} to {}",relay,state?relay.stateLabelA:relay.stateLabelB); diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java b/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java index f18d30b..a04783c 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java @@ -51,7 +51,7 @@ public class SetSignal extends Action { @Override protected Window properties(List
preForm, FormInput formInputs, List
postForm) { Select select = new Select(SIGNAL); - for (Signal signal : plan.signals()) { + for (Signal signal : BaseClass.listElements(Signal.class)) { Tag option = select.addOption(signal.id(),signal.title()); if (signal == this.signal) option.attr("selected", "selected"); } @@ -66,6 +66,11 @@ public class SetSignal extends Action { return super.properties(preForm, formInputs, postForm); } + + @Override + protected void removeChild(BaseClass child) { + if (child == signal) signal = null; + } public SetSignal set(Signal sig) { signal = sig; diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java index 72f2760..beb99e1 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java @@ -46,6 +46,11 @@ public class SetSpeed extends Action{ return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + @Override public String toString() { return t("Set speed to {} {}",speed,speedUnit); diff --git a/src/main/java/de/srsoftware/web4rail/actions/ShowText.java b/src/main/java/de/srsoftware/web4rail/actions/ShowText.java index ff94ba1..7e01488 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ShowText.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ShowText.java @@ -21,6 +21,11 @@ public class ShowText extends TextAction{ return new Label(t("Text to display on clients:")+NBSP); } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + @Override public String toString() { return t("Display \"{}\" on clients.",text); diff --git a/src/main/java/de/srsoftware/web4rail/actions/StopAllTrains.java b/src/main/java/de/srsoftware/web4rail/actions/StopAllTrains.java index 7855a05..6d2fac7 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/StopAllTrains.java +++ b/src/main/java/de/srsoftware/web4rail/actions/StopAllTrains.java @@ -14,4 +14,9 @@ public class StopAllTrains extends Action { Train.list().forEach(train -> train.stopNow()); return true; } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java b/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java index 150c3d4..1eb444f 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java +++ b/src/main/java/de/srsoftware/web4rail/actions/StopAuto.java @@ -15,4 +15,8 @@ public class StopAuto extends Action { return true; } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java index e161e75..fdbd9af 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java +++ b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java @@ -45,6 +45,11 @@ public class TriggerContact extends Action { return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + if (child == contact) contact = null; + } + public String toString() { return isSet(contact) ? t("Trigger {}",contact) : "["+t("click here to setup contact")+"]"; }; diff --git a/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java b/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java index 338ca9d..9fad65c 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java +++ b/src/main/java/de/srsoftware/web4rail/actions/TurnTrain.java @@ -16,4 +16,9 @@ public class TurnTrain extends Action{ } return false; } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java index df7fe8e..d9446ac 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java @@ -5,6 +5,7 @@ import java.util.List; import org.json.JSONObject; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tiles.Block; @@ -13,6 +14,11 @@ public class BlockFree extends Condition { private static final String BLOCK = Block.class.getSimpleName(); private Block block; + + private BlockFree block(Block block) { + this.block = block; + return this; + } @Override public boolean fulfilledBy(Context context) { @@ -35,17 +41,17 @@ public class BlockFree extends Condition { formInputs.add(t("Select block"), Block.selector(block, null)); return super.properties(preForm, formInputs, postForm); } + + @Override + protected void removeChild(BaseClass child) { + if (child == block) block = null; + } @Override public String toString() { if (block == null) return t("[Click here to select block!]"); return t(inverted ? "Block {} is occupied":"Block {} is free",block); } - - private BlockFree block(Block block) { - this.block = block; - return this; - } @Override diff --git a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java index 237dede..c32e4dc 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java @@ -15,9 +15,7 @@ import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Application; import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Plan; -import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; -import de.srsoftware.web4rail.actions.ConditionalAction; import de.srsoftware.web4rail.tags.Checkbox; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Label; @@ -27,9 +25,7 @@ public abstract class Condition extends BaseClass { public static final Logger LOG = LoggerFactory.getLogger(Condition.class); private static final String INVERTED = "inverted"; private static final String PREFIX = Condition.class.getPackageName(); - private static HashMap conditions = new HashMap(); public boolean inverted = false; - private Object parent; public Condition() { this(new Id()); @@ -37,7 +33,7 @@ public abstract class Condition extends BaseClass { public Condition(Id id) { this.id = id; - conditions.put(id, this); + register(); } public static Object action(HashMap params,Plan plan) { @@ -47,18 +43,18 @@ public abstract class Condition extends BaseClass { Id cid = Id.from(params); if (isSet(cid)) { - Condition condition = conditions.get(cid); - if (condition == null) return t("No condition with id {}!",cid); + Condition condition = BaseClass.get(cid); + if (isNull(condition)) return t("No condition with id {}!",cid); switch (action) { case ACTION_PROPS: return condition.properties(); case ACTION_UPDATE: condition.update(params); - return plan.showContext(params); + return condition.parent().properties(); case ACTION_DROP: - condition.drop(); - return plan.showContext(params); + condition.remove(); + return condition.parent().properties(); } return t("Unknown action: {}",action); } @@ -74,27 +70,18 @@ public abstract class Condition extends BaseClass { private static Object addCondition(HashMap params) { String type = params.get(REALM_CONDITION); - String context = params.get(CONTEXT); if (isNull(type)) return t("No type supplied to addCondition!"); - if (isNull(context)) return t("No context supplied to addCondtion!"); + + Id parentId = Id.from(params, PARENT); + if (isNull(parentId)) return t("No parent id supplied to addCondition"); + + BaseClass parent = BaseClass.get(parentId); + if (isNull(parent)) return t("No condition with id {} found!",parentId); Condition condition = Condition.create(type); if (isNull(condition)) return t("Unknown type \"{}\" of condition!",type); - String[] parts = context.split(":"); - Id contextId = new Id(parts[1]); - String realm = parts[0]; - switch (realm) { - case REALM_ROUTE: - Route route = plan.route(contextId); - if (isNull(route)) return t("Unknown route: {}",contextId); - route.add(condition); - return route.properties(); - - default: - break; - } - return t("Cannot handle context of type {} in addCondition!"); + return condition.parent(parent).properties(); } public static Condition create(String type) { @@ -107,18 +94,6 @@ public abstract class Condition extends BaseClass { return null; } - private void drop() { - if (parent instanceof ConditionalAction) { - ConditionalAction ca = (ConditionalAction) parent; - ca.remove(this); - } - if (parent instanceof Route) { - Route route = (Route) parent; - route.remove(this); - } - conditions.remove(this.id()); - } - public abstract boolean fulfilledBy(Context context); public JSONObject json() { @@ -186,11 +161,6 @@ public abstract class Condition extends BaseClass { protected Object update(HashMap params) { inverted = "on".equals(params.get(INVERTED)); - return t("updated {}.",this); - } - - public Condition parent(Object parent) { - this.parent = parent; 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 0b5404b..be186df 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java @@ -1,35 +1,57 @@ package de.srsoftware.web4rail.conditions; +import java.util.Iterator; import java.util.Vector; +import java.util.stream.Stream; import org.json.JSONArray; import org.json.JSONObject; -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.tags.Button; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; -public class ConditionList extends Vector implements Constants{ +public class ConditionList extends Condition implements Iterable{ - private static final long serialVersionUID = 5826717120751473807L; + private Vector conditions = new Vector(); + + public void add(Condition condition) { + conditions.add(condition); + } + + public void addAll(ConditionList conditions) { + this.conditions.addAll(conditions.conditions); + } + public boolean fulfilledBy(Context context) { - for (Condition condition : this) { + for (Condition condition : conditions) { if (!condition.fulfilledBy(context)) return false; } return true; } + + public boolean isEmpty() { + return conditions.isEmpty(); + } + + @Override + public Iterator iterator() { + return conditions.iterator(); + } + + @Override + public JSONObject json() { + String cls = getClass().getSimpleName(); + throw new UnsupportedOperationException(cls+".json() not supported, use "+cls+".jsonArray instead!"); + } - public JSONArray json() { + public JSONArray jsonArray() { JSONArray json = new JSONArray(); - for (Condition condition : this) json.put(condition.json()); + for (Condition condition : conditions) json.put(condition.json()); return json; } @@ -42,39 +64,43 @@ public class ConditionList extends Vector implements Constants{ if (caption != null) new Tag("p").content(caption).addTo(fieldset); Tag list = new Tag("ul"); newConditionForm().addTo(new Tag("li")).addTo(list); - forEach(condition -> condition.link("li", condition).addTo(list)); + conditions.forEach(condition -> condition.link("li", condition).addTo(list)); list.addTo(fieldset); return fieldset; } + public void load(JSONArray arr) { + for (int i=0; i stream() { + return conditions.stream(); } } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java b/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java index 9f060c4..2ad49ea 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java @@ -1,46 +1,19 @@ package de.srsoftware.web4rail.conditions; -import java.util.List; import java.util.stream.Collectors; -import org.json.JSONObject; - -import de.srsoftware.web4rail.Window; -import de.srsoftware.web4rail.tags.Fieldset; - -public class OrCondition extends Condition{ +public class OrCondition extends ConditionList{ - private static final String CONDITIONS = "conditions"; - private ConditionList conditions = new ConditionList(); - @Override public boolean fulfilledBy(Context context) { - for (Condition condition : conditions) { + for (Condition condition : this) { if (condition.fulfilledBy(context)) return true; } return false; } - - @Override - public JSONObject json() { - return super.json().put(CONDITIONS, conditions.json()); - } - - @Override - public Condition load(JSONObject json) { - super.load(json); - if (json.has(CONDITIONS)) conditions.load(json.getJSONArray(CONDITIONS)); - return this; - } - - @Override - protected Window properties(List
preForm, FormInput formInputs, List
postForm) { - // add conditions - return super.properties(preForm, formInputs, postForm); - } @Override public String toString() { - return conditions.isEmpty() ? t("Click here to select conditions") : String.join(" "+t("OR")+" ", conditions.stream().map(Object::toString).collect(Collectors.toList())); + return isEmpty() ? t("Click here to select conditions") : String.join(" "+t("OR")+" ", stream().map(Object::toString).collect(Collectors.toList())); } } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java b/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java index 1850dca..481b996 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/PushPullTrain.java @@ -1,11 +1,18 @@ package de.srsoftware.web4rail.conditions; +import de.srsoftware.web4rail.BaseClass; + public class PushPullTrain extends Condition { @Override public boolean fulfilledBy(Context context) { return context.train().pushPull != inverted; } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } @Override public String toString() { diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java index 3c1a422..c852757 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java @@ -5,6 +5,7 @@ import java.util.List; import org.json.JSONObject; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; @@ -37,6 +38,11 @@ public class TrainHasTag extends Condition { return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + @Override public String toString() { if (tag == null) return t("[Click to setup tag]"); diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java index d2c5e37..dc568a7 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java @@ -6,6 +6,7 @@ import java.util.List; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; @@ -37,7 +38,12 @@ public class TrainLength extends Condition { formInputs.add(t("Maximum train length"),new Input(MAX_LENGTH, maxLength).numeric()); return super.properties(preForm, formInputs, postForm); } - + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + @Override public String toString() { return t(inverted ? "train is longer than {}" : "train is shorter than {}",maxLength) ; diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java index cfc6223..d389319 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java @@ -5,6 +5,7 @@ import java.util.List; import org.json.JSONObject; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tags.Fieldset; @@ -36,6 +37,11 @@ public class TrainSelect extends Condition { return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + if (child == train) train = null; + } + @Override public String toString() { if (train == null) return t("[Click here to select train!]"); diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index c0f56ef..98d24a6 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -213,6 +213,12 @@ public class Car extends BaseClass implements Comparable{ return super.properties(preForm,formInputs,postForm); } + + @Override + protected void removeChild(BaseClass child) { + if (child == train) train = null; + } + public static void saveAll(String filename) throws IOException { BufferedWriter file = new BufferedWriter(new FileWriter(filename)); diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 5e5053f..93cfe66 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -77,7 +77,7 @@ public class Train extends BaseClass implements Comparable { private Block currentBlock,destination = null; LinkedList trace = new LinkedList(); - + private class Autopilot extends Thread{ boolean stop = false; int waitTime = 100; @@ -566,9 +566,15 @@ public class Train extends BaseClass implements Comparable { return t("{} stopping at next block.",this); } else return t("autopilot not active."); } - - public void removeFromTrace(Tile tile) { - trace.remove(tile); + + @Override + public void removeChild(BaseClass child) { + if (child == route) route = null; + if (child == currentBlock) currentBlock = null; + if (child == destination) destination = null; + cars.remove(child); + locos.remove(child); + trace.remove(child); } public void reserveNext() { diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index d8611f4..453eb2e 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -12,6 +12,7 @@ import org.json.JSONArray; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.Range; @@ -233,11 +234,16 @@ public abstract class Block extends StretchableTile implements Comparable return this; } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + public static Select selector(Block preselected,Collection exclude) { if (isNull(exclude)) exclude = new Vector(); Select select = new Select(Block.class.getSimpleName()); new Tag("option").attr("value","0").content(t("unset")).addTo(select); - for (Block block : plan.blocks()) { + for (Block block : BaseClass.listElements(Block.class)) { if (exclude.contains(block)) continue; Tag opt = select.addOption(block.id(), block); if (block == preselected) opt.attr("selected", "selected"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java index 9ba44ca..0323c87 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java @@ -7,6 +7,7 @@ import java.util.Map; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; @@ -100,6 +101,12 @@ public abstract class Bridge extends Tile { return t("Click other bridge to connect to!"); } + @Override + protected void removeChild(BaseClass child) { + if (child == counterpart) counterpart = null; + plan.place(this); + } + @Override public Tag tag(Map replacements) throws IOException { Tag tag = super.tag(replacements); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java index f27a193..ac3fa7a 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java @@ -11,6 +11,7 @@ import java.util.TreeMap; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.actions.ActionList; import de.srsoftware.web4rail.tags.Fieldset; @@ -165,6 +166,11 @@ public class Contact extends Tile{ return super.properties(preForm, formInputs, postForm); } + @Override + protected void removeChild(BaseClass child) { + if (child == actions) actions = null; + } + public static Select selector(Contact preselect) { TreeMap sortedSet = new TreeMap(); // Map from Name to Contact for (Contact contact : contactsById.values()) sortedSet.put(contact.toString(), contact); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Cross.java b/src/main/java/de/srsoftware/web4rail/tiles/Cross.java index b679cca..f4d26f8 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Cross.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Cross.java @@ -2,9 +2,15 @@ package de.srsoftware.web4rail.tiles; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; public abstract class Cross extends Tile { public abstract Map offsetConnections(Direction from); + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/CrossPlus.java b/src/main/java/de/srsoftware/web4rail/tiles/CrossPlus.java index 47fc307..66a90c1 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/CrossPlus.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/CrossPlus.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -31,4 +32,9 @@ public class CrossPlus extends Tile{ public List possibleDirections() { return List.of(Direction.EAST,Direction.WEST,Direction.NORTH,Direction.SOUTH); } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java index 49b86f7..9d561d1 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java @@ -3,6 +3,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -21,4 +22,9 @@ public class DiagES extends Tile{ return new HashMap<>(); } } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java index c1524bf..afb27b0 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java @@ -3,6 +3,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -21,4 +22,9 @@ public class DiagNE extends Tile{ return new HashMap<>(); } } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java index 82291ea..d0ffbea 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java @@ -3,6 +3,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -20,4 +21,9 @@ public class DiagSW extends Tile{ return new HashMap<>(); } } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java index 0ac848a..9a5e61f 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java @@ -3,6 +3,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -22,4 +23,10 @@ public class DiagWN extends Tile{ return new HashMap<>(); } } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/EndE.java b/src/main/java/de/srsoftware/web4rail/tiles/EndE.java index 5aaa474..1a992c2 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/EndE.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/EndE.java @@ -1,4 +1,10 @@ package de.srsoftware.web4rail.tiles; +import de.srsoftware.web4rail.BaseClass; + public class EndE extends Tile{ + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/EndN.java b/src/main/java/de/srsoftware/web4rail/tiles/EndN.java index f9a91c7..b37d44b 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/EndN.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/EndN.java @@ -1,4 +1,11 @@ package de.srsoftware.web4rail.tiles; +import de.srsoftware.web4rail.BaseClass; + public class EndN extends Tile{ + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/EndS.java b/src/main/java/de/srsoftware/web4rail/tiles/EndS.java index 3293f54..ac9cdba 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/EndS.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/EndS.java @@ -1,4 +1,10 @@ package de.srsoftware.web4rail.tiles; +import de.srsoftware.web4rail.BaseClass; + public class EndS extends Tile{ + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/EndW.java b/src/main/java/de/srsoftware/web4rail/tiles/EndW.java index d294165..d0db868 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/EndW.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/EndW.java @@ -1,3 +1,10 @@ package de.srsoftware.web4rail.tiles; -public class EndW extends Tile{} +import de.srsoftware.web4rail.BaseClass; + +public class EndW extends Tile{ + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } +} diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Eraser.java b/src/main/java/de/srsoftware/web4rail/tiles/Eraser.java index 1d3ea78..0c3694a 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Eraser.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Eraser.java @@ -1,5 +1,10 @@ package de.srsoftware.web4rail.tiles; -public class Eraser extends Tile { +import de.srsoftware.web4rail.BaseClass; +public class Eraser extends Tile { + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java index bf14ca5..7577e1a 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java @@ -11,6 +11,7 @@ import java.util.concurrent.TimeoutException; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Command; import de.srsoftware.web4rail.Command.Reply; import de.srsoftware.web4rail.Device; @@ -40,7 +41,6 @@ public class Relay extends Tile implements Device{ private String name = t("Relay"); protected boolean state = true; - private static final HashMap relays = new HashMap(); public static final boolean STATE_A = true,STATE_B=false; private static final String LABEL_A = "label_a"; private static final String LABEL_B = "label_b"; @@ -125,7 +125,6 @@ public class Relay extends Tile implements Device{ @Override public Tile position(int x, int y) { super.position(x, y); - relays.put(id(), this); return this; } @@ -161,6 +160,11 @@ public class Relay extends Tile implements Device{ } } + @Override + protected void removeChild(BaseClass child) { + // TODO Auto-generated method stub + } + public Relay setLabel(boolean state, String tx) { if (state) { stateLabelA = tx; @@ -235,19 +239,11 @@ public class Relay extends Tile implements Device{ return super.update(params); } - public static Collection list() { - return relays.values(); - } - - public static Relay get(Id relayId) { - return relays.get(relayId); - } - public static Select selector(Relay preselected, Collection exclude) { if (isNull(exclude)) exclude = new Vector(); Select select = new Select(Relay.class.getSimpleName()); new Tag("option").attr("value","0").content(t("unset")).addTo(select); - for (Relay relay : Relay.list()) { + for (Relay relay : BaseClass.listElements(Relay.class)) { if (exclude.contains(relay)) continue; Tag opt = select.addOption(relay.id, relay); if (relay == preselected) opt.attr("selected", "selected"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java index 3034e62..72feba3 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.Map; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -28,6 +29,14 @@ public class Shadow extends Tile{ return overlay; } + @Override + protected void removeChild(BaseClass child) { + if (child == overlay) { + overlay = null; + remove(); + } + } + @Override public Tag tag(Map replacements) throws IOException { Tag tag = super.tag(replacements); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java index 0fa7365..3e5c45f 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java @@ -7,6 +7,7 @@ import java.util.TreeSet; import java.util.Vector; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Plan.Direction; public abstract class Signal extends Tile implements Comparable{ @@ -37,6 +38,11 @@ public abstract class Signal extends Tile implements Comparable{ } public abstract boolean isAffectedFrom(Direction dir); + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } public boolean state(String state) { this.state = state; diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java b/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java index 2d5a678..1c84204 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -23,18 +24,23 @@ public class StraightH extends StretchableTile{ } } - @Override - public int width() { - return stretch; - } - @Override public List possibleDirections() { return List.of(Direction.EAST,Direction.WEST); } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } @Override protected String stretchType() { return t("Width"); - } + } + + @Override + public int width() { + return stretch; + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java index 52c09d4..5324717 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.tiles.Turnout.State; @@ -33,6 +34,11 @@ public class StraightV extends StretchableTile{ return List.of(Direction.NORTH,Direction.SOUTH); } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + @Override protected String stretchType() { return t("Height"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java b/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java index 4261a4c..c3e4580 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java @@ -11,6 +11,7 @@ import java.util.Vector; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; @@ -43,16 +44,20 @@ public class TextDisplay extends StretchableTile { formInputs.add(t("Text"),new Input(TEXT, text)); return super.properties(preForm, formInputs, postForm); } + + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } public static Select selector(TextDisplay preselected,Collection exclude) { if (isNull(exclude)) exclude = new Vector(); Select select = new Select(TextDisplay.class.getSimpleName()); new Tag("option").attr("value","0").content(t("unset")).addTo(select); - for (Tile tile : plan.tiles.values()) { - if (!(tile instanceof TextDisplay)) continue; - if (exclude.contains(tile)) continue; - Tag opt = select.addOption(tile.id(), tile); - if (tile == preselected) opt.attr("selected", "selected"); + for (TextDisplay display : BaseClass.listElements(TextDisplay.class)) { + if (exclude.contains(display)) continue; + Tag opt = select.addOption(display.id(), display); + if (display == preselected) opt.attr("selected", "selected"); } return select; } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index a902126..34e622d 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -251,10 +251,12 @@ public abstract class Tile extends BaseClass{ return super.properties(preForm, formInputs, postForm); } - public void remove(Route route) { - routes.remove(route); + @Override + public BaseClass remove() { + plan.stream("remove "+id()); + return super.remove(); } - + private static String replace(String line, Entry replacement) { String key = replacement.getKey(); Object val = replacement.getValue(); @@ -280,9 +282,9 @@ public abstract class Tile extends BaseClass{ return routes; } - public static void saveAll(HashMap tiles ,String filename) throws IOException { + public static void saveAll(String filename) throws IOException { BufferedWriter file = new BufferedWriter(new FileWriter(filename)); - for (Tile tile : tiles.values()) { + for (Tile tile : BaseClass.listElements(Tile.class)) { if (isNull(tile) || tile instanceof Shadow) continue; file.append(tile.json()+"\n"); } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java index 2576dea..97cc517 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java @@ -9,6 +9,7 @@ import java.util.concurrent.TimeoutException; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Command; import de.srsoftware.web4rail.Command.Reply; import de.srsoftware.web4rail.Device; @@ -139,6 +140,11 @@ public abstract class Turnout extends Tile implements Device{ } } + @Override + protected void removeChild(BaseClass child) { + // this class has no child elements + } + public State state() { return state; } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java index a188132..7a6988c 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java @@ -8,7 +8,7 @@ import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; -public class TurnoutL extends Turnout { +public abstract class TurnoutL extends Turnout { private static final String LEFT = "left"; diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java index 4e6d1be..35ad15b 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java @@ -8,7 +8,7 @@ import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; -public class TurnoutR extends Turnout { +public abstract class TurnoutR extends Turnout { private static final String RIGHT = "right";