package dk.thoerup.traininfo.provider; import java.net.URLEncoder; import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister; import android.location.Location; import android.util.Log; import dk.thoerup.android.traininfo.common.StationBean; import dk.thoerup.traininfo.util.AndroidTimeoutCache; import dk.thoerup.traininfo.util.DownloadUtil; import dk.thoerup.traininfo.util.XmlUtil; public class XmlStationProvider implements StationProvider { final static int CACHE_TIMEOUT = 300*1000; //List stations = new ArrayList(); AndroidTimeoutCache stationCache = new AndroidTimeoutCache(CACHE_TIMEOUT); double roundToPlaces(double value, int places) { double pow = Math.pow(10, places); double temp = Math.round( value*pow ); return temp / pow; } @Override public StationBean lookupStations(Location location) { double lat = roundToPlaces(location.getLatitude(), 4); double lng = roundToPlaces(location.getLongitude(), 4); String url = XmlUtil.SERVICE_BASE + "/LocateStations?latitude=" + lat + "&longitude=" + lng; Log.i("url", url); return lookupStationsWorker(url); } @Override public StationBean lookupStationsByName(String name) { try { name = URLEncoder.encode(name, "ISO8859-1"); } catch (Exception e) { Log.e("lookupStations", "Encoding failed", e);//if encoding fails use original and hope for the best } String url = XmlUtil.SERVICE_BASE + "/LocateStations?name=" + name; Log.i("url", url); return lookupStationsWorker(url); } @Override public StationBean lookupStationsByIds(String ids) { String url = ""; url = XmlUtil.SERVICE_BASE + "/LocateStations?list=" + ids; Log.i("url", url); return lookupStationsWorker(url); } public StationBean lookupStationsWorker(String url) { StationBean tmpStations = stationCache.get(url); if (tmpStations != null) { Log.i("lookupStations", "cache hit " + url); } else { tmpStations = fetchStations(url); if (tmpStations != null) { stationCache.put(url, tmpStations); } } return tmpStations; } public StationBean fetchStations(String url) { try { String xml = DownloadUtil.getContentString(url, 15000, "ISO-8859-1"); Serializer serializer = new Persister(); StationBean stations = serializer.read(StationBean.class, xml); return stations; } catch (Exception e) { Log.e("XmlStationProvider", "lookupStations: ", e); return null; } } }