import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class GenerateAttributes {
/**
* @param args
*/
public static void main(String[] args) {
final File inFile = new File(args[0]);
InputStream inputStream;
try {
writeHeader();
inputStream = new FileInputStream(inFile);
final Reader reader = new InputStreamReader(inputStream, "UTF-8");
final InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");
parseAttributes(is);
writeTrailer();
} catch (final Exception e) {
e.printStackTrace();
}
}
private static void writeHeader() {
System.out.print("// This is a generated file, do not change manually!\n" + "\n"
+ "# internal name | gcid | ocid | acode | man | license | copyright holder | URL\n");
}
private static String formattedId(int id, int width) {
final String result = " ".substring(0, width - 1) + id;
return result.substring(result.length() - width);
}
private static void writeAttr(AttrInfo attr) {
System.out.println(" | " + formattedId(attr.gc_id, 4) + " | " + formattedId(attr.oc_de_id, 4)
+ " | " + formattedId(attr.acode, 5) + " |");
}
private static void writeTrailer() {
System.out.println();
}
private static void parseAttributes(InputSource stream) {
try {
final SAXParserFactory factory = SAXParserFactory.newInstance();
final SAXParser saxParser = factory.newSAXParser();
final DefaultHandler handler = new DefaultHandler() {
AttrInfo attr;
ArrayList<String> names;
boolean readingName;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equalsIgnoreCase("attr")) {
attr = new AttrInfo();
names = new ArrayList<String>();
attr.acode = Integer.parseInt(attributes.getValue("acode").substring(1));
}
if (attr != null && qName.equalsIgnoreCase("opencaching")) {
if ("http://www.opencaching.de/".equalsIgnoreCase(attributes.getValue("schema"))) {
attr.oc_de_id = Integer.parseInt(attributes.getValue("id"));
} else if ("http://opencaching.pl/".equalsIgnoreCase(attributes.getValue("schema"))) {
attr.oc_pl_id = Integer.parseInt(attributes.getValue("id"));
} else if ("http://www.opencaching.nl/".equalsIgnoreCase(attributes.getValue("schema"))) {
attr.oc_nl_id = Integer.parseInt(attributes.getValue("id"));
}
}
if (attr != null && qName.equalsIgnoreCase("groundspeak")) {
attr.gc_id = Integer.parseInt(attributes.getValue("id"));
}
if (names != null && qName.equalsIgnoreCase("name")) {
readingName = true;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (attr != null && qName.equalsIgnoreCase("attr")) {
attr.names = names.toArray(new String[] {});
names = null;
writeAttr(attr);
attr = null;
}
readingName = false;
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (readingName) {
names.add(new String(ch, start, length));
}
}
};
saxParser.parse(stream, handler);
} catch (final Exception e) {
e.printStackTrace();
}
}
static class AttrInfo {
public int oc_de_id;
public int oc_nl_id;
public int oc_pl_id;
public int acode;
public int gc_id;
public String[] names;
}
}