Flesh out XmlReader more

This commit is contained in:
drdev
2016-01-01 22:53:13 +00:00
parent 622743359c
commit ed1ae4a71d
6 changed files with 241 additions and 58 deletions

View File

@@ -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();

View File

@@ -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);
}
}

View File

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

View File

@@ -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);
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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()) {