From e3337c202dace08c218b06ea158065bbcc1a52d4 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 18 Feb 2016 19:52:24 +0100 Subject: [PATCH] SH: Parse fares. --- .../schildbach/pte/AbstractHafasProvider.java | 28 ++++++++++++------- enabler/src/de/schildbach/pte/ShProvider.java | 18 ++++++++++++ .../pte/live/ShProviderLiveTest.java | 8 ++++++ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java index a46fea96..3842ec8f 100644 --- a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java @@ -1272,24 +1272,20 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider for (int iFareSet = 0; iFareSet < fareSetList.length(); iFareSet++) { final JSONObject fareSet = fareSetList.getJSONObject(iFareSet); - final String network = fareSet.optString("name", null); - if (network != null) + final String fareSetName = fareSet.optString("name", null); + final String fareSetDescription = fareSet.optString("desc", null); + if (fareSetName != null || fareSetDescription != null) { final JSONArray fareList = fareSet.getJSONArray("fareL"); for (int iFare = 0; iFare < fareList.length(); iFare++) { final JSONObject jsonFare = fareList.getJSONObject(iFare); final String name = jsonFare.getString("name"); - if (name.endsWith("- Jahreskarte") || name.endsWith("- Monatskarte")) - continue; - final Currency currency = Currency.getInstance(jsonFare.getString("cur")); final float price = jsonFare.getInt("prc") / 100f; - - if (name.startsWith("Vollpreis - ")) - fares.add(new Fare(network, Fare.Type.ADULT, currency, price, name.substring(12), null)); - else if (name.startsWith("Kind - ")) - fares.add(new Fare(network, Fare.Type.CHILD, currency, price, name.substring(7), null)); + final Fare fare = parseJsonTripFare(fareSetName, fareSetDescription, name, currency, price); + if (fare != null) + fares.add(fare); } } } @@ -1308,6 +1304,18 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider } } + protected Fare parseJsonTripFare(final @Nullable String fareSetName, final @Nullable String fareSetDescription, final String name, + final Currency currency, final float price) + { + if (name.endsWith("- Jahreskarte") || name.endsWith("- Monatskarte")) + return null; + if (name.startsWith("Vollpreis - ")) + return new Fare(fareSetName, Fare.Type.ADULT, currency, price, name.substring(12), null); + if (name.startsWith("Kind - ")) + return new Fare(fareSetName, Fare.Type.CHILD, currency, price, name.substring(7), null); + return null; + } + private String wrapJsonApiRequest(final String meth, final String req, final boolean formatted) { return "{" // diff --git a/enabler/src/de/schildbach/pte/ShProvider.java b/enabler/src/de/schildbach/pte/ShProvider.java index f91187bd..5c73e035 100644 --- a/enabler/src/de/schildbach/pte/ShProvider.java +++ b/enabler/src/de/schildbach/pte/ShProvider.java @@ -18,6 +18,7 @@ package de.schildbach.pte; import java.io.IOException; +import java.util.Currency; import java.util.Date; import java.util.EnumSet; import java.util.HashMap; @@ -29,6 +30,8 @@ import javax.annotation.Nullable; import com.google.common.base.Charsets; +import de.schildbach.pte.dto.Fare; +import de.schildbach.pte.dto.Fare.Type; import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyLocationsResult; @@ -131,6 +134,21 @@ public class ShProvider extends AbstractHafasProvider later ? jsonContext.laterContext : jsonContext.earlierContext); } + @Override + protected Fare parseJsonTripFare(final @Nullable String fareSetName, final @Nullable String fareSetDescription, String name, + final Currency currency, final float price) + { + if (!"Normalpreis".equals(fareSetDescription) || !name.startsWith("Einzelfahrkarte ")) + return null; + name = name.substring(16); + if (name.startsWith("Übergang")) + return null; + if (name.startsWith("Kind ")) + return new Fare("SH-Tarif", Type.CHILD, currency, price, name.substring(5), null); + else + return new Fare("SH-Tarif", Type.ADULT, currency, price, name, null); + } + protected static final Map STYLES = new HashMap(); static diff --git a/enabler/test/de/schildbach/pte/live/ShProviderLiveTest.java b/enabler/test/de/schildbach/pte/live/ShProviderLiveTest.java index e0d4c5da..971897b8 100644 --- a/enabler/test/de/schildbach/pte/live/ShProviderLiveTest.java +++ b/enabler/test/de/schildbach/pte/live/ShProviderLiveTest.java @@ -115,4 +115,12 @@ public class ShProviderLiveTest extends AbstractProviderLiveTest final QueryTripsResult laterResult = queryMoreTrips(result.context, true); print(laterResult); } + + @Test + public void tripKiel() throws Exception + { + final QueryTripsResult result = queryTrips(new Location(LocationType.STATION, "3490015"), null, new Location(LocationType.STATION, "706923"), + new Date(), true, Product.ALL, WalkSpeed.NORMAL, Accessibility.NEUTRAL); + print(result); + } }