diff --git a/enabler/src/de/schildbach/pte/NetworkId.java b/enabler/src/de/schildbach/pte/NetworkId.java index 1fcc6424..9488e3b3 100644 --- a/enabler/src/de/schildbach/pte/NetworkId.java +++ b/enabler/src/de/schildbach/pte/NetworkId.java @@ -26,7 +26,7 @@ public enum NetworkId RT, // Germany - DB, BVG, VBB, RMV, NVV, BAYERN, MVV, INVG, AVV, VGN, VVM, VMV, HVV, SH, GVH, BSVAG, BSAG, VBN, NASA, VVO, VMS, VGS, VRR, VRS, MVG, NPH, VRN, VRT, VVS, NALDO, DING, KVV, VAGFR, NVBW, VVV, + DB, BVG, VBB, NVV, BAYERN, MVV, INVG, AVV, VGN, VVM, VMV, HVV, SH, GVH, BSVAG, BSAG, VBN, NASA, VVO, VMS, VGS, VRR, VRS, MVG, NPH, VRN, VRT, VVS, NALDO, DING, KVV, VAGFR, NVBW, VVV, // Austria OEBB, VOR, LINZ, SVV, VVT, VMOBIL, IVB, STV, diff --git a/enabler/src/de/schildbach/pte/NvvProvider.java b/enabler/src/de/schildbach/pte/NvvProvider.java index 8e889a18..ccb93da6 100644 --- a/enabler/src/de/schildbach/pte/NvvProvider.java +++ b/enabler/src/de/schildbach/pte/NvvProvider.java @@ -18,13 +18,19 @@ package de.schildbach.pte; import java.io.IOException; +import java.util.Collection; +import java.util.Date; import java.util.List; +import java.util.Set; import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.QueryDeparturesResult; +import de.schildbach.pte.dto.QueryTripsContext; +import de.schildbach.pte.dto.QueryTripsResult; +import de.schildbach.pte.util.StringReplaceReader; /** * @author Andreas Schildbach @@ -32,11 +38,11 @@ import de.schildbach.pte.dto.QueryDeparturesResult; public class NvvProvider extends AbstractHafasProvider { public static final NetworkId NETWORK_ID = NetworkId.NVV; - private static final String API_BASE = "http://auskunft.nvv.de/nvv/bin/jp/"; + private static final String API_BASE = "http://auskunft.nvv.de/auskunft/bin/jp/"; public NvvProvider() { - super(API_BASE + "stboard.exe/dn", null, API_BASE + "query.exe/dn", 17, null, UTF_8, UTF_8); + super(API_BASE + "stboard.exe/dn", API_BASE + "ajax-getstop.exe/dn", API_BASE + "query.exe/dn", 16, null, UTF_8, null); } public NetworkId id() @@ -47,7 +53,7 @@ public class NvvProvider extends AbstractHafasProvider public boolean hasCapabilities(final Capability... capabilities) { for (final Capability capability : capabilities) - if (capability == Capability.AUTOCOMPLETE_ONE_LINE || capability == Capability.TRIPS) + if (capability == Capability.AUTOCOMPLETE_ONE_LINE || capability == Capability.DEPARTURES || capability == Capability.TRIPS) return true; return false; @@ -58,13 +64,13 @@ public class NvvProvider extends AbstractHafasProvider { if (product == Product.HIGH_SPEED_TRAIN) { - productBits.setCharAt(0, '1'); // Zug ICE - productBits.setCharAt(1, '1'); // Zug + productBits.setCharAt(0, '1'); // ICE + productBits.setCharAt(1, '1'); // Zug, scheinbar IC? } else if (product == Product.REGIONAL_TRAIN) { - productBits.setCharAt(2, '1'); // Zug Nahverkehr - productBits.setCharAt(10, '1'); // RegioTram + productBits.setCharAt(2, '1'); // Zug + productBits.setCharAt(10, '1'); // Zug } else if (product == Product.SUBURBAN_TRAIN) { @@ -76,7 +82,7 @@ public class NvvProvider extends AbstractHafasProvider } else if (product == Product.TRAM) { - productBits.setCharAt(5, '1'); // Tram + productBits.setCharAt(5, '1'); // Straßenbahn } else if (product == Product.BUS) { @@ -85,11 +91,11 @@ public class NvvProvider extends AbstractHafasProvider } else if (product == Product.ON_DEMAND) { - productBits.setCharAt(9, '1'); // Anruf-Sammel-Taxi + productBits.setCharAt(9, '1'); // AST/Rufbus } else if (product == Product.FERRY) { - productBits.setCharAt(8, '1'); // Schiff + productBits.setCharAt(8, '1'); // Fähre/Schiff } else if (product == Product.CABLECAR) { @@ -100,14 +106,48 @@ public class NvvProvider extends AbstractHafasProvider } } - private static final String[] PLACES = { "Kassel" }; + @Override + protected char intToProduct(final int value) + { + if (value == 1) + return 'I'; + if (value == 2) + return 'I'; + if (value == 4) + return 'R'; + if (value == 8) + return 'S'; + if (value == 16) + return 'U'; + if (value == 32) + return 'T'; + if (value == 64) + return 'B'; + if (value == 128) + return 'B'; + if (value == 256) + return 'F'; + if (value == 512) + return 'P'; + if (value == 1024) + return 'R'; + + throw new IllegalArgumentException("cannot handle: " + value); + } + + private static final String[] PLACES = { "Frankfurt (Main)", "Offenbach (Main)", "Mainz", "Wiesbaden", "Marburg", "Kassel", "Hanau", "Göttingen", + "Darmstadt", "Aschaffenburg", "Berlin", "Fulda" }; @Override protected String[] splitPlaceAndName(final String name) { for (final String place : PLACES) - if (name.startsWith(place + " ") || name.startsWith(place + "-")) + { + if (name.startsWith(place + " - ")) + return new String[] { place, name.substring(place.length() + 3) }; + else if (name.startsWith(place + " ") || name.startsWith(place + "-")) return new String[] { place, name.substring(place.length() + 1) }; + } return super.splitPlaceAndName(name); } @@ -122,6 +162,7 @@ public class NvvProvider extends AbstractHafasProvider uri.append("&look_maxno=").append(maxStations != 0 ? maxStations : 200); uri.append("&look_maxdist=").append(maxDistance != 0 ? maxDistance : 5000); uri.append("&look_stopclass=").append(allProductsInt()); + uri.append("&look_nv=get_stopweight|yes"); uri.append("&look_x=").append(location.lon); uri.append("&look_y=").append(location.lat); @@ -130,7 +171,7 @@ public class NvvProvider extends AbstractHafasProvider else if (location.type == LocationType.STATION && location.hasId()) { final StringBuilder uri = new StringBuilder(stationBoardEndpoint); - uri.append("?near=Anzeigen"); + uri.append("?L=vs_rmv&near=Anzeigen"); uri.append("&distance=").append(maxDistance != 0 ? maxDistance / 1000 : 50); uri.append("&input=").append(location.id); @@ -142,7 +183,7 @@ public class NvvProvider extends AbstractHafasProvider } } - public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, boolean equivs) throws IOException + public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { final StringBuilder uri = new StringBuilder(stationBoardEndpoint); uri.append(xmlQueryDeparturesParameters(stationId)); @@ -150,9 +191,44 @@ public class NvvProvider extends AbstractHafasProvider return xmlQueryDepartures(uri.toString(), stationId); } + @Override + protected void addCustomReplaces(final StringReplaceReader reader) + { + reader.replace("
", " "); + reader.replace("", " "); + reader.replace("
  • ", " "); + reader.replace("
  • ", " "); + reader.replace("", " "); + reader.replace("", " "); + } + public List autocompleteStations(final CharSequence constraint) throws IOException { - return xmlMLcReq(constraint); + final StringBuilder uri = new StringBuilder(getStopEndpoint); + uri.append(jsonGetStopsParameters(constraint)); + + return jsonGetStops(uri.toString()); + } + + @Override + protected void appendCustomTripsQueryBinaryUri(final StringBuilder uri) + { + uri.append("&h2g-direct=11"); + } + + @Override + public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, + final int numTrips, final Collection products, final WalkSpeed walkSpeed, final Accessibility accessibility, + final Set