From fe40fa22081d8f94ea14159e59506d15a7d63e57 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 17 Nov 2018 23:02:24 +0100 Subject: [PATCH] HSL: Remove provider for Finland. --- .../src/de/schildbach/pte/HslProvider.java | 713 ------------------ enabler/src/de/schildbach/pte/NetworkId.java | 3 - .../pte/live/HslProviderLiveTest.java | 142 ---- .../pte/live/secrets.properties.template | 2 - 4 files changed, 860 deletions(-) delete mode 100644 enabler/src/de/schildbach/pte/HslProvider.java delete mode 100644 enabler/test/de/schildbach/pte/live/HslProviderLiveTest.java diff --git a/enabler/src/de/schildbach/pte/HslProvider.java b/enabler/src/de/schildbach/pte/HslProvider.java deleted file mode 100644 index 4c7c6bdd..00000000 --- a/enabler/src/de/schildbach/pte/HslProvider.java +++ /dev/null @@ -1,713 +0,0 @@ -/* - * Copyright 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; - -import java.io.IOException; -import java.text.ParsePosition; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.EnumSet; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; - -import javax.annotation.Nullable; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; - -import com.google.common.base.Joiner; - -import de.schildbach.pte.dto.Departure; -import de.schildbach.pte.dto.Line; -import de.schildbach.pte.dto.Location; -import de.schildbach.pte.dto.LocationType; -import de.schildbach.pte.dto.NearbyLocationsResult; -import de.schildbach.pte.dto.Point; -import de.schildbach.pte.dto.Product; -import de.schildbach.pte.dto.QueryDeparturesResult; -import de.schildbach.pte.dto.QueryTripsContext; -import de.schildbach.pte.dto.QueryTripsResult; -import de.schildbach.pte.dto.ResultHeader; -import de.schildbach.pte.dto.StationDepartures; -import de.schildbach.pte.dto.Stop; -import de.schildbach.pte.dto.Style; -import de.schildbach.pte.dto.SuggestLocationsResult; -import de.schildbach.pte.dto.SuggestedLocation; -import de.schildbach.pte.dto.Trip; -import de.schildbach.pte.dto.TripOptions; -import de.schildbach.pte.exception.ParserException; -import de.schildbach.pte.util.HttpClient; -import de.schildbach.pte.util.XmlPullUtil; - -import okhttp3.HttpUrl; -import okhttp3.ResponseBody; - -/** - * @author Mats Sjöberg - */ -public class HslProvider extends AbstractNetworkProvider { - private static final HttpUrl API_BASE = HttpUrl.parse("https://api.reittiopas.fi/hsl/"); - private static final String SERVER_PRODUCT = "hsl"; - private static final String SERVER_VERSION = "1_2_0"; - private static final int EARLIER_TRIPS_MINUTE_OFFSET = 5; - private static final int EARLIER_TRIPS_MINIMUM = 3; - - private final XmlPullParserFactory parserFactory; - - private String user; - private String pass; - - public HslProvider(String user, String pass) { - super(NetworkId.HSL); - - this.user = user; - this.pass = pass; - - try { - parserFactory = XmlPullParserFactory.newInstance(System.getProperty(XmlPullParserFactory.PROPERTY_NAME), - null); - } catch (final XmlPullParserException x) { - throw new RuntimeException(x); - } - } - - @Override - protected boolean hasCapability(final Capability capability) { - return true; - } - - private HttpUrl.Builder apiUrl(final String request) { - final HttpUrl.Builder url = API_BASE.newBuilder(); - url.addPathSegment(SERVER_VERSION).addPathSegment(""); - url.addQueryParameter("user", user); - url.addQueryParameter("pass", pass); - url.addQueryParameter("request", request); - url.addQueryParameter("epsg_out", "wgs84"); - url.addQueryParameter("epsg_in", "wgs84"); - url.addQueryParameter("format", "xml"); - return url; - } - - private Point coordStrToPoint(final String coordStr) { - if (coordStr == null) - return null; - - final String[] parts = coordStr.split(","); - return Point.fromDouble(Double.parseDouble(parts[1]), Double.parseDouble(parts[0])); - } - - private Point xmlCoordsToPoint(final XmlPullParser pp) throws XmlPullParserException, IOException { - XmlPullUtil.enter(pp, "coord"); - String x = xmlValueTag(pp, "x"); - String y = xmlValueTag(pp, "y"); - XmlPullUtil.skipExit(pp, "coord"); - return Point.fromDouble(Double.parseDouble(y), Double.parseDouble(x)); - } - - private String xmlValueTag(final XmlPullParser pp, final String tagName) - throws XmlPullParserException, IOException { - XmlPullUtil.skipUntil(pp, tagName); - return XmlPullUtil.valueTag(pp, tagName); - } - - private String locationToCoords(final Location loc) { - return String.format("%2.6f,%2.6f", loc.getLonAsDouble(), loc.getLatAsDouble()); - } - - private Location queryStop(final String stationId) throws IOException { - final HttpUrl.Builder url = apiUrl("stop"); - url.addQueryParameter("code", stationId); - url.addQueryParameter("dep_limit", "1"); - final AtomicReference result = new AtomicReference<>(); - - final HttpClient.Callback callback = new HttpClient.Callback() { - @Override - public void onSuccessful(final CharSequence bodyPeek, final ResponseBody body) throws IOException { - try { - final XmlPullParser pp = parserFactory.newPullParser(); - pp.setInput(body.charStream()); - - XmlPullUtil.enter(pp, "response"); - XmlPullUtil.enter(pp, "node"); - - final String id = xmlValueTag(pp, "code"); - final String name = xmlValueTag(pp, "name_fi"); - final Point pt = coordStrToPoint(xmlValueTag(pp, "coords")); - result.set(new Location(LocationType.STATION, id, pt, null, name)); - } catch (final XmlPullParserException x) { - throw new ParserException("cannot parse xml: " + bodyPeek, x); - } - } - }; - - httpClient.getInputStream(callback, url.build()); - return result.get(); - } - - // Determine stations near to given location. At least one of - // stationId or lat/lon pair must be present. - // NOTE: HSL returns only stops, not other locations, so "types" is not honoured. - @Override - public NearbyLocationsResult queryNearbyLocations(EnumSet types, Location location, int maxDistance, - int maxStations) throws IOException { - final HttpUrl.Builder url = apiUrl("stops_area"); - if (!location.hasCoord()) { - if (location.type != LocationType.STATION) - throw new IllegalArgumentException("cannot handle: " + location.type); - if (!location.hasId()) - throw new IllegalArgumentException("at least one of stationId or lat/lon " + "must be given"); - location = queryStop(location.id); - } - url.addQueryParameter("center_coordinate", locationToCoords(location)); - url.addQueryParameter("limit", Integer.toString(maxStations)); - url.addQueryParameter("diameter", Integer.toString(maxDistance * 2)); - final AtomicReference result = new AtomicReference<>(); - - final HttpClient.Callback callback = new HttpClient.Callback() { - @Override - public void onSuccessful(final CharSequence bodyPeek, final ResponseBody body) throws IOException { - try { - final XmlPullParser pp = parserFactory.newPullParser(); - pp.setInput(body.charStream()); - - final List stations = new ArrayList<>(); - final ResultHeader header = new ResultHeader(network, SERVER_PRODUCT); - - XmlPullUtil.enter(pp, "response"); - - while (XmlPullUtil.test(pp, "node")) { - XmlPullUtil.enter(pp, "node"); - - final String id = xmlValueTag(pp, "code"); - final String name = xmlValueTag(pp, "name"); - final Point pt = coordStrToPoint(xmlValueTag(pp, "coords")); - final String place = xmlValueTag(pp, "address"); - - XmlPullUtil.skipExit(pp, "node"); - - stations.add(new Location(LocationType.STATION, id, pt, place, name)); - } - - result.set(new NearbyLocationsResult(header, stations)); - } catch (final XmlPullParserException x) { - throw new ParserException("cannot parse xml: " + bodyPeek, x); - } - } - }; - - httpClient.getInputStream(callback, url.build()); - return result.get(); - } - - private Line newLine(String code, int type, String message) { - String label = code.substring(1, 5).trim().replaceAll("^0+", ""); - Product product = Product.BUS; - char acode = code.substring(0, 1).charAt(0); - - int color = 0xFF193695; - - if (label.equals("1300M") || type == 6) { - label = "Metro"; - product = Product.SUBWAY; - color = 0xFFfb6500; - } else if (label.equals("1019") || type == 7) { - label = "Ferry"; - product = Product.FERRY; - } else if (type == 2) { - product = Product.TRAM; - color = 0xFF00ab67; - } else if (type == 12 || (type == 0 && acode == '3')) { - product = Product.REGIONAL_TRAIN; - color = 0xFF2cbe2c; - if ((label.charAt(0) == '1' || label.charAt(0) == '2') && label.length() == 2) - label = label.substring(1) + "-train"; - } - - Style style = new Style(color, Style.deriveForegroundColor(color)); - - return new Line(code, network.toString(), product, label, style, message); - } - - // Get departures at a given station, probably live - @Override - public QueryDeparturesResult queryDepartures(String stationId, @Nullable Date queryDate, final int maxDepartures, - boolean equivs) throws IOException { - final HttpUrl.Builder url = apiUrl("stop"); - url.addQueryParameter("code", stationId); - if (queryDate != null) { - url.addQueryParameter("date", new SimpleDateFormat("yyyyMMdd").format(queryDate)); - url.addQueryParameter("time", new SimpleDateFormat("HHmm").format(queryDate)); - } - url.addQueryParameter("dep_limit", Integer.toString(maxDepartures)); - final AtomicReference result = new AtomicReference<>(); - - final HttpClient.Callback callback = new HttpClient.Callback() { - @Override - public void onSuccessful(final CharSequence bodyPeek, final ResponseBody body) throws IOException { - try { - final XmlPullParser pp = parserFactory.newPullParser(); - pp.setInput(body.charStream()); - - XmlPullUtil.enter(pp, "response"); - XmlPullUtil.enter(pp, "node"); - - // FIXME: id is never used!? - final String id = xmlValueTag(pp, "code"); - final String name = xmlValueTag(pp, "name_fi"); - - final Map lines = new HashMap<>(); - - XmlPullUtil.skipUntil(pp, "lines"); - XmlPullUtil.enter(pp, "lines"); - while (XmlPullUtil.test(pp, "node")) { - final String[] parts = XmlPullUtil.valueTag(pp, "node").split(":"); - lines.put(parts[0], newLine(parts[0], 0, parts[1])); - } - XmlPullUtil.skipExit(pp, "lines"); - - final ResultHeader header = new ResultHeader(network, SERVER_PRODUCT); - final QueryDeparturesResult r = new QueryDeparturesResult(header); - - XmlPullUtil.skipUntil(pp, "departures"); - XmlPullUtil.enter(pp, "departures"); - - final List departures = new ArrayList<>(maxDepartures); - while (XmlPullUtil.test(pp, "node")) { - XmlPullUtil.enter(pp, "node"); - final String code = xmlValueTag(pp, "code"); - final String time = xmlValueTag(pp, "time"); - final String date = xmlValueTag(pp, "date"); - XmlPullUtil.skipExit(pp, "node"); - - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); - Date depDate = sdf.parse(date + time, new ParsePosition(0)); - - final Line line = lines.get(code); - final Location destination = new Location(LocationType.ANY, line.message, null, null); - final Departure departure = new Departure(depDate, null, line, null, destination, null, null); - departures.add(departure); - } - - Location station = new Location(LocationType.STATION, id, null, name); - r.stationDepartures.add(new StationDepartures(station, departures, null)); - result.set(r); - } catch (final XmlPullParserException x) { - throw new ParserException("cannot parse xml: " + bodyPeek, x); - } - } - }; - - httpClient.getInputStream(callback, url.build()); - return result.get(); - } - - /** - * Meant for auto-completion of location names, like in an {@link android.widget.AutoCompleteTextView} - * - * @param constraint - * input by user so far - * @return location suggestions - * @throws IOException - */ - @Override - public SuggestLocationsResult suggestLocations(CharSequence constraint) throws IOException { - final HttpUrl.Builder url = apiUrl("geocode"); - // Since HSL is picky about the input we clean out any - // character that isn't alphabetic, numeral, -, ', / - // or a space. Those should be all chars needed for a - // name. - String constraintStr = constraint.toString().replaceAll("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\d-'/ ]", ""); - url.addQueryParameter("key", constraintStr); - final AtomicReference result = new AtomicReference<>(); - - final HttpClient.Callback callback = new HttpClient.Callback() { - @Override - public void onSuccessful(final CharSequence bodyPeek, final ResponseBody body) throws IOException { - try { - final ResultHeader header = new ResultHeader(network, SERVER_PRODUCT); - final List locations = new ArrayList<>(); - - final XmlPullParser pp = parserFactory.newPullParser(); - pp.setInput(body.charStream()); - - XmlPullUtil.enter(pp, "response"); - - int weight = 10000; - - while (XmlPullUtil.test(pp, "node")) { - XmlPullUtil.enter(pp, "node"); - final String locType = xmlValueTag(pp, "locType"); - String name = xmlValueTag(pp, "name"); - final Point pt = coordStrToPoint(xmlValueTag(pp, "coords")); - - LocationType type = LocationType.ANY; - if (locType.equals("poi")) - type = LocationType.POI; - if (locType.equals("address")) - type = LocationType.ADDRESS; - if (locType.equals("stop")) - type = LocationType.STATION; - - XmlPullUtil.skipUntil(pp, "details"); - XmlPullUtil.enter(pp, "details"); - XmlPullUtil.optSkip(pp, "address"); - final String id = XmlPullUtil.optValueTag(pp, "code", null); - final String shortCode = XmlPullUtil.optValueTag(pp, "shortCode", null); - XmlPullUtil.skipExit(pp, "details"); - - XmlPullUtil.skipExit(pp, "node"); - - if (shortCode != null) - name = name + " (" + shortCode + ")"; - - locations.add(new SuggestedLocation(new Location(type, id, pt, null, name), weight)); - weight -= 1; - } - - result.set(new SuggestLocationsResult(header, locations)); - } catch (final XmlPullParserException x) { - throw new ParserException("cannot parse xml: " + bodyPeek, x); - } - } - }; - - httpClient.getInputStream(callback, url.build()); - return result.get(); - } - - @SuppressWarnings("serial") - public static class QueryTripsHslContext implements QueryTripsContext { - public final String uri; - public Date date; - public Date prevDate = null; - public Date nextDate = null; - public final Location from; - public final Location via; - public final Location to; - public List trips; - - public QueryTripsHslContext(final String uri, final Location from, final Location via, final Location to, - final Date date) { - this.uri = uri; - this.from = from; - this.via = via; - this.to = to; - this.date = date; - this.trips = new ArrayList<>(); - } - - @Override - public boolean canQueryLater() { - return true; - } - - @Override - public boolean canQueryEarlier() { - return true; - } - } - - // Query trips, asking for any ambiguousnesses - // NOTE: HSL ignores accessibility - @Override - public QueryTripsResult queryTrips(Location from, @Nullable Location via, Location to, Date date, boolean dep, - @Nullable TripOptions options) throws IOException { - final ResultHeader header = new ResultHeader(network, SERVER_PRODUCT); - - if (!from.isIdentified()) { - final List locations = suggestLocations(from.name).getLocations(); - if (locations.isEmpty()) - return new QueryTripsResult(header, QueryTripsResult.Status.NO_TRIPS); - if (locations.size() > 1) - return new QueryTripsResult(header, locations, null, null); - from = locations.get(0); - } - - if (via != null && !via.isIdentified()) { - final List locations = suggestLocations(via.name).getLocations(); - if (locations.isEmpty()) - return new QueryTripsResult(header, QueryTripsResult.Status.NO_TRIPS); - if (locations.size() > 1) - return new QueryTripsResult(header, null, locations, null); - via = locations.get(0); - } - - if (!to.isIdentified()) { - final List locations = suggestLocations(to.name).getLocations(); - if (locations.isEmpty()) - return new QueryTripsResult(header, QueryTripsResult.Status.NO_TRIPS); - if (locations.size() > 1) - return new QueryTripsResult(header, null, null, locations); - to = locations.get(0); - } - - final HttpUrl.Builder url = apiUrl("route"); - - url.addQueryParameter("from", locationToCoords(from)); - if (via != null) - url.addQueryParameter("via", locationToCoords(via)); - url.addQueryParameter("to", locationToCoords(to)); - - url.addQueryParameter("timetype", dep ? "departure" : "arrival"); - - if (options == null) - options = new TripOptions(); - - if (options.walkSpeed != WalkSpeed.NORMAL) - url.addQueryParameter("walk_speed", Integer.toString(options.walkSpeed == WalkSpeed.SLOW ? 30 : 100)); - url.addQueryParameter("show", "5"); - - if (options.products != null && options.products.size() > 0) { - List tt = new ArrayList<>(); - if (options.products.contains(Product.HIGH_SPEED_TRAIN) || options.products.contains(Product.REGIONAL_TRAIN) - || options.products.contains(Product.SUBURBAN_TRAIN)) - tt.add("train"); - if (options.products.contains(Product.SUBWAY)) - tt.add("metro"); - if (options.products.contains(Product.TRAM)) - tt.add("tram"); - if (options.products.contains(Product.BUS)) - tt.add("bus"); - if (options.products.contains(Product.FERRY)) - tt.add("ferry"); - - if (tt.size() > 0) - url.addQueryParameter("transport_types", Joiner.on("|").join(tt)); - } - - QueryTripsHslContext context = new QueryTripsHslContext(url.build().toString(), from, via, to, date); - - return queryHslTrips(from, via, to, context, date, true); - } - - /** - * Query more trips (e.g. earlier or later) - * - * @param contextObj - * context to query more trips from - * @param later - * {@code true} to get later trips, {@code false} to get earlier trips - * @return result object that contains possible trips - * @throws IOException - */ - @Override - public QueryTripsResult queryMoreTrips(QueryTripsContext contextObj, boolean later) throws IOException { - final QueryTripsHslContext context = (QueryTripsHslContext) contextObj; - - QueryTripsResult result; - - if (later) { - result = queryHslTrips(context.from, context.via, context.to, context, context.nextDate, later); - } else { - // if we are fetching earlier trips, we have - // to do a hack to search backwards in small - // steps - - int tries = 0; - int contextTrips = context.trips.size(); - - final Calendar cal = new GregorianCalendar(timeZone); - cal.setTime(context.prevDate); - - do { - cal.add(Calendar.MINUTE, -EARLIER_TRIPS_MINUTE_OFFSET); - result = queryHslTrips(context.from, context.via, context.to, context, cal.getTime(), later); - - tries += 1; - - // keep trying if we are fetching earlier - // trips and the list of trips hasn't grown enough - } while ((result.trips.size() - contextTrips < EARLIER_TRIPS_MINIMUM) && tries < 10); - } - - return result; - } - - private QueryTripsResult queryHslTrips(final Location from, final Location via, final Location to, - final QueryTripsHslContext context, Date date, final boolean later) throws IOException { - final HttpUrl.Builder url = HttpUrl.parse(context.uri).newBuilder(); - url.addQueryParameter("date", new SimpleDateFormat("yyyyMMdd").format(date)); - url.addQueryParameter("time", new SimpleDateFormat("HHmm").format(date)); - final AtomicReference result = new AtomicReference<>(); - - final HttpClient.Callback callback = new HttpClient.Callback() { - @Override - public void onSuccessful(final CharSequence bodyPeek, final ResponseBody body) throws IOException { - try { - final XmlPullParser pp = parserFactory.newPullParser(); - pp.setInput(body.charStream()); - - XmlPullUtil.enter(pp, "response"); - - final ResultHeader header = new ResultHeader(network, SERVER_PRODUCT); - - final List trips = new ArrayList<>(context.trips); - - // we use this for quick checking if trip already exists - Set tripSet = new HashSet<>(); - for (Trip t : trips) - tripSet.add(t.getId()); - - int insert = later ? trips.size() : 0; - - while (XmlPullUtil.test(pp, "node")) { - XmlPullUtil.enter(pp, "node"); - - XmlPullUtil.enter(pp, "node"); - - List legs = new ArrayList<>(); - - XmlPullUtil.skipUntil(pp, "legs"); - XmlPullUtil.enter(pp, "legs"); - int numTransfers = 0; - - while (XmlPullUtil.test(pp, "node")) { - XmlPullUtil.enter(pp, "node"); - - int distance = Integer.parseInt(xmlValueTag(pp, "length")); - String legType = xmlValueTag(pp, "type"); - String lineCode = XmlPullUtil.optValueTag(pp, "code", null); - - List path = new ArrayList<>(); - - Location departure = null; - Date departureTime = null; - Stop departureStop = null; - - Location arrival = null; - Date arrivalTime = null; - - LinkedList stops = new LinkedList<>(); - - XmlPullUtil.skipUntil(pp, "locs"); - XmlPullUtil.enter(pp, "locs"); - while (XmlPullUtil.test(pp, "node")) { - XmlPullUtil.enter(pp, "node"); - Point pt = xmlCoordsToPoint(pp); - - String arrTime = xmlValueTag(pp, "arrTime"); - String depTime = xmlValueTag(pp, "depTime"); - String name = XmlPullUtil.optValueTag(pp, "name", null); - String code = XmlPullUtil.optValueTag(pp, "code", null); - String shortCode = XmlPullUtil.optValueTag(pp, "shortCode", null); - String stopAddress = XmlPullUtil.optValueTag(pp, "stopAddress", null); - - if (name == null) { - name = (path.size() == 0 && from != null && from.name != null) ? from.name : null; - } - - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); - Date arrDate = sdf.parse(arrTime, new ParsePosition(0)); - Date depDate = sdf.parse(depTime, new ParsePosition(0)); - - LocationType type = LocationType.ANY; - if (code != null) - type = LocationType.STATION; - Location loc = new Location(type, code, pt, stopAddress, name); - - if (path.size() == 0) { - departure = loc; - departureTime = depDate; - if (type == LocationType.STATION) - departureStop = new Stop(loc, true, departureTime, null, null, null); - - } else { - arrival = loc; - arrivalTime = arrDate; - if (type == LocationType.STATION) { - stops.add(new Stop(loc, arrDate, null, depDate, null)); - } - } - - path.add(pt); - XmlPullUtil.skipExit(pp, "node"); - } - XmlPullUtil.skipExit(pp, "locs"); - XmlPullUtil.skipExit(pp, "node"); - - if (legType.equals("walk")) { - // ugly hack to set the name of the last arrival - if (arrival != null && arrival.name == null) { - arrival = new Location(arrival.type, arrival.id, arrival.coord, arrival.place, - to.name); - } - - legs.add(new Trip.Individual(Trip.Individual.Type.WALK, departure, departureTime, - arrival, arrivalTime, path, distance)); - } else { - Stop arrivalStop = null; - if (stops.size() > 0) { - Stop last = stops.getLast(); - arrivalStop = new Stop(last.location, false, last.plannedArrivalTime, null, null, - null); - stops.removeLast(); - } - - Line line = null; - if (lineCode != null) - line = newLine(lineCode, Integer.parseInt(legType), null); - - legs.add(new Trip.Public(line, null, departureStop, arrivalStop, stops, path, null)); - numTransfers++; - } - } - XmlPullUtil.skipExit(pp, "legs"); - XmlPullUtil.skipExit(pp, "node"); - XmlPullUtil.skipExit(pp, "node"); - - Trip t = new Trip(null, from, to, legs, null, null, numTransfers - 1); - if (!tripSet.contains(t.getId())) { - Date thisTime = t.getFirstDepartureTime(); - while (insert < trips.size() && thisTime.after(trips.get(insert).getFirstDepartureTime())) - insert++; - - trips.add(insert++, t); - tripSet.add(t.getId()); - } - } - - Date lastDate = trips.get(trips.size() - 1).getFirstDepartureTime(); - Date firstDate = trips.get(0).getFirstDepartureTime(); - if (context.nextDate == null || lastDate.after(context.nextDate)) - context.nextDate = lastDate; - if (context.prevDate == null || firstDate.before(context.prevDate)) - context.prevDate = firstDate; - context.trips = trips; - - result.set(new QueryTripsResult(header, url.build().toString(), from, via, to, context, trips)); - } catch (final XmlPullParserException x) { - throw new ParserException("cannot parse xml: " + bodyPeek, x); - } - } - }; - - context.date = date; - - httpClient.getInputStream(callback, url.build()); - return result.get(); - } -} diff --git a/enabler/src/de/schildbach/pte/NetworkId.java b/enabler/src/de/schildbach/pte/NetworkId.java index 996ceb24..8750178a 100644 --- a/enabler/src/de/schildbach/pte/NetworkId.java +++ b/enabler/src/de/schildbach/pte/NetworkId.java @@ -51,9 +51,6 @@ public enum NetworkId { // Sweden SE, - // Finland - HSL, - // Luxembourg LU, diff --git a/enabler/test/de/schildbach/pte/live/HslProviderLiveTest.java b/enabler/test/de/schildbach/pte/live/HslProviderLiveTest.java deleted file mode 100644 index a68018c2..00000000 --- a/enabler/test/de/schildbach/pte/live/HslProviderLiveTest.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 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.live; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.Date; -import java.util.List; - -import org.junit.Test; - -import de.schildbach.pte.HslProvider; -import de.schildbach.pte.dto.Location; -import de.schildbach.pte.dto.LocationType; -import de.schildbach.pte.dto.NearbyLocationsResult; -import de.schildbach.pte.dto.QueryDeparturesResult; -import de.schildbach.pte.dto.QueryTripsResult; -import de.schildbach.pte.dto.SuggestLocationsResult; -import de.schildbach.pte.dto.Trip; - -/** - * @author Mats Sjöberg - */ -public class HslProviderLiveTest extends AbstractProviderLiveTest { - public HslProviderLiveTest() { - super(new HslProvider(secretProperty("hsl.usertoken"), secretProperty("hsl.passphrase"))); - } - - @Test - public void nearbyLocations() throws Exception { - final NearbyLocationsResult result = queryNearbyLocations(null, Location.coord(60174022, 24939222)); - print(result); - assertEquals(NearbyLocationsResult.Status.OK, result.status); - assertTrue(result.locations.size() > 0); - } - - @Test - public void nearbyStationsByCoordinate() throws Exception { - final NearbyLocationsResult result = queryNearbyStations(Location.coord(60174022, 24939222)); - print(result); - assertEquals(NearbyLocationsResult.Status.OK, result.status); - assertTrue(result.locations.size() > 0); - } - - @Test - public void queryDepartures() throws Exception { - final QueryDeparturesResult result = queryDepartures("1030424", false); - print(result); - assertEquals(QueryDeparturesResult.Status.OK, result.status); - assertTrue(result.stationDepartures.size() > 0); - } - - @Test - public void suggestLocationsIdentified() throws Exception { - final SuggestLocationsResult result = suggestLocations("3029"); - print(result); - assertEquals(SuggestLocationsResult.Status.OK, result.status); - assertTrue(result.getLocations().size() == 1); - } - - @Test - public void suggestLocationsIncomplete() throws Exception { - final SuggestLocationsResult result = suggestLocations("Kum"); - print(result); - assertEquals(SuggestLocationsResult.Status.OK, result.status); - assertTrue(result.getLocations().size() > 0); - } - - @Test - public void suggestLocationsWithUmlaut() throws Exception { - final SuggestLocationsResult result = suggestLocations("Jät"); - print(result); - assertEquals(SuggestLocationsResult.Status.OK, result.status); - assertTrue(result.getLocations().size() > 0); - } - - private void assertTimesInSequence(List trips) { - for (int i = 1; i < trips.size(); i++) { - Date start1 = trips.get(i - 1).getFirstDepartureTime(); - Date start2 = trips.get(i).getFirstDepartureTime(); - assertTrue(i + ": " + start1 + " vs " + start2, start1.compareTo(start2) <= 0); - } - } - - @Test - public void shortTrip() throws Exception { - final QueryTripsResult result = queryTrips( - new Location(LocationType.STATION, null, "", "Gustaf Hällströmin katu 1"), null, - new Location(LocationType.STATION, null, "", "Tyynenmerenkatu 11"), new Date(), true, null); - print(result); - assertTimesInSequence(result.trips); - - assertEquals(QueryTripsResult.Status.OK, result.status); - assertTrue(result.trips.size() > 0); - - assertTrue(result.context.canQueryLater()); - - final QueryTripsResult laterResult = queryMoreTrips(result.context, true); - print(laterResult); - assertEquals(QueryTripsResult.Status.OK, laterResult.status); - assertTrue(laterResult.trips.size() > result.trips.size()); - assertTimesInSequence(laterResult.trips); - - assertTrue(laterResult.context.canQueryLater()); - - final QueryTripsResult later2Result = queryMoreTrips(laterResult.context, true); - print(later2Result); - for (Trip trip : later2Result.trips) { - System.out.println("LATER2 " + trip.getFirstDepartureTime() + " " + trip.getId()); - } - assertEquals(QueryTripsResult.Status.OK, later2Result.status); - assertTrue(later2Result.trips.size() > laterResult.trips.size()); - assertTimesInSequence(later2Result.trips); - - assertTrue(later2Result.context.canQueryEarlier()); - - final QueryTripsResult earlierResult = queryMoreTrips(later2Result.context, false); - print(earlierResult); - for (Trip trip : earlierResult.trips) { - System.out.println("EARLIER " + trip.getFirstDepartureTime() + " " + trip.getId()); - } - assertEquals(QueryTripsResult.Status.OK, earlierResult.status); - assertTrue(earlierResult.trips.size() > later2Result.trips.size()); - assertTimesInSequence(earlierResult.trips); - } -} diff --git a/enabler/test/de/schildbach/pte/live/secrets.properties.template b/enabler/test/de/schildbach/pte/live/secrets.properties.template index b59c5809..84beaf9f 100644 --- a/enabler/test/de/schildbach/pte/live/secrets.properties.template +++ b/enabler/test/de/schildbach/pte/live/secrets.properties.template @@ -18,5 +18,3 @@ zvv.api_authorization = dsb.api_authorization = se.api_authorization = lu.api_authorization = -hsl.usertoken = -hsl.passphrase =