diff --git a/src/de/schildbach/pte/BahnProvider.java b/src/de/schildbach/pte/BahnProvider.java index 9ddb870b..eebaceee 100644 --- a/src/de/schildbach/pte/BahnProvider.java +++ b/src/de/schildbach/pte/BahnProvider.java @@ -257,7 +257,7 @@ public final class BahnProvider implements NetworkProvider line = normalizeLine(line); else line = null; - final Connection connection = new Connection(link, departureTime, arrivalTime, from, to, new ArrayList(1)); + final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to, new ArrayList(1)); connection.parts.add(new Connection.Trip(departureTime, arrivalTime, line, line != null ? LINES.get(line.charAt(0)) : null)); connections.add(connection); } @@ -347,8 +347,8 @@ public final class BahnProvider implements NetworkProvider final Date departureDateTime = ParserUtils.joinDateTime(departureDate, departureTime); final Date arrivalDateTime = ParserUtils.joinDateTime(arrivalDate, arrivalTime); - lastTrip = new Connection.Trip(line, LINES.get(line.charAt(0)), null, departureDateTime, departurePosition, departure, - arrivalDateTime, arrivalPosition, arrival); + lastTrip = new Connection.Trip(line, LINES.get(line.charAt(0)), null, departureDateTime, departurePosition, 0, departure, + arrivalDateTime, arrivalPosition, 0, arrival); parts.add(lastTrip); if (firstDepartureTime == null) @@ -385,8 +385,8 @@ public final class BahnProvider implements NetworkProvider if (firstDepartureTime == null || lastArrivalTime == null) throw new IllegalStateException("could not parse all parts of:\n" + page + "\n" + parts); - return new GetConnectionDetailsResult(new Date(), new Connection(uri, firstDepartureTime, lastArrivalTime, firstDeparture, lastArrival, - parts)); + return new GetConnectionDetailsResult(new Date(), new Connection(uri, firstDepartureTime, lastArrivalTime, 0, firstDeparture, 0, + lastArrival, parts)); } else { diff --git a/src/de/schildbach/pte/Connection.java b/src/de/schildbach/pte/Connection.java index 75a0c59d..e8b8b611 100644 --- a/src/de/schildbach/pte/Connection.java +++ b/src/de/schildbach/pte/Connection.java @@ -29,17 +29,22 @@ public final class Connection final public String link; final public Date departureTime; final public Date arrivalTime; + final public int fromId; final public String from; + final public int toId; final public String to; final public List parts; - public Connection(String link, Date departureTime, Date arrivalTime, String from, String to, List parts) + public Connection(final String link, final Date departureTime, final Date arrivalTime, final int fromId, final String from, final int toId, + final String to, final List parts) { this.id = extractId(link); this.link = link; this.departureTime = departureTime; + this.fromId = fromId; this.from = from; this.arrivalTime = arrivalTime; + this.toId = toId; this.to = to; this.parts = parts; } @@ -89,28 +94,33 @@ public final class Connection final public String destination; final public Date departureTime; final public String departurePosition; + final public int departureId; final public String departure; final public Date arrivalTime; final public String arrivalPosition; + final public int arrivalId; final public String arrival; public Trip(final String line, final int[] lineColors, final String destination, final Date departureTime, final String departurePosition, - final String departure, final Date arrivalTime, final String arrivalPosition, final String arrival) + final int departureId, final String departure, final Date arrivalTime, final String arrivalPosition, final int arrivalId, + final String arrival) { this.line = line; this.lineColors = lineColors; this.destination = destination; this.departureTime = departureTime; this.departurePosition = departurePosition; + this.departureId = departureId; this.departure = departure; this.arrivalTime = arrivalTime; this.arrivalPosition = arrivalPosition; + this.arrivalId = arrivalId; this.arrival = arrival; } public Trip(final Date departureTime, final Date arrivalTime, final String line, final int[] lineColors) { - this(line, lineColors, null, departureTime, null, null, arrivalTime, null, null); + this(line, lineColors, null, departureTime, null, 0, null, arrivalTime, null, 0, null); } @Override @@ -121,9 +131,11 @@ public final class Connection builder.append(","); builder.append("destination=").append(destination); builder.append(","); - builder.append("departure=").append(departureTime).append("/").append(departurePosition).append("/").append(departure); + builder.append("departure=").append(departureTime).append("/").append(departurePosition).append("/").append(departureId).append("/") + .append(departure); builder.append(","); - builder.append("arrival=").append(arrivalTime).append("/").append(arrivalPosition).append("/").append(arrival); + builder.append("arrival=").append(arrivalTime).append("/").append(arrivalPosition).append("/").append(arrivalId).append("/").append( + arrival); builder.append("]"); return builder.toString(); } @@ -135,7 +147,7 @@ public final class Connection final public String departure; final public String arrival; - public Footway(int min, String departure, String arrival) + public Footway(final int min, final String departure, final String arrival) { this.min = min; this.departure = departure; diff --git a/src/de/schildbach/pte/MvvProvider.java b/src/de/schildbach/pte/MvvProvider.java index 1e5599e8..845dd05a 100644 --- a/src/de/schildbach/pte/MvvProvider.java +++ b/src/de/schildbach/pte/MvvProvider.java @@ -290,7 +290,8 @@ public class MvvProvider implements NetworkProvider Date arrivalTime = ParserUtils.joinDateTime(date, ParserUtils.parseTime(mConFine.group(5))); if (departureTime.after(arrivalTime)) arrivalTime = ParserUtils.addDays(arrivalTime, 1); - final Connection connection = new Connection(link, departureTime, arrivalTime, from, to, new ArrayList(1)); + final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to, + new ArrayList(1)); connection.parts.add(new Connection.Trip(departureTime, arrivalTime, null, null)); connections.add(connection); } @@ -301,7 +302,8 @@ public class MvvProvider implements NetworkProvider final Date departureTime = calendar.getTime(); calendar.add(Calendar.MINUTE, min); final Date arrivalTime = calendar.getTime(); - final Connection connection = new Connection(link, departureTime, arrivalTime, from, to, new ArrayList(1)); + final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to, + new ArrayList(1)); connection.parts.add(new Connection.Footway(min, from, to)); connections.add(connection); } @@ -386,8 +388,8 @@ public class MvvProvider implements NetworkProvider final String normalizedLine = normalizeLine(product, line); - parts.add(new Connection.Trip(normalizedLine, LINES.get(normalizedLine), destination, departureTime, null, departure, - arrivalTime, null, arrival)); + parts.add(new Connection.Trip(normalizedLine, LINES.get(normalizedLine), destination, departureTime, null, 0, departure, + arrivalTime, null, 0, arrival)); if (firstDepartureTime == null) firstDepartureTime = departureTime; @@ -432,8 +434,8 @@ public class MvvProvider implements NetworkProvider lastArrivalTime = calendar.getTime(); } - return new GetConnectionDetailsResult(new Date(), new Connection(uri, firstDepartureTime, lastArrivalTime, firstDeparture, lastArrival, - parts)); + return new GetConnectionDetailsResult(new Date(), new Connection(uri, firstDepartureTime, lastArrivalTime, 0, firstDeparture, 0, + lastArrival, parts)); } else { diff --git a/src/de/schildbach/pte/RmvProvider.java b/src/de/schildbach/pte/RmvProvider.java index 84b0b394..533cdc3a 100644 --- a/src/de/schildbach/pte/RmvProvider.java +++ b/src/de/schildbach/pte/RmvProvider.java @@ -215,26 +215,26 @@ public class RmvProvider implements NetworkProvider if (mConFine.matches()) { final String link = ParserUtils.resolveEntities(mConFine.group(1)); - Date departure = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(2))); + Date departureTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(2))); if (!connections.isEmpty()) { - final long diff = ParserUtils.timeDiff(departure, + final long diff = ParserUtils.timeDiff(departureTime, ((Connection.Trip) connections.get(connections.size() - 1).parts.get(0)).departureTime); if (diff > PARSER_DAY_ROLLOVER_THRESHOLD_MS) - departure = ParserUtils.addDays(departure, -1); + departureTime = ParserUtils.addDays(departureTime, -1); else if (diff < -PARSER_DAY_ROLLOVER_THRESHOLD_MS) - departure = ParserUtils.addDays(departure, 1); + departureTime = ParserUtils.addDays(departureTime, 1); } - Date arrival = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(3))); - if (departure.after(arrival)) - arrival = ParserUtils.addDays(arrival, 1); + Date arrivalTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(3))); + if (departureTime.after(arrivalTime)) + arrivalTime = ParserUtils.addDays(arrivalTime, 1); String line = mConFine.group(4); if (line != null && !line.endsWith("Um.")) line = normalizeLine(line); else line = null; - final Connection connection = new Connection(link, departure, arrival, from, to, new ArrayList(1)); - connection.parts.add(new Connection.Trip(departure, arrival, line, line != null ? LINES.get(line.charAt(0)) : null)); + final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to, new ArrayList(1)); + connection.parts.add(new Connection.Trip(departureTime, arrivalTime, line, line != null ? LINES.get(line.charAt(0)) : null)); connections.add(connection); } else @@ -321,8 +321,8 @@ public class RmvProvider implements NetworkProvider final Date departureDateTime = ParserUtils.joinDateTime(currentDate, departureTime); final Date arrivalDateTime = ParserUtils.joinDateTime(currentDate, arrivalTime); - lastTrip = new Connection.Trip(line, LINES.get(line.charAt(0)), destination, departureDateTime, departurePosition, departure, - arrivalDateTime, arrivalPosition, arrival); + lastTrip = new Connection.Trip(line, LINES.get(line.charAt(0)), destination, departureDateTime, departurePosition, 0, + departure, arrivalDateTime, arrivalPosition, 0, arrival); parts.add(lastTrip); if (firstDepartureTime == null) @@ -349,8 +349,8 @@ public class RmvProvider implements NetworkProvider } } - return new GetConnectionDetailsResult(currentDate, new Connection(uri, firstDepartureTime, lastArrivalTime, firstDeparture, lastArrival, - parts)); + return new GetConnectionDetailsResult(currentDate, new Connection(uri, firstDepartureTime, lastArrivalTime, 0, firstDeparture, 0, + lastArrival, parts)); } else { diff --git a/src/de/schildbach/pte/VbbProvider.java b/src/de/schildbach/pte/VbbProvider.java index e5b9daf3..ab832636 100644 --- a/src/de/schildbach/pte/VbbProvider.java +++ b/src/de/schildbach/pte/VbbProvider.java @@ -193,24 +193,24 @@ public final class VbbProvider implements NetworkProvider if (mConFine.matches()) { final String link = BVG_BASE_URL + ParserUtils.resolveEntities(mConFine.group(1)); - Date departure = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(2))); + Date departureTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(2))); if (!connections.isEmpty()) { - final long diff = ParserUtils.timeDiff(departure, + final long diff = ParserUtils.timeDiff(departureTime, ((Connection.Trip) connections.get(connections.size() - 1).parts.get(0)).departureTime); if (diff > PARSER_DAY_ROLLOVER_THRESHOLD_MS) - departure = ParserUtils.addDays(departure, -1); + departureTime = ParserUtils.addDays(departureTime, -1); else if (diff < -PARSER_DAY_ROLLDOWN_THRESHOLD_MS) - departure = ParserUtils.addDays(departure, 1); + departureTime = ParserUtils.addDays(departureTime, 1); } - Date arrival = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(3))); - if (departure.after(arrival)) - arrival = ParserUtils.addDays(arrival, 1); + Date arrivalTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mConFine.group(3))); + if (departureTime.after(arrivalTime)) + arrivalTime = ParserUtils.addDays(arrivalTime, 1); String line = mConFine.group(4); if (line != null) line = normalizeLine(ParserUtils.resolveEntities(line)); - final Connection connection = new Connection(link, departure, arrival, from, to, new ArrayList(1)); - connection.parts.add(new Connection.Trip(departure, arrival, line, LINES.get(line))); + final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to, new ArrayList(1)); + connection.parts.add(new Connection.Trip(departureTime, arrivalTime, line, LINES.get(line))); connections.add(connection); } else @@ -229,7 +229,8 @@ public final class VbbProvider implements NetworkProvider private static final Pattern P_CONNECTION_DETAILS_HEAD = Pattern.compile(".*(?:Datum|Abfahrt): (\\d\\d\\.\\d\\d\\.\\d\\d).*", Pattern.DOTALL); private static final Pattern P_CONNECTION_DETAILS_COARSE = Pattern.compile("

\n?(.+?)\n?

", Pattern.DOTALL); - static final Pattern P_CONNECTION_DETAILS_FINE = Pattern.compile("(?:(?:\\n?)?(.+?)(?:\\n?)?)?.*?" // departure + static final Pattern P_CONNECTION_DETAILS_FINE = Pattern.compile("(?:(?:\\n?)?" // departureId + + "(.+?)(?:\\n?)?)?.*?" // departure + "(?:" // + "ab (\\d+:\\d+)\n?" // departureTime + "(Gl\\. \\d+)?.*?" // departurePosition @@ -237,6 +238,7 @@ public final class VbbProvider implements NetworkProvider + "Ri\\. (.*?)[\n\\.]*<.*?" // destination + "an (\\d+:\\d+)\n?" // arrivalTime + "(Gl\\. \\d+)?.*?" // arrivalPosition + + "\n?" // arrivalId + "(.*?)" // arrival + "|" // + "(\\d+) Min\\.[\n\\s]?" // footway @@ -256,8 +258,10 @@ public final class VbbProvider implements NetworkProvider Date firstDepartureTime = null; String firstDeparture = null; + int firstDepartureId = 0; Date lastArrivalTime = null; String lastArrival = null; + int lastArrivalId = 0; final Matcher mDetCoarse = P_CONNECTION_DETAILS_COARSE.matcher(page); while (mDetCoarse.find()) @@ -265,45 +269,60 @@ public final class VbbProvider implements NetworkProvider final Matcher mDetFine = P_CONNECTION_DETAILS_FINE.matcher(mDetCoarse.group(1)); if (mDetFine.matches()) { - String departure = ParserUtils.resolveEntities(mDetFine.group(1)); + int departureId = 0; + String departure = ParserUtils.resolveEntities(mDetFine.group(2)); if (departure == null) + { departure = lastArrival; - if (departure != null && firstDeparture == null) - firstDeparture = departure; + departureId = lastArrivalId; + } + else + { + departureId = Integer.parseInt(mDetFine.group(1)); + } - final String min = mDetFine.group(9); + if (departure != null && firstDeparture == null) + { + firstDeparture = departure; + firstDepartureId = departureId; + } + + final String min = mDetFine.group(11); if (min == null) { - Date departureTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mDetFine.group(2))); + Date departureTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mDetFine.group(3))); if (lastArrivalTime != null && departureTime.before(lastArrivalTime)) departureTime = ParserUtils.addDays(departureTime, 1); - final String departurePosition = mDetFine.group(3); + final String departurePosition = mDetFine.group(4); - final String line = normalizeLine(ParserUtils.resolveEntities(mDetFine.group(4))); + final String line = normalizeLine(ParserUtils.resolveEntities(mDetFine.group(5))); - final String destination = ParserUtils.resolveEntities(mDetFine.group(5)); + final String destination = ParserUtils.resolveEntities(mDetFine.group(6)); - Date arrivalTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mDetFine.group(6))); + Date arrivalTime = ParserUtils.joinDateTime(currentDate, ParserUtils.parseTime(mDetFine.group(7))); if (departureTime.after(arrivalTime)) arrivalTime = ParserUtils.addDays(arrivalTime, 1); - final String arrivalPosition = mDetFine.group(7); + final String arrivalPosition = mDetFine.group(8); - final String arrival = ParserUtils.resolveEntities(mDetFine.group(8)); + final int arrivalId = Integer.parseInt(mDetFine.group(9)); - parts.add(new Connection.Trip(line, LINES.get(line), destination, departureTime, departurePosition, departure, arrivalTime, - arrivalPosition, arrival)); + final String arrival = ParserUtils.resolveEntities(mDetFine.group(10)); + + parts.add(new Connection.Trip(line, LINES.get(line), destination, departureTime, departurePosition, departureId, departure, + arrivalTime, arrivalPosition, arrivalId, arrival)); if (firstDepartureTime == null) firstDepartureTime = departureTime; lastArrival = arrival; + lastArrivalId = arrivalId; lastArrivalTime = arrivalTime; } else { - final String arrival = ParserUtils.resolveEntities(selectNotNull(mDetFine.group(10), mDetFine.group(11))); + final String arrival = ParserUtils.resolveEntities(selectNotNull(mDetFine.group(12), mDetFine.group(13))); if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway) { @@ -325,8 +344,8 @@ public final class VbbProvider implements NetworkProvider } if (firstDepartureTime != null && lastArrivalTime != null) - return new GetConnectionDetailsResult(currentDate, new Connection(uri, firstDepartureTime, lastArrivalTime, firstDeparture, - lastArrival, parts)); + return new GetConnectionDetailsResult(currentDate, new Connection(uri, firstDepartureTime, lastArrivalTime, firstDepartureId, + firstDeparture, lastArrivalId, lastArrival, parts)); else return new GetConnectionDetailsResult(currentDate, null); }