dynamically determine first trip departure time and last trip arrival time of connection

git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@840 0924bc21-9374-b0fa-ee44-9ff1593b38f0
This commit is contained in:
andreas.schildbach@gmail.com 2011-10-23 14:45:58 +00:00
parent b089e441e3
commit db3510f3d6
5 changed files with 33 additions and 63 deletions

View file

@ -1731,9 +1731,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
XmlPullUtil.enter(pp, "itdPartialRouteList"); XmlPullUtil.enter(pp, "itdPartialRouteList");
final List<Connection.Part> parts = new LinkedList<Connection.Part>(); final List<Connection.Part> parts = new LinkedList<Connection.Part>();
Location firstDeparture = null; Location firstDeparture = null;
Date firstDepartureTime = null;
Location lastArrival = null; Location lastArrival = null;
Date lastArrivalTime = null;
while (XmlPullUtil.test(pp, "itdPartialRoute")) while (XmlPullUtil.test(pp, "itdPartialRoute"))
{ {
@ -1753,8 +1751,6 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
XmlPullUtil.require(pp, "itdDateTime"); XmlPullUtil.require(pp, "itdDateTime");
processItdDateTime(pp, time); processItdDateTime(pp, time);
final Date departureTime = time.getTime(); final Date departureTime = time.getTime();
if (firstDepartureTime == null)
firstDepartureTime = departureTime;
final Date departureTargetTime; final Date departureTargetTime;
if (XmlPullUtil.test(pp, "itdDateTimeTarget")) if (XmlPullUtil.test(pp, "itdDateTimeTarget"))
{ {
@ -1780,7 +1776,6 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
XmlPullUtil.require(pp, "itdDateTime"); XmlPullUtil.require(pp, "itdDateTime");
processItdDateTime(pp, time); processItdDateTime(pp, time);
final Date arrivalTime = time.getTime(); final Date arrivalTime = time.getTime();
lastArrivalTime = arrivalTime;
final Date arrivalTargetTime; final Date arrivalTargetTime;
if (XmlPullUtil.test(pp, "itdDateTimeTarget")) if (XmlPullUtil.test(pp, "itdDateTimeTarget"))
{ {
@ -1970,8 +1965,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
} }
XmlPullUtil.exit(pp, "itdFare"); XmlPullUtil.exit(pp, "itdFare");
} }
connections.add(new Connection(id, uri, firstDepartureTime, lastArrivalTime, firstDeparture, lastArrival, parts, connections.add(new Connection(id, uri, firstDeparture, lastArrival, parts, fares.isEmpty() ? null : fares, null));
fares.isEmpty() ? null : fares, null));
XmlPullUtil.exit(pp, "itdRoute"); XmlPullUtil.exit(pp, "itdRoute");
} }

View file

@ -832,8 +832,6 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
XmlPullUtil.exit(pp, "Overview"); XmlPullUtil.exit(pp, "Overview");
final List<Connection.Part> parts = new ArrayList<Connection.Part>(4); final List<Connection.Part> parts = new ArrayList<Connection.Part>(4);
Date firstDepartureTime = null;
Date lastArrivalTime = null;
XmlPullUtil.enter(pp, "ConSectionList"); XmlPullUtil.enter(pp, "ConSectionList");
@ -1009,17 +1007,13 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
parts.add(new Connection.Footway(min, sectionDeparture, sectionArrival, null)); parts.add(new Connection.Footway(min, sectionDeparture, sectionArrival, null));
} }
} }
if (firstDepartureTime == null)
firstDepartureTime = departureTime;
lastArrivalTime = arrivalTime;
} }
XmlPullUtil.exit(pp, "ConSectionList"); XmlPullUtil.exit(pp, "ConSectionList");
XmlPullUtil.exit(pp, "Connection"); XmlPullUtil.exit(pp, "Connection");
connections.add(new Connection(id, null, firstDepartureTime, lastArrivalTime, departure, arrival, parts, null, capacity)); connections.add(new Connection(id, null, departure, arrival, parts, null, capacity));
} }
XmlPullUtil.exit(pp); XmlPullUtil.exit(pp);

View file

