diff --git a/enabler/src/de/schildbach/pte/BvgProvider.java b/enabler/src/de/schildbach/pte/BvgProvider.java
index f3dfe7b2..5dc2786c 100644
--- a/enabler/src/de/schildbach/pte/BvgProvider.java
+++ b/enabler/src/de/schildbach/pte/BvgProvider.java
@@ -44,7 +44,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.dto.StationDepartures;
import de.schildbach.pte.dto.Stop;
import de.schildbach.pte.dto.Style;
@@ -67,6 +66,28 @@ public final class BvgProvider extends AbstractHafasProvider
private final String additionalQueryParameter;
+ 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 BvgProvider(final String additionalQueryParameter)
{
super(API_BASE + "query.bin/dn", 8, null);
@@ -608,10 +629,14 @@ public final class BvgProvider 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);
}
@@ -672,8 +697,8 @@ public final class BvgProvider extends AbstractHafasProvider
+ "(?:]*?>.*?)?" // linkEarlier
+ "(?:]*?>.*?)?" // linkLater
, Pattern.DOTALL);
- private static final Pattern P_CONNECTIONS_COARSE = Pattern
- .compile("", Pattern.DOTALL);
+ private static final Pattern P_CONNECTIONS_COARSE = Pattern.compile("",
+ Pattern.DOTALL);
private static final Pattern P_CONNECTIONS_FINE = Pattern.compile(".*?" //
+ "Verbindungen - Detailansicht - Abfahrt: am (\\d{2}\\.\\d{2}\\.\\d{2}) um \\d{1,2}:\\d{2}.*?" // date
+ "guiVCtrl_connection_detailsOut_setStatus_([^_]+)_allHalts=yes.*?" // id
@@ -727,8 +752,7 @@ public final class BvgProvider extends AbstractHafasProvider
final Calendar currentDate = new GregorianCalendar(timeZone());
currentDate.clear();
ParserUtils.parseGermanDate(currentDate, mHead.group(12));
- // final String linkEarlier = mHead.group(13) != null ? BVG_BASE_URL +
- // ParserUtils.resolveEntities(mHead.group(13)) : null;
+ final String linkEarlier = mHead.group(13) != null ? BASE_URL + ParserUtils.resolveEntities(mHead.group(13)) : null;
final String linkLater = mHead.group(14) != null ? BASE_URL + ParserUtils.resolveEntities(mHead.group(14)) : null;
final List connections = new ArrayList();
@@ -862,7 +886,7 @@ public final class BvgProvider extends AbstractHafasProvider
}
}
- return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), firstUri, from, via, to, new SimpleStringContext(linkLater),
+ return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), firstUri, from, via, to, new Context(linkLater, linkEarlier),
connections);
}
else
diff --git a/enabler/test/de/schildbach/pte/live/BvgProviderLiveTest.java b/enabler/test/de/schildbach/pte/live/BvgProviderLiveTest.java
index 3c0adf64..ca726c62 100644
--- a/enabler/test/de/schildbach/pte/live/BvgProviderLiveTest.java
+++ b/enabler/test/de/schildbach/pte/live/BvgProviderLiveTest.java
@@ -94,6 +94,12 @@ public class BvgProviderLiveTest extends AbstractProviderLiveTest
System.out.println(result);
final QueryConnectionsResult laterResult = provider.queryMoreConnections(result.context, true);
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