diff --git a/src/de/schildbach/pte/SbbProvider.java b/src/de/schildbach/pte/SbbProvider.java
index 91426707..bbff3375 100644
--- a/src/de/schildbach/pte/SbbProvider.java
+++ b/src/de/schildbach/pte/SbbProvider.java
@@ -405,26 +405,26 @@ public class SbbProvider extends AbstractHafasProvider
private static final Pattern P_DEPARTURES_HEAD_COARSE = Pattern.compile(".*?" //
+ "(?:" //
- + "
\n(.+?)\n
.*?" // head
- + "(?:(.+)|(an dieser Haltestelle keines)).*?" // departures
- + "\n(.+?)\n
" //
+ + "\n(.*?)
\n" // head
+ + "(?:(.*?)|(an dieser Haltestelle keines))\n" // departures
+ + "\n(.*?)
\n" // footer
+ "|(Informationen zu)" // messages
+ "|(Verbindung zum Server konnte leider nicht hergestellt werden|kann vom Server derzeit leider nicht bearbeitet werden)" // messages
+ ").*?" //
, Pattern.DOTALL);
private static final Pattern P_DEPARTURES_HEAD_FINE = Pattern.compile("" //
- + "(.*?)
\n" // location
- + "Abfahrt (\\d+:\\d+)\n" // time
- + "Uhr, (\\d{2}\\.\\d{2}\\.\\d{2}).*?" // date
- + "input=(\\d+).*?" // locationId
+ + "([^<]*)(?:
)?\n" // location
+ + "Abfahrt (\\d{1,2}:\\d{2})\n" // time
+ + "Uhr, (\\d{2}\\.\\d{2}\\.\\d{2})\n" // date
+ + ".*?input=(\\d+)&.*?" // locationId
, Pattern.DOTALL);
- private static final Pattern P_DEPARTURES_COARSE = Pattern.compile("\n(.+?)
", Pattern.DOTALL);
+ private static final Pattern P_DEPARTURES_COARSE = Pattern.compile("\n(.*?)
", Pattern.DOTALL);
private static final Pattern P_DEPARTURES_FINE = Pattern.compile("" //
- + "(.*?)\n" // line
+ + "(.*?)\n" // line
+ ">>\n" //
+ "(.*?)\n" // destination
+ "
\n" //
- + "(\\d+:\\d+)\n" // time
+ + "(\\d+:\\d+)\n" // time
+ "(?:Gl\\. (" + ParserUtils.P_PLATFORM + ")\n)?" // position
+ ".*?" //
, Pattern.DOTALL);
@@ -445,8 +445,8 @@ public class SbbProvider extends AbstractHafasProvider
else if (mHeadCoarse.group(6) != null)
return new QueryDeparturesResult(uri, Status.SERVICE_DOWN);
- final String c = mHeadCoarse.group(1) + mHeadCoarse.group(4);
- final Matcher mHeadFine = P_DEPARTURES_HEAD_FINE.matcher(c);
+ final String head = mHeadCoarse.group(1) + mHeadCoarse.group(4);
+ final Matcher mHeadFine = P_DEPARTURES_HEAD_FINE.matcher(head);
if (mHeadFine.matches())
{
final String location = ParserUtils.resolveEntities(mHeadFine.group(1));
@@ -454,11 +454,18 @@ public class SbbProvider extends AbstractHafasProvider
.parseTime(mHeadFine.group(2)));
final int locationId = 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 String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(1)));
@@ -492,7 +499,7 @@ public class SbbProvider extends AbstractHafasProvider
}
else
{
- throw new IllegalArgumentException("cannot parse '" + c + "' on " + uri);
+ throw new IllegalArgumentException("cannot parse '" + head + "' on " + uri);
}
}
else
diff --git a/test/de/schildbach/pte/live/SbbProviderLiveTest.java b/test/de/schildbach/pte/live/SbbProviderLiveTest.java
index 2e8b404f..7f330159 100644
--- a/test/de/schildbach/pte/live/SbbProviderLiveTest.java
+++ b/test/de/schildbach/pte/live/SbbProviderLiveTest.java
@@ -28,6 +28,7 @@ import de.schildbach.pte.dto.Location;
import de.schildbach.pte.dto.LocationType;
import de.schildbach.pte.dto.NearbyStationsResult;
import de.schildbach.pte.dto.QueryConnectionsResult;
+import de.schildbach.pte.dto.QueryDeparturesResult;
/**
* @author Andreas Schildbach
@@ -42,7 +43,15 @@ public class SbbProviderLiveTest
{
final NearbyStationsResult result = provider.nearbyStations("8500010", 0, 0, 0, 0);
- System.out.println(result.stations.size() + " " + result.stations);
+ System.out.println(result.status + " " + result.stations.size() + " " + result.stations);
+ }
+
+ @Test
+ public void queryDepartures() throws Exception
+ {
+ final QueryDeparturesResult result = provider.queryDepartures(provider.departuresQueryUri("8500010", 0));
+
+ System.out.println(result.status + " " + result.departures.size() + " " + result.departures);
}
@Test