@ -48,8 +48,6 @@ public final class BahnProvider extends AbstractHafasProvider
public static final String OLD_NETWORK_ID = "mobile.bahn.de"; public static final String OLD_NETWORK_ID = "mobile.bahn.de";
private static final String API_BASE = "http://mobile.bahn.de/bin/mobil/"; private static final String API_BASE = "http://mobile.bahn.de/bin/mobil/";
private static final long PARSER_DAY_ROLLOVER_THRESHOLD_MS = 12 * 60 * 60 * 1000;
public BahnProvider() public BahnProvider()
{ {
super("http://reiseauskunft.bahn.de/bin/extxml.exe", 14, null); super("http://reiseauskunft.bahn.de/bin/extxml.exe", 14, null);
@ -353,24 +351,7 @@ public final class BahnProvider extends AbstractHafasProvider
if (mConFine.matches()) if (mConFine.matches())
{ {
final String link = ParserUtils.resolveEntities(mConFine.group(1)); final String link = ParserUtils.resolveEntities(mConFine.group(1));
final Calendar departureTime = new GregorianCalendar(timeZone()); final Connection connection = new Connection(AbstractHafasProvider.extractConnectionId(link), link, from, to, null, null, null);
departureTime.setTimeInMillis(currentDate.getTimeInMillis());
ParserUtils.parseEuropeanTime(departureTime, mConFine.group(2));
if (!connections.isEmpty())
{
final long diff = departureTime.getTimeInMillis() - connections.get(connections.size() - 1).departureTime.getTime();
if (diff > PARSER_DAY_ROLLOVER_THRESHOLD_MS)
departureTime.add(Calendar.DAY_OF_YEAR, -1);
else if (diff < -PARSER_DAY_ROLLOVER_THRESHOLD_MS)
departureTime.add(Calendar.DAY_OF_YEAR, 1);
}
final Calendar arrivalTime = new GregorianCalendar(timeZone());
arrivalTime.setTimeInMillis(currentDate.getTimeInMillis());
ParserUtils.parseEuropeanTime(arrivalTime, mConFine.group(3));
if (departureTime.after(arrivalTime))
arrivalTime.add(Calendar.DAY_OF_YEAR, 1);
final Connection connection = new Connection(AbstractHafasProvider.extractConnectionId(link), link, departureTime.getTime(),
arrivalTime.getTime(), from, to, null, null, null);
connections.add(connection); connections.add(connection);
} }
else else
@ -429,9 +410,7 @@ public final class BahnProvider extends AbstractHafasProvider
{ {
final List<Connection.Part> parts = new ArrayList<Connection.Part>(4); final List<Connection.Part> parts = new ArrayList<Connection.Part>(4);
Date firstDepartureTime = null;
Location firstDeparture = null; Location firstDeparture = null;
Date lastArrivalTime = null;
Location lastArrival = null; Location lastArrival = null;
final Matcher mDetCoarse = P_CONNECTION_DETAILS_COARSE.matcher(mHead.group(1)); final Matcher mDetCoarse = P_CONNECTION_DETAILS_COARSE.matcher(mHead.group(1));
@ -474,11 +453,7 @@ public final class BahnProvider extends AbstractHafasProvider
parts.add(new Connection.Trip(line, null, departureTime.getTime(), null, departurePosition, departure, arrivalTime parts.add(new Connection.Trip(line, null, departureTime.getTime(), null, departurePosition, departure, arrivalTime
.getTime(), null, arrivalPosition, arrival, null, null)); .getTime(), null, arrivalPosition, arrival, null, null));
if (firstDepartureTime == null)
firstDepartureTime = departureTime.getTime();
lastArrival = arrival; lastArrival = arrival;
lastArrivalTime = arrivalTime.getTime();
} }
else if (mDetFine.group(10) != null) else if (mDetFine.group(10) != null)
{ {
@ -512,13 +487,8 @@ public final class BahnProvider extends AbstractHafasProvider
} }
} }
// verify
if (firstDepartureTime == null || lastArrivalTime == null)
throw new IllegalStateException("could not parse all parts of:\n" + mHead.group(1) + "\n" + parts);
return new GetConnectionDetailsResult(new GregorianCalendar(timeZone()).getTime(), new Connection( return new GetConnectionDetailsResult(new GregorianCalendar(timeZone()).getTime(), new Connection(
AbstractHafasProvider.extractConnectionId(uri), uri, firstDepartureTime, lastArrivalTime, firstDeparture, lastArrival, parts, AbstractHafasProvider.extractConnectionId(uri), uri, firstDeparture, lastArrival, parts, null, null));
null, null));
} }
else else
{ {

View file

@ -741,9 +741,6 @@ public final class BvgProvider extends AbstractHafasProvider
ParserUtils.parseGermanDate(time, mConFine.group(1)); ParserUtils.parseGermanDate(time, mConFine.group(1));
Date lastTime = null; Date lastTime = null;
Date firstDepartureTime = null;
Date lastArrivalTime = null;
final String id = mConFine.group(2); final String id = mConFine.group(2);
final String[] trackParts = mConFine.group(3).split("\\*"); final String[] trackParts = mConFine.group(3).split("\\*");
@ -788,8 +785,6 @@ public final class BvgProvider extends AbstractHafasProvider
time.add(Calendar.DAY_OF_YEAR, 1); time.add(Calendar.DAY_OF_YEAR, 1);
lastTime = time.getTime(); lastTime = time.getTime();
final Date departureTime = time.getTime(); final Date departureTime = time.getTime();
if (firstDepartureTime == null)
firstDepartureTime = departureTime;
final String[] tArr2 = track.size() == 1 ? tracks.get(iTrack + 1).get(0) : tArr; final String[] tArr2 = track.size() == 1 ? tracks.get(iTrack + 1).get(0) : tArr;
@ -800,7 +795,6 @@ public final class BvgProvider extends AbstractHafasProvider
time.add(Calendar.DAY_OF_YEAR, 1); time.add(Calendar.DAY_OF_YEAR, 1);
lastTime = time.getTime(); lastTime = time.getTime();
final Date arrivalTime = time.getTime(); final Date arrivalTime = time.getTime();
lastArrivalTime = arrivalTime;
final int mins = (int) ((arrivalTime.getTime() - departureTime.getTime()) / 1000 / 60); final int mins = (int) ((arrivalTime.getTime() - departureTime.getTime()) / 1000 / 60);
@ -813,8 +807,6 @@ public final class BvgProvider extends AbstractHafasProvider
time.add(Calendar.DAY_OF_YEAR, 1); time.add(Calendar.DAY_OF_YEAR, 1);
lastTime = time.getTime(); lastTime = time.getTime();
final Date departureTime = time.getTime(); final Date departureTime = time.getTime();
if (firstDepartureTime == null)
firstDepartureTime = departureTime;
final List<Stop> intermediateStops = new LinkedList<Stop>(); final List<Stop> intermediateStops = new LinkedList<Stop>();
for (final String[] tStop : track.subList(1, track.size() - 1)) for (final String[] tStop : track.subList(1, track.size() - 1))
@ -833,7 +825,6 @@ public final class BvgProvider extends AbstractHafasProvider
time.add(Calendar.DAY_OF_YEAR, 1); time.add(Calendar.DAY_OF_YEAR, 1);
lastTime = time.getTime(); lastTime = time.getTime();
final Date arrivalTime = time.getTime(); final Date arrivalTime = time.getTime();
lastArrivalTime = arrivalTime;
final String arrivalPosition = !mDetails.group(4).equals("&nbsp;") ? ParserUtils.resolveEntities(mDetails.group(4)) final String arrivalPosition = !mDetails.group(4).equals("&nbsp;") ? ParserUtils.resolveEntities(mDetails.group(4))
: null; : null;
@ -857,7 +848,7 @@ public final class BvgProvider extends AbstractHafasProvider
} }
} }
connections.add(new Connection(id, firstUri, firstDepartureTime, lastArrivalTime, from, to, parts, null, null)); connections.add(new Connection(id, firstUri, from, to, parts, null, null));
} }
else else
{ {

View file

@ -31,21 +31,17 @@ public final class Connection implements Serializable
public final String id; public final String id;
public final String link; public final String link;
public final Date departureTime;
public final Date arrivalTime;
public final Location from; public final Location from;
public final Location to; public final Location to;
public final List<Part> parts; public final List<Part> parts;
public final List<Fare> fares; public final List<Fare> fares;
public final int[] capacity; public final int[] capacity;
public Connection(final String id, final String link, final Date departureTime, final Date arrivalTime, final Location from, final Location to, public Connection(final String id, final String link, final Location from, final Location to, final List<Part> parts, final List<Fare> fares,
final List<Part> parts, final List<Fare> fares, final int[] capacity) final int[] capacity)
{ {
this.id = id; this.id = id;
this.link = link; this.link = link;
this.departureTime = departureTime;
this.arrivalTime = arrivalTime;
this.from = from; this.from = from;
this.to = to; this.to = to;
this.parts = parts; this.parts = parts;
@ -53,11 +49,36 @@ public final class Connection implements Serializable
this.capacity = capacity; this.capacity = capacity;
} }
public Date getFirstTripDepartureTime()
{
if (parts != null)
for (final Part part : parts)
if (part instanceof Trip)
return ((Trip) part).getDepartureTime();
return null;
}
public Date getFirstTripArrivalTime()
{
if (parts != null)
{
for (int i = parts.size() - 1; i >= 0; i--)
{
final Part part = parts.get(i);
if (part instanceof Trip)
return ((Trip) part).getArrivalTime();
}
}
return null;
}
@Override @Override
public String toString() public String toString()
{ {
final SimpleDateFormat FORMAT = new SimpleDateFormat("E HH:mm"); final SimpleDateFormat FORMAT = new SimpleDateFormat("E HH:mm");
return id + " " + FORMAT.format(departureTime) + "-" + FORMAT.format(arrivalTime); return id + " " + FORMAT.format(getFirstTripDepartureTime()) + "-" + FORMAT.format(getFirstTripArrivalTime());
} }
@Override @Override