mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Flesh out XmlReader more
This commit is contained in:
@@ -19,6 +19,7 @@ package forge.planarconquest;
|
||||
|
||||
import forge.achievement.PlaneswalkerAchievements;
|
||||
import forge.assets.ISkinImage;
|
||||
import forge.card.CardDb;
|
||||
import forge.deck.Deck;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
@@ -91,13 +92,14 @@ public final class ConquestData {
|
||||
|
||||
try {
|
||||
XmlReader xml = new XmlReader(xmlFilename);
|
||||
planeswalker = xml.read("planeswalker", planeswalker);
|
||||
CardDb cardDb = FModel.getMagicDb().getCommonCards();
|
||||
planeswalker = xml.read("planeswalker", planeswalker, cardDb);
|
||||
aetherShards = xml.read("aetherShards", aetherShards);
|
||||
currentLocation = xml.read("currentLocation", currentLocation, ConquestLocation.class);
|
||||
/*xml.read("unlockedCards", unlockedCards);
|
||||
xml.read("newCards", newCards);
|
||||
xml.read("commanders", commanders);
|
||||
xml.read("planeDataMap", planeDataMap);*/
|
||||
xml.read("unlockedCards", unlockedCards, cardDb);
|
||||
xml.read("newCards", newCards, cardDb);
|
||||
xml.read("commanders", commanders, ConquestCommander.class);
|
||||
xml.read("planeDataMap", planeDataMap, ConquestPlane.class, ConquestPlaneData.class);
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -14,22 +14,11 @@ import forge.util.XmlWriter;
|
||||
import forge.util.XmlWriter.IXmlWritable;
|
||||
|
||||
public class ConquestLocation implements IXmlWritable {
|
||||
private ConquestPlane plane;
|
||||
private int regionIndex;
|
||||
private int row;
|
||||
private int col;
|
||||
private final ConquestPlane plane;
|
||||
private final int regionIndex, row, col;
|
||||
|
||||
private List<ConquestLocation> neighbors;
|
||||
|
||||
public ConquestLocation() {
|
||||
}
|
||||
|
||||
public ConquestLocation(XmlReader xml) {
|
||||
plane = xml.read("plane", plane, ConquestPlane.class);
|
||||
regionIndex = xml.read("regionIndex", regionIndex);
|
||||
row = xml.read("row", row);
|
||||
col = xml.read("col", col);
|
||||
}
|
||||
|
||||
public ConquestLocation(ConquestPlane plane0, int regionIndex0, int row0, int col0) {
|
||||
plane = plane0;
|
||||
regionIndex = regionIndex0;
|
||||
@@ -37,6 +26,20 @@ public class ConquestLocation implements IXmlWritable {
|
||||
col = col0;
|
||||
}
|
||||
|
||||
public ConquestLocation(XmlReader xml) {
|
||||
plane = xml.read("plane", ConquestPlane.class);
|
||||
regionIndex = xml.read("regionIndex", 0);
|
||||
row = xml.read("row", 0);
|
||||
col = xml.read("col", 0);
|
||||
}
|
||||
@Override
|
||||
public void saveToXml(XmlWriter xml) {
|
||||
xml.write("plane", plane);
|
||||
xml.write("regionIndex", regionIndex);
|
||||
xml.write("row", row);
|
||||
xml.write("col", col);
|
||||
}
|
||||
|
||||
public ConquestPlane getPlane() {
|
||||
return plane;
|
||||
}
|
||||
@@ -135,12 +138,4 @@ public class ConquestLocation implements IXmlWritable {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveToXml(XmlWriter xml) {
|
||||
xml.write("plane", plane);
|
||||
xml.write("regionIndex", regionIndex);
|
||||
xml.write("row", row);
|
||||
xml.write("col", col);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package forge.planarconquest;
|
||||
import forge.item.PaperCard;
|
||||
import forge.model.FModel;
|
||||
import forge.planarconquest.ConquestPlane.Region;
|
||||
import forge.util.XmlReader;
|
||||
import forge.util.XmlWriter;
|
||||
import forge.util.XmlWriter.IXmlWritable;
|
||||
|
||||
@@ -15,6 +16,17 @@ public class ConquestPlaneData implements IXmlWritable {
|
||||
eventResults = new ConquestRecord[plane.getEventCount()];
|
||||
}
|
||||
|
||||
public ConquestPlaneData(XmlReader xml) {
|
||||
plane = xml.read("plane", ConquestPlane.class);
|
||||
eventResults = new ConquestRecord[plane.getEventCount()];
|
||||
xml.read("eventResults", eventResults, ConquestRecord.class);
|
||||
}
|
||||
@Override
|
||||
public void saveToXml(XmlWriter xml) {
|
||||
xml.write("plane", plane);
|
||||
xml.write("eventResults", eventResults);
|
||||
}
|
||||
|
||||
public boolean hasConquered(ConquestLocation loc) {
|
||||
return hasConquered(loc.getRegionIndex(), loc.getRow(), loc.getCol());
|
||||
}
|
||||
@@ -65,14 +77,4 @@ public class ConquestPlaneData implements IXmlWritable {
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveToXml(XmlWriter xml) {
|
||||
xml.write("plane", plane);
|
||||
xml.startElement("eventResults");
|
||||
for (int i = 0; i < eventResults.length; i++) {
|
||||
xml.write(String.valueOf(i), eventResults[i]);
|
||||
}
|
||||
xml.endElement();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,27 @@
|
||||
package forge.planarconquest;
|
||||
|
||||
import forge.util.XmlReader;
|
||||
import forge.util.XmlWriter;
|
||||
import forge.util.XmlWriter.IXmlWritable;
|
||||
|
||||
public class ConquestRecord implements IXmlWritable {
|
||||
private int wins, losses, level;
|
||||
|
||||
public ConquestRecord() {
|
||||
}
|
||||
|
||||
public ConquestRecord(XmlReader xml) {
|
||||
wins = xml.read("wins", 0);
|
||||
losses = xml.read("losses", 0);
|
||||
level = xml.read("level", 0);
|
||||
}
|
||||
@Override
|
||||
public void saveToXml(XmlWriter xml) {
|
||||
xml.write("wins", wins);
|
||||
xml.write("losses", losses);
|
||||
xml.write("level", level);
|
||||
}
|
||||
|
||||
public int getWins() {
|
||||
return wins;
|
||||
}
|
||||
@@ -29,11 +45,4 @@ public class ConquestRecord implements IXmlWritable {
|
||||
public void levelUp() {
|
||||
level++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveToXml(XmlWriter xml) {
|
||||
xml.write("wins", wins);
|
||||
xml.write("losses", losses);
|
||||
xml.write("level", level);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
package forge.util;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Collection;
|
||||
import java.util.EnumMap;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import forge.card.CardDb;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.XmlWriter.IXmlWritable;
|
||||
|
||||
@@ -25,11 +31,17 @@ public class XmlReader {
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
public <E extends Enum<E>> E read(String key, E defaultValue, Class<E> enumType) {
|
||||
public <E extends Enum<E>> E read(String key, E defaultValue) {
|
||||
if (currentElement.hasAttribute(key)) {
|
||||
return Enum.valueOf(defaultValue.getDeclaringClass(), currentElement.getAttribute(key));
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
public <E extends Enum<E>> E read(String key, Class<E> enumType) {
|
||||
if (currentElement.hasAttribute(key)) {
|
||||
return Enum.valueOf(enumType, currentElement.getAttribute(key));
|
||||
}
|
||||
return defaultValue;
|
||||
return null;
|
||||
}
|
||||
public int read(String key, int defaultValue) {
|
||||
if (currentElement.hasAttribute(key)) {
|
||||
@@ -49,25 +61,180 @@ public class XmlReader {
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
public PaperCard read(String key, PaperCard defaultValue) {
|
||||
//TODO
|
||||
return defaultValue;
|
||||
public PaperCard read(String key, PaperCard defaultValue, CardDb cardDb) {
|
||||
paperCardBuilder.setup(this, cardDb);
|
||||
return read(key, defaultValue, paperCardBuilder);
|
||||
}
|
||||
public <T extends Collection<PaperCard>> void read(String key, T collectionToLoad, CardDb cardDb) {
|
||||
paperCardBuilder.setup(this, cardDb);
|
||||
read(key, collectionToLoad, null, paperCardBuilder);
|
||||
}
|
||||
public <T extends Collection<PaperCard>> T read(String key, Class<T> collectionType, CardDb cardDb) {
|
||||
paperCardBuilder.setup(this, cardDb);
|
||||
return read(key, null, collectionType, paperCardBuilder);
|
||||
}
|
||||
public <T extends IXmlWritable> T read(String key, T defaultValue, Class<T> type) {
|
||||
readChildElement(key);
|
||||
/*NodeList elements = currentElement.getElementsByTagName(key);
|
||||
if (elements.getLength() > 0) {
|
||||
return read(key, defaultValue, new GenericBuilder<T>(type));
|
||||
}
|
||||
public <V extends IXmlWritable, T extends Collection<V>> void read(String key, T collectionToLoad, Class<V> elementType) {
|
||||
read(key, collectionToLoad, null, new GenericBuilder<V>(elementType));
|
||||
}
|
||||
public <V extends IXmlWritable, T extends Collection<V>> T read(String key, Class<T> collectionType, Class<V> elementType) {
|
||||
return read(key, null, collectionType, new GenericBuilder<V>(elementType));
|
||||
}
|
||||
public <V extends IXmlWritable> void read(final String key, final V[] array, final Class<V> elementType) {
|
||||
parseChildElements(key, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final GenericBuilder<V> builder = new GenericBuilder<V>(elementType);
|
||||
parseChildElements(null, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Integer arrayIndex = Integer.valueOf(currentElement.getTagName());
|
||||
if (arrayIndex >= 0 && arrayIndex < array.length) {
|
||||
V value = builder.evaluate();
|
||||
if (value != null) {
|
||||
array[arrayIndex] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
public <E extends Enum<E>, V extends IXmlWritable> void read(final String key, final EnumMap<E, V> enumMap, final Class<E> enumType, final Class<V> valueType) {
|
||||
parseChildElements(key, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final GenericBuilder<V> builder = new GenericBuilder<V>(valueType);
|
||||
parseChildElements(null, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
E mapKey = Enum.valueOf(enumType, currentElement.getTagName());
|
||||
V value = builder.evaluate();
|
||||
if (value != null) {
|
||||
enumMap.put(mapKey, value);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* Private helper methods */
|
||||
|
||||
private <T> T read(String key, T defaultValue, Evaluator<T> builder) {
|
||||
NodeList childNodes = currentElement.getChildNodes();
|
||||
for (int i = 0; i < childNodes.getLength(); i++) {
|
||||
Node node = childNodes.item(i);
|
||||
if (node instanceof Element) {
|
||||
Element element = (Element)node;
|
||||
if (element.getTagName().equals(key)) {
|
||||
Element parentElement = currentElement;
|
||||
currentElement = element;
|
||||
T result = builder.evaluate();
|
||||
currentElement = parentElement;
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
private <V, T extends Collection<V>> T read(String key, T defaultValue, Class<T> collectionType, Evaluator<V> builder) {
|
||||
NodeList childNodes = currentElement.getChildNodes();
|
||||
for (int i = 0; i < childNodes.getLength(); i++) {
|
||||
Node node = childNodes.item(i);
|
||||
if (node instanceof Element) {
|
||||
Element element = (Element)node;
|
||||
if (element.getTagName().equals(key)) {
|
||||
Element parentElement = currentElement;
|
||||
currentElement = element;
|
||||
V result = builder.evaluate();
|
||||
currentElement = parentElement;
|
||||
if (result != null) {
|
||||
if (defaultValue == null) {
|
||||
try {
|
||||
defaultValue = collectionType.newInstance();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
defaultValue.add(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
private void parseChildElements(String findKey, Runnable handler) {
|
||||
Element parentElement = currentElement;
|
||||
NodeList childNodes = currentElement.getChildNodes();
|
||||
for (int i = 0; i < childNodes.getLength(); i++) {
|
||||
Node node = childNodes.item(i);
|
||||
if (node instanceof Element) {
|
||||
Element element = (Element)node;
|
||||
if (findKey == null || element.getTagName().equals(findKey)) {
|
||||
currentElement = (Element)node;
|
||||
handler.run();
|
||||
currentElement = parentElement;
|
||||
if (findKey != null) { return; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final PaperCardBuilder paperCardBuilder = new PaperCardBuilder();
|
||||
private static class PaperCardBuilder extends Evaluator<PaperCard> {
|
||||
private XmlReader xml;
|
||||
private CardDb cardDb;
|
||||
|
||||
private void setup(XmlReader xml0, CardDb cardDb0) {
|
||||
xml = xml0;
|
||||
cardDb = cardDb0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaperCard evaluate() {
|
||||
String name = xml.read("name", "");
|
||||
String edition = xml.read("edition", "");
|
||||
int artIndex = xml.read("artIndex", 0);
|
||||
return cardDb.getCard(name, edition, artIndex);
|
||||
}
|
||||
}
|
||||
|
||||
private static class GenericBuilder<T extends IXmlWritable> extends Evaluator<T> {
|
||||
private final Class<T> type;
|
||||
|
||||
private GenericBuilder(Class<T> type0) {
|
||||
type = type0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T evaluate() {
|
||||
try {
|
||||
return type.getDeclaredConstructor(XmlReader.class).newInstance(this);
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}*/
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
private void readChildElement(String key) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import java.util.Stack;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
@@ -84,6 +85,13 @@ public class XmlWriter {
|
||||
}
|
||||
endElement();
|
||||
}
|
||||
public void write(String key, IXmlWritable[] value) {
|
||||
startElement(key);
|
||||
for (int i = 0; i < value.length; i++) {
|
||||
write(String.valueOf(i), value[i]);
|
||||
}
|
||||
endElement();
|
||||
}
|
||||
public void write(String key, EnumMap<? extends Enum<?>, ? extends IXmlWritable> value) {
|
||||
startElement(key);
|
||||
for (Entry<? extends Enum<?>, ? extends IXmlWritable> entry : value.entrySet()) {
|
||||
|
||||
Reference in New Issue
Block a user