diff --git a/forge-gui/src/main/java/forge/util/XmlReader.java b/forge-gui/src/main/java/forge/util/XmlReader.java index a39ee4688f8..b0ba4585508 100644 --- a/forge-gui/src/main/java/forge/util/XmlReader.java +++ b/forge-gui/src/main/java/forge/util/XmlReader.java @@ -83,13 +83,13 @@ public class XmlReader { return read(key, null, collectionType, new GenericBuilder(elementType)); } public void read(final String key, final V[] array, final Class elementType) { - parseChildElements(key, new Runnable() { + parseChildElements(key, new Evaluator() { @Override - public void run() { + public Void evaluate() { final GenericBuilder builder = new GenericBuilder(elementType); - parseChildElements(null, new Runnable() { + return parseChildElements(null, new Evaluator() { @Override - public void run() { + public Void evaluate() { try { Integer arrayIndex = Integer.valueOf(currentElement.getTagName()); if (arrayIndex >= 0 && arrayIndex < array.length) { @@ -102,19 +102,20 @@ public class XmlReader { catch (Exception e) { e.printStackTrace(); } + return null; } }); } }); } public , V extends IXmlWritable> void read(final String key, final EnumMap enumMap, final Class enumType, final Class valueType) { - parseChildElements(key, new Runnable() { + parseChildElements(key, new Evaluator() { @Override - public void run() { + public Void evaluate() { final GenericBuilder builder = new GenericBuilder(valueType); - parseChildElements(null, new Runnable() { + return parseChildElements(null, new Evaluator() { @Override - public void run() { + public Void evaluate() { try { E mapKey = Enum.valueOf(enumType, currentElement.getTagName()); V value = builder.evaluate(); @@ -125,6 +126,7 @@ public class XmlReader { catch (Exception e) { e.printStackTrace(); } + return null; } }); } @@ -133,57 +135,47 @@ public class XmlReader { /* Private helper methods */ - private T read(String key, T defaultValue, Evaluator 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; - } - } + private T read(String key, T defaultValue, final Evaluator builder) { + T result = parseChildElements(key, builder); + if (result == null) { + result = defaultValue; } - return defaultValue; + return result; } - private > T read(String key, T defaultValue, Class collectionType, Evaluator 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; - } + private > T read(String key, final T collectionToLoad, final Class collectionType, final Evaluator builder) { + return read(key, collectionToLoad, new Evaluator() { + @Override + public T evaluate() { + final T result; + if (collectionToLoad == null) { + try { + result = collectionType.newInstance(); + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + } + else { + result = collectionToLoad; + } + parseChildElements(null, new Evaluator() { + @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 parseChildElements(String findKey, Evaluator handler) { Element parentElement = currentElement; NodeList childNodes = currentElement.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { @@ -192,12 +184,15 @@ public class XmlReader { Element element = (Element)node; if (findKey == null || element.getTagName().equals(findKey)) { currentElement = (Element)node; - handler.run(); + T result = handler.evaluate(); currentElement = parentElement; - if (findKey != null) { return; } + if (findKey != null) { + return result; + } } } } + return null; } private static final PaperCardBuilder paperCardBuilder = new PaperCardBuilder(); @@ -213,13 +208,13 @@ public class XmlReader { @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); + String setCode = xml.read("set", ""); + int artIndex = xml.read("art", 0); + return cardDb.getCard(name, setCode, artIndex); } } - private static class GenericBuilder extends Evaluator { + private class GenericBuilder extends Evaluator { private final Class type; private GenericBuilder(Class type0) { @@ -229,7 +224,7 @@ public class XmlReader { @Override public T evaluate() { try { - return type.getDeclaredConstructor(XmlReader.class).newInstance(this); + return type.getDeclaredConstructor(XmlReader.class).newInstance(XmlReader.this); } catch (Exception e) { e.printStackTrace();