From 6a97e1c3163ba586bc3ec2f1354e03356a417e36 Mon Sep 17 00:00:00 2001 From: "andreas.schildbach" Date: Wed, 13 Oct 2010 13:10:19 +0000 Subject: [PATCH] adapt to Switzerland format changes for departures git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@289 0924bc21-9374-b0fa-ee44-9ff1593b38f0 --- src/de/schildbach/pte/SbbProvider.java | 35 +++++++++++-------- .../pte/live/SbbProviderLiveTest.java | 11 +++++- 2 files changed, 31 insertions(+), 15 deletions(-) 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