package org.droiddraw.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Hashtable;
import java.util.Vector;
import javax.xml.parsers.ParserConfigurationException;
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 ArrayHandler extends DefaultHandler {
Hashtable<String, Vector<String>> arrays;
Vector<String> items;
StringBuffer buff;
String name;
public ArrayHandler()
{
arrays = new Hashtable<String,Vector<String>>();
buff = new StringBuffer();
}
@Override
public void characters(char arg0[], int arg1, int arg2)
{
buff.append(arg0, arg1, arg2);
}
@Override
public void startDocument()
{
arrays.clear();
}
@Override
public void startElement(String ns, String lName, String qName, Attributes atts)
{
buff.setLength(0);
if(qName.equals("array")) {
name = atts.getValue("name");
items = new Vector<String>();
}
}
@Override
public void endElement(String uri, String localName, String qName)
{
if(qName.equals("item")) {
String str = buff.toString();
while (str.indexOf("\\u")!=-1) {
int ix = str.indexOf("\\u");
int code = Integer.parseInt(str.substring(ix+2, ix+6), 16);
str = str.substring(0, ix)+(char)code+str.substring(ix+6);
}
while (str.indexOf("\\n")!=-1) {
str = str.replace("\\n", "\n");
}
items.add(str);
}
else if (qName.equals("array")) {
arrays.put(name, items);
items = null;
}
}
public Hashtable<String,Vector<String>> getArrays()
{
return arrays;
}
public static Hashtable<String,Vector<String>> load(InputStream is)
throws SAXException, ParserConfigurationException, IOException
{
return load(new InputSource(is));
}
public static Hashtable<String,Vector<String>> load(InputSource in)
throws SAXException, ParserConfigurationException, IOException
{
ArrayHandler sh = new ArrayHandler();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(in, sh);
return sh.getArrays();
}
public static void dump(Writer w, Hashtable<String, Vector<String>> arrays)
{
PrintWriter pw = new PrintWriter(w);
pw.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
pw.println("<resources>");
if (arrays != null) {
for (String key : arrays.keySet()) {
pw.println("<array name=\""+key+"\">");
Vector<String> array = arrays.get(key);
for (String item : array) {
pw.println("<item>"+item+"</item>");
}
pw.println("</array>");
}
}
pw.println("</resources>");
pw.flush();
}
}