diff --git a/src/de/schildbach/pte/AbstractHafasProvider.java b/src/de/schildbach/pte/AbstractHafasProvider.java index 30489c4f..daf440ae 100644 --- a/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/src/de/schildbach/pte/AbstractHafasProvider.java @@ -59,24 +59,28 @@ import de.schildbach.pte.util.XmlPullUtil; public abstract class AbstractHafasProvider implements NetworkProvider { private static final String DEFAULT_ENCODING = "ISO-8859-1"; + private static final String prod = "hafas"; private final String apiUri; - private static final String prod = "hafas"; + private final int numProductBits; private final String accessId; private final String jsonGetStopsEncoding; private final String xmlMlcResEncoding; - public AbstractHafasProvider(final String apiUri, final String accessId, final String jsonGetStopsEncoding, final String xmlMlcResEncoding) + public AbstractHafasProvider(final String apiUri, final int numProductBits, final String accessId, final String jsonGetStopsEncoding, + final String xmlMlcResEncoding) { this.apiUri = apiUri; + this.numProductBits = numProductBits; this.accessId = accessId; this.jsonGetStopsEncoding = jsonGetStopsEncoding; this.xmlMlcResEncoding = xmlMlcResEncoding; } - public AbstractHafasProvider(final String apiUri, final String accessId) + public AbstractHafasProvider(final String apiUri, final int numProductBits, final String accessId) { this.apiUri = apiUri; + this.numProductBits = numProductBits; this.accessId = accessId; this.jsonGetStopsEncoding = DEFAULT_ENCODING; this.xmlMlcResEncoding = DEFAULT_ENCODING; @@ -87,6 +91,19 @@ public abstract class AbstractHafasProvider implements NetworkProvider return TimeZone.getTimeZone("CET"); } + protected final String allProductsString() + { + final StringBuilder allProducts = new StringBuilder(numProductBits); + for (int i = 0; i < numProductBits; i++) + allProducts.append('1'); + return allProducts.toString(); + } + + protected final int allProductsInt() + { + return (1 << numProductBits) - 1; + } + protected String[] splitNameAndPlace(final String name) { return new String[] { null, name }; diff --git a/src/de/schildbach/pte/BahnProvider.java b/src/de/schildbach/pte/BahnProvider.java index 1633c742..61dc0995 100644 --- a/src/de/schildbach/pte/BahnProvider.java +++ b/src/de/schildbach/pte/BahnProvider.java @@ -50,7 +50,7 @@ public final class BahnProvider extends AbstractHafasProvider public BahnProvider() { - super("http://reiseauskunft.bahn.de/bin/extxml.exe", null); + super("http://reiseauskunft.bahn.de/bin/extxml.exe", 14, null); } public NetworkId id() @@ -108,7 +108,8 @@ public final class BahnProvider extends AbstractHafasProvider else { final String uri = API_BASE + "query.exe/dox" + "?performLocating=2&tpl=stopsnear&look_maxdist=" + (maxDistance > 0 ? maxDistance : 5000) - + "&look_stopclass=1023" + "&look_x=" + lon + "&look_y=" + lat; + + "&look_stopclass=" + allProductsInt() + "&look_x=" + lon + "&look_y=" + lat; + System.out.println(uri); final CharSequence page = ParserUtils.scrape(uri); final Matcher m = P_NEARBY_STATIONS_BY_COORDINATE.matcher(page); @@ -496,7 +497,7 @@ public final class BahnProvider extends AbstractHafasProvider { final StringBuilder uri = new StringBuilder(); uri.append(API_BASE).append("bhftafel.exe/dn"); - uri.append("?productsFilter=11111111111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations uri.append("&start=yes"); diff --git a/src/de/schildbach/pte/BvgProvider.java b/src/de/schildbach/pte/BvgProvider.java index 99c3a5f8..810b47c6 100644 --- a/src/de/schildbach/pte/BvgProvider.java +++ b/src/de/schildbach/pte/BvgProvider.java @@ -64,7 +64,7 @@ public final class BvgProvider extends AbstractHafasProvider public BvgProvider(final String additionalQueryParameter) { - super(API_BASE + "query.bin/dn", null); + super(API_BASE + "query.bin/dn", 8, null); this.additionalQueryParameter = additionalQueryParameter; } diff --git a/src/de/schildbach/pte/DsbProvider.java b/src/de/schildbach/pte/DsbProvider.java index 4986bbc7..3d8bb5cb 100644 --- a/src/de/schildbach/pte/DsbProvider.java +++ b/src/de/schildbach/pte/DsbProvider.java @@ -37,7 +37,7 @@ public class DsbProvider extends AbstractHafasProvider public DsbProvider() { - super(null, null); + super(null, 11, null); } public NetworkId id() @@ -82,7 +82,7 @@ public class DsbProvider extends AbstractHafasProvider uri.append("?performLocating=2&tpl=stop2json"); uri.append("&look_maxno=").append(maxStations != 0 ? maxStations : 200); uri.append("&look_maxdist=").append(maxDistance != 0 ? maxDistance : 5000); - uri.append("&look_stopclass=2047"); + uri.append("&look_stopclass=").append(allProductsInt()); uri.append("&look_x=").append(lon); uri.append("&look_y=").append(lat); @@ -91,7 +91,7 @@ public class DsbProvider extends AbstractHafasProvider else { uri.append("stboard.exe/mn"); - uri.append("?productsFilter=11111111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&input=").append(ParserUtils.urlEncode(stationId)); uri.append("&sTI=1&start=yes&hcount=0"); @@ -173,7 +173,7 @@ public class DsbProvider extends AbstractHafasProvider { final StringBuilder uri = new StringBuilder(); uri.append(API_BASE).append("stboard.exe/mn"); - uri.append("?productsFilter=11111111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations uri.append("&start=yes"); diff --git a/src/de/schildbach/pte/InvgProvider.java b/src/de/schildbach/pte/InvgProvider.java index e2fc97b7..a17140be 100644 --- a/src/de/schildbach/pte/InvgProvider.java +++ b/src/de/schildbach/pte/InvgProvider.java @@ -50,7 +50,7 @@ public class InvgProvider extends AbstractHafasProvider public InvgProvider() { - super(API_URI, null); + super(API_URI, 10, null); } public NetworkId id() @@ -143,7 +143,7 @@ public class InvgProvider extends AbstractHafasProvider uri.append(API_BASE).append("stboard.exe/dn"); uri.append("?input=").append(stationId); uri.append("&boardType=dep"); - uri.append("&productsFilter=1111111111"); + uri.append("&productsFilter=").append(allProductsString()); if (maxDepartures != 0) uri.append("&maxJourneys=").append(maxDepartures); uri.append("&disableEquivs=yes"); // don't use nearby stations diff --git a/src/de/schildbach/pte/LuProvider.java b/src/de/schildbach/pte/LuProvider.java index 025d48d0..3e9f5a20 100644 --- a/src/de/schildbach/pte/LuProvider.java +++ b/src/de/schildbach/pte/LuProvider.java @@ -37,7 +37,7 @@ public class LuProvider extends AbstractHafasProvider public LuProvider() { - super(API_BASE + "query.exe/dn", null); + super(API_BASE + "query.exe/dn", 10, null); } public NetworkId id() @@ -71,7 +71,7 @@ public class LuProvider extends AbstractHafasProvider { final StringBuilder uri = new StringBuilder(API_BASE); uri.append("stboard.exe/dn"); - uri.append("?productsFilter=11111111111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&input=").append(ParserUtils.urlEncode(stationId)); uri.append("&sTI=1&start=yes&hcount=0&L=vs_java3"); @@ -119,7 +119,7 @@ public class LuProvider extends AbstractHafasProvider { final StringBuilder uri = new StringBuilder(); uri.append(API_BASE).append("stboard.exe/dn"); - uri.append("?productsFilter=11111111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations uri.append("&start=yes"); diff --git a/src/de/schildbach/pte/NasaProvider.java b/src/de/schildbach/pte/NasaProvider.java index a85869be..db800c65 100644 --- a/src/de/schildbach/pte/NasaProvider.java +++ b/src/de/schildbach/pte/NasaProvider.java @@ -47,7 +47,7 @@ public class NasaProvider extends AbstractHafasProvider public NasaProvider() { - super(API_BASE + "query.exe/dn", null); + super(API_BASE + "query.exe/dn", 8, null); } public NetworkId id() @@ -69,8 +69,8 @@ public class NasaProvider extends AbstractHafasProvider return xmlMLcReq(constraint); } - private final String NEARBY_URI = API_BASE - + "stboard.exe/dn?input=%s&selectDate=today&boardType=dep&productsFilter=11111111&distance=50&near=Anzeigen"; + private final String NEARBY_URI = API_BASE + "stboard.exe/dn?input=%s&selectDate=today&boardType=dep&productsFilter=" + allProductsString() + + "&distance=50&near=Anzeigen"; @Override protected String nearbyStationUri(final String stationId) @@ -85,7 +85,7 @@ public class NasaProvider extends AbstractHafasProvider uri.append(API_BASE).append("stboard.exe/dn"); uri.append("?input=").append(stationId); uri.append("&boardType=dep"); - uri.append("&productsFilter=11111111"); + uri.append("&productsFilter=").append(allProductsString()); if (maxDepartures != 0) uri.append("&maxJourneys=").append(maxDepartures); uri.append("&disableEquivs=yes"); // don't use nearby stations diff --git a/src/de/schildbach/pte/NsProvider.java b/src/de/schildbach/pte/NsProvider.java index 48f6671b..1a335061 100644 --- a/src/de/schildbach/pte/NsProvider.java +++ b/src/de/schildbach/pte/NsProvider.java @@ -46,7 +46,7 @@ public class NsProvider extends AbstractHafasProvider public NsProvider() { - super(API_URI, null); + super(API_URI, 6, null); } public NetworkId id() @@ -83,7 +83,7 @@ public class NsProvider extends AbstractHafasProvider uri.append("?input=").append(stationId); uri.append("&boardType=dep"); uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 50); // maximum taken from SNCB site - uri.append("&productsFilter=1:1111111111111111"); + uri.append("&productsFilter=").append(allProductsString()); uri.append("&disableEquivs=yes"); // don't use nearby stations uri.append("&start=yes"); return uri.toString(); diff --git a/src/de/schildbach/pte/OebbProvider.java b/src/de/schildbach/pte/OebbProvider.java index 7760aaf2..ce42a8ec 100644 --- a/src/de/schildbach/pte/OebbProvider.java +++ b/src/de/schildbach/pte/OebbProvider.java @@ -57,7 +57,7 @@ public class OebbProvider extends AbstractHafasProvider public OebbProvider() { - super(null, null); + super(null, 12, null); } public NetworkId id() @@ -105,7 +105,7 @@ public class OebbProvider extends AbstractHafasProvider uri.append("?performLocating=2&tpl=stop2json"); uri.append("&look_maxno=").append(maxStations != 0 ? maxStations : 200); uri.append("&look_maxdist=").append(maxDistance != 0 ? maxDistance : 5000); - uri.append("&look_stopclass=2047"); + uri.append("&look_stopclass=").append(allProductsInt()); uri.append("&look_x=").append(lon); uri.append("&look_y=").append(lat); @@ -490,7 +490,7 @@ public class OebbProvider extends AbstractHafasProvider uri.append("stboard.exe/dn?L=vs_scotty.vs_stb"); uri.append("&input=").append(stationId); uri.append("&boardType=dep"); - uri.append("&productsFilter=111111111111"); + uri.append("&productsFilter=").append(allProductsString()); uri.append("&additionalTime=0"); uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 20); uri.append("&start=yes"); diff --git a/src/de/schildbach/pte/PlProvider.java b/src/de/schildbach/pte/PlProvider.java index 803fae7f..56ef939e 100644 --- a/src/de/schildbach/pte/PlProvider.java +++ b/src/de/schildbach/pte/PlProvider.java @@ -37,7 +37,7 @@ public class PlProvider extends AbstractHafasProvider public PlProvider() { - super(API_BASE + "query.exe/pn", null, null, "UTF-8"); + super(API_BASE + "query.exe/pn", 7, null, null, "UTF-8"); } public NetworkId id() @@ -87,7 +87,7 @@ public class PlProvider extends AbstractHafasProvider { final StringBuilder uri = new StringBuilder(API_BASE); uri.append("stboard.exe/pn"); - uri.append("?productsFilter=1111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&input=").append(ParserUtils.urlEncode(stationId)); uri.append("&sTI=1&start=yes&hcount=0"); @@ -316,7 +316,7 @@ public class PlProvider extends AbstractHafasProvider { final StringBuilder uri = new StringBuilder(); uri.append(API_BASE).append("stboard.exe/pn"); - uri.append("?productsFilter=1111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations uri.append("&start=yes"); diff --git a/src/de/schildbach/pte/RmvProvider.java b/src/de/schildbach/pte/RmvProvider.java index c0698cff..40109384 100644 --- a/src/de/schildbach/pte/RmvProvider.java +++ b/src/de/schildbach/pte/RmvProvider.java @@ -53,7 +53,7 @@ public class RmvProvider extends AbstractHafasProvider public RmvProvider() { - super(null, null); + super(null, 17, null); } public NetworkId id() diff --git a/src/de/schildbach/pte/SbbProvider.java b/src/de/schildbach/pte/SbbProvider.java index bf0a9973..36e041c1 100644 --- a/src/de/schildbach/pte/SbbProvider.java +++ b/src/de/schildbach/pte/SbbProvider.java @@ -48,7 +48,7 @@ public class SbbProvider extends AbstractHafasProvider public SbbProvider(final String accessId) { - super(API_URI, accessId); + super(API_URI, 10, accessId); } public NetworkId id() @@ -86,7 +86,7 @@ public class SbbProvider extends AbstractHafasProvider if (maxDepartures != 0) uri.append("&maxJourneys=").append(maxDepartures); uri.append("&boardType=dep"); - uri.append("&productsFilter=1111111111000000"); + uri.append("&productsFilter=").append(allProductsString()); uri.append("&input=").append(stationId); uri.append("&disableEquivs=yes"); // don't use nearby stations return uri.toString(); diff --git a/src/de/schildbach/pte/SeptaProvider.java b/src/de/schildbach/pte/SeptaProvider.java index 40e56704..17da45ca 100644 --- a/src/de/schildbach/pte/SeptaProvider.java +++ b/src/de/schildbach/pte/SeptaProvider.java @@ -47,7 +47,7 @@ public class SeptaProvider extends AbstractHafasProvider public SeptaProvider() { - super(API_BASE + "query.exe/en", null); + super(API_BASE + "query.exe/en", 4, null); } public NetworkId id() @@ -126,8 +126,8 @@ public class SeptaProvider extends AbstractHafasProvider return 0; } - private final String NEARBY_URI = API_BASE - + "stboard.exe/en?input=%s&selectDate=today&boardType=dep&productsFilter=1111&distance=50&near=Anzeigen"; + private final String NEARBY_URI = API_BASE + "stboard.exe/en?input=%s&selectDate=today&boardType=dep&productsFilter=" + allProductsString() + + "&distance=50&near=Anzeigen"; @Override protected String nearbyStationUri(final String stationId) @@ -148,7 +148,7 @@ public class SeptaProvider extends AbstractHafasProvider now.get(Calendar.AM_PM) == Calendar.AM ? "am" : "pm"))); uri.append("&date=").append( String.format("%02d%02d%04d", now.get(Calendar.MONTH) + 1, now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.YEAR))); - uri.append("&productsFilter=1111"); + uri.append("&productsFilter=").append(allProductsString()); if (maxDepartures != 0) uri.append("&maxJourneys=").append(maxDepartures); uri.append("&disableEquivs=yes"); // don't use nearby stations diff --git a/src/de/schildbach/pte/ShProvider.java b/src/de/schildbach/pte/ShProvider.java index fdcb9ec9..d725614d 100644 --- a/src/de/schildbach/pte/ShProvider.java +++ b/src/de/schildbach/pte/ShProvider.java @@ -46,7 +46,7 @@ public class ShProvider extends AbstractHafasProvider public ShProvider() { - super(API_BASE + "query.exe/dn", null); + super(API_BASE + "query.exe/dn", 16, null); } public NetworkId id() @@ -68,8 +68,8 @@ public class ShProvider extends AbstractHafasProvider return xmlMLcReq(constraint); } - private final String NEARBY_URI = API_BASE - + "stboard.exe/dn?input=%s&selectDate=today&boardType=dep&productsFilter=1111111111111111&distance=50&near=Anzeigen"; + private final String NEARBY_URI = API_BASE + "stboard.exe/dn?input=%s&selectDate=today&boardType=dep&productsFilter=" + allProductsString() + + "&distance=50&near=Anzeigen"; @Override protected String nearbyStationUri(final String stationId) @@ -118,7 +118,7 @@ public class ShProvider extends AbstractHafasProvider uri.append(API_BASE).append("stboard.exe/dn"); uri.append("?input=").append(stationId); uri.append("&boardType=dep"); - uri.append("&productsFilter=11111111"); + uri.append("&productsFilter=").append(allProductsString()); if (maxDepartures != 0) uri.append("&maxJourneys=").append(maxDepartures); uri.append("&disableEquivs=yes"); // don't use nearby stations diff --git a/src/de/schildbach/pte/SncbProvider.java b/src/de/schildbach/pte/SncbProvider.java index 12f1b978..6fc97723 100644 --- a/src/de/schildbach/pte/SncbProvider.java +++ b/src/de/schildbach/pte/SncbProvider.java @@ -47,7 +47,7 @@ public class SncbProvider extends AbstractHafasProvider public SncbProvider() { - super(API_URI, null); + super(API_URI, 16, null); } public NetworkId id() @@ -90,7 +90,7 @@ public class SncbProvider extends AbstractHafasProvider uri.append("?input=").append(stationId); uri.append("&boardType=dep"); uri.append("&maxJourneys=").append(maxDepartures != 0 ? maxDepartures : 50); // maximum taken from SNCB site - uri.append("&productsFilter=1:1111111111111111"); + uri.append("&productsFilter=").append(allProductsString()); uri.append("&disableEquivs=yes"); // don't use nearby stations uri.append("&start=yes"); return uri.toString(); diff --git a/src/de/schildbach/pte/VgsProvider.java b/src/de/schildbach/pte/VgsProvider.java index 0b2a3748..ed35aaa7 100644 --- a/src/de/schildbach/pte/VgsProvider.java +++ b/src/de/schildbach/pte/VgsProvider.java @@ -49,7 +49,7 @@ public class VgsProvider extends AbstractHafasProvider public VgsProvider() { - super(null, null); + super(null, 11, null); } public NetworkId id() @@ -77,8 +77,8 @@ public class VgsProvider extends AbstractHafasProvider return jsonGetStops(uri); } - private final String NEARBY_URI = API_BASE - + "stboard.exe/dn?input=%s&selectDate=today&boardType=dep&productsFilter=11111111&distance=50&near=Anzeigen"; + private final String NEARBY_URI = API_BASE + "stboard.exe/dn?input=%s&selectDate=today&boardType=dep&productsFilter=" + allProductsString() + + "&distance=50&near=Anzeigen"; @Override protected String nearbyStationUri(final String stationId) @@ -93,7 +93,7 @@ public class VgsProvider extends AbstractHafasProvider uri.append(API_BASE).append("stboard.exe/dn"); uri.append("?input=").append(stationId); uri.append("&boardType=dep"); - uri.append("&productsFilter=11111111111"); + uri.append("&productsFilter=").append(allProductsString()); if (maxDepartures != 0) uri.append("&maxJourneys=").append(maxDepartures); uri.append("&disableEquivs=yes"); // don't use nearby stations diff --git a/src/de/schildbach/pte/ZvvProvider.java b/src/de/schildbach/pte/ZvvProvider.java index eb96eabd..f09688bc 100644 --- a/src/de/schildbach/pte/ZvvProvider.java +++ b/src/de/schildbach/pte/ZvvProvider.java @@ -37,7 +37,7 @@ public class ZvvProvider extends AbstractHafasProvider public ZvvProvider() { - super(API_BASE + "query.exe/dn", null); + super(API_BASE + "query.exe/dn", 10, null); } public NetworkId id() @@ -91,7 +91,7 @@ public class ZvvProvider extends AbstractHafasProvider uri.append("?performLocating=2&tpl=stop2json"); uri.append("&look_maxno=").append(maxStations != 0 ? maxStations : 150); uri.append("&look_maxdist=").append(maxDistance != 0 ? maxDistance : 5000); - uri.append("&look_stopclass=1023"); + uri.append("&look_stopclass=").append(allProductsInt()); uri.append("&look_x=").append(lon); uri.append("&look_y=").append(lat); @@ -100,7 +100,7 @@ public class ZvvProvider extends AbstractHafasProvider else { uri.append("stboard.exe/dn"); - uri.append("?productsFilter=1111111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&input=").append(ParserUtils.urlEncode(stationId)); uri.append("&sTI=1&start=yes&hcount=0"); @@ -197,7 +197,7 @@ public class ZvvProvider extends AbstractHafasProvider { final StringBuilder uri = new StringBuilder(); uri.append(API_BASE).append("stboard.exe/dn"); - uri.append("?productsFilter=1111111111"); + uri.append("?productsFilter=").append(allProductsString()); uri.append("&boardType=dep"); uri.append("&maxJourneys=50"); // ignore maxDepartures because result contains other stations uri.append("&start=yes");