--- android/TrainInfo/src/dk/thoerup/traininfo/provider/XmlTimetableProvider.java 2009/09/29 19:06:34 357 +++ android/TrainInfo/src/dk/thoerup/traininfo/provider/XmlTimetableProvider.java 2010/09/08 06:03:45 1027 @@ -4,30 +4,51 @@ import java.util.List; import org.w3c.dom.Document; + import org.w3c.dom.Node; import org.w3c.dom.NodeList; import android.util.Log; import dk.thoerup.traininfo.TimetableBean; +import dk.thoerup.traininfo.util.AndroidTimeoutCache; import dk.thoerup.traininfo.util.DownloadUtil; import dk.thoerup.traininfo.util.XmlUtil; public class XmlTimetableProvider implements TimetableProvider { - List timetables = new ArrayList(); + final static int CACHE_TIMEOUT = 60*1000; + + AndroidTimeoutCache> timetableCache = new AndroidTimeoutCache>(CACHE_TIMEOUT); @Override - public List getTimetable() { + public List lookupTimetable(String type, String trainID) { + + String trainNumber = extractTrainNumber(trainID); + + String key = type + "-" + trainID; + List timetables = timetableCache.get(key); + + if (timetables == null) { + timetables = lookupTimetableWorker(type, trainNumber); + + if (timetables != null) { + timetableCache.put(key, timetables); + } + + } else { + Log.i("XmlTimetableProvider", "cache hit !!!"); + } + return timetables; } + - @Override - public boolean lookupTimetable(String trainID) { - boolean success = false; - String url = XmlUtil.SERVICE_BASE + "/TimetableServlet?train=" + trainID ; + public List lookupTimetableWorker(String type, String trainNumber) { + + String url = XmlUtil.SERVICE_BASE + "/TimetableServlet?train=" + trainNumber + "&type=" + type; Log.i("url", url); try { - timetables.clear(); + List timetables = new ArrayList(); String xml = DownloadUtil.getContentString(url, 15000, "ISO-8859-1"); @@ -45,7 +66,14 @@ TimetableBean timetable = new TimetableBean(); - NodeList entries = entryNode.getChildNodes(); + NodeList entries = entryNode.getChildNodes(); + + if (entryNode.hasAttributes() && entryNode.getAttributes().getNamedItem("current") != null) { + timetable.setCurrent( Boolean.parseBoolean(entryNode.getAttributes().getNamedItem("current").getNodeValue())); + } else { + timetable.setCurrent(false); + } + for (int j=0; j