try to parse station ids in connections

git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@15 0924bc21-9374-b0fa-ee44-9ff1593b38f0
This commit is contained in:
andreas.schildbach 2010-07-20 12:28:39 +00:00
parent 8fb908bb0d
commit d6468e32c2
5 changed files with 89 additions and 56 deletions

View file

@ -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<Connection.Part>(1));
final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to, new ArrayList<Connection.Part>(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
{

View file

@ -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<Part> parts;
public Connection(String link, Date departureTime, Date arrivalTime, String from, String to, List<Part> 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<Part> 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;

View file

@ -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<Connection.Part>(1));
final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to,
new ArrayList<Connection.Part>(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<Connection.Part>(1));
final Connection connection = new Connection(link, departureTime, arrivalTime, 0, from, 0, to,
new ArrayList<Connection.Part>(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
{

View file

@ -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<Connection.Part>(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<Connection.Part>(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
{

View file

@ -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<Connection.Part>(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<Connection.Part>(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("<p class=\"con\\w\">\n?(.+?)\n?</p>", Pattern.DOTALL);
static final Pattern P_CONNECTION_DETAILS_FINE = Pattern.compile("(?:<a href=\".+?\">(?:\\n?<strong>)?(.+?)(?:</strong>\\n?)?</a>)?.*?" // departure
static final Pattern P_CONNECTION_DETAILS_FINE = Pattern.compile("(?:<a href=\".*?input=(\\d+).*?\">(?:\\n?<strong>)?" // departureId
+ "(.+?)(?:</strong>\\n?)?</a>)?.*?" // 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
+ "<a href=\".*?input=(\\d+).*?\">\n?" // arrivalId
+ "<strong>(.*?)</strong>" // 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);
}