diff --git a/src/de/schildbach/pte/AtcProvider.java b/src/de/schildbach/pte/AtcProvider.java index 49a63508..13d06e6d 100644 --- a/src/de/schildbach/pte/AtcProvider.java +++ b/src/de/schildbach/pte/AtcProvider.java @@ -50,12 +50,6 @@ public class AtcProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -65,4 +59,10 @@ public class AtcProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/AvvProvider.java b/src/de/schildbach/pte/AvvProvider.java index c60f3329..96dd0868 100644 --- a/src/de/schildbach/pte/AvvProvider.java +++ b/src/de/schildbach/pte/AvvProvider.java @@ -51,12 +51,6 @@ public class AvvProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class AvvProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/BahnProvider.java b/src/de/schildbach/pte/BahnProvider.java index 9049a64e..bc7119a5 100644 --- a/src/de/schildbach/pte/BahnProvider.java +++ b/src/de/schildbach/pte/BahnProvider.java @@ -68,16 +68,6 @@ public final class BahnProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - private final static Pattern P_NEARBY_STATIONS_BY_STATION = Pattern .compile("([^<]*)"); @@ -130,6 +120,16 @@ public final class BahnProvider extends AbstractHafasProvider } } + private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + private String connectionsQueryUri(final Location from, final Location via, final Location to, final Date date, final boolean dep, final String products) { diff --git a/src/de/schildbach/pte/BsagProvider.java b/src/de/schildbach/pte/BsagProvider.java index 0e7a27b8..c564a378 100644 --- a/src/de/schildbach/pte/BsagProvider.java +++ b/src/de/schildbach/pte/BsagProvider.java @@ -50,12 +50,6 @@ public class BsagProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -65,4 +59,10 @@ public class BsagProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/BsvagProvider.java b/src/de/schildbach/pte/BsvagProvider.java index 400c5f7e..890070a5 100644 --- a/src/de/schildbach/pte/BsvagProvider.java +++ b/src/de/schildbach/pte/BsvagProvider.java @@ -51,12 +51,6 @@ public class BsvagProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class BsvagProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/BvbProvider.java b/src/de/schildbach/pte/BvbProvider.java index a6c08fd2..435543c0 100644 --- a/src/de/schildbach/pte/BvbProvider.java +++ b/src/de/schildbach/pte/BvbProvider.java @@ -51,12 +51,6 @@ public class BvbProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class BvbProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/BvgProvider.java b/src/de/schildbach/pte/BvgProvider.java index 8ea0951f..540e7cac 100644 --- a/src/de/schildbach/pte/BvgProvider.java +++ b/src/de/schildbach/pte/BvgProvider.java @@ -83,9 +83,21 @@ public final class BvgProvider extends AbstractHafasProvider return true; } - public List autocompleteStations(final CharSequence constraint) throws IOException + @Override + protected String[] splitNameAndPlace(final String name) { - return xmlMLcReq(constraint); + if (name.endsWith(" (Berlin)")) + return new String[] { "Berlin", name.substring(0, name.length() - 9) }; + else if (name.startsWith("Potsdam, ")) + return new String[] { "Potsdam", name.substring(9) }; + else if (name.startsWith("Cottbus, ")) + return new String[] { "Cottbus", name.substring(9) }; + else if (name.startsWith("Brandenburg, ")) + return new String[] { "Brandenburg", name.substring(13) }; + else if (name.startsWith("Frankfurt (Oder), ")) + return new String[] { "Frankfurt (Oder)", name.substring(18) }; + + return super.splitNameAndPlace(name); } private final static Pattern P_NEARBY_OWN = Pattern @@ -165,21 +177,245 @@ public final class BvgProvider extends AbstractHafasProvider } } - @Override - protected String[] splitNameAndPlace(final String name) - { - if (name.endsWith(" (Berlin)")) - return new String[] { "Berlin", name.substring(0, name.length() - 9) }; - else if (name.startsWith("Potsdam, ")) - return new String[] { "Potsdam", name.substring(9) }; - else if (name.startsWith("Cottbus, ")) - return new String[] { "Cottbus", name.substring(9) }; - else if (name.startsWith("Brandenburg, ")) - return new String[] { "Brandenburg", name.substring(13) }; - else if (name.startsWith("Frankfurt (Oder), ")) - return new String[] { "Frankfurt (Oder)", name.substring(18) }; + private static final String DEPARTURE_URL_LIVE = BASE_URL + "/IstAbfahrtzeiten/index/mobil?"; - return super.splitNameAndPlace(name); + private String departuresQueryLiveUri(final int stationId) + { + final StringBuilder uri = new StringBuilder(); + uri.append(DEPARTURE_URL_LIVE); + uri.append("input=").append(stationId); + if (additionalQueryParameter != null) + uri.append('&').append(additionalQueryParameter); + return uri.toString(); + } + + private static final String DEPARTURE_URL_PLAN = API_BASE + "stboard.bin/dox/dox?boardType=dep&disableEquivs=yes&start=yes&"; + + private String departuresQueryPlanUri(final int stationId, final int maxDepartures) + { + final StringBuilder uri = new StringBuilder(); + uri.append(DEPARTURE_URL_PLAN); + uri.append("input=").append(stationId); + uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 50); + if (additionalQueryParameter != null) + uri.append('&').append(additionalQueryParameter); + return uri.toString(); + } + + private static final Pattern P_DEPARTURES_PLAN_HEAD = Pattern.compile(".*?" // + + "(.*?).*?Datum:\\s*([^<\n]+)[<\n].*?" // + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_PLAN_COARSE = Pattern.compile("" // + + "\\s*((?:|).+?)\\s*" // + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_PLAN_FINE = Pattern.compile("" // + + "(\\d{1,2}:\\d{2}).*?" // time + + "\\s*(.*?)[\\s\\*]*.*?" // line + + "(?:\\((Gl\\. " + ParserUtils.P_PLATFORM + ")\\).*?)?" // position + + "]*>" // destinationId + + "\\s*(.*?)\\s*.*?" // destination + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_PLAN_ERRORS = Pattern.compile("(derzeit leider nicht bearbeitet werden)|(Wartungsarbeiten)|" + + "(http-equiv=\"refresh\")", Pattern.CASE_INSENSITIVE); + + private static final Pattern P_DEPARTURES_LIVE_HEAD = Pattern.compile(".*?" // + + "(.*?).*?Datum:\\s*([^<\n]+)[<\n].*?" // + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_LIVE_COARSE = Pattern.compile("" // + + "\\s*((?:|).+?)\\s*" // + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_LIVE_FINE = Pattern.compile("" // + + "\\s*(\\d{1,2}:\\d{2})\\s*" // time + + "(\\*)?\\s*\\s*" // planned + + "\\s*(.*?)\\s*\\s*" // line + + ".*?\\s*(.*?)\\s*.*?" // destination + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_LIVE_MSGS_COARSE = Pattern.compile("" // + + "\\s*(.+?)\\s*" // + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_LIVE_MSGS_FINE = Pattern.compile("" // + + "\\s*(.*?)\\s*\\s*" // line + + "\\s*(\\d{2}\\.\\d{2}\\.\\d{4})\\s*\\s*" // date + + "([^<]*)" // message + , Pattern.DOTALL); + private static final Pattern P_DEPARTURES_LIVE_ERRORS = Pattern.compile("(Haltestelle:)|(Wartungsgründen)|(http-equiv=\"refresh\")", + Pattern.CASE_INSENSITIVE); + + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final QueryDeparturesResult result = new QueryDeparturesResult(); + + if (stationId < 1000000) // live + { + // scrape page + final String uri = departuresQueryLiveUri(stationId); + final CharSequence page = ParserUtils.scrape(uri); + + final Matcher mError = P_DEPARTURES_LIVE_ERRORS.matcher(page); + if (mError.find()) + { + if (mError.group(1) != null) + return new QueryDeparturesResult(Status.INVALID_STATION); + if (mError.group(2) != null) + return new QueryDeparturesResult(Status.SERVICE_DOWN); + if (mError.group(3) != null) + throw new IOException("connected to private wlan"); + } + + // parse page + final Matcher mHead = P_DEPARTURES_LIVE_HEAD.matcher(page); + if (mHead.matches()) + { + final String[] placeAndName = splitNameAndPlace(ParserUtils.resolveEntities(mHead.group(1))); + final Calendar currentTime = new GregorianCalendar(timeZone()); + currentTime.clear(); + parseDateTime(currentTime, mHead.group(2)); + + final Map messages = new HashMap(); + + final Matcher mMsgsCoarse = P_DEPARTURES_LIVE_MSGS_COARSE.matcher(page); + while (mMsgsCoarse.find()) + { + final Matcher mMsgsFine = P_DEPARTURES_LIVE_MSGS_FINE.matcher(mMsgsCoarse.group(1)); + if (mMsgsFine.matches()) + { + final String line = normalizeLine(ParserUtils.resolveEntities(mMsgsFine.group(1))); + final String message = ParserUtils.resolveEntities(mMsgsFine.group(3)).replace('\n', ' '); + messages.put(line, message); + } + else + { + throw new IllegalArgumentException("cannot parse '" + mMsgsCoarse.group(1) + "' on " + uri); + } + } + + final List departures = new ArrayList(8); + + final Matcher mDepCoarse = P_DEPARTURES_LIVE_COARSE.matcher(page); + while (mDepCoarse.find()) + { + final Matcher mDepFine = P_DEPARTURES_LIVE_FINE.matcher(mDepCoarse.group(1)); + if (mDepFine.matches()) + { + final Calendar parsedTime = new GregorianCalendar(timeZone()); + parsedTime.setTimeInMillis(currentTime.getTimeInMillis()); + ParserUtils.parseEuropeanTime(parsedTime, mDepFine.group(1)); + + if (parsedTime.getTimeInMillis() - currentTime.getTimeInMillis() < -PARSER_DAY_ROLLOVER_THRESHOLD_MS) + parsedTime.add(Calendar.DAY_OF_MONTH, 1); + + boolean isPlanned = mDepFine.group(2) != null; + + Date plannedTime = null; + Date predictedTime = null; + if (!isPlanned) + predictedTime = parsedTime.getTime(); + else + plannedTime = parsedTime.getTime(); + + final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(3))); + + final String position = null; + + final int destinationId = 0; + + final String destination = ParserUtils.resolveEntities(mDepFine.group(4)); + + final Departure dep = new Departure(plannedTime, predictedTime, line, line != null ? lineColors(line) : null, null, position, + destinationId, destination, messages.get(line)); + if (!departures.contains(dep)) + departures.add(dep); + } + else + { + throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(1) + "' on " + uri); + } + } + + result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, stationId, placeAndName[0], placeAndName[1]), + departures, null)); + return result; + } + else + { + throw new IllegalArgumentException("cannot parse '" + page + "' on " + uri); + } + } + else + { + // scrape page + final String uri = departuresQueryPlanUri(stationId, maxDepartures); + final CharSequence page = ParserUtils.scrape(uri); + + final Matcher mError = P_DEPARTURES_PLAN_ERRORS.matcher(page); + if (mError.find()) + { + if (mError.group(1) != null) + return new QueryDeparturesResult(Status.INVALID_STATION); + if (mError.group(2) != null) + return new QueryDeparturesResult(Status.SERVICE_DOWN); + if (mError.group(3) != null) + throw new IOException("connected to private wlan"); + } + + // parse page + final Matcher mHead = P_DEPARTURES_PLAN_HEAD.matcher(page); + if (mHead.matches()) + { + final String[] placeAndName = splitNameAndPlace(ParserUtils.resolveEntities(mHead.group(1))); + final Calendar currentTime = new GregorianCalendar(timeZone()); + currentTime.clear(); + ParserUtils.parseGermanDate(currentTime, mHead.group(2)); + final List departures = new ArrayList(8); + + final Matcher mDepCoarse = P_DEPARTURES_PLAN_COARSE.matcher(page); + while (mDepCoarse.find()) + { + final Matcher mDepFine = P_DEPARTURES_PLAN_FINE.matcher(mDepCoarse.group(1)); + if (mDepFine.matches()) + { + final Calendar parsedTime = new GregorianCalendar(timeZone()); + parsedTime.setTimeInMillis(currentTime.getTimeInMillis()); + ParserUtils.parseEuropeanTime(parsedTime, mDepFine.group(1)); + + if (parsedTime.getTimeInMillis() - currentTime.getTimeInMillis() < -PARSER_DAY_ROLLOVER_THRESHOLD_MS) + parsedTime.add(Calendar.DAY_OF_MONTH, 1); + + final Date plannedTime = parsedTime.getTime(); + + final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(2))); + + final String position = ParserUtils.resolveEntities(mDepFine.group(3)); + + final int destinationId = Integer.parseInt(mDepFine.group(4)); + + final String destination = ParserUtils.resolveEntities(mDepFine.group(5)); + + final Departure dep = new Departure(plannedTime, null, line, line != null ? lineColors(line) : null, null, position, + destinationId, destination, null); + if (!departures.contains(dep)) + departures.add(dep); + } + else + { + throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(1) + "' on " + uri); + } + } + + result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, stationId, placeAndName[0], placeAndName[1]), + departures, null)); + return result; + } + else + { + throw new IllegalArgumentException("cannot parse '" + page + "' on " + uri); + } + } + } + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlMLcReq(constraint); } private String connectionsQueryUri(final Location from, final Location via, final Location to, final Date date, final boolean dep, @@ -636,242 +872,6 @@ public final class BvgProvider extends AbstractHafasProvider throw new UnsupportedOperationException(); } - private static final String DEPARTURE_URL_LIVE = BASE_URL + "/IstAbfahrtzeiten/index/mobil?"; - - private String departuresQueryLiveUri(final int stationId) - { - final StringBuilder uri = new StringBuilder(); - uri.append(DEPARTURE_URL_LIVE); - uri.append("input=").append(stationId); - if (additionalQueryParameter != null) - uri.append('&').append(additionalQueryParameter); - return uri.toString(); - } - - private static final String DEPARTURE_URL_PLAN = API_BASE + "stboard.bin/dox/dox?boardType=dep&disableEquivs=yes&start=yes&"; - - private String departuresQueryPlanUri(final int stationId, final int maxDepartures) - { - final StringBuilder uri = new StringBuilder(); - uri.append(DEPARTURE_URL_PLAN); - uri.append("input=").append(stationId); - uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 50); - if (additionalQueryParameter != null) - uri.append('&').append(additionalQueryParameter); - return uri.toString(); - } - - private static final Pattern P_DEPARTURES_PLAN_HEAD = Pattern.compile(".*?" // - + "(.*?).*?Datum:\\s*([^<\n]+)[<\n].*?" // - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_PLAN_COARSE = Pattern.compile("" // - + "\\s*((?:|).+?)\\s*" // - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_PLAN_FINE = Pattern.compile("" // - + "(\\d{1,2}:\\d{2}).*?" // time - + "\\s*(.*?)[\\s\\*]*.*?" // line - + "(?:\\((Gl\\. " + ParserUtils.P_PLATFORM + ")\\).*?)?" // position - + "]*>" // destinationId - + "\\s*(.*?)\\s*.*?" // destination - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_PLAN_ERRORS = Pattern.compile("(derzeit leider nicht bearbeitet werden)|(Wartungsarbeiten)|" - + "(http-equiv=\"refresh\")", Pattern.CASE_INSENSITIVE); - - private static final Pattern P_DEPARTURES_LIVE_HEAD = Pattern.compile(".*?" // - + "(.*?).*?Datum:\\s*([^<\n]+)[<\n].*?" // - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_LIVE_COARSE = Pattern.compile("" // - + "\\s*((?:|).+?)\\s*" // - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_LIVE_FINE = Pattern.compile("" // - + "\\s*(\\d{1,2}:\\d{2})\\s*" // time - + "(\\*)?\\s*\\s*" // planned - + "\\s*(.*?)\\s*\\s*" // line - + ".*?\\s*(.*?)\\s*.*?" // destination - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_LIVE_MSGS_COARSE = Pattern.compile("" // - + "\\s*(.+?)\\s*" // - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_LIVE_MSGS_FINE = Pattern.compile("" // - + "\\s*(.*?)\\s*\\s*" // line - + "\\s*(\\d{2}\\.\\d{2}\\.\\d{4})\\s*\\s*" // date - + "([^<]*)" // message - , Pattern.DOTALL); - private static final Pattern P_DEPARTURES_LIVE_ERRORS = Pattern.compile("(Haltestelle:)|(Wartungsgründen)|(http-equiv=\"refresh\")", - Pattern.CASE_INSENSITIVE); - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final QueryDeparturesResult result = new QueryDeparturesResult(); - - if (stationId < 1000000) // live - { - // scrape page - final String uri = departuresQueryLiveUri(stationId); - final CharSequence page = ParserUtils.scrape(uri); - - final Matcher mError = P_DEPARTURES_LIVE_ERRORS.matcher(page); - if (mError.find()) - { - if (mError.group(1) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); - if (mError.group(2) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); - if (mError.group(3) != null) - throw new IOException("connected to private wlan"); - } - - // parse page - final Matcher mHead = P_DEPARTURES_LIVE_HEAD.matcher(page); - if (mHead.matches()) - { - final String[] placeAndName = splitNameAndPlace(ParserUtils.resolveEntities(mHead.group(1))); - final Calendar currentTime = new GregorianCalendar(timeZone()); - currentTime.clear(); - parseDateTime(currentTime, mHead.group(2)); - - final Map messages = new HashMap(); - - final Matcher mMsgsCoarse = P_DEPARTURES_LIVE_MSGS_COARSE.matcher(page); - while (mMsgsCoarse.find()) - { - final Matcher mMsgsFine = P_DEPARTURES_LIVE_MSGS_FINE.matcher(mMsgsCoarse.group(1)); - if (mMsgsFine.matches()) - { - final String line = normalizeLine(ParserUtils.resolveEntities(mMsgsFine.group(1))); - final String message = ParserUtils.resolveEntities(mMsgsFine.group(3)).replace('\n', ' '); - messages.put(line, message); - } - else - { - throw new IllegalArgumentException("cannot parse '" + mMsgsCoarse.group(1) + "' on " + uri); - } - } - - final List departures = new ArrayList(8); - - final Matcher mDepCoarse = P_DEPARTURES_LIVE_COARSE.matcher(page); - while (mDepCoarse.find()) - { - final Matcher mDepFine = P_DEPARTURES_LIVE_FINE.matcher(mDepCoarse.group(1)); - if (mDepFine.matches()) - { - final Calendar parsedTime = new GregorianCalendar(timeZone()); - parsedTime.setTimeInMillis(currentTime.getTimeInMillis()); - ParserUtils.parseEuropeanTime(parsedTime, mDepFine.group(1)); - - if (parsedTime.getTimeInMillis() - currentTime.getTimeInMillis() < -PARSER_DAY_ROLLOVER_THRESHOLD_MS) - parsedTime.add(Calendar.DAY_OF_MONTH, 1); - - boolean isPlanned = mDepFine.group(2) != null; - - Date plannedTime = null; - Date predictedTime = null; - if (!isPlanned) - predictedTime = parsedTime.getTime(); - else - plannedTime = parsedTime.getTime(); - - final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(3))); - - final String position = null; - - final int destinationId = 0; - - final String destination = ParserUtils.resolveEntities(mDepFine.group(4)); - - final Departure dep = new Departure(plannedTime, predictedTime, line, line != null ? lineColors(line) : null, null, position, - destinationId, destination, messages.get(line)); - if (!departures.contains(dep)) - departures.add(dep); - } - else - { - throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(1) + "' on " + uri); - } - } - - result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, stationId, placeAndName[0], placeAndName[1]), - departures, null)); - return result; - } - else - { - throw new IllegalArgumentException("cannot parse '" + page + "' on " + uri); - } - } - else - { - // scrape page - final String uri = departuresQueryPlanUri(stationId, maxDepartures); - final CharSequence page = ParserUtils.scrape(uri); - - final Matcher mError = P_DEPARTURES_PLAN_ERRORS.matcher(page); - if (mError.find()) - { - if (mError.group(1) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); - if (mError.group(2) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); - if (mError.group(3) != null) - throw new IOException("connected to private wlan"); - } - - // parse page - final Matcher mHead = P_DEPARTURES_PLAN_HEAD.matcher(page); - if (mHead.matches()) - { - final String[] placeAndName = splitNameAndPlace(ParserUtils.resolveEntities(mHead.group(1))); - final Calendar currentTime = new GregorianCalendar(timeZone()); - currentTime.clear(); - ParserUtils.parseGermanDate(currentTime, mHead.group(2)); - final List departures = new ArrayList(8); - - final Matcher mDepCoarse = P_DEPARTURES_PLAN_COARSE.matcher(page); - while (mDepCoarse.find()) - { - final Matcher mDepFine = P_DEPARTURES_PLAN_FINE.matcher(mDepCoarse.group(1)); - if (mDepFine.matches()) - { - final Calendar parsedTime = new GregorianCalendar(timeZone()); - parsedTime.setTimeInMillis(currentTime.getTimeInMillis()); - ParserUtils.parseEuropeanTime(parsedTime, mDepFine.group(1)); - - if (parsedTime.getTimeInMillis() - currentTime.getTimeInMillis() < -PARSER_DAY_ROLLOVER_THRESHOLD_MS) - parsedTime.add(Calendar.DAY_OF_MONTH, 1); - - final Date plannedTime = parsedTime.getTime(); - - final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(2))); - - final String position = ParserUtils.resolveEntities(mDepFine.group(3)); - - final int destinationId = Integer.parseInt(mDepFine.group(4)); - - final String destination = ParserUtils.resolveEntities(mDepFine.group(5)); - - final Departure dep = new Departure(plannedTime, null, line, line != null ? lineColors(line) : null, null, position, - destinationId, destination, null); - if (!departures.contains(dep)) - departures.add(dep); - } - else - { - throw new IllegalArgumentException("cannot parse '" + mDepCoarse.group(1) + "' on " + uri); - } - } - - result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, stationId, placeAndName[0], placeAndName[1]), - departures, null)); - return result; - } - else - { - throw new IllegalArgumentException("cannot parse '" + page + "' on " + uri); - } - } - } - private static final Pattern P_DATE_TIME = Pattern.compile("([^,]*), (.*?)"); private static final void parseDateTime(final Calendar calendar, final CharSequence str) diff --git a/src/de/schildbach/pte/DingProvider.java b/src/de/schildbach/pte/DingProvider.java index d72ea1b8..bc20bab7 100644 --- a/src/de/schildbach/pte/DingProvider.java +++ b/src/de/schildbach/pte/DingProvider.java @@ -51,12 +51,6 @@ public class DingProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class DingProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/DsbProvider.java b/src/de/schildbach/pte/DsbProvider.java index bcb3b7dc..0493119d 100644 --- a/src/de/schildbach/pte/DsbProvider.java +++ b/src/de/schildbach/pte/DsbProvider.java @@ -55,18 +55,7 @@ public class DsbProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) - throws IOException + public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -99,6 +88,31 @@ public class DsbProvider extends AbstractHafasProvider } } + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final StringBuilder uri = new StringBuilder(); + uri.append(API_BASE).append("stboard.exe/mn"); + uri.append("?productsFilter=").append(allProductsString()); + uri.append("&boardType=dep"); + uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations + uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations + uri.append("&start=yes"); + uri.append("&L=vs_java3"); + uri.append("&input=").append(stationId); + + return xmlQueryDepartures(uri.toString(), stationId); + } + + private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + private static final Pattern P_NORMALIZE_LINE_AND_TYPE = Pattern.compile("([^#]*)#(.*)"); @Override @@ -163,19 +177,4 @@ public class DsbProvider extends AbstractHafasProvider return 0; } - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final StringBuilder uri = new StringBuilder(); - uri.append(API_BASE).append("stboard.exe/mn"); - uri.append("?productsFilter=").append(allProductsString()); - uri.append("&boardType=dep"); - uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations - uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations - uri.append("&start=yes"); - uri.append("&L=vs_java3"); - uri.append("&input=").append(stationId); - - return xmlQueryDepartures(uri.toString(), stationId); - } } diff --git a/src/de/schildbach/pte/DubProvider.java b/src/de/schildbach/pte/DubProvider.java index 9027f210..d9cbebe4 100644 --- a/src/de/schildbach/pte/DubProvider.java +++ b/src/de/schildbach/pte/DubProvider.java @@ -58,12 +58,6 @@ public class DubProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -73,4 +67,10 @@ public class DubProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/GvhProvider.java b/src/de/schildbach/pte/GvhProvider.java index b955e868..541f019a 100644 --- a/src/de/schildbach/pte/GvhProvider.java +++ b/src/de/schildbach/pte/GvhProvider.java @@ -54,12 +54,6 @@ public class GvhProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -69,6 +63,12 @@ public class GvhProvider extends AbstractEfaProvider return String.format(NEARBY_STATION_URI, stationId); } + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } + private static final Map LINES = new HashMap(); static diff --git a/src/de/schildbach/pte/InvgProvider.java b/src/de/schildbach/pte/InvgProvider.java index 38dd9e3c..098dbc65 100644 --- a/src/de/schildbach/pte/InvgProvider.java +++ b/src/de/schildbach/pte/InvgProvider.java @@ -66,12 +66,6 @@ public class InvgProvider extends AbstractHafasProvider return true; return false; - - } - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlMLcReq(constraint); } private static final String[] PLACES = { "Ingolstadt", "München" }; @@ -108,45 +102,6 @@ public class InvgProvider extends AbstractHafasProvider } } - protected static final Pattern P_NORMALIZE_LINE_BUS = Pattern.compile("Bus\\s*(\\d+)"); - protected static final Pattern P_NORMALIZE_LINE_NACHTBUS = Pattern.compile("Bus\\s*N\\s*(\\d+)"); - protected static final Pattern P_NORMALIZE_LINE_BUS_S = Pattern.compile("Bus\\s*S\\s*(\\d+)"); - protected static final Pattern P_NORMALIZE_LINE_BUS_X = Pattern.compile("Bus\\s*X\\s*(\\d+)"); - - @Override - protected String normalizeLine(final String type, final String line) - { - if ("1".equals(type)) - { - final Matcher mBus = P_NORMALIZE_LINE_BUS.matcher(line); - if (mBus.matches()) - return "B" + mBus.group(1); - - final Matcher mNachtbus = P_NORMALIZE_LINE_NACHTBUS.matcher(line); - if (mNachtbus.matches()) - return "BN" + mNachtbus.group(1); - - final Matcher mBusS = P_NORMALIZE_LINE_BUS_S.matcher(line); - if (mBusS.matches()) - return "BS" + mBusS.group(1); - - final Matcher mBusX = P_NORMALIZE_LINE_BUS_X.matcher(line); - if (mBusX.matches()) - return "BX" + mBusX.group(1); - } - - return super.normalizeLine(type, line); - } - - @Override - protected char normalizeType(final String type) - { - if ("1".equals(type)) - return 'B'; - - return 0; - } - private String departuresQueryUri(final int stationId, final int maxDepartures) { final StringBuilder uri = new StringBuilder(); @@ -307,6 +262,50 @@ public class InvgProvider extends AbstractHafasProvider } } + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlMLcReq(constraint); + } + + protected static final Pattern P_NORMALIZE_LINE_BUS = Pattern.compile("Bus\\s*(\\d+)"); + protected static final Pattern P_NORMALIZE_LINE_NACHTBUS = Pattern.compile("Bus\\s*N\\s*(\\d+)"); + protected static final Pattern P_NORMALIZE_LINE_BUS_S = Pattern.compile("Bus\\s*S\\s*(\\d+)"); + protected static final Pattern P_NORMALIZE_LINE_BUS_X = Pattern.compile("Bus\\s*X\\s*(\\d+)"); + + @Override + protected String normalizeLine(final String type, final String line) + { + if ("1".equals(type)) + { + final Matcher mBus = P_NORMALIZE_LINE_BUS.matcher(line); + if (mBus.matches()) + return "B" + mBus.group(1); + + final Matcher mNachtbus = P_NORMALIZE_LINE_NACHTBUS.matcher(line); + if (mNachtbus.matches()) + return "BN" + mNachtbus.group(1); + + final Matcher mBusS = P_NORMALIZE_LINE_BUS_S.matcher(line); + if (mBusS.matches()) + return "BS" + mBusS.group(1); + + final Matcher mBusX = P_NORMALIZE_LINE_BUS_X.matcher(line); + if (mBusX.matches()) + return "BX" + mBusX.group(1); + } + + return super.normalizeLine(type, line); + } + + @Override + protected char normalizeType(final String type) + { + if ("1".equals(type)) + return 'B'; + + return 0; + } + private static final Map LINES = new HashMap(); static diff --git a/src/de/schildbach/pte/IvbProvider.java b/src/de/schildbach/pte/IvbProvider.java index d15681b1..c2de4045 100644 --- a/src/de/schildbach/pte/IvbProvider.java +++ b/src/de/schildbach/pte/IvbProvider.java @@ -51,12 +51,6 @@ public class IvbProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class IvbProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/KvvProvider.java b/src/de/schildbach/pte/KvvProvider.java index f4ee4aa0..4d90835a 100644 --- a/src/de/schildbach/pte/KvvProvider.java +++ b/src/de/schildbach/pte/KvvProvider.java @@ -51,12 +51,6 @@ public class KvvProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class KvvProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/LinzProvider.java b/src/de/schildbach/pte/LinzProvider.java index 7701c182..1b8f5aa0 100644 --- a/src/de/schildbach/pte/LinzProvider.java +++ b/src/de/schildbach/pte/LinzProvider.java @@ -51,12 +51,6 @@ public class LinzProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&mode=direct&coordOutputFormat=WGS84&mergeDep=1&useAllStops=1&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&excludedMeans=checkbox"; @@ -66,4 +60,10 @@ public class LinzProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/LuProvider.java b/src/de/schildbach/pte/LuProvider.java index fc6e6b51..85066b81 100644 --- a/src/de/schildbach/pte/LuProvider.java +++ b/src/de/schildbach/pte/LuProvider.java @@ -54,11 +54,6 @@ public class LuProvider extends AbstractHafasProvider return false; } - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlMLcReq(constraint); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { if (location.type == LocationType.STATION && location.hasId()) @@ -78,6 +73,26 @@ public class LuProvider extends AbstractHafasProvider } } + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final StringBuilder uri = new StringBuilder(); + uri.append(API_BASE).append("stboard.exe/dn"); + uri.append("?productsFilter=").append(allProductsString()); + uri.append("&boardType=dep"); + uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations + uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations + uri.append("&start=yes"); + uri.append("&L=vs_java3"); + uri.append("&input=").append(stationId); + + return xmlQueryDepartures(uri.toString(), stationId); + } + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlMLcReq(constraint); + } + private static final Pattern P_NORMALIZE_LINE_AND_TYPE = Pattern.compile("([^#]*)#(.*)"); @Override @@ -113,19 +128,4 @@ public class LuProvider extends AbstractHafasProvider return 0; } - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final StringBuilder uri = new StringBuilder(); - uri.append(API_BASE).append("stboard.exe/dn"); - uri.append("?productsFilter=").append(allProductsString()); - uri.append("&boardType=dep"); - uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations - uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations - uri.append("&start=yes"); - uri.append("&L=vs_java3"); - uri.append("&input=").append(stationId); - - return xmlQueryDepartures(uri.toString(), stationId); - } } diff --git a/src/de/schildbach/pte/MariborProvider.java b/src/de/schildbach/pte/MariborProvider.java index e9a78a93..320e8c08 100644 --- a/src/de/schildbach/pte/MariborProvider.java +++ b/src/de/schildbach/pte/MariborProvider.java @@ -51,12 +51,6 @@ public class MariborProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class MariborProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/MetProvider.java b/src/de/schildbach/pte/MetProvider.java index 7319d747..e108ebd1 100644 --- a/src/de/schildbach/pte/MetProvider.java +++ b/src/de/schildbach/pte/MetProvider.java @@ -60,12 +60,6 @@ public class MetProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -76,6 +70,12 @@ public class MetProvider extends AbstractEfaProvider return String.format(NEARBY_STATION_URI, stationId); } + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } + private static final Map LINES = new HashMap(); static diff --git a/src/de/schildbach/pte/MvgProvider.java b/src/de/schildbach/pte/MvgProvider.java index f54b400b..69dc039c 100644 --- a/src/de/schildbach/pte/MvgProvider.java +++ b/src/de/schildbach/pte/MvgProvider.java @@ -50,12 +50,6 @@ public class MvgProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct&deleteAssignedStop=0"; @@ -65,4 +59,10 @@ public class MvgProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/MvvProvider.java b/src/de/schildbach/pte/MvvProvider.java index 51ea763a..fcda33a8 100644 --- a/src/de/schildbach/pte/MvvProvider.java +++ b/src/de/schildbach/pte/MvvProvider.java @@ -54,12 +54,6 @@ public class MvvProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -70,6 +64,12 @@ public class MvvProvider extends AbstractEfaProvider return String.format(NEARBY_STATION_URI, stationId); } + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } + private static final Map LINES = new HashMap(); static diff --git a/src/de/schildbach/pte/NaldoProvider.java b/src/de/schildbach/pte/NaldoProvider.java index 8c56eee9..8bfcf1cd 100644 --- a/src/de/schildbach/pte/NaldoProvider.java +++ b/src/de/schildbach/pte/NaldoProvider.java @@ -51,12 +51,6 @@ public class NaldoProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class NaldoProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/NasaProvider.java b/src/de/schildbach/pte/NasaProvider.java index a7896fc1..ec9d6b87 100644 --- a/src/de/schildbach/pte/NasaProvider.java +++ b/src/de/schildbach/pte/NasaProvider.java @@ -65,11 +65,6 @@ public class NasaProvider extends AbstractHafasProvider return false; } - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlMLcReq(constraint); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -242,6 +237,11 @@ public class NasaProvider extends AbstractHafasProvider } } + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlMLcReq(constraint); + } + @Override protected char normalizeType(String type) { diff --git a/src/de/schildbach/pte/NetworkProvider.java b/src/de/schildbach/pte/NetworkProvider.java index a3e2ef67..1203c361 100644 --- a/src/de/schildbach/pte/NetworkProvider.java +++ b/src/de/schildbach/pte/NetworkProvider.java @@ -48,16 +48,6 @@ public interface NetworkProvider boolean hasCapabilities(Capability... capabilities); - /** - * Meant for auto-completion of station names, like in an {@link android.widget.AutoCompleteTextView} - * - * @param constraint - * input by user so far - * @return auto-complete suggestions - * @throws IOException - */ - List autocompleteStations(CharSequence constraint) throws IOException; - /** * Determine stations near to given location. At least one of stationId or lat/lon pair must be present. * @@ -72,6 +62,30 @@ public interface NetworkProvider */ NearbyStationsResult queryNearbyStations(Location location, int maxDistance, int maxStations) throws IOException; + /** + * Get departures at a given station, probably live + * + * @param stationId + * id of the station + * @param maxDepartures + * maximum number of departures to get or {@code 0} + * @param equivs + * also query equivalent stations? + * @return result object containing the departures + * @throws IOException + */ + QueryDeparturesResult queryDepartures(int stationId, int maxDepartures, boolean equivs) throws IOException; + + /** + * Meant for auto-completion of station names, like in an {@link android.widget.AutoCompleteTextView} + * + * @param constraint + * input by user so far + * @return auto-complete suggestions + * @throws IOException + */ + List autocompleteStations(CharSequence constraint) throws IOException; + /** * Query connections, asking for any ambiguousnesses * @@ -117,20 +131,6 @@ public interface NetworkProvider */ GetConnectionDetailsResult getConnectionDetails(String connectionUri) throws IOException; - /** - * Get departures at a given station, probably live - * - * @param stationId - * id of the station - * @param maxDepartures - * maximum number of departures to get or {@code 0} - * @param equivs - * also query equivalent stations? - * @return result object containing the departures - * @throws IOException - */ - QueryDeparturesResult queryDepartures(int stationId, int maxDepartures, boolean equivs) throws IOException; - /** * Get colors of line * diff --git a/src/de/schildbach/pte/NriProvider.java b/src/de/schildbach/pte/NriProvider.java index ea6dde24..58039aed 100644 --- a/src/de/schildbach/pte/NriProvider.java +++ b/src/de/schildbach/pte/NriProvider.java @@ -65,17 +65,6 @@ public class NriProvider extends AbstractHafasProvider return super.splitNameAndPlace(name); } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/ony?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsS0B=5&REQ0JourneyStopsB=12&getstop=1&noSession=yes&REQ0JourneyStopsS0G=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -109,6 +98,32 @@ public class NriProvider extends AbstractHafasProvider } } + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final StringBuilder uri = new StringBuilder(); + uri.append(API_BASE).append("stboard.exe/on"); + uri.append("?productsFilter=").append(allProductsString()); + uri.append("&boardType=dep"); + uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations + uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations + uri.append("&start=yes"); + uri.append("&L=vs_java3"); + uri.append("&input=").append(stationId); + + return xmlQueryDepartures(uri.toString(), stationId); + } + + private static final String AUTOCOMPLETE_URI = API_BASE + + "ajax-getstop.exe/ony?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsS0B=5&REQ0JourneyStopsB=12&getstop=1&noSession=yes&REQ0JourneyStopsS0G=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + @Override protected char normalizeType(final String type) { @@ -144,19 +159,4 @@ public class NriProvider extends AbstractHafasProvider return 0; } - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final StringBuilder uri = new StringBuilder(); - uri.append(API_BASE).append("stboard.exe/on"); - uri.append("?productsFilter=").append(allProductsString()); - uri.append("&boardType=dep"); - uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations - uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations - uri.append("&start=yes"); - uri.append("&L=vs_java3"); - uri.append("&input=").append(stationId); - - return xmlQueryDepartures(uri.toString(), stationId); - } } diff --git a/src/de/schildbach/pte/NsProvider.java b/src/de/schildbach/pte/NsProvider.java index 9ff312e4..a5dde498 100644 --- a/src/de/schildbach/pte/NsProvider.java +++ b/src/de/schildbach/pte/NsProvider.java @@ -65,11 +65,6 @@ public class NsProvider extends AbstractHafasProvider return false; } - public List autocompleteStations(final CharSequence constraint) throws IOException - { - throw new UnsupportedOperationException(); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { if (location.type == LocationType.STATION && location.hasId()) @@ -194,6 +189,11 @@ public class NsProvider extends AbstractHafasProvider } } + public List autocompleteStations(final CharSequence constraint) throws IOException + { + throw new UnsupportedOperationException(); + } + @Override protected char normalizeType(final String type) { diff --git a/src/de/schildbach/pte/NvbwProvider.java b/src/de/schildbach/pte/NvbwProvider.java index bb8c3416..f0d4b980 100644 --- a/src/de/schildbach/pte/NvbwProvider.java +++ b/src/de/schildbach/pte/NvbwProvider.java @@ -50,12 +50,6 @@ public class NvbwProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -65,4 +59,10 @@ public class NvbwProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/OebbProvider.java b/src/de/schildbach/pte/OebbProvider.java index ae7ce9c9..fb855451 100644 --- a/src/de/schildbach/pte/OebbProvider.java +++ b/src/de/schildbach/pte/OebbProvider.java @@ -76,16 +76,6 @@ public class OebbProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsB=12&S=%s?&js=true&"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), URL_ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -116,6 +106,100 @@ public class OebbProvider extends AbstractHafasProvider } } + private String departuresQueryUri(final int stationId, final int maxDepartures) + { + final StringBuilder uri = new StringBuilder(); + + uri.append(API_BASE); + uri.append("stboard.exe/dn?L=vs_scotty.vs_stb"); + uri.append("&input=").append(stationId); + uri.append("&boardType=dep"); + uri.append("&productsFilter=").append(allProductsString()); + uri.append("&additionalTime=0"); + uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 20); + uri.append("&start=yes"); + uri.append("&monitor=1"); + uri.append("&requestType=0"); + uri.append("&view=preview"); + uri.append("&disableEquivs=yes"); // don't use nearby stations + + return uri.toString(); + } + + private static final Pattern P_DEPARTURES_ERROR = Pattern.compile("(Verbindung zum Server konnte leider nicht hergestellt werden)"); + + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final QueryDeparturesResult result = new QueryDeparturesResult(); + + // scrape page + final String uri = departuresQueryUri(stationId, maxDepartures); + final String page = ParserUtils.scrape(uri).toString().substring(14); + + // parse page + final Matcher mError = P_DEPARTURES_ERROR.matcher(page); + if (mError.find()) + { + if (mError.group(1) != null) + return new QueryDeparturesResult(Status.SERVICE_DOWN); + } + + try + { + final JSONObject head = new JSONObject(page); + final String location = ParserUtils.resolveEntities(head.getString("stationName")); + final int locationId = head.optInt("stationEvaId", -1); + // final boolean rt = head.optBoolean("rtInfo"); + if (locationId == -1) + return new QueryDeparturesResult(Status.INVALID_STATION); + + final List departures = new ArrayList(8); + + final JSONArray aDeparture = head.optJSONArray("journey"); + if (aDeparture != null) + { + for (int i = 0; i < aDeparture.length(); i++) + { + final JSONObject departure = aDeparture.optJSONObject(i); + if (departure != null) + { + final Calendar parsedTime = new GregorianCalendar(timeZone()); + parsedTime.clear(); + ParserUtils.parseGermanDate(parsedTime, departure.getString("da")); + ParserUtils.parseEuropeanTime(parsedTime, departure.getString("ti")); + final String line = normalizeLine(ParserUtils.resolveEntities(departure.getString("pr"))); + final String destination = ParserUtils.resolveEntities(departure.getString("st")); + String position = departure.optString("tr"); + if (position != null) + position = "Gl. " + position; + final boolean rt = head.optBoolean("rt", false); + final String lineLink = departure.optString("tinfoline"); + + departures.add(new Departure(!rt ? parsedTime.getTime() : null, rt ? parsedTime.getTime() : null, line, + line != null ? lineColors(line) : null, lineLink, position, 0, destination, null)); + } + } + } + + result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, locationId, null, location), departures, null)); + return result; + } + catch (final JSONException x) + { + throw new RuntimeException("cannot parse: '" + page + "' on " + stationId, x); + } + } + + private static final String AUTOCOMPLETE_URI = API_BASE + + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsB=12&S=%s?&js=true&"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), URL_ENCODING)); + + return jsonGetStops(uri); + } + private static final Map WALKSPEED_MAP = new HashMap(); static { @@ -481,90 +565,6 @@ public class OebbProvider extends AbstractHafasProvider throw new UnsupportedOperationException(); } - private String departuresQueryUri(final int stationId, final int maxDepartures) - { - final StringBuilder uri = new StringBuilder(); - - uri.append(API_BASE); - uri.append("stboard.exe/dn?L=vs_scotty.vs_stb"); - uri.append("&input=").append(stationId); - uri.append("&boardType=dep"); - uri.append("&productsFilter=").append(allProductsString()); - uri.append("&additionalTime=0"); - uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 20); - uri.append("&start=yes"); - uri.append("&monitor=1"); - uri.append("&requestType=0"); - uri.append("&view=preview"); - uri.append("&disableEquivs=yes"); // don't use nearby stations - - return uri.toString(); - } - - private static final Pattern P_DEPARTURES_ERROR = Pattern.compile("(Verbindung zum Server konnte leider nicht hergestellt werden)"); - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final QueryDeparturesResult result = new QueryDeparturesResult(); - - // scrape page - final String uri = departuresQueryUri(stationId, maxDepartures); - final String page = ParserUtils.scrape(uri).toString().substring(14); - - // parse page - final Matcher mError = P_DEPARTURES_ERROR.matcher(page); - if (mError.find()) - { - if (mError.group(1) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); - } - - try - { - final JSONObject head = new JSONObject(page); - final String location = ParserUtils.resolveEntities(head.getString("stationName")); - final int locationId = head.optInt("stationEvaId", -1); - // final boolean rt = head.optBoolean("rtInfo"); - if (locationId == -1) - return new QueryDeparturesResult(Status.INVALID_STATION); - - final List departures = new ArrayList(8); - - final JSONArray aDeparture = head.optJSONArray("journey"); - if (aDeparture != null) - { - for (int i = 0; i < aDeparture.length(); i++) - { - final JSONObject departure = aDeparture.optJSONObject(i); - if (departure != null) - { - final Calendar parsedTime = new GregorianCalendar(timeZone()); - parsedTime.clear(); - ParserUtils.parseGermanDate(parsedTime, departure.getString("da")); - ParserUtils.parseEuropeanTime(parsedTime, departure.getString("ti")); - final String line = normalizeLine(ParserUtils.resolveEntities(departure.getString("pr"))); - final String destination = ParserUtils.resolveEntities(departure.getString("st")); - String position = departure.optString("tr"); - if (position != null) - position = "Gl. " + position; - final boolean rt = head.optBoolean("rt", false); - final String lineLink = departure.optString("tinfoline"); - - departures.add(new Departure(!rt ? parsedTime.getTime() : null, rt ? parsedTime.getTime() : null, line, - line != null ? lineColors(line) : null, lineLink, position, 0, destination, null)); - } - } - } - - result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, locationId, null, location), departures, null)); - return result; - } - catch (final JSONException x) - { - throw new RuntimeException("cannot parse: '" + page + "' on " + stationId, x); - } - } - private static final Pattern P_NORMALIZE_LINE_NUMBER = Pattern.compile("\\d{2,5}"); private static final Pattern P_NORMALIZE_LINE_RUSSIA = Pattern.compile("\\d{1,3}[A-Z]{2}"); private static final Pattern P_NORMALIZE_LINE_RUSSIA_INT = Pattern.compile("\\d{3}Y"); diff --git a/src/de/schildbach/pte/PlProvider.java b/src/de/schildbach/pte/PlProvider.java index ca63d7c8..5cb0e2f9 100644 --- a/src/de/schildbach/pte/PlProvider.java +++ b/src/de/schildbach/pte/PlProvider.java @@ -70,11 +70,6 @@ public class PlProvider extends AbstractHafasProvider return super.splitNameAndPlace(name); } - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlMLcReq(constraint); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { if (location.type == LocationType.STATION && location.hasId()) @@ -97,6 +92,26 @@ public class PlProvider extends AbstractHafasProvider } } + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final StringBuilder uri = new StringBuilder(); + uri.append(API_BASE).append("stboard.exe/pn"); + uri.append("?productsFilter=").append(allProductsString()); + uri.append("&boardType=dep"); + uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations + uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations + uri.append("&start=yes"); + uri.append("&L=vs_java3"); + uri.append("&input=").append(stationId); + + return xmlQueryDepartures(uri.toString(), stationId); + } + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlMLcReq(constraint); + } + private static final Pattern P_NORMALIZE_LINE_RUSSIA = Pattern.compile("(?:D\\s*)?(\\d{1,3}(?:[A-Z]{2}|Y))"); private static final Pattern P_NORMALIZE_LINE_NUMBER = Pattern.compile("\\d{2,5}"); @@ -179,19 +194,4 @@ public class PlProvider extends AbstractHafasProvider return 0; } - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final StringBuilder uri = new StringBuilder(); - uri.append(API_BASE).append("stboard.exe/pn"); - uri.append("?productsFilter=").append(allProductsString()); - uri.append("&boardType=dep"); - uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations - uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations - uri.append("&start=yes"); - uri.append("&L=vs_java3"); - uri.append("&input=").append(stationId); - - return xmlQueryDepartures(uri.toString(), stationId); - } } diff --git a/src/de/schildbach/pte/RmvProvider.java b/src/de/schildbach/pte/RmvProvider.java index dae2c231..eeb4c8e0 100644 --- a/src/de/schildbach/pte/RmvProvider.java +++ b/src/de/schildbach/pte/RmvProvider.java @@ -77,16 +77,6 @@ public class RmvProvider extends AbstractHafasProvider return super.splitNameAndPlace(name); } - private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -257,6 +247,16 @@ public class RmvProvider extends AbstractHafasProvider } } + private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + @Override protected String normalizeLine(final String line) { diff --git a/src/de/schildbach/pte/SbbProvider.java b/src/de/schildbach/pte/SbbProvider.java index 1bc1f26f..16b7537f 100644 --- a/src/de/schildbach/pte/SbbProvider.java +++ b/src/de/schildbach/pte/SbbProvider.java @@ -57,16 +57,6 @@ public class SbbProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -115,6 +105,16 @@ public class SbbProvider extends AbstractHafasProvider return xmlQueryDepartures(uri.toString(), stationId); } + private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + private static final Pattern P_NORMALIZE_LINE_AND_TYPE = Pattern.compile("([^#]*)#(.*)"); @Override diff --git a/src/de/schildbach/pte/SeProvider.java b/src/de/schildbach/pte/SeProvider.java index 03dc5c7c..26f026e2 100644 --- a/src/de/schildbach/pte/SeProvider.java +++ b/src/de/schildbach/pte/SeProvider.java @@ -96,17 +96,6 @@ public class SeProvider extends AbstractHafasProvider return super.splitNameAndPlace(name); } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/sny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=7&getstop=1&noSession=yes&REQ0JourneyStopsB=12&REQ0JourneyStopsS0G=&S=%s"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -139,12 +128,6 @@ public class SeProvider extends AbstractHafasProvider } } - @Override - protected char normalizeType(final String type) - { - throw new UnsupportedOperationException(); - } - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { final StringBuilder uri = new StringBuilder(); @@ -159,4 +142,21 @@ public class SeProvider extends AbstractHafasProvider return xmlQueryDepartures(uri.toString(), stationId); } + + private static final String AUTOCOMPLETE_URI = API_BASE + + "ajax-getstop.exe/sny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=7&getstop=1&noSession=yes&REQ0JourneyStopsB=12&REQ0JourneyStopsS0G=&S=%s"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + + @Override + protected char normalizeType(final String type) + { + throw new UnsupportedOperationException(); + } } diff --git a/src/de/schildbach/pte/SeptaProvider.java b/src/de/schildbach/pte/SeptaProvider.java index accc9563..44961111 100644 --- a/src/de/schildbach/pte/SeptaProvider.java +++ b/src/de/schildbach/pte/SeptaProvider.java @@ -71,62 +71,6 @@ public class SeptaProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsB=12&S=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - - @Override - protected char normalizeType(final String type) - { - final String ucType = type.toUpperCase(); - - // skip parsing of "common" lines, because this is America - - // Regional - if (ucType.equals("RAI")) - return 'R'; - - // Subway - if (ucType.equals("BSS")) - return 'U'; - if (ucType.equals("BSL")) - return 'U'; - if (ucType.equals("MFL")) - return 'U'; - - // Tram - if (ucType.equals("TRM")) - return 'T'; - if (ucType.equals("NHS")) // Tro NHSL - return 'T'; - - // Bus - if (ucType.equals("BUS")) - return 'B'; - if (ucType.equals("TRO")) - return 'B'; - - // from Connections: - - if (ucType.equals("RAIL")) - return 'R'; - - if (ucType.equals("SUBWAY")) - return 'U'; - - if (ucType.equals("TROLLEY")) - return 'B'; - - return 0; - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -295,4 +239,60 @@ public class SeptaProvider extends AbstractHafasProvider throw new IllegalArgumentException("cannot parse '" + page + "' on " + stationId); } } + + private static final String AUTOCOMPLETE_URI = API_BASE + + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsB=12&S=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + + @Override + protected char normalizeType(final String type) + { + final String ucType = type.toUpperCase(); + + // skip parsing of "common" lines, because this is America + + // Regional + if (ucType.equals("RAI")) + return 'R'; + + // Subway + if (ucType.equals("BSS")) + return 'U'; + if (ucType.equals("BSL")) + return 'U'; + if (ucType.equals("MFL")) + return 'U'; + + // Tram + if (ucType.equals("TRM")) + return 'T'; + if (ucType.equals("NHS")) // Tro NHSL + return 'T'; + + // Bus + if (ucType.equals("BUS")) + return 'B'; + if (ucType.equals("TRO")) + return 'B'; + + // from Connections: + + if (ucType.equals("RAIL")) + return 'R'; + + if (ucType.equals("SUBWAY")) + return 'U'; + + if (ucType.equals("TROLLEY")) + return 'B'; + + return 0; + } } diff --git a/src/de/schildbach/pte/SfProvider.java b/src/de/schildbach/pte/SfProvider.java index 0275b4e1..18843ead 100644 --- a/src/de/schildbach/pte/SfProvider.java +++ b/src/de/schildbach/pte/SfProvider.java @@ -57,6 +57,22 @@ public class SfProvider extends AbstractEfaProvider return false; } + private static final String NEARBY_STATION_URI = API_BASE + + "XSLT_DM_REQUEST" + + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; + + @Override + protected String nearbyStationUri(final int stationId) + { + return String.format(NEARBY_STATION_URI, stationId); + } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } + @Override protected String normalizeLocationName(final String name) { @@ -80,20 +96,4 @@ public class SfProvider extends AbstractEfaProvider else return super.parseLine(mot, name, longName, noTrainName); } - - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - - private static final String NEARBY_STATION_URI = API_BASE - + "XSLT_DM_REQUEST" - + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; - - @Override - protected String nearbyStationUri(final int stationId) - { - return String.format(NEARBY_STATION_URI, stationId); - } } diff --git a/src/de/schildbach/pte/ShProvider.java b/src/de/schildbach/pte/ShProvider.java index 1a3f710b..4290b252 100644 --- a/src/de/schildbach/pte/ShProvider.java +++ b/src/de/schildbach/pte/ShProvider.java @@ -64,11 +64,6 @@ public class ShProvider extends AbstractHafasProvider return false; } - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlMLcReq(constraint); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -87,23 +82,6 @@ public class ShProvider extends AbstractHafasProvider } } - @Override - protected char normalizeType(final String type) - { - final String ucType = type.toUpperCase(); - - if ("KBS".equals(ucType)) - return 'B'; - if ("KB1".equals(ucType)) - return 'B'; - - final char t = super.normalizeType(type); - if (t != 0) - return t; - - return 0; - } - private String departuresQueryUri(final int stationId, final int maxDepartures) { final StringBuilder uri = new StringBuilder(); @@ -257,4 +235,26 @@ public class ShProvider extends AbstractHafasProvider throw new IllegalArgumentException("cannot parse '" + page + "' on " + stationId); } } + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlMLcReq(constraint); + } + + @Override + protected char normalizeType(final String type) + { + final String ucType = type.toUpperCase(); + + if ("KBS".equals(ucType)) + return 'B'; + if ("KB1".equals(ucType)) + return 'B'; + + final char t = super.normalizeType(type); + if (t != 0) + return t; + + return 0; + } } diff --git a/src/de/schildbach/pte/SncbProvider.java b/src/de/schildbach/pte/SncbProvider.java index d0ee45e5..43cde996 100644 --- a/src/de/schildbach/pte/SncbProvider.java +++ b/src/de/schildbach/pte/SncbProvider.java @@ -65,17 +65,6 @@ public class SncbProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsB=12&S=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -201,6 +190,17 @@ public class SncbProvider extends AbstractHafasProvider } } + private static final String AUTOCOMPLETE_URI = API_BASE + + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsB=12&S=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + @Override protected char normalizeType(final String type) { diff --git a/src/de/schildbach/pte/StvProvider.java b/src/de/schildbach/pte/StvProvider.java index 6dbe916d..773991f0 100644 --- a/src/de/schildbach/pte/StvProvider.java +++ b/src/de/schildbach/pte/StvProvider.java @@ -51,12 +51,6 @@ public class StvProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class StvProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/SvvProvider.java b/src/de/schildbach/pte/SvvProvider.java index fc780565..ea0166c5 100644 --- a/src/de/schildbach/pte/SvvProvider.java +++ b/src/de/schildbach/pte/SvvProvider.java @@ -51,12 +51,6 @@ public class SvvProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class SvvProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/TflProvider.java b/src/de/schildbach/pte/TflProvider.java index 23ab9425..b022f4f6 100644 --- a/src/de/schildbach/pte/TflProvider.java +++ b/src/de/schildbach/pte/TflProvider.java @@ -61,12 +61,6 @@ public class TflProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -76,6 +70,12 @@ public class TflProvider extends AbstractEfaProvider return String.format(NEARBY_STATION_URI, stationId); } + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } + private static final Map LINES = new HashMap(); static diff --git a/src/de/schildbach/pte/TleaProvider.java b/src/de/schildbach/pte/TleaProvider.java index 6e92f43c..880b395d 100644 --- a/src/de/schildbach/pte/TleaProvider.java +++ b/src/de/schildbach/pte/TleaProvider.java @@ -58,12 +58,6 @@ public class TleaProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -73,4 +67,10 @@ public class TleaProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/TlemProvider.java b/src/de/schildbach/pte/TlemProvider.java index 7ca4d829..f8a8e575 100644 --- a/src/de/schildbach/pte/TlemProvider.java +++ b/src/de/schildbach/pte/TlemProvider.java @@ -58,12 +58,6 @@ public class TlemProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -73,4 +67,10 @@ public class TlemProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/TlseProvider.java b/src/de/schildbach/pte/TlseProvider.java index e8defc43..6f7ae31d 100644 --- a/src/de/schildbach/pte/TlseProvider.java +++ b/src/de/schildbach/pte/TlseProvider.java @@ -58,12 +58,6 @@ public class TlseProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -73,4 +67,10 @@ public class TlseProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/TlswProvider.java b/src/de/schildbach/pte/TlswProvider.java index c283930c..ca073986 100644 --- a/src/de/schildbach/pte/TlswProvider.java +++ b/src/de/schildbach/pte/TlswProvider.java @@ -57,12 +57,6 @@ public class TlswProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&name_dm=90000591&type_dm=stop&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -72,4 +66,10 @@ public class TlswProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VagfrProvider.java b/src/de/schildbach/pte/VagfrProvider.java index 58355586..d41c2e31 100644 --- a/src/de/schildbach/pte/VagfrProvider.java +++ b/src/de/schildbach/pte/VagfrProvider.java @@ -50,12 +50,6 @@ public class VagfrProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -65,4 +59,10 @@ public class VagfrProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VbbProvider.java b/src/de/schildbach/pte/VbbProvider.java index 86749517..d049c2dd 100644 --- a/src/de/schildbach/pte/VbbProvider.java +++ b/src/de/schildbach/pte/VbbProvider.java @@ -75,16 +75,6 @@ public class VbbProvider extends AbstractHafasProvider return super.splitNameAndPlace(name); } - private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -118,6 +108,31 @@ public class VbbProvider extends AbstractHafasProvider } } + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final StringBuilder uri = new StringBuilder(); + uri.append(API_BASE).append("stboard.exe/dn"); + uri.append("?productsFilter=").append(allProductsString()); + uri.append("&boardType=dep"); + uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations + uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations + uri.append("&start=yes"); + uri.append("&L=vs_java3"); + uri.append("&input=").append(stationId); + + return xmlQueryDepartures(uri.toString(), stationId); + } + + private static final String AUTOCOMPLETE_URI = API_BASE + "ajax-getstop.exe/dn?getstop=1&REQ0JourneyStopsS0A=255&S=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + private static final Pattern P_NORMALIZE_LINE_AND_TYPE = Pattern.compile("([^#]*)#(.*)"); @Override @@ -138,19 +153,4 @@ public class VbbProvider extends AbstractHafasProvider throw new IllegalStateException("cannot normalize line " + line); } - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final StringBuilder uri = new StringBuilder(); - uri.append(API_BASE).append("stboard.exe/dn"); - uri.append("?productsFilter=").append(allProductsString()); - uri.append("&boardType=dep"); - uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations - uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations - uri.append("&start=yes"); - uri.append("&L=vs_java3"); - uri.append("&input=").append(stationId); - - return xmlQueryDepartures(uri.toString(), stationId); - } } diff --git a/src/de/schildbach/pte/VblProvider.java b/src/de/schildbach/pte/VblProvider.java index d2494ee9..2cff964b 100644 --- a/src/de/schildbach/pte/VblProvider.java +++ b/src/de/schildbach/pte/VblProvider.java @@ -50,12 +50,6 @@ public class VblProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -65,4 +59,10 @@ public class VblProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VbnProvider.java b/src/de/schildbach/pte/VbnProvider.java index ed62ade1..2f2d731c 100644 --- a/src/de/schildbach/pte/VbnProvider.java +++ b/src/de/schildbach/pte/VbnProvider.java @@ -53,17 +53,6 @@ public class VbnProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsS0B=5&REQ0JourneyStopsB=12&getstop=1&noSession=yes&REQ0JourneyStopsS0G=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -97,6 +86,32 @@ public class VbnProvider extends AbstractHafasProvider } } + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final StringBuilder uri = new StringBuilder(); + uri.append(API_BASE).append("stboard.exe/dn"); + uri.append("?productsFilter=").append(allProductsString()); + uri.append("&boardType=dep"); + uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations + uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations + uri.append("&start=yes"); + uri.append("&L=vs_java3"); + uri.append("&input=").append(stationId); + + return xmlQueryDepartures(uri.toString(), stationId); + } + + private static final String AUTOCOMPLETE_URI = API_BASE + + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsS0B=5&REQ0JourneyStopsB=12&getstop=1&noSession=yes&REQ0JourneyStopsS0G=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + @Override protected char normalizeType(final String type) { @@ -124,19 +139,4 @@ public class VbnProvider extends AbstractHafasProvider return 0; } - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final StringBuilder uri = new StringBuilder(); - uri.append(API_BASE).append("stboard.exe/dn"); - uri.append("?productsFilter=").append(allProductsString()); - uri.append("&boardType=dep"); - uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations - uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations - uri.append("&start=yes"); - uri.append("&L=vs_java3"); - uri.append("&input=").append(stationId); - - return xmlQueryDepartures(uri.toString(), stationId); - } } diff --git a/src/de/schildbach/pte/VgsProvider.java b/src/de/schildbach/pte/VgsProvider.java index 4ce4a526..b3f4b74f 100644 --- a/src/de/schildbach/pte/VgsProvider.java +++ b/src/de/schildbach/pte/VgsProvider.java @@ -64,17 +64,6 @@ public class VgsProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/eny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=1&getstop=1&noSession=yes&REQ0JourneyStopsB=12&REQ0JourneyStopsS0G=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - - public List autocompleteStations(final CharSequence constraint) throws IOException - { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return jsonGetStops(uri); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -259,6 +248,17 @@ public class VgsProvider extends AbstractHafasProvider } } + private static final String AUTOCOMPLETE_URI = API_BASE + + "ajax-getstop.exe/eny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=1&getstop=1&noSession=yes&REQ0JourneyStopsB=12&REQ0JourneyStopsS0G=%s?&js=true&"; + private static final String ENCODING = "ISO-8859-1"; + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); + + return jsonGetStops(uri); + } + @Override protected char normalizeType(final String type) { diff --git a/src/de/schildbach/pte/VmobilProvider.java b/src/de/schildbach/pte/VmobilProvider.java index 17ec0047..4f13c94a 100644 --- a/src/de/schildbach/pte/VmobilProvider.java +++ b/src/de/schildbach/pte/VmobilProvider.java @@ -25,6 +25,7 @@ import de.schildbach.pte.dto.LocationType; /** * Verkehrsverbund Vorarlberg + * * @author Andreas Schildbach */ public class VmobilProvider extends AbstractEfaProvider @@ -51,12 +52,6 @@ public class VmobilProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +61,10 @@ public class VmobilProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VmsProvider.java b/src/de/schildbach/pte/VmsProvider.java index 7a890df9..8df2d844 100644 --- a/src/de/schildbach/pte/VmsProvider.java +++ b/src/de/schildbach/pte/VmsProvider.java @@ -51,12 +51,6 @@ public class VmsProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct&deleteAssignedStop=0"; @@ -66,4 +60,10 @@ public class VmsProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VmvProvider.java b/src/de/schildbach/pte/VmvProvider.java index cde50cec..8c093cda 100644 --- a/src/de/schildbach/pte/VmvProvider.java +++ b/src/de/schildbach/pte/VmvProvider.java @@ -51,12 +51,6 @@ public class VmvProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct&deleteAssignedStop=0"; @@ -66,4 +60,10 @@ public class VmvProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VorProvider.java b/src/de/schildbach/pte/VorProvider.java index f9b57157..1ca97b51 100644 --- a/src/de/schildbach/pte/VorProvider.java +++ b/src/de/schildbach/pte/VorProvider.java @@ -51,12 +51,6 @@ public class VorProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class VorProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VrnProvider.java b/src/de/schildbach/pte/VrnProvider.java index e5ea9d67..2b9db656 100644 --- a/src/de/schildbach/pte/VrnProvider.java +++ b/src/de/schildbach/pte/VrnProvider.java @@ -51,12 +51,6 @@ public class VrnProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct&deleteAssignedStop=0"; @@ -66,4 +60,10 @@ public class VrnProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VrrProvider.java b/src/de/schildbach/pte/VrrProvider.java index 09ad84db..8545cf7a 100644 --- a/src/de/schildbach/pte/VrrProvider.java +++ b/src/de/schildbach/pte/VrrProvider.java @@ -54,12 +54,6 @@ public class VrrProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct&deleteAssignedStop=0"; @@ -70,6 +64,12 @@ public class VrrProvider extends AbstractEfaProvider return String.format(NEARBY_STATION_URI, stationId); } + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } + private static final Map LINES = new HashMap(); static diff --git a/src/de/schildbach/pte/VrtProvider.java b/src/de/schildbach/pte/VrtProvider.java index f579b21d..b3bb45a1 100644 --- a/src/de/schildbach/pte/VrtProvider.java +++ b/src/de/schildbach/pte/VrtProvider.java @@ -50,12 +50,6 @@ public class VrtProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -65,4 +59,10 @@ public class VrtProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VvmProvider.java b/src/de/schildbach/pte/VvmProvider.java index 4e3bca75..fcf33e7e 100644 --- a/src/de/schildbach/pte/VvmProvider.java +++ b/src/de/schildbach/pte/VvmProvider.java @@ -50,12 +50,6 @@ public class VvmProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -65,4 +59,10 @@ public class VvmProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VvoProvider.java b/src/de/schildbach/pte/VvoProvider.java index cc4f500a..c301a7a7 100644 --- a/src/de/schildbach/pte/VvoProvider.java +++ b/src/de/schildbach/pte/VvoProvider.java @@ -51,12 +51,6 @@ public class VvoProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct"; @@ -66,4 +60,10 @@ public class VvoProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.STATION, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/VvsProvider.java b/src/de/schildbach/pte/VvsProvider.java index b5872731..73e84214 100644 --- a/src/de/schildbach/pte/VvsProvider.java +++ b/src/de/schildbach/pte/VvsProvider.java @@ -51,12 +51,6 @@ public class VvsProvider extends AbstractEfaProvider return false; } - @Override - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); - } - private static final String NEARBY_STATION_URI = API_BASE + "XSLT_DM_REQUEST" + "?outputFormat=XML&coordOutputFormat=WGS84&type_dm=stop&name_dm=%s&itOptionsActive=1&ptOptionsActive=1&useProxFootSearch=1&mergeDep=1&useAllStops=1&mode=direct&deleteAssignedStop=0"; @@ -66,4 +60,10 @@ public class VvsProvider extends AbstractEfaProvider { return String.format(NEARBY_STATION_URI, stationId); } + + @Override + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlStopfinderRequest(new Location(LocationType.ANY, 0, null, constraint.toString())); + } } diff --git a/src/de/schildbach/pte/ZvvProvider.java b/src/de/schildbach/pte/ZvvProvider.java index b0eaf033..e1d1315c 100644 --- a/src/de/schildbach/pte/ZvvProvider.java +++ b/src/de/schildbach/pte/ZvvProvider.java @@ -68,11 +68,6 @@ public class ZvvProvider extends AbstractHafasProvider return super.splitNameAndPlace(name); } - public List autocompleteStations(final CharSequence constraint) throws IOException - { - return xmlMLcReq(constraint); - } - public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException { final StringBuilder uri = new StringBuilder(API_BASE); @@ -106,6 +101,26 @@ public class ZvvProvider extends AbstractHafasProvider } } + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException + { + final StringBuilder uri = new StringBuilder(); + uri.append(API_BASE).append("stboard.exe/dn"); + uri.append("?productsFilter=").append(allProductsString()); + uri.append("&boardType=dep"); + uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations + uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations + uri.append("&start=yes"); + uri.append("&L=vs_java3"); + uri.append("&input=").append(stationId); + + return xmlQueryDepartures(uri.toString(), stationId); + } + + public List autocompleteStations(final CharSequence constraint) throws IOException + { + return xmlMLcReq(constraint); + } + private static final Pattern P_NORMALIZE_LINE_AND_TYPE = Pattern.compile("([^#]*)#(.*)"); @Override @@ -165,19 +180,4 @@ public class ZvvProvider extends AbstractHafasProvider return 0; } - - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException - { - final StringBuilder uri = new StringBuilder(); - uri.append(API_BASE).append("stboard.exe/dn"); - uri.append("?productsFilter=").append(allProductsString()); - uri.append("&boardType=dep"); - uri.append("&disableEquivs=").append(equivs ? "no" : "yes"); // don't use nearby stations - uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations - uri.append("&start=yes"); - uri.append("&L=vs_java3"); - uri.append("&input=").append(stationId); - - return xmlQueryDepartures(uri.toString(), stationId); - } }