mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
XmlReader fixes
This commit is contained in:
@@ -83,13 +83,13 @@ public class XmlReader {
|
|||||||
return read(key, null, collectionType, new GenericBuilder<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) {
|
public <V extends IXmlWritable> void read(final String key, final V[] array, final Class<V> elementType) {
|
||||||
parseChildElements(key, new Runnable() {
|
parseChildElements(key, new Evaluator<Void>() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public Void evaluate() {
|
||||||
final GenericBuilder<V> builder = new GenericBuilder<V>(elementType);
|
final GenericBuilder<V> builder = new GenericBuilder<V>(elementType);
|
||||||
parseChildElements(null, new Runnable() {
|
return parseChildElements(null, new Evaluator<Void>() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public Void evaluate() {
|
||||||
try {
|
try {
|
||||||
Integer arrayIndex = Integer.valueOf(currentElement.getTagName());
|
Integer arrayIndex = Integer.valueOf(currentElement.getTagName());
|
||||||
if (arrayIndex >= 0 && arrayIndex < array.length) {
|
if (arrayIndex >= 0 && arrayIndex < array.length) {
|
||||||
@@ -102,19 +102,20 @@ public class XmlReader {
|
|||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
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) {
|
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() {
|
parseChildElements(key, new Evaluator<Void>() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public Void evaluate() {
|
||||||
final GenericBuilder<V> builder = new GenericBuilder<V>(valueType);
|
final GenericBuilder<V> builder = new GenericBuilder<V>(valueType);
|
||||||
parseChildElements(null, new Runnable() {
|
return parseChildElements(null, new Evaluator<Void>() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public Void evaluate() {
|
||||||
try {
|
try {
|
||||||
E mapKey = Enum.valueOf(enumType, currentElement.getTagName());
|
E mapKey = Enum.valueOf(enumType, currentElement.getTagName());
|
||||||
V value = builder.evaluate();
|
V value = builder.evaluate();
|
||||||
@@ -125,6 +126,7 @@ public class XmlReader {
|
|||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -133,57 +135,47 @@ public class XmlReader {
|
|||||||
|
|
||||||
/* Private helper methods */
|
/* Private helper methods */
|
||||||
|
|
||||||
private <T> T read(String key, T defaultValue, Evaluator<T> builder) {
|
private <T> T read(String key, T defaultValue, final Evaluator<T> builder) {
|
||||||
NodeList childNodes = currentElement.getChildNodes();
|
T result = parseChildElements(key, builder);
|
||||||
for (int i = 0; i < childNodes.getLength(); i++) {
|
if (result == null) {
|
||||||
Node node = childNodes.item(i);
|
result = defaultValue;
|
||||||
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private <V, T extends Collection<V>> T read(String key, T defaultValue, Class<T> collectionType, Evaluator<V> builder) {
|
private <V, T extends Collection<V>> T read(String key, final T collectionToLoad, final Class<T> collectionType, final Evaluator<V> builder) {
|
||||||
NodeList childNodes = currentElement.getChildNodes();
|
return read(key, collectionToLoad, new Evaluator<T>() {
|
||||||
for (int i = 0; i < childNodes.getLength(); i++) {
|
@Override
|
||||||
Node node = childNodes.item(i);
|
public T evaluate() {
|
||||||
if (node instanceof Element) {
|
final T result;
|
||||||
Element element = (Element)node;
|
if (collectionToLoad == null) {
|
||||||
if (element.getTagName().equals(key)) {
|
try {
|
||||||
Element parentElement = currentElement;
|
result = collectionType.newInstance();
|
||||||
currentElement = element;
|
}
|
||||||
V result = builder.evaluate();
|
catch (Exception e) {
|
||||||
currentElement = parentElement;
|
e.printStackTrace();
|
||||||
if (result != null) {
|
return null;
|
||||||
if (defaultValue == null) {
|
}
|
||||||
try {
|
}
|
||||||
defaultValue = collectionType.newInstance();
|
else {
|
||||||
}
|
result = collectionToLoad;
|
||||||
catch (Exception e) {
|
}
|
||||||
e.printStackTrace();
|
parseChildElements(null, new Evaluator<V>() {
|
||||||
return null;
|
@Override
|
||||||
}
|
public V evaluate() {
|
||||||
|
V value = builder.evaluate();
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
}
|
}
|
||||||
defaultValue.add(result);
|
return value;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
return defaultValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildElements(String findKey, Runnable handler) {
|
private <T> T parseChildElements(String findKey, Evaluator<T> handler) {
|
||||||
Element parentElement = currentElement;
|
Element parentElement = currentElement;
|
||||||
NodeList childNodes = currentElement.getChildNodes();
|
NodeList childNodes = currentElement.getChildNodes();
|
||||||
for (int i = 0; i < childNodes.getLength(); i++) {
|
for (int i = 0; i < childNodes.getLength(); i++) {
|
||||||
@@ -192,12 +184,15 @@ public class XmlReader {
|
|||||||
Element element = (Element)node;
|
Element element = (Element)node;
|
||||||
if (findKey == null || element.getTagName().equals(findKey)) {
|
if (findKey == null || element.getTagName().equals(findKey)) {
|
||||||
currentElement = (Element)node;
|
currentElement = (Element)node;
|
||||||
handler.run();
|
T result = handler.evaluate();
|
||||||
currentElement = parentElement;
|
currentElement = parentElement;
|
||||||
if (findKey != null) { return; }
|
if (findKey != null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final PaperCardBuilder paperCardBuilder = new PaperCardBuilder();
|
private static final PaperCardBuilder paperCardBuilder = new PaperCardBuilder();
|
||||||
@@ -213,13 +208,13 @@ public class XmlReader {
|
|||||||
@Override
|
@Override
|
||||||
public PaperCard evaluate() {
|
public PaperCard evaluate() {
|
||||||
String name = xml.read("name", "");
|
String name = xml.read("name", "");
|
||||||
String edition = xml.read("edition", "");
|
String setCode = xml.read("set", "");
|
||||||
int artIndex = xml.read("artIndex", 0);
|
int artIndex = xml.read("art", 0);
|
||||||
return cardDb.getCard(name, edition, artIndex);
|
return cardDb.getCard(name, setCode, artIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class GenericBuilder<T extends IXmlWritable> extends Evaluator<T> {
|
private class GenericBuilder<T extends IXmlWritable> extends Evaluator<T> {
|
||||||
private final Class<T> type;
|
private final Class<T> type;
|
||||||
|
|
||||||
private GenericBuilder(Class<T> type0) {
|
private GenericBuilder(Class<T> type0) {
|
||||||
@@ -229,7 +224,7 @@ public class XmlReader {
|
|||||||
@Override
|
@Override
|
||||||
public T evaluate() {
|
public T evaluate() {
|
||||||
try {
|
try {
|
||||||
return type.getDeclaredConstructor(XmlReader.class).newInstance(this);
|
return type.getDeclaredConstructor(XmlReader.class).newInstance(XmlReader.this);
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
Reference in New Issue
Block a user