\n
\n(.+?)\\s*(?:- Aktuell)?\n.*?" // location
- + "Abfahrt (\\d{1,2}:\\d{2})\nUhr, (\\d{2}\\.\\d{2}\\.\\d{2}).*?" // currentTime
- , Pattern.DOTALL);
- private static final Pattern P_DEPARTURES_COARSE = Pattern.compile("
\n(.+?)
", Pattern.DOTALL);
- static final Pattern P_DEPARTURES_FINE = Pattern.compile(".*?" //
- + "
\n" // lineLink
- + "(.*?)\n" // line
- + "\n" //
- + ">>\n" //
- + "\\s*(.+?)\\s*\n" // destination
- + "
\n" //
- + "
(\\d{1,2}:\\d{2})" // time
- + "(?:
(?:(pünktl\\.)|ca. \\+(\\d+)))?" // ontime, delay
- + "(?: k\\.A\\.)?" //
- + "(?:,
([^<]*))*" // messages FIXME
- + "(?:(?:, )?(?:
heute )?(Gl\\. " + ParserUtils.P_PLATFORM + ")(?:\\s*)?)?" // position
- + "(?:,
]*>[^<]*)?" // (ersatzzug message)
- + "(?:,
[^<]*]*>[^<]*)?" // (ersatzzug message)
- + "(?:,
[^<]*)?" // (sonderzug message)
- , Pattern.DOTALL);
- private static final Pattern P_DEPARTURES_URI_STATION_ID = Pattern.compile("input=(\\d+)");
+ private static final Pattern P_DEPARTURES_COARSE = Pattern.compile("
", Pattern.DOTALL);
+ static final Pattern P_DEPARTURES_FINE = Pattern.compile("" //
+ + "fpTime=\"(\\d{1,2}:\\d{2})\" fpDate=\"(\\d{2}\\.\\d{2}\\.\\d{2})\" \n" // time, date
+ + "delay=\"(?:-|k\\.A\\.?|cancel|\\+?\\s*(\\d+))\" \n" // delay
+ + "(?:platform =\"([^\"]*)\" \n)?" // position
+ + "(?:newpl =\"([^\"]*)\" \n)?" //
+ + "targetLoc=\"([^\"]*)\" \n" // destination
+ + "prod=\"([^\"]*)\" \n" // line
+ + "(?:dir=[^\n]*\n)?" // (destination)
+ + "(?:depStation=\"([^\"]*)\"\n)?" //
+ + "delayReason=\"([^\"]*)\"\n" // message
+ );
+ private static final Pattern P_DEPARTURES_MESSAGES = Pattern.compile("
departures = new ArrayList(8);
+ final Calendar calendar = new GregorianCalendar();
+
+ final Matcher mDepCoarse = P_DEPARTURES_COARSE.matcher(page);
+ while (mDepCoarse.find())
+ {
+ final Matcher mDepFine = P_DEPARTURES_FINE.matcher(mDepCoarse.group(1));
+ if (mDepFine.matches())
{
- final String location = ParserUtils.resolveEntities(mHeadFine.group(1));
- final Date currentTime = ParserUtils.joinDateTime(ParserUtils.parseDate(mHeadFine.group(3)), ParserUtils
- .parseTime(mHeadFine.group(2)));
- final List departures = new ArrayList(8);
-
- // choose matcher
- final Matcher mDepCoarse = P_DEPARTURES_COARSE.matcher(mHeadCoarse.group(1));
- while (mDepCoarse.find())
+ if (mDepFine.group(8) == null)
{
- final Matcher mDepFine = P_DEPARTURES_FINE.matcher(mDepCoarse.group(1));
- if (mDepFine.matches())
+ final Date plannedTime = ParserUtils.joinDateTime(ParserUtils.parseDate(mDepFine.group(2)), ParserUtils.parseTime(mDepFine
+ .group(1)));
+
+ Date predictedTime = null;
+ if (mDepFine.group(3) != null)
{
- final String lineLink = ParserUtils.resolveEntities(mDepFine.group(1));
-
- final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(2)));
-
- final String destination = ParserUtils.resolveEntities(mDepFine.group(3));
-
- final Calendar current = new GregorianCalendar();
- current.setTime(currentTime);
- final Calendar parsed = new GregorianCalendar();
- parsed.setTime(ParserUtils.parseTime(mDepFine.group(4)));
- parsed.set(Calendar.YEAR, current.get(Calendar.YEAR));
- parsed.set(Calendar.MONTH, current.get(Calendar.MONTH));
- parsed.set(Calendar.DAY_OF_MONTH, current.get(Calendar.DAY_OF_MONTH));
- if (ParserUtils.timeDiff(parsed.getTime(), currentTime) < -PARSER_DAY_ROLLOVER_THRESHOLD_MS)
- parsed.add(Calendar.DAY_OF_MONTH, 1);
- final Date plannedTime = parsed.getTime();
-
- Date predictedTime = null;
- if (mDepFine.group(5) != null)
- {
- predictedTime = plannedTime;
- }
- else if (mDepFine.group(6) != null)
- {
- final int delay = Integer.parseInt(mDepFine.group(6));
- parsed.add(Calendar.MINUTE, delay);
- predictedTime = parsed.getTime();
- }
-
- final String message = ParserUtils.resolveEntities(mDepFine.group(7));
-
- final String position = ParserUtils.resolveEntities(mDepFine.group(8));
-
- final Departure dep = new Departure(plannedTime, predictedTime, line, line != null ? LINES.get(line.charAt(0)) : null,
- lineLink, position, 0, destination, message);
- if (!departures.contains(dep))
- departures.add(dep);
- }
- else
- {
- throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(1) + "' on " + uri);
+ calendar.setTime(plannedTime);
+ calendar.add(Calendar.MINUTE, Integer.parseInt(mDepFine.group(3)));
+ predictedTime = calendar.getTime();
}
+
+ final String position = mDepFine.group(4) != null ? "Gl. " + ParserUtils.resolveEntities(mDepFine.group(4)) : null;
+
+ final String destination = ParserUtils.resolveEntities(mDepFine.group(6));
+
+ final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(7)));
+
+ final String message = ParserUtils.resolveEntities(mDepFine.group(9));
+
+ departures.add(new Departure(plannedTime, predictedTime, line, line != null ? LINES.get(line.charAt(0)) : null, null, position,
+ 0, destination, message));
}
-
- return new QueryDeparturesResult(uri, stationId, location, departures);
}
else
{
- throw new IllegalArgumentException("cannot parse '" + mHeadCoarse.group(1) + "' on " + uri);
+ throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(1) + "' on " + uri);
}
}
- else
- {
- return new QueryDeparturesResult(uri, Status.NO_INFO);
- }
+
+ return new QueryDeparturesResult(uri, 0, null, departures);
}
private static final Pattern P_NORMALIZE_LINE_NUMBER = Pattern.compile("\\d{2,5}");
diff --git a/test/de/schildbach/pte/live/BahnProviderLiveTest.java b/test/de/schildbach/pte/live/BahnProviderLiveTest.java
index 1f090ceb..66d816dd 100644
--- a/test/de/schildbach/pte/live/BahnProviderLiveTest.java
+++ b/test/de/schildbach/pte/live/BahnProviderLiveTest.java
@@ -24,6 +24,7 @@ import org.junit.Test;
import de.schildbach.pte.BahnProvider;
import de.schildbach.pte.Connection;
import de.schildbach.pte.QueryConnectionsResult;
+import de.schildbach.pte.QueryDeparturesResult;
import de.schildbach.pte.NetworkProvider.LocationType;
import de.schildbach.pte.NetworkProvider.WalkSpeed;
@@ -33,6 +34,13 @@ import de.schildbach.pte.NetworkProvider.WalkSpeed;
public class BahnProviderLiveTest
{
private BahnProvider provider = new BahnProvider();
+
+ @Test
+ public void departures() throws Exception
+ {
+ final QueryDeparturesResult queryDepartures = provider.queryDepartures(provider.departuresQueryUri("692991", 0));
+ System.out.println(queryDepartures.departures);
+ }
@Test
public void shortConnection() throws Exception