package com.papagiannis.tuberun.fetchers;
import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicBoolean;
public class DeparturesOvergroundFetcher extends DeparturesFetcher{
private static final long serialVersionUID = 1L;
private AtomicBoolean isFirst = new AtomicBoolean(true);
private transient RequestTask task=null;
protected int update_counter=0;
protected String line, station_code,station_nice;
public DeparturesOvergroundFetcher(String stationcode, String stationnice)
{
station_code = stationcode;
station_nice = stationnice;
}
@Override
public void update() {
boolean first = isFirst.compareAndSet(true, false);
if (!first)
return; // only one at a time
String request_query = "http://www.tfl.gov.uk/tfl/livetravelnews/departure-boards/departureboards.aspx?" +
"line=overground&mode=overground&station="+station_code;
task=new RequestTask(new HttpCallback() {
public void onReturn(String s) {
getDeparturesCallBack(s);
}
});
task.execute(request_query);
}
@Override
public Date getUpdateTime() {
return new Date();
}
private void getDeparturesCallBack(String reply)
{
try
{
departures.clear();
while (true)
{
int i = reply.indexOf("Departure times for");
if (i != -1)
{
reply = reply.substring(i);
i = reply.indexOf("Departure times for");
}
int j = reply.indexOf("<td class=\"destination\">");
if (i == -1 || j == -1 || j < i) break;
String dirpart = reply.substring(i, j);
String plat = "";
try {
while (plat.equals("") || plat.equalsIgnoreCase(" ")) {
String start = "<span>";
String end = "</span>";
int si = dirpart.indexOf(start) + start.length();
int ei = dirpart.indexOf(end);
plat = dirpart.substring(si, ei);
dirpart=dirpart.substring(ei+end.length());
}
}
catch (Exception e) {
continue;
}
HashMap<String, String> train1 = getInfo(reply);
j = reply.indexOf("<td class=\"destination\">") + 24;
reply = reply.substring(j);
if (train1 != null) train1.put("platform", plat);
HashMap<String, String> train2 = getInfo(reply);
j = reply.indexOf("<td class=\"destination\">") + 24;
if (train2 != null) train2.put("platform", plat);
reply = reply.substring(j);
HashMap<String, String> train3 = getInfo(reply);
if (train3 != null) train3.put("platform", plat);
//The direction exists, go on
if (train1 != null) departures.add(train1);
if (train2 != null) departures.add(train2);
if (train3 != null) departures.add(train3);
}
notifyClients();
isFirst.set(true);
}
catch (Exception e)
{
notifyClients();
isFirst.set(true);
}
}
private HashMap<String, String> getInfo(String reply)
{
HashMap<String, String> train1 = new HashMap<String, String>();
int i, j;
String q1 = "<td class=\"destination\">";
i = reply.indexOf(q1) + q1.length();
if (i == q1.length() - 1) return null;
reply = reply.substring(i);
j = reply.indexOf("<");
String r = reply.substring(0, j);
r = r.replaceAll( "\n", "");
r = r.replaceAll( "\t", "");
r = r.replaceAll("\r", "");
r = r.replaceAll("&", "and");
r = r.trim();
train1.put("destination", r);
reply = reply.substring(j);
train1.put("position", "");
String q3 = "<td class=\"time\">";
i = reply.indexOf(q3) + q3.length();
reply = reply.substring(i);
j = reply.indexOf("<");
r = reply.substring(0, j);
r = r.replaceAll("\n", "");
r = r.replaceAll("\t", "");
r = r.replaceAll("\r", "");
r = r.trim();
train1.put("time", r);
reply = reply.substring(j);
return train1;
}
@Override
public void abort() {
isFirst.set(true);
if (task!=null) task.cancel(true);
}
}