From 65d1f24d8918531ecd7f0541e8a9f2ede9011bde Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Mon, 19 Mar 2012 11:10:25 +0100 Subject: [PATCH] later/earlier connections handling for BVG --- .../src/de/schildbach/pte/BvgProvider.java | 42 +++++++++++++++---- .../pte/live/BvgProviderLiveTest.java | 6 +++ 2 files changed, 39 insertions(+), 9 deletions(-) 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("
]*name=\"ivuTrackListForm(\\d+)\"[^>]*>(.+?)
", Pattern.DOTALL); + private static final Pattern P_CONNECTIONS_COARSE = Pattern.compile("
]*name=\"ivuTrackListForm(\\d+)\"[^>]*>(.+?)
", + 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