diff --git a/src/de/schildbach/pte/OebbProvider.java b/src/de/schildbach/pte/OebbProvider.java
index c328a038..9d6254a7 100644
--- a/src/de/schildbach/pte/OebbProvider.java
+++ b/src/de/schildbach/pte/OebbProvider.java
@@ -115,7 +115,7 @@ public class OebbProvider implements NetworkProvider
final DateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm");
final StringBuilder uri = new StringBuilder();
- uri.append("http://fahrplan.oebb.at/bin/query.exe/dn?ld=web25&OK");
+ uri.append("http://fahrplan.oebb.at/bin/query.exe/dn?ld=web05&OK");
uri.append("&REQ0HafasSearchForw=").append(dep ? "1" : "0");
uri.append("&REQ0JourneyDate=").append(ParserUtils.urlEncode(DATE_FORMAT.format(date)));
uri.append("&REQ0JourneyStopsS0G=").append(ParserUtils.urlEncode(from));
@@ -449,15 +449,15 @@ public class OebbProvider implements NetworkProvider
+ "Abfahrt (\\d+:\\d+).*?" // time
+ "%23(\\d+)&.*?" // locationId
, Pattern.DOTALL);
- private static final Pattern P_DEPARTURES_COARSE = Pattern.compile("
(.*?)
", Pattern.DOTALL);
- private static final Pattern P_DEPARTURES_FINE = Pattern.compile(".*?" //
- + "(\\d{1,2}:\\d{2}) | \n" // plannedTime
- + "(?:\n" //
+ private static final Pattern P_DEPARTURES_COARSE = Pattern.compile(" | \n(.*?)
", Pattern.DOTALL);
+ static final Pattern P_DEPARTURES_FINE = Pattern.compile("" //
+ + "(\\d{1,2}:\\d{2}) | \n.*?" // plannedTime
+ + "(?:\n" //
+ "(?: |(pünktlich|\\d{1,2}:\\d{2}))\n | \n" // predictedTime
+ ")?.*?" //
- + "
\\s*(.*?)\\s*\\s*(.*?)\\s*\n" //
- + "" // destinationId
+ + "" // destinationId
+ "\\s*(.*?)\\s*\n" // destination
+ ".*?" //
+ "(?:\n(" + ParserUtils.P_PLATFORM + ").*?)?" // position
@@ -488,11 +488,18 @@ public class OebbProvider implements NetworkProvider
.parseTime(mHeadFine.group(3)));
final int stationId = Integer.parseInt(mHeadFine.group(4));
final List departures = new ArrayList(8);
+ String oldZebra = null;
final Matcher mDepCoarse = P_DEPARTURES_COARSE.matcher(mHeadCoarse.group(2));
while (mDepCoarse.find())
{
- final Matcher mDepFine = P_DEPARTURES_FINE.matcher(mDepCoarse.group(1));
+ final String zebra = mDepCoarse.group(1);
+ if (oldZebra != null && zebra.equals(oldZebra))
+ throw new IllegalArgumentException("missed row? last:" + zebra);
+ else
+ oldZebra = zebra;
+
+ final Matcher mDepFine = P_DEPARTURES_FINE.matcher(mDepCoarse.group(2));
if (mDepFine.matches())
{
final Calendar current = new GregorianCalendar();
@@ -535,7 +542,7 @@ public class OebbProvider implements NetworkProvider
}
else
{
- throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(1) + "' on " + uri);
+ throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(2) + "' on " + uri);
}
}
diff --git a/test/de/schildbach/pte/OebbProviderTest.java b/test/de/schildbach/pte/OebbProviderTest.java
new file mode 100644
index 00000000..c3f3701c
--- /dev/null
+++ b/test/de/schildbach/pte/OebbProviderTest.java
@@ -0,0 +1,53 @@
+package de.schildbach.pte;
+
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+
+import java.util.regex.Matcher;
+
+import org.junit.Test;
+
+public class OebbProviderTest
+{
+ @Test
+ public void testDepartures()
+ {
+ assertFineDepartures("" //
+ + "09:12 | \n" //
+ + "\n" //
+ + " Bus 16A\n" //
+ + " | \n" //
+ + "\n" //
+ + "\n" //
+ + "\n" //
+ + "Wien Hetzendorf Bahnhst\n" //
+ + "\n" //
+ + "\n" //
+ + " \n" //
+ + "\n" //
+ + "Wien Breitenfurter Straße/Hetzendorfer Straße\n" //
+ + "\n" //
+ + "09:12\n" //
+ + "-\n" //
+ + "\n" //
+ + "Wien Hetzendorf Bahnhst (Eckartsaugasse)\n" //
+ + "\n" //
+ + "09:13\n" //
+ + " | \n");
+ }
+
+ private Matcher assertFineDepartures(String s)
+ {
+ Matcher m = OebbProvider.P_DEPARTURES_FINE.matcher(s);
+ assertTrue(m.matches());
+
+ // ParserUtils.printGroups(m);
+
+ assertNotNull(m.group(1)); // time
+ assertNotNull(m.group(3)); // lineType
+ assertNotNull(m.group(4)); // line
+ assertNotNull(m.group(6)); // destination
+
+ return m;
+ }
+}
|