From f534dae10084aca71bf38bfeda6f854d289617cc Mon Sep 17 00:00:00 2001 From: "andreas.schildbach@gmail.com" Date: Sun, 27 Feb 2011 11:15:19 +0000 Subject: [PATCH] map for connection details git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@507 0924bc21-9374-b0fa-ee44-9ff1593b38f0 --- .../schildbach/pte/AbstractEfaProvider.java | 59 ++++++++++++++++-- .../schildbach/pte/AbstractHafasProvider.java | 7 ++- src/de/schildbach/pte/BahnProvider.java | 8 +-- src/de/schildbach/pte/BvgProvider.java | 6 +- src/de/schildbach/pte/OebbProvider.java | 4 +- src/de/schildbach/pte/RmvProvider.java | 6 +- src/de/schildbach/pte/dto/Connection.java | 24 ++++++-- src/de/schildbach/pte/dto/Point.java | 61 +++++++++++++++++++ 8 files changed, 148 insertions(+), 27 deletions(-) create mode 100644 src/de/schildbach/pte/dto/Point.java diff --git a/src/de/schildbach/pte/AbstractEfaProvider.java b/src/de/schildbach/pte/AbstractEfaProvider.java index a4594dbb..aa5f1664 100644 --- a/src/de/schildbach/pte/AbstractEfaProvider.java +++ b/src/de/schildbach/pte/AbstractEfaProvider.java @@ -46,6 +46,7 @@ import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; +import de.schildbach.pte.dto.Point; import de.schildbach.pte.dto.QueryConnectionsResult; import de.schildbach.pte.dto.QueryConnectionsResult.Status; import de.schildbach.pte.dto.QueryDeparturesResult; @@ -1311,19 +1312,28 @@ public abstract class AbstractEfaProvider implements NetworkProvider { final int min = (int) (arrivalTime.getTimeInMillis() - departureTime.getTimeInMillis()) / 1000 / 60; + XmlPullUtil.enter(pp, "itdMeansOfTransport"); + XmlPullUtil.exit(pp, "itdMeansOfTransport"); + + if (XmlPullUtil.test(pp, "itdStopSeq")) + XmlPullUtil.next(pp); + + List path = null; + if (XmlPullUtil.test(pp, "itdPathCoordinates")) + path = processItdPathCoordinates(pp); + if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway) { final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1); + if (path != null && lastFootway.path != null) + path.addAll(0, lastFootway.path); parts.add(new Connection.Footway(lastFootway.min + min, lastFootway.departureId, lastFootway.departure, arrivalId, - arrival)); + arrival, path)); } else { - parts.add(new Connection.Footway(min, departureId, departure, arrivalId, arrival)); + parts.add(new Connection.Footway(min, departureId, departure, arrivalId, arrival, path)); } - - XmlPullUtil.enter(pp, "itdMeansOfTransport"); - XmlPullUtil.exit(pp, "itdMeansOfTransport"); } else if ("gesicherter Anschluss".equals(productName) || "nicht umsteigen".equals(productName)) // type97 { @@ -1387,8 +1397,12 @@ public abstract class AbstractEfaProvider implements NetworkProvider intermediateStops.remove(intermediateStops.size() - 1); } + List path = null; + if (XmlPullUtil.test(pp, "itdPathCoordinates")) + path = processItdPathCoordinates(pp); + parts.add(new Connection.Trip(line, destination, departureTime.getTime(), departurePosition, departureId, departure, - arrivalTime.getTime(), arrivalPosition, arrivalId, arrival, intermediateStops)); + arrivalTime.getTime(), arrivalPosition, arrivalId, arrival, intermediateStops, path)); } XmlPullUtil.exit(pp, "itdPartialRoute"); @@ -1453,6 +1467,39 @@ public abstract class AbstractEfaProvider implements NetworkProvider } } + private List processItdPathCoordinates(final XmlPullParser pp) throws XmlPullParserException, IOException + { + final List path = new LinkedList(); + + XmlPullUtil.enter(pp, "itdPathCoordinates"); + + XmlPullUtil.enter(pp, "coordEllipsoid"); + final String ellipsoid = pp.getText(); + XmlPullUtil.exit(pp, "coordEllipsoid"); + + if (!"WGS84".equals(ellipsoid)) + throw new IllegalStateException("unknown ellipsoid: " + ellipsoid); + + XmlPullUtil.enter(pp, "coordType"); + final String type = pp.getText(); + XmlPullUtil.exit(pp, "coordType"); + + if (!"GEO_DECIMAL".equals(type)) + throw new IllegalStateException("unknown type: " + type); + + XmlPullUtil.enter(pp, "itdCoordinateString"); + for (final String coordStr : pp.getText().split(" ")) + { + final String[] coordsStr = coordStr.split(","); + path.add(new Point(Integer.parseInt(coordsStr[1]), Integer.parseInt(coordsStr[0]))); + } + XmlPullUtil.exit(pp, "itdCoordinateString"); + + XmlPullUtil.exit(pp, "itdPathCoordinates"); + + return path; + } + private Fare processItdGenericTicketGroup(final XmlPullParser pp, final String net, final Currency currency) throws XmlPullParserException, IOException { diff --git a/src/de/schildbach/pte/AbstractHafasProvider.java b/src/de/schildbach/pte/AbstractHafasProvider.java index 199346f7..2a1390c2 100644 --- a/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/src/de/schildbach/pte/AbstractHafasProvider.java @@ -448,7 +448,7 @@ public abstract class AbstractHafasProvider implements NetworkProvider if (min == 0 || line != null) { parts.add(new Connection.Trip(line, destination, departureTime, departurePos, sectionDeparture.id, sectionDeparture.name, - arrivalTime, arrivalPos, sectionArrival.id, sectionArrival.name, null)); + arrivalTime, arrivalPos, sectionArrival.id, sectionArrival.name, null, null)); } else { @@ -456,11 +456,12 @@ public abstract class AbstractHafasProvider implements NetworkProvider { final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1); parts.add(new Connection.Footway(lastFootway.min + min, lastFootway.departureId, lastFootway.departure, - sectionArrival.id, sectionArrival.name)); + sectionArrival.id, sectionArrival.name, null)); } else { - parts.add(new Connection.Footway(min, sectionDeparture.id, sectionDeparture.name, sectionArrival.id, sectionArrival.name)); + parts.add(new Connection.Footway(min, sectionDeparture.id, sectionDeparture.name, sectionArrival.id, sectionArrival.name, + null)); } } diff --git a/src/de/schildbach/pte/BahnProvider.java b/src/de/schildbach/pte/BahnProvider.java index 4b2b36b3..1e96cf30 100644 --- a/src/de/schildbach/pte/BahnProvider.java +++ b/src/de/schildbach/pte/BahnProvider.java @@ -368,7 +368,7 @@ public final class BahnProvider extends AbstractHafasProvider final Date departureDateTime = ParserUtils.joinDateTime(departureDate, departureTime); final Date arrivalDateTime = ParserUtils.joinDateTime(arrivalDate, arrivalTime); lastTrip = new Connection.Trip(line, null, departureDateTime, departurePosition, 0, departure, arrivalDateTime, - arrivalPosition, 0, arrival, null); + arrivalPosition, 0, arrival, null, null); parts.add(lastTrip); if (firstDepartureTime == null) @@ -386,11 +386,11 @@ public final class BahnProvider extends AbstractHafasProvider 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 + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival)); + parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival, null)); } else { - parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival)); + parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival, null)); } lastArrival = arrival; @@ -399,7 +399,7 @@ public final class BahnProvider extends AbstractHafasProvider { final String arrival = ParserUtils.resolveEntities(mDetFine.group(12)); - parts.add(new Connection.Footway(0, 0, departure, 0, arrival)); + parts.add(new Connection.Footway(0, 0, departure, 0, arrival, null)); } } else diff --git a/src/de/schildbach/pte/BvgProvider.java b/src/de/schildbach/pte/BvgProvider.java index f68510c5..e1f275f2 100644 --- a/src/de/schildbach/pte/BvgProvider.java +++ b/src/de/schildbach/pte/BvgProvider.java @@ -525,7 +525,7 @@ public final class BvgProvider extends AbstractHafasProvider final String arrival = ParserUtils.resolveEntities(mDetFine.group(10)); parts.add(new Connection.Trip(line, destination, departureTime, departurePosition, departureId, departure, arrivalTime, - arrivalPosition, arrivalId, arrival, null)); + arrivalPosition, arrivalId, arrival, null, null)); if (firstDepartureTime == null) firstDepartureTime = departureTime; @@ -549,12 +549,12 @@ public final class BvgProvider extends AbstractHafasProvider { final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1); parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), lastFootway.departureId, lastFootway.departure, - arrivalId, arrival, arrivalLat, arrivalLon)); + arrivalId, arrival, arrivalLat, arrivalLon, null)); } else { parts.add(new Connection.Footway(Integer.parseInt(min), departureId, departure, arrivalId, arrival, arrivalLat, - arrivalLon)); + arrivalLon, null)); } lastArrival = arrival; diff --git a/src/de/schildbach/pte/OebbProvider.java b/src/de/schildbach/pte/OebbProvider.java index a35baee2..519b1083 100644 --- a/src/de/schildbach/pte/OebbProvider.java +++ b/src/de/schildbach/pte/OebbProvider.java @@ -464,14 +464,14 @@ public class OebbProvider extends AbstractHafasProvider ParserUtils.resolveEntities(mDetFine.group(13))) : null; final Connection.Trip trip = new Connection.Trip(line, destination, detailsDepartureDateTime, departurePosition, - departureId, departure, detailsArrivalDateTime, arrivalPosition, arrivalId, arrival, null); + departureId, departure, detailsArrivalDateTime, arrivalPosition, arrivalId, arrival, null, null); connection.parts.add(trip); } else { final int min = (int) (detailsArrivalDateTime.getTime() - detailsDepartureDateTime.getTime()) / 1000 / 60; - final Connection.Footway footway = new Connection.Footway(min, departureId, departure, arrivalId, arrival); + final Connection.Footway footway = new Connection.Footway(min, departureId, departure, arrivalId, arrival, null); connection.parts.add(footway); } } diff --git a/src/de/schildbach/pte/RmvProvider.java b/src/de/schildbach/pte/RmvProvider.java index 2b95189f..fe407dbb 100644 --- a/src/de/schildbach/pte/RmvProvider.java +++ b/src/de/schildbach/pte/RmvProvider.java @@ -372,7 +372,7 @@ public class RmvProvider extends AbstractHafasProvider final String arrivalPosition = ParserUtils.resolveEntities(mDetFine.group(6)); lastTrip = new Connection.Trip(line, destination, departureTime, departurePosition, 0, departure, arrivalTime, - arrivalPosition, 0, arrival, null); + arrivalPosition, 0, arrival, null, null); parts.add(lastTrip); if (firstDepartureTime == null) @@ -385,11 +385,11 @@ public class RmvProvider extends AbstractHafasProvider 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 + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival)); + parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival, null)); } else { - parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival)); + parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival, null)); } } } diff --git a/src/de/schildbach/pte/dto/Connection.java b/src/de/schildbach/pte/dto/Connection.java index 3b94788a..90634e2e 100644 --- a/src/de/schildbach/pte/dto/Connection.java +++ b/src/de/schildbach/pte/dto/Connection.java @@ -77,11 +77,17 @@ public final class Connection implements Serializable return id.hashCode(); } - public static interface Part extends Serializable + public static class Part implements Serializable { + public final List path; + + public Part(final List path) + { + this.path = path; + } } - public final static class Trip implements Part + public final static class Trip extends Part { public final String line; public final Location destination; @@ -97,8 +103,10 @@ public final class Connection implements Serializable public Trip(final String line, final Location destination, final Date departureTime, final String departurePosition, final int departureId, final String departure, final Date arrivalTime, final String arrivalPosition, final int arrivalId, final String arrival, - final List intermediateStops) + final List intermediateStops, final List path) { + super(path); + this.line = line; this.destination = destination; this.departureTime = departureTime; @@ -130,7 +138,7 @@ public final class Connection implements Serializable } } - public final static class Footway implements Part + public final static class Footway extends Part { public final int min; public final int departureId; @@ -140,8 +148,10 @@ public final class Connection implements Serializable public final int arrivalLat, arrivalLon; public Footway(final int min, final int departureId, final String departure, final int arrivalId, final String arrival, final int arrivalLat, - final int arrivalLon) + final int arrivalLon, final List path) { + super(path); + this.min = min; this.departureId = departureId; this.departure = departure; @@ -151,8 +161,10 @@ public final class Connection implements Serializable this.arrivalLon = arrivalLon; } - public Footway(final int min, final int departureId, final String departure, final int arrivalId, final String arrival) + public Footway(final int min, final int departureId, final String departure, final int arrivalId, final String arrival, final List path) { + super(path); + this.min = min; this.departureId = departureId; this.departure = departure; diff --git a/src/de/schildbach/pte/dto/Point.java b/src/de/schildbach/pte/dto/Point.java new file mode 100644 index 00000000..ee3a8927 --- /dev/null +++ b/src/de/schildbach/pte/dto/Point.java @@ -0,0 +1,61 @@ +/* + * Copyright 2010 the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.schildbach.pte.dto; + +import java.io.Serializable; + +/** + * @author Andreas Schildbach + */ +public final class Point implements Serializable +{ + public final int lat, lon; + + public Point(final int lat, final int lon) + { + this.lat = lat; + this.lon = lon; + } + + @Override + public String toString() + { + return "[" + lat + "/" + lon + "]"; + } + + @Override + public boolean equals(final Object o) + { + if (o == this) + return true; + if (!(o instanceof Point)) + return false; + final Point other = (Point) o; + if (this.lat != other.lat) + return false; + if (this.lon != other.lon) + return false; + return true; + } + + @Override + public int hashCode() + { + return lat + 27 * lon; + } +}