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

View file

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

View file

@ -48,8 +48,6 @@ public final class BahnProvider extends AbstractHafasProvider
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 long PARSER_DAY_ROLLOVER_THRESHOLD_MS = 12 * 60 * 60 * 1000;
public BahnProvider()
{
super("http://reiseauskunft.bahn.de/bin/extxml.exe", 14, null);
@ -353,24 +351,7 @@ public final class BahnProvider extends AbstractHafasProvider
if (mConFine.matches())
{
final String link = ParserUtils.resolveEntities(mConFine.group(1));
final Calendar departureTime = new GregorianCalendar(timeZone());
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);
final Connection connection = new Connection(AbstractHafasProvider.extractConnectionId(link), link, from, to, null, null, null);
connections.add(connection);
}
else
@ -429,9 +410,7 @@ public final class BahnProvider extends AbstractHafasProvider
{
final List<Connection.Part> parts = new ArrayList<Connection.Part>(4);
Date firstDepartureTime = null;
Location firstDeparture = null;
Date lastArrivalTime = null;
Location lastArrival = null;
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
.getTime(), null, arrivalPosition, arrival, null, null));
if (firstDepartureTime == null)
firstDepartureTime = departureTime.getTime();
lastArrival = arrival;
lastArrivalTime = arrivalTime.getTime();
}
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(
AbstractHafasProvider.extractConnectionId(uri), uri, firstDepartureTime, lastArrivalTime, firstDeparture, lastArrival, parts,
null, null));
AbstractHafasProvider.extractConnectionId(uri), uri, firstDeparture, lastArrival, parts, null, null));
}
else
{

View file

@ -741,9 +741,6 @@ public final class BvgProvider extends AbstractHafasProvider
ParserUtils.parseGermanDate(time, mConFine.group(1));
Date lastTime = null;
Date firstDepartureTime = null;
Date lastArrivalTime = null;
final String id = mConFine.group(2);
final String[] trackParts = mConFine.group(3).split("\\*");
@ -788,8 +785,6 @@ public final class BvgProvider extends AbstractHafasProvider
time.add(Calendar.DAY_OF_YEAR, 1);
lastTime = 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;
@ -800,7 +795,6 @@ public final class BvgProvider extends AbstractHafasProvider
time.add(Calendar.DAY_OF_YEAR, 1);
lastTime = time.getTime();
final Date arrivalTime = time.getTime();
lastArrivalTime = arrivalTime;
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);
lastTime = time.getTime();
final Date departureTime = time.getTime();
if (firstDepartureTime == null)
firstDepartureTime = departureTime;
final List<Stop> intermediateStops = new LinkedList<Stop>();
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);
lastTime = time.getTime();
final Date arrivalTime = time.getTime();
lastArrivalTime = arrivalTime;
final String arrivalPosition = !mDetails.group(4).equals("&nbsp;") ? ParserUtils.resolveEntities(mDetails.group(4))
: 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
{

View file

@ -31,21 +31,17 @@ public final class Connection implements Serializable
public final String id;
public final String link;
public final Date departureTime;
public final Date arrivalTime;
public final Location from;
public final Location to;
public final List<Part> parts;
public final List<Fare> fares;
public final int[] capacity;
public Connection(final String id, final String link, final Date departureTime, final Date arrivalTime, final Location from, final Location to,
final List<Part> parts, final List<Fare> fares, final int[] capacity)
public Connection(final String id, final String link, final Location from, final Location to, final List<Part> parts, final List<Fare> fares,
final int[] capacity)
{
this.id = id;
this.link = link;
this.departureTime = departureTime;
this.arrivalTime = arrivalTime;
this.from = from;
this.to = to;
this.parts = parts;
@ -53,11 +49,36 @@ public final class Connection implements Serializable
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
public String toString()
{
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