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
- + "_pic.gif\")
.*?" // 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" //
+ + " \n" //
+ + " | \n" //
+ + "\n" //
+ + "Einsiedeln, Birchli/Garage | \n" //
+ + "\n" //
+ + " | \n" //
+ + " | | \n" //
+ + " | \n" //
+ + "\n" //
+ + " \n" //
+ + "Fussweg\n" //
+ + " | \n" //
+ + "\n" //
+ + "\n" //
+ + " \n" //
+ + " \n" //
+ + " \n" //
+ + " \n" //
+ + " \n" //
+ + " | \n" //
+ + "\n" //
+ + "\n" //
+ + "\n" //
+ + " | \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);
+ }
}