diff --git a/enabler/src/de/schildbach/pte/BahnProvider.java b/enabler/src/de/schildbach/pte/BahnProvider.java
index ca91a945..679aefe2 100644
--- a/enabler/src/de/schildbach/pte/BahnProvider.java
+++ b/enabler/src/de/schildbach/pte/BahnProvider.java
@@ -37,7 +37,6 @@ import de.schildbach.pte.dto.QueryConnectionsContext;
import de.schildbach.pte.dto.QueryConnectionsResult;
import de.schildbach.pte.dto.QueryDeparturesResult;
import de.schildbach.pte.dto.ResultHeader;
-import de.schildbach.pte.dto.SimpleStringContext;
import de.schildbach.pte.exception.SessionExpiredException;
import de.schildbach.pte.util.ParserUtils;
@@ -49,6 +48,28 @@ public final class BahnProvider extends AbstractHafasProvider
public static final NetworkId NETWORK_ID = NetworkId.DB;
private static final String API_BASE = "http://mobile.bahn.de/bin/mobil/";
+ private static class Context implements QueryConnectionsContext
+ {
+ private final String linkLater;
+ private final String linkEarlier;
+
+ private Context(final String linkLater, final String linkEarlier)
+ {
+ this.linkLater = linkLater;
+ this.linkEarlier = linkEarlier;
+ }
+
+ public boolean canQueryLater()
+ {
+ return linkLater != null;
+ }
+
+ public boolean canQueryEarlier()
+ {
+ return linkEarlier != null;
+ }
+ }
+
public BahnProvider()
{
super("http://reiseauskunft.bahn.de/bin/extxml.exe", 14, null);
@@ -298,10 +319,14 @@ public final class BahnProvider extends AbstractHafasProvider
@Override
public QueryConnectionsResult queryMoreConnections(final QueryConnectionsContext contextObj, final boolean later) throws IOException
{
- final SimpleStringContext context = (SimpleStringContext) contextObj;
- final String uri = context.context;
+ final Context context = (Context) contextObj;
+
+ final String uri = later ? context.linkLater : context.linkEarlier;
+ if (uri == null)
+ throw new IllegalStateException("cannot query " + (later ? "later" : "earlier"));
+
final CharSequence page = ParserUtils.scrape(uri);
- // TODO handle next/prev
+
return queryConnections(uri, page);
}
@@ -309,8 +334,8 @@ public final class BahnProvider extends AbstractHafasProvider
+ "von: ([^<]*).*?" // from
+ "nach: ([^<]*).*?" // to
+ "Datum: .., (\\d{2}\\.\\d{2}\\.\\d{2}).*?" // currentDate
- + "(?:
]*>\\s*Früher.*?)?" // linkEarlier
- + "(?:
]*>\\s*Später.*?)?" // linkLater
+ + "(?:]*href=\"([^\"]*)\"[^>]*>
]*>\\s*Früher.*?)?" // linkEarlier
+ + "(?:]*href=\"([^\"]*)\"[^>]*>
]*>\\s*Später.*?)?" // linkLater
, Pattern.DOTALL);
private static final Pattern P_CONNECTIONS_COARSE = Pattern.compile("(.+?) |
", Pattern.DOTALL);
private static final Pattern P_CONNECTIONS_FINE = Pattern.compile(".*?" //
@@ -344,8 +369,9 @@ public final class BahnProvider extends AbstractHafasProvider
final Calendar currentDate = new GregorianCalendar(timeZone());
currentDate.clear();
ParserUtils.parseGermanDate(currentDate, mHead.group(3));
- // final String linkEarlier = mHead.group(4) != null ? ParserUtils.resolveEntities(mHead.group(4)) : null;
+ final String linkEarlier = mHead.group(4) != null ? ParserUtils.resolveEntities(mHead.group(4)) : null;
final String linkLater = mHead.group(5) != null ? ParserUtils.resolveEntities(mHead.group(5)) : null;
+
final List connections = new ArrayList();
final Matcher mConCoarse = P_CONNECTIONS_COARSE.matcher(page);
@@ -364,7 +390,7 @@ public final class BahnProvider extends AbstractHafasProvider
}
}
- return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), uri, from, null, to, new SimpleStringContext(linkLater), connections);
+ return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), uri, from, null, to, new Context(linkLater, linkEarlier), connections);
}
else
{
diff --git a/enabler/test/de/schildbach/pte/live/BahnProviderLiveTest.java b/enabler/test/de/schildbach/pte/live/BahnProviderLiveTest.java
index 158aa87a..e6ad82b3 100644
--- a/enabler/test/de/schildbach/pte/live/BahnProviderLiveTest.java
+++ b/enabler/test/de/schildbach/pte/live/BahnProviderLiveTest.java
@@ -90,6 +90,12 @@ public class BahnProviderLiveTest extends AbstractProviderLiveTest
for (final Connection connection : result.connections)
provider.getConnectionDetails(connection.link);
System.out.println(laterResult);
+ final QueryConnectionsResult later2Result = provider.queryMoreConnections(laterResult.context, true);
+ System.out.println(later2Result);
+ final QueryConnectionsResult earlierResult = provider.queryMoreConnections(later2Result.context, false);
+ System.out.println(earlierResult);
+ final QueryConnectionsResult later3Result = provider.queryMoreConnections(earlierResult.context, true);
+ System.out.println(later3Result);
}
@Test