Normalize station ids when passing them to Hafas or EFA APIs.

This commit is contained in:
Andreas Schildbach 2014-06-14 19:57:58 +02:00
parent c4ebd7fbc7
commit 751338cbe1
14 changed files with 44 additions and 27 deletions

View file

@ -934,7 +934,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
{
final StringBuilder parameters = new StringBuilder();
appendCommonRequestParams(parameters, "XML");
parameters.append("&type_dm=stop&name_dm=").append(stationId);
parameters.append("&type_dm=stop&name_dm=").append(normalizeStationId(stationId));
parameters.append("&itOptionsActive=1");
parameters.append("&ptOptionsActive=1");
parameters.append("&useProxFootSearch=1");
@ -1449,7 +1449,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
final StringBuilder parameters = new StringBuilder();
appendCommonRequestParams(parameters, "XML");
parameters.append("&type_dm=stop");
parameters.append("&name_dm=").append(stationId);
parameters.append("&name_dm=").append(normalizeStationId(stationId));
if (useRealtime)
parameters.append("&useRealtime=1");
parameters.append("&mode=direct");
@ -3275,7 +3275,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
if (canAcceptPoiId && location.type == LocationType.POI && location.hasId())
{
uri.append("&type_").append(paramSuffix).append("=poiID");
uri.append("&name_").append(paramSuffix).append("=").append(location.id);
uri.append("&name_").append(paramSuffix).append("=").append(normalizeStationId(location.id));
}
else if ((location.type == LocationType.POI || location.type == LocationType.ADDRESS) && location.hasLocation())
{

View file

@ -579,7 +579,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
parameters.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations
parameters.append("&start=yes");
parameters.append("&L=vs_java3");
parameters.append("&input=").append(stationId);
parameters.append("&input=").append(normalizeStationId(stationId));
if (clientType != null)
parameters.append("&clientType=").append(ParserUtils.urlEncode(clientType));
@ -590,6 +590,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
protected QueryDeparturesResult xmlQueryDepartures(final String uri, final String stationId) throws IOException
{
final String normalizedStationId = normalizeStationId(stationId);
StringReplaceReader reader = null;
try
@ -628,7 +630,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
return new QueryDeparturesResult(header, QueryDeparturesResult.Status.INVALID_STATION);
if (code.equals("H890"))
{
result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, stationId), Collections
result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, normalizedStationId), Collections
.<Departure> emptyList(), null));
return result;
}
@ -646,8 +648,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
final String evaId = XmlPullUtil.attr(pp, "evaId");
if (evaId != null)
{
if (!evaId.equals(stationId))
throw new IllegalStateException("stationId: " + stationId + ", evaId: " + evaId);
if (!evaId.equals(normalizedStationId))
throw new IllegalStateException("stationId: " + normalizedStationId + ", evaId: " + evaId);
final String name = XmlPullUtil.attr(pp, "name");
if (name != null)
@ -793,7 +795,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
XmlPullUtil.requireSkip(pp, "Journey");
}
result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, stationId,
result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, normalizedStationId,
stationPlaceAndName != null ? stationPlaceAndName[0] : null, stationPlaceAndName != null ? stationPlaceAndName[1] : null),
departures, null));
return result;
@ -1457,7 +1459,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
private static final String locationXml(final Location location)
{
if (location.type == LocationType.STATION && location.hasId())
return "<Station externalId=\"" + location.id + "\" />";
return "<Station externalId=\"" + normalizeStationId(location.id) + "\" />";
else if (location.type == LocationType.POI && location.hasLocation())
return "<Poi type=\"WGS84\" x=\"" + location.lon + "\" y=\"" + location.lat + "\" />";
else if (location.type == LocationType.ADDRESS && location.hasLocation())
@ -1475,7 +1477,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
if (location.type == LocationType.STATION && location.hasId() && isValidStationId(location.id))
{
id.append("@L=").append(location.id);
id.append("@L=").append(normalizeStationId(location.id));
}
else if (location.hasLocation())
{
@ -2260,7 +2262,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
final StringBuilder parameters = new StringBuilder();
parameters.append("?productsFilter=").append(allProductsString());
parameters.append("&boardType=dep");
parameters.append("&input=").append(stationId);
parameters.append("&input=").append(normalizeStationId(stationId));
parameters.append("&sTI=1&start=yes&hcount=0&L=vs_java3");
if (clientType != null)
parameters.append("&clientType=").append(ParserUtils.urlEncode(clientType));

View file

@ -118,4 +118,19 @@ public abstract class AbstractNetworkProvider implements NetworkProvider
{
return null;
}
protected static String normalizeStationId(final String stationId)
{
if (stationId == null || stationId.isEmpty())
return null;
if (stationId.charAt(0) != '0')
return stationId;
final StringBuilder normalized = new StringBuilder(stationId);
while (normalized.length() > 0 && normalized.charAt(0) == '0')
normalized.deleteCharAt(0);
return normalized.toString();
}
}

View file

@ -194,7 +194,7 @@ public final class BvgProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
final CharSequence page = ParserUtils.scrape(uri.toString());
@ -262,7 +262,7 @@ public final class BvgProvider extends AbstractHafasProvider
{
final StringBuilder uri = new StringBuilder();
uri.append(DEPARTURE_URL_LIVE);
uri.append("input=").append(stationId);
uri.append("input=").append(normalizeStationId(stationId));
if (additionalQueryParameter != null)
uri.append('&').append(additionalQueryParameter);
return uri.toString();
@ -274,7 +274,7 @@ public final class BvgProvider extends AbstractHafasProvider
{
final StringBuilder uri = new StringBuilder();
uri.append(DEPARTURE_URL_PLAN);
uri.append("&input=").append(stationId);
uri.append("&input=").append(normalizeStationId(stationId));
uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 50);
if (additionalQueryParameter != null)
uri.append('&').append(additionalQueryParameter);

View file

@ -103,7 +103,7 @@ public class InvgProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}
@ -116,7 +116,7 @@ public class InvgProvider extends AbstractHafasProvider
private String departuresQueryUri(final String stationId, final int maxDepartures)
{
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?input=").append(stationId);
uri.append("?input=").append(normalizeStationId(stationId));
uri.append("&boardType=dep");
uri.append("&productsFilter=").append(allProductsString());
if (maxDepartures != 0)

View file

@ -126,7 +126,7 @@ public class JetProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}

View file

@ -148,7 +148,7 @@ public class NasaProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}

