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