From 5cdc8c32121dc7f7f7ee42e30c8a21f6ea3c56ab Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 10 Dec 2020 00:55:03 +0100 Subject: [PATCH] overhauled Car.manager and Locomotive.manager to show max speeds correctly, implemented saving of reverse speeds --- .../de/srsoftware/web4rail/moving/Car.java | 50 +++++++++---------- .../web4rail/moving/Locomotive.java | 8 +-- .../de/srsoftware/web4rail/moving/Train.java | 18 ++++--- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index 08916ab..e4f1733 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -9,8 +9,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.TreeSet; +import java.util.stream.Collectors; import org.json.JSONObject; import org.slf4j.Logger; @@ -31,7 +31,6 @@ import de.srsoftware.web4rail.tags.Table; public class Car extends BaseClass implements Comparable{ protected static final Logger LOG = LoggerFactory.getLogger(Car.class); - static HashMap cars = new HashMap(); public static final String NAME = "name"; public static boolean FORWARD = true; @@ -57,14 +56,13 @@ public class Car extends BaseClass implements Comparable{ public Car(String name, Id id) { this.name = name; - if (isNull(id)) id = new Id(); this.id = id; - cars.put(id, this); + register(); } public static Object action(HashMap params,Plan plan) throws IOException { String id = params.get(ID); - Car car = id == null ? null : Car.get(id); + Car car = id == null ? null : Car.get(new Id(id)); switch (params.get(ACTION)) { case ACTION_ADD: @@ -105,15 +103,12 @@ public class Car extends BaseClass implements Comparable{ return (stockId+":"+name).compareTo(o.stockId+":"+o.name); } - public static Car get(Object id) { - return isNull(id) ? null : cars.get(new Id(""+id)); // try to get by id - } - public JSONObject json() { JSONObject json = super.json(); json.put(NAME, name); json.put(LENGTH, length); if (maxSpeedForward != 0) json.put(MAX_SPEED, maxSpeedForward); + if (maxSpeedReverse != 0) json.put(MAX_SPEED_REVERSE, maxSpeedReverse); json.put(STOCK_ID, stockId); if (!tags.isEmpty()) json.put(TAGS, tags); return json; @@ -133,7 +128,6 @@ public class Car extends BaseClass implements Comparable{ } public static void loadAll(String filename, Plan plan) throws IOException { - cars.clear(); BufferedReader file = new BufferedReader(new FileReader(filename, UTF8)); String line = file.readLine(); while (line != null) { @@ -167,26 +161,30 @@ public class Car extends BaseClass implements Comparable{ new Tag("p").content(t("Click on a name to edit the entry.")).addTo(win); Table table = new Table().addHead(t("Stock ID"),t("Name"),t("Max. Speed",speedUnit),t("Length"),t("Train"),t("Tags"),t("Actions")); - cars.values() - .stream() - .filter(car -> !(car instanceof Locomotive)) - .sorted((c1,c2)->{ - try { - return Integer.parseInt(c1.stockId)-Integer.parseInt(c2.stockId); - } catch (NumberFormatException nfe) { - return c1.stockId.compareTo(c2.stockId); - } - - }) - .forEach(car -> table.addRow( + List cars = BaseClass.listElements(Car.class) + .stream() + .filter(car -> !(car instanceof Locomotive)) + .sorted((c1,c2)->{ + try { + return Integer.parseInt(c1.stockId)-Integer.parseInt(c2.stockId); + } catch (NumberFormatException nfe) { + return c1.stockId.compareTo(c2.stockId); + } + + }).collect(Collectors.toList()); + for (Car car : cars) { + String maxSpeed = (car.maxSpeedForward == 0 ? "–":""+car.maxSpeedForward)+NBSP; + if (car.maxSpeedReverse != car.maxSpeedForward) maxSpeed += "("+car.maxSpeedReverse+")"+NBSP; + + table.addRow( car.stockId, car.link(), - car.maxSpeedForward == 0 ? "–":(car.maxSpeedForward+NBSP+speedUnit), + maxSpeed+speedUnit, car.length+NBSP+lengthUnit, isSet(car.train) ? car.train.link("span", car.train) : "", String.join(", ", car.tags()), - car.cloneButton() - )); + car.cloneButton()); + } table.addTo(win); Form form = new Form("add-car-form"); @@ -240,7 +238,7 @@ public class Car extends BaseClass implements Comparable{ public static void saveAll(String filename) throws IOException { BufferedWriter file = new BufferedWriter(new FileWriter(filename)); - for (Entry entry: cars.entrySet()) file.write(entry.getValue().json()+"\n"); + for (Car car : BaseClass.listElements(Car.class)) file.write(car.json()+"\n"); file.close(); } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java index 3f00e82..bb199dc 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java @@ -45,7 +45,7 @@ public class Locomotive extends Car implements Constants,Device{ public static Object action(HashMap params, Plan plan) throws IOException { String id = params.get(ID); - Locomotive loco = id == null ? null : Locomotive.get(id); + Locomotive loco = id == null ? null : BaseClass.get(new Id(id)); switch (params.get(ACTION)) { case ACTION_ADD: new Locomotive(params.get(Locomotive.NAME)).parent(plan).register(); @@ -163,12 +163,6 @@ public class Locomotive extends Car implements Constants,Device{ return properties(); } - public static Locomotive get(Object id) { - Car car = Car.get(id); - if (car instanceof Locomotive) return (Locomotive) car; - return null; - } - private void init() { if (init) return; String proto = null; diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 96d6bc2..cd697c1 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -178,8 +178,9 @@ public class Train extends BaseClass implements Comparable { private Object addCar(HashMap params) { LOG.debug("addCar({})",params); - if (!params.containsKey(CAR_ID)) return t("No car id passed to Train.addCar!"); - Car car = Car.get(params.get(CAR_ID)); + String carId = params.get(CAR_ID); + if (isNull(carId)) return t("No car id passed to Train.addCar!"); + Car car = BaseClass.get(new Id(carId)); if (isNull(car)) return t("No car with id \"{}\" known!",params.get(CAR_ID)); add(car); return properties(); @@ -266,7 +267,9 @@ public class Train extends BaseClass implements Comparable { } private static Object create(HashMap params, Plan plan) { - Locomotive loco = (Locomotive) Locomotive.get(params.get(Train.LOCO_ID)); + String locoId = params.get(Train.LOCO_ID); + if (isNull(locoId)) return t("Need loco id to create new train!"); + Locomotive loco = BaseClass.get(new Id(locoId)); if (isNull(loco)) return t("unknown locomotive: {}",params.get(ID)); Train train = new Train(loco); train.parent(plan); @@ -307,8 +310,9 @@ public class Train extends BaseClass implements Comparable { } private Object dropCar(HashMap params) { - Car car = Car.get(params.get(CAR_ID)); - + String carId = params.get(CAR_ID); + if (isNull(carId)) return t("Cannot drop car without car id!"); + Car car = BaseClass.get(new Id(carId)); if (isSet(car)) { cars.remove(car); car.train(null); @@ -402,9 +406,9 @@ public class Train extends BaseClass implements Comparable { if (json.has(TRACE)) json.getJSONArray(TRACE).forEach(elem -> { trace.add(plan.get(new Id(elem.toString()), false).set(this)); }); if (json.has(BLOCK)) currentBlock = (Block) plan.get(new Id(json.getString(BLOCK)), false).set(this); // do not move this up! during set, other fields will be referenced! if (json.has(LOCOS)) { // for downward compatibility - for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get(id)); + for (Object id : json.getJSONArray(LOCOS)) add(BaseClass.get(new Id(""+id))); } - for (Object id : json.getJSONArray(CARS)) add(Car.get(id)); + for (Object id : json.getJSONArray(CARS)) add(BaseClass.get(new Id(""+id))); super.load(json); return this; }