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<>(); + } }