View file

@ -126,7 +126,7 @@ public class NsProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}

View file

@ -169,7 +169,7 @@ public class NvvProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?L=vs_rmv&near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}

View file

@ -158,7 +158,7 @@ public class OebbProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Suchen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}

View file

@ -126,7 +126,7 @@ public class SeptaProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}
@ -141,7 +141,7 @@ public class SeptaProvider extends AbstractHafasProvider
final Calendar now = new GregorianCalendar(timeZone());
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?input=").append(stationId);
uri.append("?input=").append(normalizeStationId(stationId));
uri.append("&boardType=dep");
uri.append("&time=");
uri.append(ParserUtils.urlEncode(String.format(Locale.ENGLISH, "%02d:%02d %s", now.get(Calendar.HOUR), now.get(Calendar.MINUTE),

View file

@ -121,7 +121,7 @@ public class ShProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}
@ -134,7 +134,7 @@ public class ShProvider extends AbstractHafasProvider
private String departuresQueryUri(final String stationId, final int maxDepartures)
{
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?input=").append(stationId);
uri.append("?input=").append(normalizeStationId(stationId));
uri.append("&boardType=dep");
uri.append("&productsFilter=").append(allProductsString());
if (maxDepartures != 0)

View file

@ -138,7 +138,7 @@ public class SncbProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Zoek");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}

View file

@ -134,7 +134,7 @@ public class VgsProvider extends AbstractHafasProvider
final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
uri.append("?near=Anzeigen");
uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50);
uri.append("&input=").append(location.id);
uri.append("&input=").append(normalizeStationId(location.id));
return htmlNearbyStations(uri.toString());
}