diff --git a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java index 22f378f4..e8c85d76 100644 --- a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java @@ -60,6 +60,7 @@ 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.Position; import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryTripsContext; @@ -1556,7 +1557,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider new LinkedList(), new LinkedList()); } - final String position = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); + final Position position = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); XmlPullUtil.enter(pp, "itdDeparture"); @@ -1667,7 +1668,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider XmlPullUtil.enter(pp, "r"); final int assignedId = Integer.parseInt(requireValueTag(pp, "id")); requireValueTag(pp, "a"); - final String position = optValueTag(pp, "pl"); + final Position position = new Position(optValueTag(pp, "pl")); XmlPullUtil.exit(pp, "r"); /* final Point positionCoordinate = */coordStrToPoint(optValueTag(pp, "c")); @@ -2403,7 +2404,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider final Location departureLocation = processItdPointAttributes(pp); if (firstDepartureLocation == null) firstDepartureLocation = departureLocation; - final String departurePosition = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); + final Position departurePosition = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); XmlPullUtil.enter(pp, "itdPoint"); if (XmlPullUtil.test(pp, "itdMapItemList")) XmlPullUtil.next(pp); @@ -2427,7 +2428,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider throw new IllegalStateException(); final Location arrivalLocation = processItdPointAttributes(pp); lastArrivalLocation = arrivalLocation; - final String arrivalPosition = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); + final Position arrivalPosition = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); XmlPullUtil.enter(pp, "itdPoint"); if (XmlPullUtil.test(pp, "itdMapItemList")) XmlPullUtil.next(pp); @@ -2576,7 +2577,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider { final Location stopLocation = processItdPointAttributes(pp); - final String stopPosition = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); + final Position stopPosition = normalizePlatformName(XmlPullUtil.optAttr(pp, "platformName", null)); XmlPullUtil.enter(pp, "itdPoint"); XmlPullUtil.require(pp, "itdDateTime"); @@ -2837,7 +2838,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider XmlPullUtil.enter(pp, "r"); final int id = Integer.parseInt(requireValueTag(pp, "id")); optValueTag(pp, "a"); - final String position = optValueTag(pp, "pl"); + final Position position = new Position(optValueTag(pp, "pl")); final String place = normalizeLocationName(optValueTag(pp, "pc")); final Point coord = coordStrToPoint(requireValueTag(pp, "c")); XmlPullUtil.exit(pp, "r"); @@ -3139,7 +3140,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider "(\\d+)\\s*" + // "(?:([A-Z])\\s*(?:-\\s*([A-Z]))?)?", Pattern.CASE_INSENSITIVE); - private static final String normalizePlatformName(final String platformName) + private static final Position normalizePlatformName(final String platformName) { if (platformName != null) { @@ -3148,15 +3149,15 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider { final String simple = Integer.toString(Integer.parseInt(m.group(1))); if (m.group(2) != null && m.group(3) != null) - return simple + m.group(2) + "-" + m.group(3); + return new Position(simple + m.group(2) + "-" + m.group(3)); else if (m.group(2) != null) - return simple + m.group(2); + return new Position(simple + m.group(2)); else - return simple; + return new Position(simple); } else { - return platformName; + return new Position(platformName); } } diff --git a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java index 192db23e..97e3f3e2 100644 --- a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java @@ -56,6 +56,7 @@ 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.Position; import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryTripsContext; @@ -295,17 +296,17 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider throw new IllegalStateException("cannot handle: " + type); } - private static final String parsePlatform(final XmlPullParser pp) throws XmlPullParserException, IOException + private static final Position parsePlatform(final XmlPullParser pp) throws XmlPullParserException, IOException { XmlPullUtil.enter(pp, "Platform"); XmlPullUtil.require(pp, "Text"); - final String position = XmlPullUtil.text(pp).trim(); + final String platformText = XmlPullUtil.text(pp).trim(); XmlPullUtil.exit(pp, "Platform"); - if (position.length() == 0) + if (platformText.length() == 0) return null; else - return position; + return new Position(platformText); } public List xmlLocValReq(final CharSequence constraint) throws IOException @@ -761,7 +762,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider predictedTime = null; } - final String position = platform != null ? "Gl. " + ParserUtils.resolveEntities(platform) : null; + final Position position = platform != null ? new Position("Gl. " + ParserUtils.resolveEntities(platform)) : null; final String[] destinationPlaceAndName; if (dir != null) @@ -1206,7 +1207,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider time.setTimeInMillis(currentDate.getTimeInMillis()); parseTime(time, XmlPullUtil.text(pp)); final Date departureTime = time.getTime(); - final String departurePos = parsePlatform(pp); + final Position departurePos = parsePlatform(pp); XmlPullUtil.exit(pp, "Dep"); XmlPullUtil.exit(pp, "BasicStop"); @@ -1278,8 +1279,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider { Date stopArrivalTime = null; Date stopDepartureTime = null; - String stopArrivalPosition = null; - String stopDeparturePosition = null; + Position stopArrivalPosition = null; + Position stopDeparturePosition = null; if (XmlPullUtil.test(pp, "Arr")) { @@ -1364,7 +1365,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider time.setTimeInMillis(currentDate.getTimeInMillis()); parseTime(time, XmlPullUtil.text(pp)); final Date arrivalTime = time.getTime(); - final String arrivalPos = parsePlatform(pp); + final Position arrivalPos = parsePlatform(pp); XmlPullUtil.exit(pp, "Arr"); XmlPullUtil.exit(pp, "BasicStop"); @@ -1851,8 +1852,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider final String lineName = strings.read(is); - final String plannedDeparturePosition = normalizePosition(strings.read(is)); - final String plannedArrivalPosition = normalizePosition(strings.read(is)); + final Position plannedDeparturePosition = normalizePosition(strings.read(is)); + final Position plannedArrivalPosition = normalizePosition(strings.read(is)); final int legAttrIndex = is.readShortReverse(); @@ -1913,8 +1914,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider final long predictedDepartureTime = time(is, resDate, tripDayOffset); final long predictedArrivalTime = time(is, resDate, tripDayOffset); - final String predictedDeparturePosition = normalizePosition(strings.read(is)); - final String predictedArrivalPosition = normalizePosition(strings.read(is)); + final Position predictedDeparturePosition = normalizePosition(strings.read(is)); + final Position predictedArrivalPosition = normalizePosition(strings.read(is)); is.readInt(); @@ -1940,8 +1941,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider final Date plannedStopDepartureDate = plannedStopDepartureTime != 0 ? new Date(plannedStopDepartureTime) : null; final long plannedStopArrivalTime = time(is, resDate, tripDayOffset); final Date plannedStopArrivalDate = plannedStopArrivalTime != 0 ? new Date(plannedStopArrivalTime) : null; - final String plannedStopDeparturePosition = normalizePosition(strings.read(is)); - final String plannedStopArrivalPosition = normalizePosition(strings.read(is)); + final Position plannedStopDeparturePosition = normalizePosition(strings.read(is)); + final Position plannedStopArrivalPosition = normalizePosition(strings.read(is)); is.readInt(); @@ -1949,8 +1950,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider final Date predictedStopDepartureDate = predictedStopDepartureTime != 0 ? new Date(predictedStopDepartureTime) : null; final long predictedStopArrivalTime = time(is, resDate, tripDayOffset); final Date predictedStopArrivalDate = predictedStopArrivalTime != 0 ? new Date(predictedStopArrivalTime) : null; - final String predictedStopDeparturePosition = normalizePosition(strings.read(is)); - final String predictedStopArrivalPosition = normalizePosition(strings.read(is)); + final Position predictedStopDeparturePosition = normalizePosition(strings.read(is)); + final Position predictedStopArrivalPosition = normalizePosition(strings.read(is)); is.readInt(); @@ -2270,16 +2271,16 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider private static final Pattern P_POSITION_PLATFORM = Pattern.compile("Gleis\\s*([^\\s]*)\\s*", Pattern.CASE_INSENSITIVE); - private String normalizePosition(final String position) + private Position normalizePosition(final String position) { if (position == null) return null; final Matcher m = P_POSITION_PLATFORM.matcher(position); if (!m.matches()) - return position; + return new Position(position); - return m.group(1); + return new Position(m.group(1)); } protected final StringBuilder xmlNearbyStationsParameters(final int stationId) diff --git a/enabler/src/de/schildbach/pte/BvgProvider.java b/enabler/src/de/schildbach/pte/BvgProvider.java index fe0e2c53..03e3cb61 100644 --- a/enabler/src/de/schildbach/pte/BvgProvider.java +++ b/enabler/src/de/schildbach/pte/BvgProvider.java @@ -37,6 +37,7 @@ 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.Position; import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryTripsContext; @@ -392,7 +393,7 @@ public final class BvgProvider extends AbstractHafasProvider final char lineProduct = normalizeType(categoryFromName(lineName)); final Line line = newLine(lineProduct, normalizeLineName(lineName), null); - final String position = null; + final Position position = null; final String[] destinationPlaceAndName = splitPlaceAndName(ParserUtils.resolveEntities(mDepFine.group(4))); final Location destination = new Location(LocationType.ANY, 0, destinationPlaceAndName[0], destinationPlaceAndName[1]); @@ -464,7 +465,7 @@ public final class BvgProvider extends AbstractHafasProvider final char lineProduct = normalizeType(categoryFromName(lineName)); final Line line = newLine(lineProduct, normalizeLineName(lineName), null); - final String position = ParserUtils.resolveEntities(mDepFine.group(3)); + final Position position = new Position(ParserUtils.resolveEntities(mDepFine.group(3))); final int destinationId = Integer.parseInt(mDepFine.group(4)); final String[] destinationPlaceAndName = splitPlaceAndName(ParserUtils.resolveEntities(mDepFine.group(5))); diff --git a/enabler/src/de/schildbach/pte/InvgProvider.java b/enabler/src/de/schildbach/pte/InvgProvider.java index bd2879f3..87e3fc8d 100644 --- a/enabler/src/de/schildbach/pte/InvgProvider.java +++ b/enabler/src/de/schildbach/pte/InvgProvider.java @@ -33,6 +33,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.Position; import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; @@ -241,7 +242,8 @@ public class InvgProvider extends AbstractHafasProvider final Location destination = new Location(destinationId > 0 ? LocationType.STATION : LocationType.ANY, destinationId, null, destinationName); - final String position = mDepFine.group(7) != null ? "Gl. " + ParserUtils.resolveEntities(mDepFine.group(7)) : null; + final Position position = mDepFine.group(7) != null ? new Position("Gl. " + ParserUtils.resolveEntities(mDepFine.group(7))) + : null; final Departure dep = new Departure(plannedTime.getTime(), predictedTime != null ? predictedTime.getTime() : null, line, position, destination, null, null); diff --git a/enabler/src/de/schildbach/pte/SeptaProvider.java b/enabler/src/de/schildbach/pte/SeptaProvider.java index c8c3c4f9..e8b07745 100644 --- a/enabler/src/de/schildbach/pte/SeptaProvider.java +++ b/enabler/src/de/schildbach/pte/SeptaProvider.java @@ -33,6 +33,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.Position; import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; @@ -264,7 +265,8 @@ public class SeptaProvider extends AbstractHafasProvider final Location destination = new Location(destinationId > 0 ? LocationType.STATION : LocationType.ANY, destinationId, null, destinationName); - final String position = mDepFine.group(7) != null ? "Gl. " + ParserUtils.resolveEntities(mDepFine.group(7)) : null; + final Position position = mDepFine.group(7) != null ? new Position("Gl. " + ParserUtils.resolveEntities(mDepFine.group(7))) + : null; final Departure dep = new Departure(plannedTime.getTime(), predictedTime != null ? predictedTime.getTime() : null, line, position, destination, null, null); diff --git a/enabler/src/de/schildbach/pte/ShProvider.java b/enabler/src/de/schildbach/pte/ShProvider.java index bede24c7..c8772c60 100644 --- a/enabler/src/de/schildbach/pte/ShProvider.java +++ b/enabler/src/de/schildbach/pte/ShProvider.java @@ -31,6 +31,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.Position; import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; @@ -227,7 +228,8 @@ public class ShProvider extends AbstractHafasProvider final Location destination = new Location(destinationId > 0 ? LocationType.STATION : LocationType.ANY, destinationId, null, destinationName); - final String position = mDepFine.group(6) != null ? "Gl. " + ParserUtils.resolveEntities(mDepFine.group(6)) : null; + final Position position = mDepFine.group(6) != null ? new Position("Gl. " + ParserUtils.resolveEntities(mDepFine.group(6))) + : null; final Departure dep = new Departure(plannedTime.getTime(), null, line, position, destination, null, null); diff --git a/enabler/src/de/schildbach/pte/dto/Departure.java b/enabler/src/de/schildbach/pte/dto/Departure.java index ed567ef5..506796b5 100644 --- a/enabler/src/de/schildbach/pte/dto/Departure.java +++ b/enabler/src/de/schildbach/pte/dto/Departure.java @@ -28,12 +28,12 @@ public final class Departure implements Serializable final public Date plannedTime; final public Date predictedTime; final public Line line; - final public String position; + final public Position position; final public Location destination; final public int[] capacity; final public String message; - public Departure(final Date plannedTime, final Date predictedTime, final Line line, final String position, final Location destination, + public Departure(final Date plannedTime, final Date predictedTime, final Line line, final Position position, final Location destination, final int[] capacity, final String message) { this.plannedTime = plannedTime; @@ -48,7 +48,7 @@ public final class Departure implements Serializable @Override public String toString() { - StringBuilder builder = new StringBuilder("Departure("); + final StringBuilder builder = new StringBuilder("Departure("); builder.append(plannedTime != null ? plannedTime : "null"); builder.append(","); builder.append(predictedTime != null ? predictedTime : "null"); diff --git a/enabler/src/de/schildbach/pte/dto/Position.java b/enabler/src/de/schildbach/pte/dto/Position.java new file mode 100644 index 00000000..dbcb4132 --- /dev/null +++ b/enabler/src/de/schildbach/pte/dto/Position.java @@ -0,0 +1,79 @@ +/* + * Copyright 2013 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 Position implements Serializable +{ + public final String name; + + public Position(final String name) + { + this.name = name; + } + + @Override + public String toString() + { + final StringBuilder builder = new StringBuilder("Position("); + builder.append(name != null ? name : "null"); + builder.append(")"); + return builder.toString(); + } + + @Override + public boolean equals(final Object o) + { + if (o == this) + return true; + if (!(o instanceof Position)) + return false; + final Position other = (Position) o; + if (!nullSafeEquals(this.name, other.name)) + return false; + return true; + } + + @Override + public int hashCode() + { + int hashCode = 0; + hashCode += nullSafeHashCode(name); + return hashCode; + } + + private boolean nullSafeEquals(final Object o1, final Object o2) + { + if (o1 == null && o2 == null) + return true; + if (o1 != null && o1.equals(o2)) + return true; + return false; + } + + private int nullSafeHashCode(final Object o) + { + if (o == null) + return 0; + return o.hashCode(); + } +} diff --git a/enabler/src/de/schildbach/pte/dto/Stop.java b/enabler/src/de/schildbach/pte/dto/Stop.java index 02b00f96..35e7e414 100644 --- a/enabler/src/de/schildbach/pte/dto/Stop.java +++ b/enabler/src/de/schildbach/pte/dto/Stop.java @@ -28,16 +28,16 @@ public final class Stop implements Serializable public final Location location; public final Date plannedArrivalTime; public final Date predictedArrivalTime; - public final String plannedArrivalPosition; - public final String predictedArrivalPosition; + public final Position plannedArrivalPosition; + public final Position predictedArrivalPosition; public final Date plannedDepartureTime; public final Date predictedDepartureTime; - public final String plannedDeparturePosition; - public final String predictedDeparturePosition; + public final Position plannedDeparturePosition; + public final Position predictedDeparturePosition; - public Stop(final Location location, final Date plannedArrivalTime, final Date predictedArrivalTime, final String plannedArrivalPosition, - final String predictedArrivalPosition, final Date plannedDepartureTime, final Date predictedDepartureTime, - final String plannedDeparturePosition, final String predictedDeparturePosition) + public Stop(final Location location, final Date plannedArrivalTime, final Date predictedArrivalTime, final Position plannedArrivalPosition, + final Position predictedArrivalPosition, final Date plannedDepartureTime, final Date predictedDepartureTime, + final Position plannedDeparturePosition, final Position predictedDeparturePosition) { this.location = location; this.plannedArrivalTime = plannedArrivalTime; @@ -50,8 +50,8 @@ public final class Stop implements Serializable this.predictedDeparturePosition = predictedDeparturePosition; } - public Stop(final Location location, final boolean departure, final Date plannedTime, final Date predictedTime, final String plannedPosition, - final String predictedPosition) + public Stop(final Location location, final boolean departure, final Date plannedTime, final Date predictedTime, final Position plannedPosition, + final Position predictedPosition) { this.location = location; this.plannedArrivalTime = !departure ? plannedTime : null; @@ -64,8 +64,8 @@ public final class Stop implements Serializable this.predictedDeparturePosition = departure ? predictedPosition : null; } - public Stop(final Location location, final Date plannedArrivalTime, final String plannedArrivalPosition, final Date plannedDepartureTime, - final String plannedDeparturePosition) + public Stop(final Location location, final Date plannedArrivalTime, final Position plannedArrivalPosition, final Date plannedDepartureTime, + final Position plannedDeparturePosition) { this.location = location; this.plannedArrivalTime = plannedArrivalTime; @@ -101,7 +101,7 @@ public final class Stop implements Serializable return null; } - public String getArrivalPosition() + public Position getArrivalPosition() { if (predictedArrivalPosition != null) return predictedArrivalPosition; @@ -139,7 +139,7 @@ public final class Stop implements Serializable return null; } - public String getDeparturePosition() + public Position getDeparturePosition() { if (predictedDeparturePosition != null) return predictedDeparturePosition; @@ -157,7 +157,7 @@ public final class Stop implements Serializable @Override public String toString() { - StringBuilder builder = new StringBuilder("Stop('"); + final StringBuilder builder = new StringBuilder("Stop('"); builder.append(location); builder.append("', arr: "); builder.append(plannedArrivalTime != null ? plannedArrivalTime : "-"); diff --git a/enabler/src/de/schildbach/pte/dto/Trip.java b/enabler/src/de/schildbach/pte/dto/Trip.java index 9e4c1e1d..76562fb3 100644 --- a/enabler/src/de/schildbach/pte/dto/Trip.java +++ b/enabler/src/de/schildbach/pte/dto/Trip.java @@ -253,7 +253,7 @@ public final class Trip implements Serializable return departureStop.getDepartureDelay(); } - public String getDeparturePosition() + public Position getDeparturePosition() { return departureStop.getDeparturePosition(); } @@ -283,7 +283,7 @@ public final class Trip implements Serializable return arrivalStop.getArrivalDelay(); } - public String getArrivalPosition() + public Position getArrivalPosition() { return arrivalStop.getArrivalPosition(); }