package com.papagiannis.tuberun.fetchers; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.concurrent.atomic.AtomicBoolean; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.os.AsyncTask; import com.papagiannis.tuberun.Station; public class DeparturesRailFetcher extends DeparturesFetcher { private static final long serialVersionUID = 1L; private AtomicBoolean isFirst = new AtomicBoolean(true); private transient RequestTask task = null; private transient ParserTask parserTask = null; protected int update_counter = 0; protected String line, station_code, station_nice; public DeparturesRailFetcher(Station s) { station_code = s.getCode(); station_nice = s.getName(); } @Override public void update() { boolean first = isFirst.compareAndSet(true, false); if (!first) return; // only one at a time String request_query = "http://ojp.nationalrail.co.uk/service/ldbboard/dep/" + station_code; task = new RequestTask(new HttpCallback() { public void onReturn(String s) { getDeparturesCallBack(s); } }); task.setDesktopUserAgent(); task.execute(request_query); } @Override public Date getUpdateTime() { return new Date(); } private void getDeparturesCallBack(String reply) { try { departures.clear(); if (reply==null || reply.length()==0) { notifyClients(); isFirst.set(true); } parserTask=new ParserTask(); parserTask.execute(reply); } catch (Exception e) { notifyClients(); isFirst.set(true); } } @Override public void abort() { if (task != null) task.cancel(true); if (parserTask!=null) parserTask.cancel(true); isFirst.set(true); } private class ParserTask extends AsyncTask<String, Integer, ArrayList<HashMap<String,String>>> { @Override protected ArrayList<HashMap<String, String>> doInBackground( String... params) { ArrayList<HashMap<String, String>> result=new ArrayList<HashMap<String,String>>(); if (params==null || params.length!=1) return result; Document doc = Jsoup.parse(params[0]); Elements table = doc.getElementsByTag("tbody"); if (table==null || table.size()==0) return result; Elements rows = table.first().getElementsByTag("tr"); for (Element row : rows) { HashMap<String, String> train = new HashMap<String, String>(); if (row.childNodeSize()<4) continue; String[] keys = new String[] { "time", "destination", "position", "platform" }; int i=0; for (String key:keys) { String value = row.child(i++).text(); value=cleanString(value); if (key.equals("platform") && value!=null && value.length() > 0) value = "Platform " + value; train.put(key, value); } result.add(train); } return result; } protected String cleanString(String in) { if (in==null) return ""; // String temp=android.text.Html.fromHtml(in).toString(); return in.replaceAll("\\s+", " "); } @Override protected void onPostExecute(ArrayList<HashMap<String, String>> result) { departures=result; notifyClients(); isFirst.set(true); } } @Override public ArrayList<HashMap<String, String>> getDepartures(String platform) { return getUnsortedDepartures(); } }