diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml
index e3046e142f1..63d5e81e111 100644
--- a/forge-gui/pom.xml
+++ b/forge-gui/pom.xml
@@ -51,5 +51,11 @@
freemarker
2.3.20
+
+ xmlpull
+ xmlpull
+ 1.1.3.1
+ provided
+
diff --git a/forge-gui/src/main/java/forge/util/XmlUtil.java b/forge-gui/src/main/java/forge/util/XmlUtil.java
index 29efd1f9f76..d2e67698467 100644
--- a/forge-gui/src/main/java/forge/util/XmlUtil.java
+++ b/forge-gui/src/main/java/forge/util/XmlUtil.java
@@ -18,6 +18,9 @@
package forge.util;
import org.w3c.dom.Node;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserFactory;
+import org.xmlpull.v1.XmlSerializer;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
@@ -25,12 +28,18 @@ import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
-import java.io.StringWriter;
-/**
- * TODO: Write javadoc for this type.
- *
- */
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Stack;
+
+
public class XmlUtil {
/**
@@ -51,4 +60,136 @@ public class XmlUtil {
}
return sw.toString();
}
+
+ public static void read(String filename, XmlTagReader reader) {
+ try {
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ factory.setNamespaceAware(true);
+ XmlPullParser xml = factory.newPullParser();
+ xml.setInput(new InputStreamReader(new FileInputStream(filename)));
+
+ int eventType = xml.getEventType();
+ while (eventType != XmlPullParser.END_DOCUMENT) {
+ switch (eventType) {
+ case XmlPullParser.START_TAG:
+ reader.tagStart(xml);
+ break;
+ case XmlPullParser.END_TAG:
+ reader.tagEnd(xml);
+ break;
+ }
+ eventType = xml.next();
+ }
+ }
+ catch (final FileNotFoundException e) {
+ /* ignore if file doesn't exist */
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static abstract class XmlTagReader {
+ public abstract void tagStart(XmlPullParser xml);
+ public void tagEnd(XmlPullParser xml) {
+ //not required to override but can be
+ }
+ }
+
+ public static void write(String filename, XmlTagWriter writer) {
+ FileOutputStream outputStream = null;
+ try {
+ outputStream = new FileOutputStream(filename);
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance(System.getProperty(XmlPullParserFactory.PROPERTY_NAME), null);
+ XmlSerializer xml = factory.newSerializer();
+ xml.setOutput(outputStream, null);
+ xml.startDocument(null, true);
+ xml.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+ writer.writeTags(new XmlWriter(xml));
+ xml.endDocument();
+ xml.flush();
+ outputStream.close();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ }
+ catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ }
+ try {
+ new File(filename).delete(); //delete file if exception
+ }
+ catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ }
+ }
+
+ public static class XmlWriter {
+ private XmlSerializer xml;
+ private Stack tagnames;
+
+ private XmlWriter(XmlSerializer xml0) {
+ xml = xml0;
+ }
+
+ public void startTag(String tagname) {
+ startTag(tagname, null);
+ }
+ public void startTag(String tagname, Map attrs) {
+ try {
+ xml.startTag("", tagname);
+ if (attrs != null) {
+ for (Entry attr : attrs.entrySet()) {
+ xml.attribute("", attr.getKey(), attr.getValue());
+ }
+ }
+ tagnames.push(tagname);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void writeTag(String tagname, Map attrs) {
+ writeTag(tagname, attrs, null);
+ }
+ public void writeTag(String tagname, String value) {
+ writeTag(tagname, null, value);
+ }
+ public void writeTag(String tagname, Map attrs, String value) {
+ try {
+ xml.startTag("", tagname);
+ if (attrs != null) {
+ for (Entry attr : attrs.entrySet()) {
+ xml.attribute("", attr.getKey(), attr.getValue());
+ }
+ }
+ if (value != null) {
+ xml.text(value);
+ }
+ xml.endTag("", tagname);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void endTag() {
+ try {
+ xml.endTag("", tagnames.pop());
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static abstract class XmlTagWriter {
+ public abstract void writeTags(XmlWriter xml);
+ }
}