From bff85253d154f4dbb94112d5063506d2aeb637c8 Mon Sep 17 00:00:00 2001 From: Michael Dyrna Date: Thu, 26 Mar 2015 00:54:43 +0100 Subject: [PATCH] VRS: Parse NRW-Tarif. --- .../src/de/schildbach/pte/VrsProvider.java | 48 ++++++++++++------- .../pte/live/VrsProviderLiveTest.java | 11 +++++ 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/enabler/src/de/schildbach/pte/VrsProvider.java b/enabler/src/de/schildbach/pte/VrsProvider.java index 86feb7d7..9d2167ef 100644 --- a/enabler/src/de/schildbach/pte/VrsProvider.java +++ b/enabler/src/de/schildbach/pte/VrsProvider.java @@ -160,6 +160,7 @@ public class VrsProvider extends AbstractNetworkProvider add(Pattern.compile("(.*) \\(Gleis (.*)\\)")); } }; + protected static final Pattern nrwTarifPattern = Pattern.compile("([\\d]+,\\d\\d)"); protected static final Map STYLES = new HashMap(); @@ -933,23 +934,7 @@ public class VrsProvider extends AbstractNetworkProvider } } int changes = route.getInt("changes"); - List fares = new ArrayList(); - final JSONObject costs = route.optJSONObject("costs"); - if (costs != null) - { - final String name = costs.optString("name", null); // seems constant "VRS-Tarif" - // final String text = costs.getString("text"); // e.g. "Preisstufe 4 [RegioTicket] 7,70 €", - // "VRR-Tarif! (Details: www.vrr.de)", "NRW-Tarif" - float price = (float) costs.optDouble("price", 0.0); // e.g. 7.7 or not existent outside VRS - // long zone = costs.getLong("zone"); // e.g. 2600 - final String level = costs.has("level") ? "Preisstufe " + costs.getString("level") : null; // e.g. - // "4" - - if (name != null && price != 0.0 && level != null) - { - fares.add(new Fare(name, Fare.Type.ADULT, Currency.getInstance("EUR"), price, level, null /* units */)); - } - } + List fares = parseFare(route.optJSONObject("costs")); trips.add(new Trip(null /* id */, tripOrigin, tripDestination, legs, fares, null /* capacity */, changes)); } @@ -971,6 +956,35 @@ public class VrsProvider extends AbstractNetworkProvider } } + private static List parseFare(final JSONObject costs) throws JSONException + { + List fares = new ArrayList(); + if (costs != null) + { + final String name = costs.optString("name", null); // e.g. "VRS-Tarif", "NRW-Tarif" + final String text = costs.optString("text", null); // e.g. "Preisstufe 4 [RegioTicket] 7,70 €", + // "VRR-Tarif! (Details: www.vrr.de)", "17,30 € (2.Kl) / PauschalpreisTickets gültig" + float price = (float) costs.optDouble("price", 0.0); // e.g. 7.7 or not existent outside VRS + // long zone = costs.getLong("zone"); // e.g. 2600 + final String level = costs.has("level") ? "Preisstufe " + costs.getString("level") : null; // e.g. "4" + + if (name != null && price != 0.0 && level != null) + { + fares.add(new Fare(name, Fare.Type.ADULT, Currency.getInstance("EUR"), price, level, null /* units */)); + } + else if (name != null && name.equals("NRW-Tarif") && text != null) + { + Matcher matcher = nrwTarifPattern.matcher(text); + if (matcher.find()) + { + fares.add(new Fare(name, Fare.Type.ADULT, Currency.getInstance("EUR"), Float.parseFloat(matcher.group(0).replace(",", ".")), + null /* level */, null /* units */)); + } + } + } + return fares; + } + protected static void parsePolygon(final String polygonStr, final List polygonArr) { if (polygonStr != null && !polygonStr.isEmpty()) diff --git a/enabler/test/de/schildbach/pte/live/VrsProviderLiveTest.java b/enabler/test/de/schildbach/pte/live/VrsProviderLiveTest.java index 7bb91fe5..4edbcb0b 100644 --- a/enabler/test/de/schildbach/pte/live/VrsProviderLiveTest.java +++ b/enabler/test/de/schildbach/pte/live/VrsProviderLiveTest.java @@ -418,6 +418,17 @@ public class VrsProviderLiveTest extends AbstractProviderLiveTest assertTrue(result.trips.size() > 0); } + @Test + public void testTripCologneWickede() throws Exception + { + final QueryTripsResult result = queryTrips(new Location(LocationType.STATION, "8"), null, new Location(LocationType.STATION, "10781"), + new Date(), true, EnumSet.of(Product.REGIONAL_TRAIN, Product.SUBURBAN_TRAIN, Product.SUBWAY, Product.TRAM), WalkSpeed.NORMAL, + Accessibility.NEUTRAL); + print(result); + assertEquals(QueryTripsResult.Status.OK, result.status); + assertTrue(result.trips.size() > 0); + } + @Test public void testTripByCoord() throws Exception {