package cryodex.xml;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class XMLUtils {
public static final String PLAYERS = "PLAYERS";
public static final String PLAYER = "PLAYER";
public static final String TOURNAMENTS = "TOURNAMENTS";
public static final String TOURNAMENT = "TOURNAMENT";
public static final String OPTIONS = "OPTIONS";
public static StringBuilder appendObject(StringBuilder sb, String label,
Object object) {
if (object == null) {
return sb;
}
sb.append("<" + label + ">");
sb.append(object.toString());
sb.append("</" + label + ">\n");
return sb;
}
public static StringBuilder appendXMLObject(StringBuilder sb, String label,
XMLObject object) {
if (object == null) {
return sb;
}
sb.append("<" + label + ">\n");
object.appendXML(sb);
sb.append("</" + label + ">\n");
return sb;
}
public static StringBuilder appendList(StringBuilder sb, String listLabel,
String label, List<? extends XMLObject> objectList) {
sb.append("<" + listLabel + ">\n");
for (XMLObject object : objectList) {
sb.append("<" + label + ">\n");
object.appendXML(sb);
sb.append("</" + label + ">\n");
}
sb.append("</" + listLabel + ">\n");
return sb;
}
public static StringBuilder appendStringList(StringBuilder sb, String listLabel,
String label, List<String> objectList) {
sb.append("<" + listLabel + ">\n");
for (String object : objectList) {
sb.append("<" + label + ">");
sb.append(object);
sb.append("</" + label + ">\n");
}
sb.append("</" + listLabel + ">\n");
return sb;
}
public static Element getItem(BufferedReader r) throws IOException {
String line = r.readLine();
if (line == null || line.trim().isEmpty()) {
return null;
} else {
line = line.trim();
if (line.matches("<.*>.*</.*>")) {
return new Element(r, line, true);
} else if (line.indexOf("/") == 1) {
return null;
} else if (line.matches("<.*>")) {
return new Element(r, line, false);
}
}
return null;
}
public static class Element {
private final String tag;
private String data;
private List<Element> children;
public Element(BufferedReader r, String tagLine, boolean hasData)
throws IOException {
tag = tagLine.substring(1, tagLine.indexOf('>'));
if (hasData) {
data = tagLine.substring(tagLine.indexOf('>') + 1,
tagLine.indexOf("</"));
} else {
Element o = getItem(r);
while (o != null) {
getChildren().add(o);
o = getItem(r);
}
}
}
public List<Element> getChildren() {
if (children == null) {
children = new ArrayList<Element>();
}
return children;
}
public String getTag() {
return tag;
}
public String getData() {
return data;
}
public Element getChild(String tag) {
for (Element e : getChildren()) {
if (e.getTag().equals(tag)) {
return e;
}
}
return null;
}
public String getStringFromChild(String tag) {
Element e = getChild(tag);
if (e != null) {
return e.getData();
}
return null;
}
public boolean getBooleanFromChild(String tag, boolean defaultValue) {
Boolean value = getBooleanFromChild(tag);
return value == null ? defaultValue : value;
}
public Boolean getBooleanFromChild(String tag) {
String s = getStringFromChild(tag);
if (s != null) {
return new Boolean(s);
}
return null;
}
public Integer getIntegerFromChild(String tag) {
String s = getStringFromChild(tag);
if (s != null) {
return new Integer(s);
}
return null;
}
@Override
public String toString() {
String s = "Tag: " + getTag();
s += "\nData: " + data;
s += "\nChildren: {";
for (Element e : getChildren()) {
s += e.getTag() + "(" + e.getData() + "), ";
}
return s;
}
}
}