diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java index 8d456fd..e86d474 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 a1af73e..ba686db 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,26 @@ 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 (Route r : routes) LOG.debug("found route: {}",r); return "analyze() not implemented, yet!"; } + private Collection follow(Route route, Connector con) { + Tile tile = get(con.x(),con.y()); + 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 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..657ab2a 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -1,5 +1,40 @@ 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 Tile add(Tile tile) { + path.add(tile); + return 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/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/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/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/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/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/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/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/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/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<>(); + } } 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<>(); + } }