package org.djd.busntrain.bus; import java.util.ArrayList; import java.util.HashMap; import java.util.TreeMap; import org.djd.busntrain.commons.XmlUtil; import org.djd.busntrain.commons.XmlUtilException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import android.util.Log; public class BusStops { private static final String TAG = BusStops.class.getSimpleName(); private static final String STOP_ELEMENT = "stop"; /** * @param stopsNodeList contain <stop> elements * @return * @throws XmlUtilException */ public static ArrayList<Stop> parseValue(String stopsXmlTxt) throws XmlUtilException { Document document = XmlUtil.unmarshall(stopsXmlTxt); NodeList stopsNodeList = document.getElementsByTagName(STOP_ELEMENT); final int STOP_COUNT = stopsNodeList.getLength(); Log.i(TAG, String.format("STOP_COUNT=%d", STOP_COUNT)); ArrayList<Stop> stops = new ArrayList<Stop>(STOP_COUNT); for (int i = 0; i < STOP_COUNT; i++) { Node stopNode = stopsNodeList.item(i); Stop stop = new Stop(stopNode); stops.add(stop); } return stops; } public static class Helper { public static ArrayList<Stop> sort(Stop.NameKey sortKey, ArrayList<Stop> stops) { TreeMap<String, Stop> sortedMap = new TreeMap<String, Stop>(); for (Stop stop : stops) { sortedMap.put(stop.getByNameKey(sortKey), stop); } stops.clear(); for (String key : sortedMap.keySet()) { stops.add(sortedMap.get(key)); } return stops; } } public static class Stop extends HashMap<String, String> { /** * */ private static final long serialVersionUID = -8853781666477277978L; enum NameKey { STOP_ID("stpid"), STOP_NAME("stpnm"), LATITUDE("lat"), LONGITUDE("lon"); private String text; private NameKey(String text) { this.text = text; } } public static final String[] COLUMNS = new String[]{NameKey.STOP_ID.text, NameKey.STOP_NAME.text}; /** * @param nodeList should contain two elements */ Stop(Node stopNode) { Element element = (Element) stopNode; for (NameKey nameKey : NameKey.values()) { String value = XmlUtil.getValue(element, nameKey.text); put(nameKey.text, value); } } /** * convenience method, same effect as get(key) * * @param nameKey * @return */ public String getByNameKey(NameKey nameKey) { return get(nameKey.text); } } }