diff --git a/pom.xml b/pom.xml
index dc1ea1f..b061892 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
de.srsoftware
tools
- 1.1.6
+ 1.1.7
compile
@@ -48,6 +48,11 @@
1.1.2
compile
+
+ org.json
+ json
+ 20200518
+
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 525417f..ae9d33f 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -11,6 +11,7 @@ import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Vector;
+import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,13 +68,14 @@ public class Plan {
return new Tag("div").clazz("list").content(tiles.toString()).addTo(tileMenu);
}
- private Tile addTile(String clazz, String xs, String ys) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+ private Tile addTile(String clazz, String xs, String ys, String configJson) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
int x = Integer.parseInt(xs);
int y = Integer.parseInt(ys);
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 (configJson != null) tile.configure(new JSONObject(configJson));
set(x, y, tile);
return tile;
@@ -103,9 +105,12 @@ public class Plan {
BufferedReader br = new BufferedReader(new FileReader(file));
while (br.ready()) {
String line = br.readLine().trim();
- String[] parts = line.split(":");
+ String[] parts = line.split(":",4);
try {
- result.addTile(parts[2].trim(), parts[0].trim(), parts[1].trim());
+ 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);
}
@@ -141,7 +146,7 @@ public class Plan {
}
private String moveTile(String direction, int x, int y) throws IOException {
- LOG.debug("moveTile({},{},{})",direction,x,y);
+ //LOG.debug("moveTile({},{},{})",direction,x,y);
Vector moved = null;
switch (direction) {
case EAST:
@@ -186,7 +191,7 @@ public class Plan {
if (action == null) throw new NullPointerException(ACTION+" should not be null!");
switch (action) {
case ACTION_ADD:
- Tile tile = addTile(params.get(TILE),params.get(X),params.get(Y));
+ Tile tile = addTile(params.get(TILE),params.get(X),params.get(Y),null);
return t("Added {}",tile.getClass().getSimpleName());
case ACTION_MOVE:
return moveTile(params.get(DIRECTION),params.get(X),params.get(Y));
@@ -235,7 +240,12 @@ public class Plan {
for (Entry row : column.getValue().entrySet()) {
int y = row.getKey();
Tile tile = row.getValue().position(x, y);
- if (tile != null && !(tile instanceof Shadow)) br.append(x+":"+y+":"+tile.getClass().getSimpleName()+"\n");
+ if (tile != null && !(tile instanceof Shadow)) {
+ br.append(x+":"+y+":"+tile.getClass().getSimpleName());
+ JSONObject config = tile.config();
+ if (!config.isEmpty()) br.append(":"+config);
+ br.append("\n");
+ }
}
}
br.close();
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java
index 1260635..7523099 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java
@@ -3,6 +3,8 @@ package de.srsoftware.web4rail.tiles;
import java.util.HashMap;
import java.util.Map.Entry;
+import org.json.JSONObject;
+
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Form;
@@ -11,6 +13,19 @@ public abstract class StretchableTile extends Tile {
private static final String LENGTH = "length";
public int length = 1;
+ @Override
+ public JSONObject config() {
+ JSONObject config = super.config();
+ if (length != 1) config.put(LENGTH, length);
+ return config;
+ }
+
+ @Override
+ public void configure(JSONObject config) {
+ super.configure(config);
+ if (config.has(LENGTH)) setLength(config.getInt(LENGTH));
+ }
+
public Tag propMenu() {
Window menu = new Window("tile-properties",t("Properties of {} @ ({},{})",getClass().getSimpleName(),x,y));
Form form = new Form();
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
index 8503b4d..f9dd6fd 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
@@ -7,6 +7,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
+import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -26,6 +27,12 @@ public abstract class Tile {
classes.add(getClass().getSimpleName());
}
+ public JSONObject config() {
+ return new JSONObject();
+ }
+
+ public void configure(JSONObject config) {}
+
public int height() {
return 1;
}