From 09a7c9f5b7672225fd90d0a1e9fc74a572b40ddc Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Mon, 21 Sep 2020 12:07:10 +0200 Subject: [PATCH] overhauling save and load routines --- pom.xml | 2 +- .../de/srsoftware/web4rail/Application.java | 17 +--- .../java/de/srsoftware/web4rail/Plan.java | 84 +++--------------- .../java/de/srsoftware/web4rail/Route.java | 71 +++++++++------ .../de/srsoftware/web4rail/moving/Car.java | 50 ++++++++++- .../web4rail/moving/Locomotive.java | 13 ++- .../de/srsoftware/web4rail/moving/Train.java | 43 ++++++++-- .../de/srsoftware/web4rail/tiles/Block.java | 33 +++++-- .../web4rail/tiles/StretchableTile.java | 15 +++- .../de/srsoftware/web4rail/tiles/Tile.java | 86 +++++++++++++++---- 10 files changed, 256 insertions(+), 158 deletions(-) diff --git a/pom.xml b/pom.xml index 5bbdb8e..2d33a19 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.3.4 + 0.3.5 Web4Rail Java Model Railway Control https://github.com/StephanRichter/Web4Rail diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java index b756339..ac20da0 100644 --- a/src/main/java/de/srsoftware/web4rail/Application.java +++ b/src/main/java/de/srsoftware/web4rail/Application.java @@ -15,8 +15,6 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.HashMap; -import java.util.Random; -import java.util.Vector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,9 +24,6 @@ import com.sun.net.httpserver.HttpServer; import de.keawe.localconfig.Configuration; import de.keawe.tools.translations.Translation; -import de.srsoftware.web4rail.moving.Locomotive; -import de.srsoftware.web4rail.moving.Train; -import de.srsoftware.web4rail.tiles.Block; public class Application { private static Plan plan; @@ -52,17 +47,7 @@ public class Application { } catch (FileNotFoundException e) { plan = new Plan(); } - Locomotive BR110 = new Locomotive("BR110"); - Locomotive BR130 = new Locomotive("BR130"); - Vector blocks = new Vector<>(plan.blocks()); - Random rand = new Random(); - Block block1 = blocks.get(rand.nextInt(blocks.size())); - if (block1 != null) block1.train(new Train(BR110)); - Block block2 = null; - do { - block2 = blocks.get(rand.nextInt(blocks.size())); - } while (block2 == block1); - if (block2 != null) block2.train(new Train(BR130)); + Desktop.getDesktop().browse(URI.create("http://localhost:"+config.getInt(PORT)+"/plan")); } diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 50104ac..49510a2 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -1,10 +1,5 @@ package de.srsoftware.web4rail; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.lang.reflect.InvocationTargetException; @@ -19,7 +14,6 @@ import java.util.Map.Entry; import java.util.Stack; import java.util.Vector; -import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,7 +40,6 @@ import de.srsoftware.web4rail.tiles.EndS; import de.srsoftware.web4rail.tiles.EndW; import de.srsoftware.web4rail.tiles.Eraser; 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; @@ -54,7 +47,6 @@ import de.srsoftware.web4rail.tiles.SignalW; import de.srsoftware.web4rail.tiles.StraightH; import de.srsoftware.web4rail.tiles.StraightV; import de.srsoftware.web4rail.tiles.Tile; -import de.srsoftware.web4rail.tiles.Turnout; import de.srsoftware.web4rail.tiles.Turnout.State; import de.srsoftware.web4rail.tiles.Turnout3E; import de.srsoftware.web4rail.tiles.TurnoutLE; @@ -151,7 +143,7 @@ public class Plan { remove(erased); return erased == null ? null : t("Removed {}.",erased); } - if (configJson != null) tile.configure(new JSONObject(configJson)); + //if (configJson != null) tile.configure(new JSONObject(configJson)); set(x, y, tile); return t("Added {}",tile.getClass().getSimpleName()); } @@ -257,60 +249,14 @@ public class Plan { } public static Plan load(String filename) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { - Plan result = new Plan(); - File file = new File(filename+".plan"); - BufferedReader br = new BufferedReader(new FileReader(file)); - while (br.ready()) { - String line = br.readLine().trim(); - String[] parts = line.split(":",4); - try { - String x = parts[0]; - String y = parts[1]; - String clazz = parts[2]; - result.addTile(clazz, x, y, parts.length>3 ? parts[3] : null); - } catch (Exception e) { - LOG.warn("Was not able to load \"{}\":",line,e); - } - } - br.close(); - file = new File(filename+".routes"); - if (file.exists()) { - br = new BufferedReader(new FileReader(file)); - while (br.ready()) { - String line = br.readLine().trim(); - String[] parts = line.split("=",2); - try { - //String id = parts[0]; - JSONObject json = new JSONObject(parts[1]); - Route route = new Route(); - json.getJSONArray(Route.PATH).forEach(entry -> { - JSONObject pos = (JSONObject) entry; - Tile tile = result.get(pos.getInt("x"),pos.getInt("y"),false); - if (route.path().isEmpty()) { - route.start((Block) tile,null); - } else { - route.add(tile, null); - } - }); - json.getJSONArray(Route.SIGNALS).forEach(entry -> { - JSONObject pos = (JSONObject) entry; - Tile tile = result.get(pos.getInt("x"),pos.getInt("y"),false); - route.addSignal((Signal) tile); - }); - json.getJSONArray(Route.TURNOUTS).forEach(entry -> { - JSONObject pos = (JSONObject) entry; - Tile tile = result.get(pos.getInt("x"),pos.getInt("y"),false); - route.addTurnout((Turnout) tile, Turnout.State.valueOf(pos.getString(Turnout.STATE))); - }); - if (json.has(Route.NAME)) route.name(json.getString(Route.NAME)); - result.registerRoute(route); - } catch (Exception e) { - LOG.warn("Was not able to load \"{}\":",line,e); - } - } - br.close(); - } else LOG.debug("{} not found.",file); - return result; + try { + Car.loadAll(filename+".cars"); + Train.loadAll(filename+".trains"); + } catch (Exception e) {} + Plan plan = new Plan(); + Tile.loadAll(filename+".plan",plan); + Route.loadAll(filename+".routes",plan); + return plan; } private Tag menu() throws IOException { @@ -460,16 +406,10 @@ public class Plan { private String saveTo(String name) throws IOException { if (name == null || name.isEmpty()) throw new NullPointerException("Name must not be empty!"); Car.saveAll(name+".cars"); - Tile.saveAll(this.tiles,name+".tiles"); + Tile.saveAll(tiles,name+".plan"); Train.saveAll(name+".trains"); // refers to cars, blocks - - File file = new File(name+".routes"); - BufferedWriter br = new BufferedWriter(new FileWriter(file)); - for (Route route: routes.values()) { - br.append(route.id()+"="+route.json()+"\n"); - } - br.close(); - return t("Plan saved as \"{}\".",file); + Route.saveAll(routes,name+".routes"); // refers to tiles + return t("Plan saved as \"{}\".",name); } public void set(int x,int y,Tile tile) throws IOException { diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 08fdcc5..5ede391 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -1,5 +1,7 @@ package de.srsoftware.web4rail; +import java.io.BufferedWriter; +import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -140,10 +142,10 @@ public class Route { public void finish() throws IOException { - startBlock.train(null); - endBlock.train(train.heading(endDirection.inverse())); + startBlock.train(null); train.route = null; unlock(); + endBlock.train(train.heading(endDirection.inverse())); } public String id() { @@ -151,12 +153,12 @@ public class Route { StringBuilder sb = new StringBuilder(); for (int i=0; i0) sb.append(" – "); + if (i>0) sb.append("-"); if (tile instanceof Block) { sb.append(((Block)tile).name); if (i>0) break; // Kontakt nach dem Ziel-Block nicht mitnehmen } else { - sb.append(tile.x+":"+tile.y); + sb.append(tile.id()); } } id = sb.toString(); @@ -170,22 +172,21 @@ public class Route { } return true; } - public String json() { JSONObject props = new JSONObject(); - JSONArray path = new JSONArray(); - for (Tile t : this.path) path.put(new JSONObject(Map.of("x",t.x,"y",t.y))); - props.put(PATH, path); + Vector tileIds = new Vector(); + for (Tile t : this.path) tileIds.add(t.id()); + props.put(PATH, tileIds); - JSONArray signals = new JSONArray(); - for (Tile t : this.signals) signals.put(new JSONObject(Map.of("x",t.x,"y",t.y))); - props.put(SIGNALS, signals); + Vector signalIds = new Vector(); // list all signals affecting this route + for (Tile t : this.signals) signalIds.add(t.id()); + props.put(SIGNALS, signalIds); JSONArray turnouts = new JSONArray(); for (Entry entry : this.turnouts.entrySet()) { Turnout t = entry.getKey(); - turnouts.put(new JSONObject(Map.of("x",t.x,"y",t.y,Turnout.STATE,entry.getValue()))); + turnouts.put(new JSONObject(Map.of(Turnout.ID,t.id(),Turnout.STATE,entry.getValue()))); } props.put(TURNOUTS, turnouts); @@ -193,6 +194,11 @@ public class Route { return props.toString(); } + + public static void loadAll(String string, Plan plan) { + // TODO Auto-generated method stub + + } public Route lock(Train train) throws IOException { this.train = train; @@ -278,22 +284,14 @@ public class Route { return form; } - - public Route start(Block block,Direction from) { - // add those fields to clone, too! - contacts = new Vector(); - signals = new Vector(); - path = new Vector(); - turnouts = new HashMap<>(); - startBlock = block; - startDirection = from; - path.add(block); - return this; - } - - @Override - public String toString() { - return getClass().getSimpleName()+"("+name()+")"; + + public static void saveAll(HashMap routes, String filename) throws IOException { + BufferedWriter file = new BufferedWriter(new FileWriter(filename)); + for (Entry entry : routes.entrySet()) { + Route route = entry.getValue(); + file.write(route.json()+"\n"); + } + file.close(); } public void setLast(State state) { @@ -306,6 +304,18 @@ public class Route { for (Signal signal : signals) signal.state(state == null ? "go" : state); return this; } + + public Route start(Block block,Direction from) { + // add those fields to clone, too! + contacts = new Vector(); + signals = new Vector(); + path = new Vector(); + turnouts = new HashMap<>(); + startBlock = block; + startDirection = from; + path.add(block); + return this; + } public Block startBlock() { return (Block) path.get(0); @@ -314,6 +324,11 @@ public class Route { protected static String t(String txt, Object...fills) { return Translation.get(Application.class, txt, fills); } + + @Override + public String toString() { + return getClass().getSimpleName()+"("+name()+")"; + } public Route unlock() throws IOException { setSignals(Signal.STOP); diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index 2c172e6..ee90abc 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -1,6 +1,8 @@ package de.srsoftware.web4rail.moving; +import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Date; @@ -13,7 +15,7 @@ public class Car { private static final String ID = "id"; private static final String NAME = "name"; private static final String LENGTH = "length"; - private static HashMap cars = new HashMap(); + static HashMap cars = new HashMap(); public int length; private String name; private String id; @@ -24,9 +26,27 @@ public class Car { public Car(String name, String id) { this.name = name; - this.id = id == null ? ""+new Date().getTime() : id; - cars.put(this.id, this); + if (id == null) { + try { // make sure multiple consecutive creations get different ids + Thread.sleep(1); + } catch (InterruptedException e) {} + id = ""+new Date().getTime(); + } + this.id = id; + cars.put(id, this); + } + + public static Car get(String nameOrId) { + HashMap cs = cars; + Car car = cars.get(nameOrId); + if (car == null) { + for (Car c : cars.values()) { + if (c.name.equals(nameOrId)) car = c; + } + } + return car; } + public String id() { return id; @@ -44,10 +64,32 @@ public class Car { return name; } + public static void loadAll(String filename) throws IOException { + cars.clear(); + BufferedReader file = new BufferedReader(new FileReader(filename)); + String line = file.readLine(); + while (line != null) { + JSONObject json = new JSONObject(line); + String name = json.getString(Car.NAME); + String id = json.getString(Car.ID); + Car car = json.has(Locomotive.LOCOMOTIVE) ? new Locomotive(name, id) : new Car(name,id); + car.load(json); + + line = file.readLine(); + } + file.close(); + } + + protected void load(JSONObject json) { + if (json.has(ID)) id = json.getString(ID); + if (json.has(LENGTH)) length = json.getInt(LENGTH); + } + 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"); + Car c = entry.getValue(); + file.write(c.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 2c414ca..35522f0 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java @@ -5,13 +5,17 @@ import org.json.JSONObject; public class Locomotive extends Car { private static final String REVERSE = "reverse"; - private static final String LOCOMOTIVE = "locomotive"; + public static final String LOCOMOTIVE = "locomotive"; private boolean reverse = false; public Locomotive(String name) { super(name); } + public Locomotive(String name, String id) { + super(name,id); + } + @Override public JSONObject json() { JSONObject json = super.json(); @@ -20,7 +24,12 @@ public class Locomotive extends Car { json.put(LOCOMOTIVE, loco); return json; } - + + @Override + protected void load(JSONObject json) { + super.load(json); + if (json.has(REVERSE)) reverse = json.getBoolean(REVERSE); + } public void setSpeed(int v) { // TODO Auto-generated method stub diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 100e33b..d0107fc 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -1,6 +1,8 @@ package de.srsoftware.web4rail.moving; +import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Date; @@ -38,8 +40,6 @@ public class Train { private static final String NAME = "name"; private String name = null; - private static final String BLOCK = "block"; - private Block block = null; private static final String ROUTE = "route"; public Route route; @@ -56,7 +56,8 @@ public class Train { private static final String LOCOS = "locomotives"; private Vector locos = new Vector(); - + private Block block = null; + private class Autopilot extends Thread{ @Override public void run() { @@ -90,16 +91,21 @@ public class Train { private Autopilot autopilot = null; public Train(Locomotive loco) { - id = new Date().getTime(); + this(loco,null); + } + + public Train(Locomotive loco, Long id) { + if (id == null) id = new Date().getTime(); + this.id = id; add(loco); trains.put(id, this); } + private JSONObject json() { JSONObject json = new JSONObject(); json.put(ID, id); json.put(NAME,name); - if (block != null) json.put(BLOCK, block.id()); if (route != null) json.put(ROUTE, route.id()); if (direction != null) json.put(DIRECTION, direction); json.put(PUSH_PULL, pushPull); @@ -154,6 +160,11 @@ public class Train { this.block = block; } + public static Train get(long id) { + return trains.get(id); + } + + public Train heading(Direction dir) { direction = dir; return this; @@ -165,6 +176,28 @@ public class Train { for (Car car : cars) result += car.length; return result; } + + public static void loadAll(String filename) throws IOException { + BufferedReader file = new BufferedReader(new FileReader(filename)); + String line = file.readLine(); + while (line != null) { + JSONObject json = new JSONObject(line); + + long id = json.getLong(ID); + + Train train = new Train(null,id); + train.load(json); + + line = file.readLine(); + } + file.close(); + } + + private void load(JSONObject json) { + pushPull = json.getBoolean(PUSH_PULL); + for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get((String)id)); + for (Object id : json.getJSONArray(CARS)) add(Car.get((String)id)); + } public String name() { String result = (name != null ? name : locos.firstElement().name()); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index 591687c..35ada1e 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -14,11 +14,13 @@ import de.srsoftware.web4rail.tags.Checkbox; public abstract class Block extends StretchableTile{ private static final String NAME = "name"; - private static final String ALLOW_TURN = "allowTurn"; public String name = "Block"; - private Train train; + + private static final String ALLOW_TURN = "allowTurn"; public boolean turnAllowed = false; + private static final String TRAIN = "train"; + @Override public JSONObject config() { JSONObject config = super.config(); @@ -27,16 +29,31 @@ public abstract class Block extends StretchableTile{ } @Override - public void configure(JSONObject config) { - super.configure(config); - if (config.has(NAME)) name = config.getString(NAME); + public boolean free() { + return train == null && super.free(); } @Override - public boolean free() { - return train == null && super.free(); + public JSONObject json() { + JSONObject json = super.json(); + json.put(NAME, name); + json.put(ALLOW_TURN, turnAllowed); + if (train != null) json.put(TRAIN, train.id); + return json; } - + + @Override + protected Tile load(JSONObject json) throws IOException { + super.load(json); + name = json.has(NAME) ? json.getString(NAME) : "Block"; + turnAllowed = json.has(ALLOW_TURN) && json.getBoolean(ALLOW_TURN); + if (json.has(TRAIN)) { + Train tr = Train.get(json.getLong(TRAIN)); + train(tr); + } + return this; + } + @Override public Tag propForm() { Tag form = super.propForm(); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java index 702cadd..32a501b 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java @@ -1,5 +1,6 @@ package de.srsoftware.web4rail.tiles; +import java.io.IOException; import java.util.HashMap; import java.util.Map.Entry; @@ -19,9 +20,17 @@ public abstract class StretchableTile extends Tile { } @Override - public void configure(JSONObject config) { - super.configure(config); - if (config.has(LENGTH)) setLength(config.getInt(LENGTH)); + public JSONObject json() { + JSONObject json = super.json(); + if (length > 1) json.put(LENGTH, length); + return json; + } + + @Override + protected Tile load(JSONObject json) throws IOException { + super.load(json); + if (json.has(LENGTH)) length = json.getInt(LENGTH); + return this; } @Override diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index de7fa91..47ee1e0 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -1,9 +1,12 @@ package de.srsoftware.web4rail.tiles; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; +import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; @@ -31,20 +34,20 @@ import de.srsoftware.web4rail.tags.Radio; public abstract class Tile { - private static final String ID = "id"; + public static final String ID = "id"; private static final String TYPE = "type"; private static final String LOCKED = "locked"; private static final String POS = "pos"; private static final String X = "x"; - private static final Object Y = "y"; + private static final String Y = "y"; public int x = -1,y = -1; private static final String ROUTE = "route"; protected Route route; private static final String OCCUPIED = "occupied"; - private Train train; + protected Train train; private static final String ONEW_WAY = "one_way"; protected Direction oneWay = null; @@ -63,17 +66,6 @@ public abstract class Tile { if (train != null) classes.add(OCCUPIED); return classes; } - - public JSONObject json() { - JSONObject json = new JSONObject(); - json.put(ID, id()); - json.put(TYPE, getClass().getSimpleName()); - JSONObject pos = new JSONObject(Map.of(X,x,Y,y)); - json.put(POS, pos); - if (route != null) json.put(ROUTE, route.id()); - if (oneWay != null) json.put(ONEW_WAY, oneWay); - return json; - } public void add(Route route) { this.routes.add(route); @@ -95,9 +87,6 @@ public abstract class Tile { return new HashMap<>(); } - - public void configure(JSONObject config) {} - public boolean free() { return route == null; } @@ -107,20 +96,64 @@ public abstract class Tile { } public String id() { - return "tile-"+x+"-"+y; + return x+":"+y; + } + + private static void inflate(String clazz, JSONObject json, Plan plan) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, IOException { + clazz = Tile.class.getName().replace(".Tile", "."+clazz); + Tile tile = (Tile) Tile.class.getClassLoader().loadClass(clazz).getDeclaredConstructor().newInstance(); + tile.plan(plan); + tile.load(json); + plan.set(tile.x, tile.y, tile); + } + + public JSONObject json() { + JSONObject json = new JSONObject(); + json.put(TYPE, getClass().getSimpleName()); + JSONObject pos = new JSONObject(Map.of(X,x,Y,y)); + json.put(POS, pos); + if (route != null) json.put(ROUTE, route.id()); + if (oneWay != null) json.put(ONEW_WAY, oneWay); + return json; } public int len() { return 1; } + public static void loadAll(String filename, Plan plan) throws IOException { + BufferedReader file = new BufferedReader(new FileReader(filename)); + String line = file.readLine(); + while (line != null) { + JSONObject json = new JSONObject(line); + String clazz = json.getString(TYPE); + + try { + Tile.inflate(clazz,json,plan); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | ClassNotFoundException e) { + e.printStackTrace(); + } + + line = file.readLine(); + } + file.close(); + } + + protected Tile load(JSONObject json) throws IOException { + JSONObject pos = json.getJSONObject(POS); + x = pos.getInt(X); + y = pos.getInt(Y); + return this; + } + public void lock(Route route) throws IOException { this.route = route; plan.place(this); } - public void plan(Plan plan) { + public Tile plan(Plan plan) { this.plan = plan; + return this; } public Tile position(int x, int y) { @@ -309,4 +342,19 @@ public abstract class Tile { } return this; } + + /* + if (clazz == null) throw new NullPointerException(TILE+" must not be null!"); + Class tc = Tile.class; + clazz = tc.getName().replace(".Tile", "."+clazz); + Tile tile = (Tile) tc.getClassLoader().loadClass(clazz).getDeclaredConstructor().newInstance(); + if (tile instanceof Eraser) { + Tile erased = get(x,y,true); + remove(erased); + return erased == null ? null : t("Removed {}.",erased); + } + if (configJson != null) tile.configure(new JSONObject(configJson)); + set(x, y, tile); + return t("Added {}",tile.getClass().getSimpleName()); +}*/ }