([^<]*)<.*?" // to
- + "Datum: .., (\\d{2}\\.\\d{2}\\.\\d{2}).*?" // currentDate
- + "(.*?" // body
- + "(?:\n" //
- + "(.*?)
\n", Pattern.DOTALL);
- private static final Pattern P_CONNECTIONS_FINE = Pattern.compile("" //
- + "(?:
]*>)?" //
- + "" // link
- + "(\\d{1,2}:\\d{2})-(\\d{1,2}:\\d{2}).*?" // departureTime, arrivalTime
- , Pattern.DOTALL);
-
- private QueryConnectionsResult queryConnections(final String uri, final CharSequence page) throws IOException
- {
- final Matcher mHead = P_CONNECTIONS_HEAD.matcher(page);
- if (mHead.matches())
- {
- final Location from = new Location(LocationType.ANY, 0, 0, 0, ParserUtils.resolveEntities(mHead.group(1)));
- final Location to = new Location(LocationType.ANY, 0, 0, 0, ParserUtils.resolveEntities(mHead.group(2)));
- final Date currentDate = ParserUtils.parseDate(mHead.group(3));
- final String body = mHead.group(4);
- final String linkEarlier = mHead.group(5) != null ? ParserUtils.resolveEntities(mHead.group(5)) : null;
- final String linkLater = mHead.group(6) != null ? ParserUtils.resolveEntities(mHead.group(6)) : null;
- final List connections = new ArrayList();
- String oldZebra = null;
-
- final Matcher mCoarse = P_CONNECTIONS_COARSE.matcher(body);
- while (mCoarse.find())
- {
- final String zebra = mCoarse.group(1);
- if (oldZebra != null && zebra.equals(oldZebra))
- throw new IllegalArgumentException("missed row? last:" + zebra);
- else
- oldZebra = zebra;
-
- final String set = mCoarse.group(2);
- final Matcher mFine = P_CONNECTIONS_FINE.matcher(set);
- if (mFine.matches())
- {
- final String link = ParserUtils.resolveEntities(mFine.group(1));
- Date departureTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mFine.group(2)));
- if (!connections.isEmpty())
- {
- final long diff = ParserUtils.timeDiff(departureTime, connections.get(connections.size() - 1).departureTime);
- if (diff > PARSER_DAY_ROLLOVER_THRESHOLD_MS)
- departureTime = ParserUtils.addDays(departureTime, -1);
- else if (diff < -PARSER_DAY_ROLLOVER_THRESHOLD_MS)
- departureTime = ParserUtils.addDays(departureTime, 1);
- }
- Date arrivalTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mFine.group(3)));
- if (departureTime.after(arrivalTime))
- arrivalTime = ParserUtils.addDays(arrivalTime, 1);
-
- connections.add(new Connection(extractConnectionId(link), link, departureTime, arrivalTime, null, null, 0, from.name, 0, to.name,
- null));
- }
- else
- {
- throw new IllegalArgumentException("cannot parse '" + set + "' on " + uri);
- }
- }
-
- return new QueryConnectionsResult(uri, from, null, to, linkEarlier, linkLater, connections);
- }
- else
- {
- throw new IOException(page.toString());
- }
- }
-
- private static final Pattern P_CONNECTION_DETAILS_HEAD = Pattern.compile(".*?" //
- + "\n- ([^<]*) -\n
\n" //
- + "(.*?)" //
- + "\n(.*?)
\n" //
- + "\n(.*?)
\n" //
- , Pattern.DOTALL);
- private static final Pattern P_CONNECTION_DETAILS_JOURNEY = Pattern.compile("" //
- + "(?:" //
- + "(.+?)\n.*?" // line
- + "ab (\\d{1,2}:\\d{2})\n" // departureTime
- + "(?: (Gl\\. .+?)\\s*\n)?" // departurePosition
- + ".*?" //
- + "an (\\d{1,2}:\\d{2})\n" // arrivalTime
- + "(?: (Gl\\. .+?)\\s*\n)?" // arrivalPosition
- + "|" //
- + "(?:Fussweg|Übergang)\n" //
- + "(\\d+) Min\\.\n" // minutes
- + ")" //
- , Pattern.DOTALL);
- private static final Pattern P_CONNECTION_DETAILS_DESTINATION = Pattern.compile("" //
- + "- ([^<]*) -\n" // destination
- , Pattern.DOTALL);
-
- @Override
- public GetConnectionDetailsResult getConnectionDetails(final String uri) throws IOException
- {
- final CharSequence page = ParserUtils.scrape(uri);
-
- final Matcher mHead = P_CONNECTION_DETAILS_HEAD.matcher(page);
- if (mHead.matches())
- {
- Date firstDepartureTime = null;
- final String firstDeparture = ParserUtils.resolveEntities(mHead.group(1));
- Date lastArrivalTime = null;
- String departure = firstDeparture;
- final String body = mHead.group(2);
- final Date date = ParserUtils.parseDate(mHead.group(3));
-
- final List parts = new ArrayList(4);
-
- final Matcher mCoarse = P_CONNECTION_DETAILS_COARSE.matcher(body);
- while (mCoarse.find())
- {
- final Matcher mJourney = P_CONNECTION_DETAILS_JOURNEY.matcher(mCoarse.group(1));
- final Matcher mDestination = P_CONNECTION_DETAILS_DESTINATION.matcher(mCoarse.group(2));
- if (mJourney.matches() && mDestination.matches())
- {
- final String arrival = mDestination.group(1);
-
- if (mJourney.group(6) == null)
- {
- final String line = normalizeLine(ParserUtils.resolveEntities(mJourney.group(1)));
- Date departureTime = ParserUtils.joinDateTime(date, ParserUtils.parseTime(mJourney.group(2)));
- if (lastArrivalTime != null && departureTime.before(lastArrivalTime))
- departureTime = ParserUtils.addDays(departureTime, 1);
- final String departurePosition = mJourney.group(3) != null ? ParserUtils.resolveEntities(mJourney.group(3)) : null;
- Date arrivalTime = ParserUtils.joinDateTime(date, ParserUtils.parseTime(mJourney.group(4)));
- if (departureTime.after(arrivalTime))
- arrivalTime = ParserUtils.addDays(arrivalTime, 1);
- final String arrivalPosition = mJourney.group(5) != null ? ParserUtils.resolveEntities(mJourney.group(5)) : null;
-
- parts.add(new Connection.Trip(line, lineColors(line), 0, null, departureTime, departurePosition, 0, departure, arrivalTime,
- arrivalPosition, 0, arrival));
-
- if (firstDepartureTime == null)
- firstDepartureTime = departureTime;
- lastArrivalTime = arrivalTime;
- departure = arrival;
- }
- else
- {
- final int min = Integer.parseInt(mJourney.group(6));
-
- parts.add(new Connection.Footway(min, 0, departure, 0, arrival, 0, 0));
-
- departure = arrival;
- }
- }
- else
- {
- throw new IllegalArgumentException("cannot parse '" + mCoarse.group(1) + "', '" + mCoarse.group(2) + "' on " + uri);
- }
- }
-
- return new GetConnectionDetailsResult(new Date(), new Connection(AbstractHafasProvider.extractConnectionId(uri), uri, firstDepartureTime,
- lastArrivalTime, null, null, 0, firstDeparture, 0, departure, parts));
- }
- else
- {
- throw new IllegalArgumentException("cannot parse '" + page + "' on " + uri);
- }
-
- }
-
private String departuresQueryUri(final String stationId, final int maxDepartures)
{
final StringBuilder uri = new StringBuilder();
@@ -417,11 +114,11 @@ public class SbbProvider extends AbstractHafasProvider
{
// messages
if (mHeadCoarse.group(3) != null)
- return new QueryDeparturesResult( Status.NO_INFO, Integer.parseInt(stationId));
+ return new QueryDeparturesResult(Status.NO_INFO, Integer.parseInt(stationId));
else if (mHeadCoarse.group(5) != null)
- return new QueryDeparturesResult( Status.INVALID_STATION, Integer.parseInt(stationId));
+ return new QueryDeparturesResult(Status.INVALID_STATION, Integer.parseInt(stationId));
else if (mHeadCoarse.group(6) != null)
- return new QueryDeparturesResult( Status.SERVICE_DOWN, Integer.parseInt(stationId));
+ return new QueryDeparturesResult(Status.SERVICE_DOWN, Integer.parseInt(stationId));
final String head = mHeadCoarse.group(1) + mHeadCoarse.group(4);
final Matcher mHeadFine = P_DEPARTURES_HEAD_FINE.matcher(head);