diff --git a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java index a77015c4..2c5c929d 100644 --- a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java @@ -2057,8 +2057,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider XmlPullUtil.enter(pp, "itdPartialRouteList"); final List parts = new LinkedList(); - Location firstDeparture = null; - Location lastArrival = null; + Location firstDepartureLocation = null; + Location lastArrivalLocation = null; while (XmlPullUtil.test(pp, "itdPartialRoute")) { @@ -2068,9 +2068,9 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider XmlPullUtil.test(pp, "itdPoint"); if (!"departure".equals(pp.getAttributeValue(null, "usage"))) throw new IllegalStateException(); - final Location departure = processItdPointAttributes(pp); - if (firstDeparture == null) - firstDeparture = departure; + final Location departureLocation = processItdPointAttributes(pp); + if (firstDepartureLocation == null) + firstDepartureLocation = departureLocation; final String departurePosition; if (!suppressPositions) departurePosition = normalizePlatform(pp.getAttributeValue(null, "platform"), pp.getAttributeValue(null, "platformName")); @@ -2097,8 +2097,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider XmlPullUtil.test(pp, "itdPoint"); if (!"arrival".equals(pp.getAttributeValue(null, "usage"))) throw new IllegalStateException(); - final Location arrival = processItdPointAttributes(pp); - lastArrival = arrival; + final Location arrivalLocation = processItdPointAttributes(pp); + lastArrivalLocation = arrivalLocation; final String arrivalPosition; if (!suppressPositions) arrivalPosition = normalizePlatform(pp.getAttributeValue(null, "platform"), pp.getAttributeValue(null, "platformName")); @@ -2148,11 +2148,11 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider if (path != null && lastFootway.path != null) path.addAll(0, lastFootway.path); parts.add(new Connection.Footway(lastFootway.min + min, distance, lastFootway.transfer || transfer, - lastFootway.departure, arrival, path)); + lastFootway.departure, arrivalLocation, path)); } else { - parts.add(new Connection.Footway(min, distance, transfer, departure, arrival, path)); + parts.add(new Connection.Footway(min, distance, transfer, departureLocation, arrivalLocation, path)); } } else if ("gesicherter Anschluss".equals(productName) || "nicht umsteigen".equals(productName)) // type97 @@ -2268,11 +2268,11 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider final int size = intermediateStops.size(); if (size >= 2) { - if (intermediateStops.get(size - 1).location.id != arrival.id) + if (intermediateStops.get(size - 1).location.id != arrivalLocation.id) throw new IllegalStateException(); intermediateStops.remove(size - 1); - if (intermediateStops.get(0).location.id != departure.id) + if (intermediateStops.get(0).location.id != departureLocation.id) throw new IllegalStateException(); intermediateStops.remove(0); } @@ -2321,9 +2321,12 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider lineAttrs.add(Line.Attr.WHEEL_CHAIR_ACCESS); final Line line = new Line(lineId, lineLabel, lineStyle(lineLabel), lineAttrs); - parts.add(new Connection.Trip(line, destination, departureTargetTime != null ? departureTargetTime : departureTime, - departureTargetTime, departurePosition, null, departure, arrivalTargetTime != null ? arrivalTargetTime : arrivalTime, - arrivalTargetTime, arrivalPosition, null, arrival, intermediateStops, path, message)); + final Stop departure = new Stop(departureLocation, true, departureTargetTime != null ? departureTargetTime : departureTime, + departureTargetTime, departurePosition, null); + final Stop arrival = new Stop(arrivalLocation, false, arrivalTargetTime != null ? arrivalTargetTime : arrivalTime, + arrivalTargetTime, arrivalPosition, null); + + parts.add(new Connection.Trip(line, destination, departure, arrival, intermediateStops, path, message)); } XmlPullUtil.exit(pp, "itdPartialRoute"); @@ -2385,7 +2388,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider XmlPullUtil.next(pp); } } - connections.add(new Connection(id, firstDeparture, lastArrival, parts, fares.isEmpty() ? null : fares, null, numChanges)); + connections.add(new Connection(id, firstDepartureLocation, lastArrivalLocation, parts, fares.isEmpty() ? null : fares, null, + numChanges)); XmlPullUtil.exit(pp, "itdRoute"); } diff --git a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java index 7a62869d..a10e875a 100644 --- a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java @@ -1057,7 +1057,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider XmlPullUtil.enter(pp, "BasicStop"); while (pp.getName().equals("StAttrList")) XmlPullUtil.next(pp); - final Location departure = parseLocation(pp); + final Location departureLocation = parseLocation(pp); XmlPullUtil.enter(pp, "Dep"); XmlPullUtil.exit(pp, "Dep"); final int[] capacity; @@ -1094,7 +1094,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider XmlPullUtil.enter(pp, "BasicStop"); while (pp.getName().equals("StAttrList")) XmlPullUtil.next(pp); - final Location arrival = parseLocation(pp); + final Location arrivalLocation = parseLocation(pp); XmlPullUtil.exit(pp, "BasicStop"); XmlPullUtil.exit(pp, "Arrival"); @@ -1118,7 +1118,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider XmlPullUtil.enter(pp, "BasicStop"); while (pp.getName().equals("StAttrList")) XmlPullUtil.next(pp); - final Location sectionDeparture = parseLocation(pp); + final Location sectionDepartureLocation = parseLocation(pp); XmlPullUtil.enter(pp, "Dep"); XmlPullUtil.require(pp, "Time"); time.setTimeInMillis(currentDate.getTimeInMillis()); @@ -1192,7 +1192,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider while (XmlPullUtil.test(pp, "StAttrList")) XmlPullUtil.next(pp); final Location location = parseLocation(pp); - if (location.id != sectionDeparture.id) + if (location.id != sectionDepartureLocation.id) { Date stopArrivalTime = null; Date stopDepartureTime = null; @@ -1278,7 +1278,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider XmlPullUtil.enter(pp, "BasicStop"); while (pp.getName().equals("StAttrList")) XmlPullUtil.next(pp); - final Location sectionArrival = parseLocation(pp); + final Location sectionArrivalLocation = parseLocation(pp); XmlPullUtil.enter(pp, "Arr"); XmlPullUtil.require(pp, "Time"); time.setTimeInMillis(currentDate.getTimeInMillis()); @@ -1293,26 +1293,28 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider // remove last intermediate final int size = intermediateStops != null ? intermediateStops.size() : 0; if (size >= 1) - if (intermediateStops.get(size - 1).location.id == sectionArrival.id) + if (intermediateStops.get(size - 1).location.id == sectionArrivalLocation.id) intermediateStops.remove(size - 1); XmlPullUtil.exit(pp, "ConSection"); if (min == 0 || line != null) { - parts.add(new Connection.Trip(line, destination, departureTime, null, departurePos, null, sectionDeparture, arrivalTime, - null, arrivalPos, null, sectionArrival, intermediateStops, path, null)); + final Stop departure = new Stop(sectionDepartureLocation, true, departureTime, null, departurePos, null); + final Stop arrival = new Stop(sectionArrivalLocation, false, arrivalTime, null, arrivalPos, null); + + parts.add(new Connection.Trip(line, destination, departure, arrival, intermediateStops, path, null)); } else { if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway) { final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1); - parts.add(new Connection.Footway(lastFootway.min + min, 0, false, lastFootway.departure, sectionArrival, null)); + parts.add(new Connection.Footway(lastFootway.min + min, 0, false, lastFootway.departure, sectionArrivalLocation, null)); } else { - parts.add(new Connection.Footway(min, 0, false, sectionDeparture, sectionArrival, null)); + parts.add(new Connection.Footway(min, 0, false, sectionDepartureLocation, sectionArrivalLocation, null)); } } } @@ -1321,7 +1323,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider XmlPullUtil.exit(pp, "Connection"); - connections.add(new Connection(id, departure, arrival, parts, null, capacity, numTransfers)); + connections.add(new Connection(id, departureLocation, arrivalLocation, parts, null, capacity, numTransfers)); } XmlPullUtil.exit(pp); @@ -1741,10 +1743,10 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider is.skipBytes(0x4a + partsOffset + iPart * 20); final long plannedDepartureTime = time(is, resDate, connectionDayOffset); - final Location departure = stations.read(is); + final Location departureLocation = stations.read(is); final long plannedArrivalTime = time(is, resDate, connectionDayOffset); - final Location arrival = stations.read(is); + final Location arrivalLocation = stations.read(is); final int type = is.readShortReverse(); @@ -1863,11 +1865,11 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider { final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1); part = new Connection.Footway(lastFootway.min + min, 0, lastFootway.transfer || transfer, lastFootway.departure, - arrival, null); + arrivalLocation, null); } else { - part = new Connection.Footway(min, 0, transfer, departure, arrival, null); + part = new Connection.Footway(min, 0, transfer, departureLocation, arrivalLocation, null); } } else if (type == 2) @@ -1881,11 +1883,14 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider final Line line = newLine(lineProduct, normalizeLineName(lineName), lineAttrs.toArray(new Line.Attr[0])); final Location direction = directionStr != null ? new Location(LocationType.ANY, 0, null, directionStr) : null; - part = new Connection.Trip(line, direction, plannedDepartureTime != 0 ? new Date(plannedDepartureTime) : null, - predictedDepartureTime != 0 ? new Date(predictedDepartureTime) : null, plannedDeparturePosition, - predictedDeparturePosition, departure, plannedArrivalTime != 0 ? new Date(plannedArrivalTime) : null, + final Stop departure = new Stop(departureLocation, true, plannedDepartureTime != 0 ? new Date(plannedDepartureTime) + : null, predictedDepartureTime != 0 ? new Date(predictedDepartureTime) : null, plannedDeparturePosition, + predictedDeparturePosition); + final Stop arrival = new Stop(arrivalLocation, false, plannedArrivalTime != 0 ? new Date(plannedArrivalTime) : null, predictedArrivalTime != 0 ? new Date(predictedArrivalTime) : null, plannedArrivalPosition, - predictedArrivalPosition, arrival, intermediateStops, null, null); + predictedArrivalPosition); + + part = new Connection.Trip(line, direction, departure, arrival, intermediateStops, null, null); } else { diff --git a/enabler/src/de/schildbach/pte/SadProvider.java b/enabler/src/de/schildbach/pte/SadProvider.java index 47f043f4..639ef6c4 100644 --- a/enabler/src/de/schildbach/pte/SadProvider.java +++ b/enabler/src/de/schildbach/pte/SadProvider.java @@ -37,6 +37,7 @@ import de.schildbach.pte.dto.QueryConnectionsResult; import de.schildbach.pte.dto.QueryConnectionsResult.Status; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.ResultHeader; +import de.schildbach.pte.dto.Stop; import de.schildbach.pte.dto.Style; public class SadProvider extends AbstractNetworkProvider { @@ -433,9 +434,13 @@ public class SadProvider extends AbstractNetworkProvider { // predictedDepartureTime, departurePosition, // predictedArrivalTime, arrivalPosition, // intermediateStops, path - parts.add(new Trip(new Line(lineId, lineId, DEFAULT_STYLE), null, responseDate.get(0), null, null, null, - soapToLocation((SoapObject) tratto.getProperty("nodo_partenza")), responseDate.get(1), null, null, null, - soapToLocation((SoapObject) tratto.getProperty("nodo_arrivo")), null, null, null)); + + final Stop departure = new Stop(soapToLocation((SoapObject) tratto.getProperty("nodo_partenza")), true, + responseDate.get(0), null, null, null); + final Stop arrival = new Stop(soapToLocation((SoapObject) tratto.getProperty("nodo_arrivo")), false, + responseDate.get(1), null, null, null); + + parts.add(new Trip(new Line(lineId, lineId, DEFAULT_STYLE), null, departure, arrival, null, null, null)); } catch (ParseException e) { e.printStackTrace(); } diff --git a/enabler/src/de/schildbach/pte/dto/Connection.java b/enabler/src/de/schildbach/pte/dto/Connection.java index 335eaf4a..19aece5e 100644 --- a/enabler/src/de/schildbach/pte/dto/Connection.java +++ b/enabler/src/de/schildbach/pte/dto/Connection.java @@ -154,8 +154,8 @@ public final class Connection implements Serializable else if (part instanceof Trip) { final Trip trip = (Trip) part; - builder.append(trip.departureTime.getTime()).append('-'); - builder.append(trip.arrivalTime.getTime()).append('-'); + builder.append(trip.departureStop.plannedDepartureTime.getTime()).append('-'); + builder.append(trip.arrivalStop.plannedArrivalTime.getTime()).append('-'); builder.append(trip.line.label); } @@ -224,112 +224,82 @@ public final class Connection implements Serializable public final Line line; public final Location destination; - public final Date departureTime; // TODO rename to plannedDepartureTime - public final Date predictedDepartureTime; - public final String departurePosition; // TODO rename to plannedDeparturePosition - public final String predictedDeparturePosition; - public final Date arrivalTime; // TODO rename to plannedArrivalTime - public final Date predictedArrivalTime; - public final String arrivalPosition; // TODO rename to plannedArrivalPosition - public final String predictedArrivalPosition; + public final Stop departureStop; + public final Stop arrivalStop; public final List intermediateStops; public final String message; - public Trip(final Line line, final Location destination, final Date plannedDepartureTime, final Date predictedDepartureTime, - final String departurePosition, final String predictedDeparturePosition, final Location departure, final Date plannedArrivalTime, - final Date predictedArrivalTime, final String arrivalPosition, final String predictedArrivalPosition, final Location arrival, + public Trip(final Line line, final Location destination, final Stop departureStop, final Stop arrivalStop, final List intermediateStops, final List path, final String message) { - super(departure, arrival, path); + super(departureStop != null ? departureStop.location : null, arrivalStop != null ? arrivalStop.location : null, path); this.line = line; this.destination = destination; - this.departureTime = plannedDepartureTime; - this.predictedDepartureTime = predictedDepartureTime; - this.departurePosition = departurePosition; - this.predictedDeparturePosition = predictedDeparturePosition; - this.arrivalTime = plannedArrivalTime; - this.predictedArrivalTime = predictedArrivalTime; - this.arrivalPosition = arrivalPosition; - this.predictedArrivalPosition = predictedArrivalPosition; + this.departureStop = departureStop; + this.arrivalStop = arrivalStop; this.intermediateStops = intermediateStops; this.message = message; } public Date getDepartureTime() { - if (predictedDepartureTime != null) - return predictedDepartureTime; - else if (departureTime != null) - return departureTime; - else + final Date departureTime = departureStop.getDepartureTime(); + + if (departureTime == null) throw new IllegalStateException(); + + return departureTime; } public boolean isDepartureTimePredicted() { - return predictedDepartureTime != null; + return departureStop.isDepartureTimePredicted(); } public Long getDepartureDelay() { - if (departureTime != null && predictedDepartureTime != null) - return predictedDepartureTime.getTime() - departureTime.getTime(); - else - return null; + return departureStop.getDepartureDelay(); } public String getDeparturePosition() { - if (predictedDeparturePosition != null) - return predictedDeparturePosition; - else if (departurePosition != null) - return departurePosition; - else - return null; + return departureStop.getDeparturePosition(); } public boolean isDeparturePositionPredicted() { - return predictedDeparturePosition != null; + return departureStop.isDeparturePositionPredicted(); } public Date getArrivalTime() { - if (predictedArrivalTime != null) - return predictedArrivalTime; - else if (arrivalTime != null) - return arrivalTime; - else + final Date arrivalTime = arrivalStop.getArrivalTime(); + + if (arrivalTime == null) throw new IllegalStateException(); + + return arrivalTime; } public boolean isArrivalTimePredicted() { - return predictedArrivalTime != null; + return arrivalStop.isArrivalTimePredicted(); } public Long getArrivalDelay() { - if (arrivalTime != null && predictedArrivalTime != null) - return predictedArrivalTime.getTime() - arrivalTime.getTime(); - else - return null; + return arrivalStop.getArrivalDelay(); } public String getArrivalPosition() { - if (predictedArrivalPosition != null) - return predictedArrivalPosition; - else if (arrivalPosition != null) - return arrivalPosition; - else - return null; + return arrivalStop.getArrivalPosition(); } public boolean isArrivalPositionPredicted() { - return predictedArrivalPosition != null; + return arrivalStop.isArrivalPositionPredicted(); } @Override @@ -343,9 +313,9 @@ public final class Connection implements Serializable builder.append("destination=").append(destination.toDebugString()); } builder.append(","); - builder.append("departure=").append(departureTime).append("/").append(departurePosition).append("/").append(departure.toDebugString()); + builder.append("departure=").append(departureStop); builder.append(","); - builder.append("arrival=").append(arrivalTime).append("/").append(arrivalPosition).append("/").append(arrival.toDebugString()); + builder.append("arrival=").append(arrivalStop); builder.append("]"); return builder.toString(); } diff --git a/enabler/src/de/schildbach/pte/dto/Stop.java b/enabler/src/de/schildbach/pte/dto/Stop.java index fdd20747..02b00f96 100644 --- a/enabler/src/de/schildbach/pte/dto/Stop.java +++ b/enabler/src/de/schildbach/pte/dto/Stop.java @@ -30,9 +30,9 @@ public final class Stop implements Serializable public final Date predictedArrivalTime; public final String plannedArrivalPosition; public final String predictedArrivalPosition; - public final Date time; // TODO rename to plannedDepartureTime + public final Date plannedDepartureTime; public final Date predictedDepartureTime; - public final String position; // TODO rename to plannedPosition + public final String plannedDeparturePosition; public final String predictedDeparturePosition; public Stop(final Location location, final Date plannedArrivalTime, final Date predictedArrivalTime, final String plannedArrivalPosition, @@ -44,12 +44,26 @@ public final class Stop implements Serializable this.predictedArrivalTime = predictedArrivalTime; this.plannedArrivalPosition = plannedArrivalPosition; this.predictedArrivalPosition = predictedArrivalPosition; - this.time = plannedDepartureTime; + this.plannedDepartureTime = plannedDepartureTime; this.predictedDepartureTime = predictedDepartureTime; - this.position = plannedDeparturePosition; + this.plannedDeparturePosition = plannedDeparturePosition; this.predictedDeparturePosition = predictedDeparturePosition; } + public Stop(final Location location, final boolean departure, final Date plannedTime, final Date predictedTime, final String plannedPosition, + final String predictedPosition) + { + this.location = location; + this.plannedArrivalTime = !departure ? plannedTime : null; + this.predictedArrivalTime = !departure ? predictedTime : null; + this.plannedArrivalPosition = !departure ? plannedPosition : null; + this.predictedArrivalPosition = !departure ? predictedPosition : null; + this.plannedDepartureTime = departure ? plannedTime : null; + this.predictedDepartureTime = departure ? predictedTime : null; + this.plannedDeparturePosition = departure ? plannedPosition : null; + this.predictedDeparturePosition = departure ? predictedPosition : null; + } + public Stop(final Location location, final Date plannedArrivalTime, final String plannedArrivalPosition, final Date plannedDepartureTime, final String plannedDeparturePosition) { @@ -58,9 +72,9 @@ public final class Stop implements Serializable this.predictedArrivalTime = null; this.plannedArrivalPosition = plannedArrivalPosition; this.predictedArrivalPosition = null; - this.time = plannedDepartureTime; + this.plannedDepartureTime = plannedDepartureTime; this.predictedDepartureTime = null; - this.position = plannedDeparturePosition; + this.plannedDeparturePosition = plannedDeparturePosition; this.predictedDeparturePosition = null; } @@ -106,8 +120,8 @@ public final class Stop implements Serializable { if (predictedDepartureTime != null) return predictedDepartureTime; - else if (time != null) - return time; + else if (plannedDepartureTime != null) + return plannedDepartureTime; else return null; } @@ -119,8 +133,8 @@ public final class Stop implements Serializable public Long getDepartureDelay() { - if (time != null && predictedDepartureTime != null) - return predictedDepartureTime.getTime() - time.getTime(); + if (plannedDepartureTime != null && predictedDepartureTime != null) + return predictedDepartureTime.getTime() - plannedDepartureTime.getTime(); else return null; } @@ -129,8 +143,8 @@ public final class Stop implements Serializable { if (predictedDeparturePosition != null) return predictedDeparturePosition; - else if (position != null) - return position; + else if (plannedDeparturePosition != null) + return plannedDeparturePosition; else return null; } @@ -143,24 +157,24 @@ public final class Stop implements Serializable @Override public String toString() { - StringBuilder builder = new StringBuilder("Stop("); + StringBuilder builder = new StringBuilder("Stop('"); builder.append(location); - builder.append(","); - builder.append(plannedArrivalTime != null ? plannedArrivalTime : "null"); - builder.append(","); - builder.append(predictedArrivalTime != null ? predictedArrivalTime : "null"); - builder.append(","); - builder.append(plannedArrivalPosition != null ? plannedArrivalPosition : "null"); - builder.append(","); - builder.append(predictedArrivalPosition != null ? predictedArrivalPosition : "null"); - builder.append(","); - builder.append(time != null ? time : "null"); - builder.append(","); - builder.append(predictedDepartureTime != null ? predictedDepartureTime : "null"); - builder.append(","); - builder.append(position != null ? position : "null"); - builder.append(","); - builder.append(predictedDeparturePosition != null ? predictedDeparturePosition : "null"); + builder.append("', arr: "); + builder.append(plannedArrivalTime != null ? plannedArrivalTime : "-"); + builder.append("/"); + builder.append(predictedArrivalTime != null ? predictedArrivalTime : "-"); + builder.append(", "); + builder.append(plannedArrivalPosition != null ? plannedArrivalPosition : "-"); + builder.append("/"); + builder.append(predictedArrivalPosition != null ? predictedArrivalPosition : "-"); + builder.append(", dep: "); + builder.append(plannedDepartureTime != null ? plannedDepartureTime : "-"); + builder.append("/"); + builder.append(predictedDepartureTime != null ? predictedDepartureTime : "-"); + builder.append(", "); + builder.append(plannedDeparturePosition != null ? plannedDeparturePosition : "-"); + builder.append("/"); + builder.append(predictedDeparturePosition != null ? predictedDeparturePosition : "-"); builder.append(")"); return builder.toString(); }