From 97c53548897a92140d2aea8b05cbba6b7ced10bb Mon Sep 17 00:00:00 2001 From: drdev Date: Fri, 9 May 2014 04:06:31 +0000 Subject: [PATCH] Flesh out XML read and write utility methods --- forge-gui/pom.xml | 6 + .../src/main/java/forge/util/XmlUtil.java | 151 +++++++++++++++++- 2 files changed, 152 insertions(+), 5 deletions(-) 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); + } }