later/earlier connections handling for BVG

This commit is contained in:
Andreas Schildbach 2012-03-19 11:10:25 +01:00
parent b118bcd97c
commit 65d1f24d89
2 changed files with 39 additions and 9 deletions

View file

@ -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
+ "(?:<a href=\"([^\"]*)\" title=\"fr&uuml;here Verbindungen\"[^>]*?>.*?)?" // linkEarlier
+ "(?:<a href=\"([^\"]*)\" title=\"sp&auml;tere Verbindungen\"[^>]*?>.*?)?" // linkLater
, Pattern.DOTALL);
private static final Pattern P_CONNECTIONS_COARSE = Pattern
.compile("<form [^>]*name=\"ivuTrackListForm(\\d+)\"[^>]*>(.+?)</form>", Pattern.DOTALL);
private static final Pattern P_CONNECTIONS_COARSE = Pattern.compile("<form [^>]*name=\"ivuTrackListForm(\\d+)\"[^>]*>(.+?)</form>",
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<Connection> connections = new ArrayList<Connection>();
@ -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

View file

@ -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