package dk.thoerup.traininfo.provider; import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; 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.XMLReader; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; import dk.thoerup.traininfo.DepartureBean; import dk.thoerup.traininfo.util.DownloadUtil; import dk.thoerup.traininfo.util.XmlUtil; public class XmlDepartureProvider extends DefaultHandler implements DepartureProvider { final static long CACHE_TIMEOUT = 60*1000; class CacheEntry { public long timestamp; public List departures; } HashMap departureCache = new HashMap(); ArrayList departures; DepartureBean tempDeparture; StringBuilder builder = new StringBuilder(512); @Override public boolean lookupDepartures(int stationID) { CacheEntry entry = departureCache.get(stationID); boolean success; long now = android.os.SystemClock.elapsedRealtime(); if (entry == null || (entry.timestamp+CACHE_TIMEOUT) < now) { success = lookupDeparturesWorker(stationID); if (success) { entry = new CacheEntry(); entry.timestamp = android.os.SystemClock.elapsedRealtime(); entry.departures = departures; departureCache.put(stationID, entry); } } else { Log.i("XmlDepartureProvider", "cache hit !!!"); success = true; } return success; } private boolean lookupDeparturesWorker(int stationID) { boolean success = false; departures = new ArrayList(); try { String url = XmlUtil.SERVICE_BASE + "/DepartureServlet?format=xml&station=" + stationID; Log.i("xmlurl",url); String doc = DownloadUtil.getContentString(url, 45000, "ISO-8859-1"); InputSource source = new InputSource( new StringReader(doc)); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); xr.setContentHandler(this); xr.setErrorHandler(this); xr.parse(source); success = true; } catch (Exception e) { Log.e("XmlDepartureProvider", "looupFunction", e); } return success; } @Override public List getDepartures(int station) { CacheEntry entry = departureCache.get(station); if (entry != null) { return entry.departures; } else { return new ArrayList(); } } // this can be called several times fore the same text-node if there are many chardata / lines @Override public void characters (char ch[], int start, int length) { for (int i= start; i