From ce75a0c027643c544a97f29cc96542a04f668cb6 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 15 Sep 2020 12:50:17 +0200 Subject: [PATCH 1/2] started to implement route search --- .../de/srsoftware/web4rail/Application.java | 7 +++- .../de/srsoftware/web4rail/Connector.java | 31 +++++++++++++++++ .../java/de/srsoftware/web4rail/Plan.java | 26 +++++++++++--- .../java/de/srsoftware/web4rail/Route.java | 34 +++++++++++++++++++ .../de/srsoftware/web4rail/tiles/Block.java | 5 ++- .../de/srsoftware/web4rail/tiles/BlockH.java | 10 +++++- .../de/srsoftware/web4rail/tiles/BlockV.java | 8 +++++ .../de/srsoftware/web4rail/tiles/DiagES.java | 17 +++++++++- .../de/srsoftware/web4rail/tiles/DiagWN.java | 17 ++++++++++ .../srsoftware/web4rail/tiles/StraightH.java | 17 ++++++++++ .../de/srsoftware/web4rail/tiles/Tile.java | 8 +++++ .../srsoftware/web4rail/tiles/TurnoutWN.java | 17 +++++++++- 12 files changed, 188 insertions(+), 9 deletions(-) create mode 100644 src/main/java/de/srsoftware/web4rail/Connector.java diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java index 8928aa4..56cb576 100644 --- a/src/main/java/de/srsoftware/web4rail/Application.java +++ b/src/main/java/de/srsoftware/web4rail/Application.java @@ -3,6 +3,7 @@ package de.srsoftware.web4rail; import java.awt.Desktop; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; @@ -39,7 +40,11 @@ public class Application { server.createContext("/js" , client -> sendFile(client)); server.setExecutor(java.util.concurrent.Executors.newCachedThreadPool()); server.start(); - plan = Plan.load("default.plan"); + try { + plan = Plan.load("default.plan"); + } catch (FileNotFoundException e) { + plan = new Plan(); + } Desktop.getDesktop().browse(URI.create("http://localhost:"+config.getInt(PORT)+"/plan")); } diff --git a/src/main/java/de/srsoftware/web4rail/Connector.java b/src/main/java/de/srsoftware/web4rail/Connector.java new file mode 100644 index 0000000..01d9fff --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/Connector.java @@ -0,0 +1,31 @@ +package de.srsoftware.web4rail; + +public class Connector { + + private String from; + private int y; + private int x; + + public Connector(int x, int y, String from) { + this.x = x; + this.y = y; + this.from = from; + } + + public String from() { + return from; + } + + public int x() { + return x; + } + + public int y() { + return y; + } + + @Override + public String toString() { + return getClass().getSimpleName()+"("+x+", "+y+", from "+from+")"; + } +} diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index d9fb6b8..6a11e0e 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -7,8 +7,10 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map.Entry; import java.util.Vector; @@ -59,10 +61,10 @@ public class Plan { private static final String Y = "y"; private static final String FILE = "file"; private static final String DIRECTION = "direction"; - private static final String EAST = "east"; - private static final String WEST = "west"; - private static final String SOUTH = "south"; - private static final String NORTH = "north"; + public static final String EAST = "east"; + public static final String WEST = "west"; + public static final String SOUTH = "south"; + public static final String NORTH = "north"; private HashMap> tiles = new HashMap>(); private HashSet blocks = new HashSet(); @@ -88,12 +90,28 @@ public class Plan { } private String analyze() { + Vector routes = new Vector(); for (Block block : blocks) { LOG.debug("searching routes from {}",block); + for (Connector con : block.startPoints()) { + routes.addAll(follow(new Route().start(block),con)); + } } return "analyze() not implemented, yet!"; } + private Collection follow(Route route, Connector con) { + LOG.debug("follow({}, {})",route,con); + Tile tile = get(con.x(),con.y()); + Vector result = new Vector<>(); + if (tile == null) return result; + route.add(tile); + List connectors = tile.connections(con.from()); + Listroutes = route.multiply(connectors.size()); + for (int i=0; i column = tiles.get(x); return column == null ? null : column.get(y); diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 6b044b6..f6e3a36 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -1,5 +1,39 @@ package de.srsoftware.web4rail; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.tiles.Block; +import de.srsoftware.web4rail.tiles.Tile; + public class Route { + + private Vector path; + + public void add(Tile tile) { + path.add(tile); + } + + protected Route clone() { + Route clone = new Route(); + clone.path = new Vector<>(path); + return clone; + } + + public List multiply(int size) { + Vector routes = new Vector(); + for (int i=0; i(); + path.add(block); + return this; + } + @Override + public String toString() { + return getClass().getSimpleName()+"("+path+")"; + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index b42d9b5..c736e9d 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -1,10 +1,13 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; import java.util.Set; +import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Route; -import de.srsoftware.web4rail.tiles.StretchableTile; public abstract class Block extends StretchableTile{ public abstract Set routes(); + + public abstract List startPoints(); } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java b/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java index eee81b4..d59ffcb 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java @@ -2,12 +2,15 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Route; public class BlockH extends Block{ @@ -45,10 +48,15 @@ public class BlockH extends Block{ } @Override - public Set routes() { + public Set routes() { return null; } + @Override + public List startPoints() { + return List.of(new Connector(x-1, y, Plan.EAST),new Connector(x+len(), y, Plan.WEST)); + } + @Override public Tag tag(Map replacements) throws IOException { if (replacements == null) replacements = new HashMap(); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java b/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java index accddba..39598c2 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java @@ -2,12 +2,15 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Route; public class BlockV extends Block{ @@ -49,6 +52,11 @@ public class BlockV extends Block{ return null; } + @Override + public List startPoints() { + return List.of(new Connector(x,y-1,Plan.SOUTH),new Connector(x,y+height(),Plan.NORTH)); + } + @Override public Tag tag(Map replacements) throws IOException { if (replacements == null) replacements = new HashMap(); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java index 4543af6..cd93551 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagES.java @@ -1,6 +1,21 @@ package de.srsoftware.web4rail.tiles; -public class DiagES extends Tile{ +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; +public class DiagES extends Tile{ + @Override + public List connections(String from) { + switch (from) { + case Plan.SOUTH: + return List.of(new Connector(x+1,y,Plan.WEST)); + case Plan.EAST: + return List.of(new Connector(x,y+1,Plan.NORTH)); + } + return new Vector<>(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java index e8f82a9..8bf39d8 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagWN.java @@ -1,4 +1,21 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class DiagWN extends Tile{ + + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x-1,y,Plan.EAST)); + case Plan.WEST: + return List.of(new Connector(x,y-1,Plan.SOUTH)); + } + return new Vector<>(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java b/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java index e501425..c3596d4 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java @@ -1,7 +1,24 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class StraightH extends StretchableTile{ + @Override + public List connections(String from) { + switch (from) { + case Plan.WEST: + return List.of(new Connector(x+len(),y,from)); + case Plan.EAST: + return List.of(new Connector(x-1,y,from)); + } + return new Vector<>(); + } + @Override public int len() { return length; diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 416b1d1..99095ad 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -5,9 +5,11 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; +import java.util.Vector; import org.json.JSONObject; import org.slf4j.Logger; @@ -16,6 +18,7 @@ import org.slf4j.LoggerFactory; import de.keawe.tools.translations.Translation; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Application; +import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Window; public abstract class Tile { @@ -32,6 +35,11 @@ public abstract class Tile { public JSONObject config() { return new JSONObject(); } + + public List connections(String from){ + return new Vector<>(); + } + public void configure(JSONObject config) {} diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutWN.java b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutWN.java index 4cd30d2..6b10c3f 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutWN.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutWN.java @@ -1,7 +1,22 @@ package de.srsoftware.web4rail.tiles; -public class TurnoutWN extends Turnout{ +import java.util.List; +import java.util.Vector; +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; +public class TurnoutWN extends Turnout{ + @Override + public List connections(String from) { + switch (from) { + case Plan.WEST: + return List.of(new Connector(x+1,y,from),new Connector(x, y-1, Plan.SOUTH)); + case Plan.EAST: + case Plan.NORTH: + return List.of(new Connector(x-1,y,Plan.EAST)); + } + return new Vector<>(); + } } From 467c8ea1c1e71564e1b384d8c781fec93a046265 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 15 Sep 2020 14:34:15 +0200 Subject: [PATCH 2/2] implemented route detection --- .../java/de/srsoftware/web4rail/Plan.java | 20 ++++++------- .../java/de/srsoftware/web4rail/Route.java | 3 +- .../de/srsoftware/web4rail/tiles/Cross.java | 9 ++++++ .../de/srsoftware/web4rail/tiles/CrossH.java | 28 ++++++++++++++++++- .../de/srsoftware/web4rail/tiles/CrossV.java | 9 +++++- .../de/srsoftware/web4rail/tiles/DiagNE.java | 16 +++++++++++ .../de/srsoftware/web4rail/tiles/DiagSW.java | 17 ++++++++++- .../de/srsoftware/web4rail/tiles/Shadow.java | 11 ++++++++ .../srsoftware/web4rail/tiles/StraightV.java | 17 +++++++++++ .../srsoftware/web4rail/tiles/TurnoutNW.java | 18 +++++++++++- 10 files changed, 132 insertions(+), 16 deletions(-) create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/Cross.java diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 6a11e0e..2d61ccc 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -92,24 +92,22 @@ public class Plan { private String analyze() { Vector routes = new Vector(); for (Block block : blocks) { - LOG.debug("searching routes from {}",block); - for (Connector con : block.startPoints()) { - routes.addAll(follow(new Route().start(block),con)); - } + for (Connector con : block.startPoints()) routes.addAll(follow(new Route().start(block),con)); } + for (Route r : routes) LOG.debug("found route: {}",r); return "analyze() not implemented, yet!"; } - private Collection follow(Route route, Connector con) { - LOG.debug("follow({}, {})",route,con); + private Collection follow(Route route, Connector con) { Tile tile = get(con.x(),con.y()); - Vector result = new Vector<>(); - if (tile == null) return result; - route.add(tile); + Vector results = new Vector<>(); + if (tile == null) return results; + Tile added = route.add(tile instanceof Shadow ? ((Shadow)tile).overlay() : tile); + if (added instanceof Block) return List.of(route); List connectors = tile.connections(con.from()); Listroutes = route.multiply(connectors.size()); - for (int i=0; i path; - public void add(Tile tile) { + public Tile add(Tile tile) { path.add(tile); + return tile; } protected Route clone() { diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Cross.java b/src/main/java/de/srsoftware/web4rail/tiles/Cross.java new file mode 100644 index 0000000..567f081 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/tiles/Cross.java @@ -0,0 +1,9 @@ +package de.srsoftware.web4rail.tiles; + +import java.util.List; + +import de.srsoftware.web4rail.Connector; + +public abstract class Cross extends Tile { + public abstract List offsetConnections(String from); +} diff --git a/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java b/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java index 1351ca2..4a42768 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java @@ -1,17 +1,43 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; +import java.util.List; import java.util.Map; +import java.util.Vector; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; -public class CrossH extends Tile{ +public class CrossH extends Cross{ + + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x+1,y+1,Plan.NORTH)); + case Plan.SOUTH: + return List.of(new Connector(x+1,y-1,Plan.SOUTH)); + } + return new Vector<>(); + } @Override public int len() { return 2; } + @Override + public List offsetConnections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x,y+1,Plan.NORTH)); + case Plan.SOUTH: + return List.of(new Connector(x,y-1,Plan.SOUTH)); + } + return new Vector<>(); +} + @Override public Tag tag(Map replacements) throws IOException { return super.tag(replacements).size(200,100).attr("viewbox", "0 0 200 100"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java b/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java index 3d09f1b..5691e42 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java @@ -1,17 +1,24 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; +import java.util.List; import java.util.Map; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Connector; -public class CrossV extends Tile{ +public class CrossV extends Cross{ @Override public int height() { return 2; } + @Override + public List offsetConnections(String from) { + return null; + } + @Override public Tag tag(Map replacements) throws IOException { return super.tag(replacements).size(100,200).attr("viewbox", "0 0 100 200"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java index 26b6c2d..351c0af 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java @@ -1,5 +1,21 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class DiagNE extends Tile{ + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x+1,y,Plan.WEST)); + case Plan.EAST: + return List.of(new Connector(x,y-1,Plan.SOUTH)); + } + return new Vector<>(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java index 6ed33f6..7fc8450 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java @@ -1,5 +1,20 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class DiagSW extends Tile{ - + @Override + public List connections(String from) { + switch (from) { + case Plan.SOUTH: + return List.of(new Connector(x-1,y,Plan.EAST)); + case Plan.WEST: + return List.of(new Connector(x,y+1,Plan.NORTH)); + } + return new Vector<>(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java index a11b540..4f32cca 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java @@ -1,8 +1,19 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; + +import de.srsoftware.web4rail.Connector; + public class Shadow extends Tile{ private Tile overlay; + + @Override + public List connections(String from) { + if (overlay instanceof StretchableTile) return overlay.connections(from); + if (overlay instanceof Cross) return ((Cross)overlay).offsetConnections(from); + return super.connections(from); + } public Shadow(Tile overlay) { this.overlay = overlay; diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java index 947e7cc..60bf19c 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java @@ -1,7 +1,24 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class StraightV extends StretchableTile{ + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x,y+height(),from)); + case Plan.SOUTH: + return List.of(new Connector(x,y-1,from)); + } + return new Vector<>(); + } + @Override public int height() { return length; diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java index 95ba0bf..e8cd1a2 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java @@ -1,6 +1,22 @@ package de.srsoftware.web4rail.tiles; -public class TurnoutNW extends Turnout{ +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; +public class TurnoutNW extends Turnout{ + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x-1,y,Plan.EAST),new Connector(x, y+1, Plan.NORTH)); + case Plan.WEST: + case Plan.SOUTH: + return List.of(new Connector(x,y-1,Plan.SOUTH)); + } + return new Vector<>(); + } }