diff --git a/src/de/schildbach/pte/SbbProvider.java b/src/de/schildbach/pte/SbbProvider.java index 38b77703..e1a77f8a 100644 --- a/src/de/schildbach/pte/SbbProvider.java +++ b/src/de/schildbach/pte/SbbProvider.java @@ -103,16 +103,16 @@ public class SbbProvider implements NetworkProvider uri.append("&REQ0HafasSkipLongChanges=1"); uri.append("&REQ0JourneyDate=").append(ParserUtils.urlEncode(DATE_FORMAT.format(date))); uri.append("&REQ0JourneyStopsS0G=").append(ParserUtils.urlEncode(from)); - uri.append("&REQ0JourneyStopsS0A=1"); + uri.append("&REQ0JourneyStopsS0A=7"); // any uri.append("&REQ0JourneyStopsS0ID="); if (via != null) { uri.append("&REQ0JourneyStops1.0G=").append(ParserUtils.urlEncode(via)); - uri.append("&REQ0JourneyStops1.0A=1"); + uri.append("&REQ0JourneyStops1.0A=7"); // any uri.append("&REQ0JourneyStops1.0ID="); } uri.append("&REQ0JourneyStopsZ0G=").append(ParserUtils.urlEncode(to)); - uri.append("&REQ0JourneyStopsZ0A=1"); + uri.append("&REQ0JourneyStopsZ0A=7"); // any uri.append("&REQ0JourneyStopsZ0ID="); uri.append("&REQ0JourneyTime=").append(ParserUtils.urlEncode(TIME_FORMAT.format(date))); uri.append("&queryPageDisplayed=yes"); @@ -202,18 +202,21 @@ public class SbbProvider implements NetworkProvider private static final Pattern P_CONNECTION_DETAILS_COARSE = Pattern.compile("(.*?class=\"stop-station-icon\".*?)\n?" // + "(.*?class=\"stop-station-icon last\".*?)", Pattern.DOTALL); static final Pattern P_CONNECTION_DETAILS_FINE = Pattern.compile(".*?" // - + "" // departureId - + "(.*?).*?" // departure - + "\n?(?:.., (\\d{2}\\.\\d{2}\\.\\d{2})\n?)?.*?" // departureDate - + "(?:(\\d{2}:\\d{2})| ).*?" // departureTime - + "\n?\\s*(.+?)?\\s*\n?.*?" // departurePosition - + "\"(.*?)\"
.*?" // line - + "(?:\n?(\\d+) Min\\..*?.*?)?" // min - + "" // arrivalId, - + "(.*?).*?" // arrival - + "\n?(?:.., (\\d{2}\\.\\d{2}\\.\\d{2})\n?)?.*?" // arrivalDate - + "(?:(\\d{2}:\\d{2})| ).*?" // arrivalTime - + "\n?\\s*(.+?)?\\s*\n?.*?" // arrivalPosition + + "\n" // + + "(?:)?" // departureId + + "([^\n<]*?)<.*?" // departure + + "]*>\n(?:.., (\\d{2}\\.\\d{2}\\.\\d{2})\n)?.*?" // departureDate + + "]*>(?:(\\d{2}:\\d{2})| ).*?" // departureTime + + "]*>\\s*(.+?)?\\s*.*?" // departurePosition + + "\\s*(.*?)\\s*|" // line + + "\n(\\d+) Min\\.).*?" // min + + "\n" // + + "(?:)?" // arrivalId + + "([^\n<]*?)<.*?" // arrival + + "]*>\n(?:.., (\\d{2}\\.\\d{2}\\.\\d{2})\n)?.*?" // arrivalDate + + "]*>(?:(\\d{2}:\\d{2})| ).*?" // arrivalTime + + "]*>\\s*(.+?)?\\s*.*?" // arrivalPosition , Pattern.DOTALL); private QueryConnectionsResult queryConnections(final String uri, final CharSequence page) throws IOException @@ -269,23 +272,27 @@ public class SbbProvider implements NetworkProvider final Matcher mDetFine = P_CONNECTION_DETAILS_FINE.matcher(set); if (mDetFine.matches()) { - final int departureId = Integer.parseInt(mDetFine.group(1)); - final String departure = ParserUtils.resolveEntities(mDetFine.group(2)); + Date departureDate = mDetFine.group(3) != null ? ParserUtils.parseDate(mDetFine.group(3)) : null; + if (departureDate != null) + lastDate = departureDate; + else + departureDate = lastDate; + final String lineType = mDetFine.group(6); - final int arrivalId = Integer.parseInt(mDetFine.group(9)); - final String arrival = ParserUtils.resolveEntities(mDetFine.group(10)); + Date arrivalDate = mDetFine.group(11) != null ? ParserUtils.parseDate(mDetFine.group(11)) : null; + if (arrivalDate != null) + lastDate = arrivalDate; + else + arrivalDate = lastDate; + if (!lineType.equals("fuss") && !lineType.equals("transfer")) { - Date departureDate = mDetFine.group(3) != null ? ParserUtils.parseDate(mDetFine.group(3)) : null; - if (departureDate != null) - lastDate = departureDate; - else - departureDate = lastDate; + final int departureId = Integer.parseInt(mDetFine.group(1)); final Date departureTime = ParserUtils.joinDateTime(departureDate, ParserUtils.parseTime(mDetFine.group(4))); @@ -293,11 +300,7 @@ public class SbbProvider implements NetworkProvider final String line = normalizeLine(lineType, ParserUtils.resolveEntities(mDetFine.group(7))); - Date arrivalDate = mDetFine.group(11) != null ? ParserUtils.parseDate(mDetFine.group(11)) : null; - if (arrivalDate != null) - lastDate = arrivalDate; - else - arrivalDate = lastDate; + final int arrivalId = Integer.parseInt(mDetFine.group(9)); final Date arrivalTime = ParserUtils.joinDateTime(arrivalDate, ParserUtils.parseTime(mDetFine.group(12))); @@ -330,7 +333,7 @@ public class SbbProvider implements NetworkProvider } } - private Connection findConnection(List connections, String id) + private Connection findConnection(final List connections, final String id) { for (final Connection connection : connections) if (connection.id.equals(id)) diff --git a/test/de/schildbach/pte/SbbProviderTest.java b/test/de/schildbach/pte/SbbProviderTest.java index a14edf07..31f6dff8 100644 --- a/test/de/schildbach/pte/SbbProviderTest.java +++ b/test/de/schildbach/pte/SbbProviderTest.java @@ -18,6 +18,7 @@ package de.schildbach.pte; import static junit.framework.Assert.assertTrue; +import static junit.framework.Assert.assertNotNull; import java.util.regex.Matcher; @@ -113,7 +114,7 @@ public class SbbProviderTest } @Test - public void footway() + public void footwayFromStationToStation() { assertFineConnectionDetails("\n" // + "\n" // @@ -150,10 +151,52 @@ public class SbbProviderTest + "\n"); } + @Test + public void footwayFromStationToAddress() + { + assertFineConnectionDetails("\n" // + + "\n" // + + "\"Umgebungskarte:\n" // + + "\n" // + + "\n" // + + "Einsiedeln, Birchli/Garage\n" // + + "\n" // + + "\n" // + + "  \n" // + + "\n" // + + "\n" // + + "\"Fussweg\"
\n" // + + "Fussweg\n" // + + "\n" // + + "\n" // + + "
\n" // + + "
\n" // + + "
\n" // + + "
\n" // + + "
\n" // + + "
\n" // + + "\n" // + + "\n" // + + "9 Min. \n" // + + "\n" // + + "\n" // + + "\"Umgebungskarte:\n" // + + "\n" // + + "8840 Einsiedeln, Erlenmoosweg 24\n" // + + "\n" // + + "\n" // + + "  \n" // + + "\n"); + } + private void assertFineConnectionDetails(String s) { Matcher m = SbbProvider.P_CONNECTION_DETAILS_FINE.matcher(s); assertTrue(m.matches()); + // ParserUtils.printGroups(m); + + assertNotNull(m.group(2)); // departure + assertNotNull(m.group(10)); // arrival } } diff --git a/test/de/schildbach/pte/live/SbbProviderLiveTest.java b/test/de/schildbach/pte/live/SbbProviderLiveTest.java index da091f23..fcf918f0 100644 --- a/test/de/schildbach/pte/live/SbbProviderLiveTest.java +++ b/test/de/schildbach/pte/live/SbbProviderLiveTest.java @@ -51,4 +51,14 @@ public class SbbProviderLiveTest final QueryConnectionsResult moreResult = provider.queryMoreConnections(result.linkLater); System.out.println(moreResult); } + + @Test + public void connectionWithFootway() throws Exception + { + final QueryConnectionsResult result = provider.queryConnections(LocationType.ANY, "Spiez, Seestraße 62", null, null, LocationType.ANY, + "Einsiedeln, Erlenmoosweg 24", new Date(), true); + System.out.println(result); + final QueryConnectionsResult moreResult = provider.queryMoreConnections(result.linkLater); + System.out.println(moreResult); + } }