AbstractHafasClientInterfaceProvider: support fare references of type FS (fare set)

This commit is contained in:
Andreas Schildbach 2024-08-30 19:22:20 +02:00
parent f2617c20a6
commit 11b3908135
2 changed files with 40 additions and 15 deletions

View file

@ -781,13 +781,11 @@ public abstract class AbstractHafasClientInterfaceProvider extends AbstractHafas
for (int i = 0; i < ovwTrfRefList.length(); i++) { for (int i = 0; i < ovwTrfRefList.length(); i++) {
final JSONObject ovwTrfRef = ovwTrfRefList.getJSONObject(i); final JSONObject ovwTrfRef = ovwTrfRefList.getJSONObject(i);
final String type = ovwTrfRef.getString("type"); final String type = ovwTrfRef.getString("type");
final int fareSetX = ovwTrfRef.getInt("fareSetX"); final JSONObject jsonFareSet = fareSetList.getJSONObject(ovwTrfRef.getInt("fareSetX"));
final int fareX = ovwTrfRef.getInt("fareX");
final JSONObject jsonFareSet = fareSetList.getJSONObject(fareSetX);
final JSONObject jsonFare = jsonFareSet.getJSONArray("fareL").getJSONObject(fareX);
final String fareName = jsonFare.getString("name");
final Fare fare;
if (type.equals("T")) { // ticket if (type.equals("T")) { // ticket
final JSONObject jsonFare =
jsonFareSet.getJSONArray("fareL").getJSONObject(ovwTrfRef.getInt("fareX"));
final String fareName = jsonFare.getString("name");
final int ticketX = ovwTrfRef.getInt("ticketX"); final int ticketX = ovwTrfRef.getInt("ticketX");
final JSONObject jsonTicket = jsonFare.getJSONArray("ticketL").getJSONObject(ticketX); final JSONObject jsonTicket = jsonFare.getJSONArray("ticketL").getJSONObject(ticketX);
final String ticketName = jsonTicket.getString("name"); final String ticketName = jsonTicket.getString("name");
@ -795,26 +793,41 @@ public abstract class AbstractHafasClientInterfaceProvider extends AbstractHafas
if (!Strings.isNullOrEmpty(currencyStr)) { if (!Strings.isNullOrEmpty(currencyStr)) {
final Currency currency = Currency.getInstance(currencyStr); final Currency currency = Currency.getInstance(currencyStr);
final float price = jsonTicket.getInt("prc") / 100f; final float price = jsonTicket.getInt("prc") / 100f;
fare = new Fare(normalizeFareName(fareName) + '\n' + ticketName, final Fare fare = new Fare(normalizeFareName(fareName) + '\n' + ticketName,
normalizeFareType(ticketName), currency, price, null, null); normalizeFareType(ticketName), currency, price, null, null);
} else { if (!hideFare(fare))
fare = null; fares.add(fare);
} }
} else if (type.equals("F")) { // fare } else if (type.equals("F")) { // fare
final JSONObject jsonFare =
jsonFareSet.getJSONArray("fareL").getJSONObject(ovwTrfRef.getInt("fareX"));
final String fareName = jsonFare.getString("name");
final String currencyStr = jsonFare.optString("cur"); final String currencyStr = jsonFare.optString("cur");
if (!Strings.isNullOrEmpty(currencyStr)) { if (!Strings.isNullOrEmpty(currencyStr)) {
final Currency currency = ParserUtils.getCurrency(currencyStr); final Currency currency = ParserUtils.getCurrency(currencyStr);
final float price = jsonFare.getInt("prc") / 100f; final float price = jsonFare.getInt("prc") / 100f;
fare = new Fare(normalizeFareName(fareName), normalizeFareType(fareName), currency, final Fare fare = new Fare(normalizeFareName(fareName), normalizeFareType(fareName),
price, null, null); currency, price, null, null);
} else { if (!hideFare(fare))
fare = null; fares.add(fare);
}
} else if (type.equals("FS")) { // fare set
final String fareSetName = jsonFareSet.getString("name");
final JSONArray fareList = jsonFareSet.getJSONArray("fareL");
for (int iFare = 0; iFare < fareList.length(); iFare++) {
final JSONObject jsonFare = fareList.getJSONObject(iFare);
final String fareName = jsonFare.getString("name");
final String currencyStr = jsonFare.optString("cur");
final Currency currency = ParserUtils.getCurrency(currencyStr);
final float price = jsonFare.getInt("prc") / 100f;
final Fare fare = new Fare(normalizeFareName(fareSetName), normalizeFareType(fareName),
currency, price, null, null);
if (!hideFare(fare))
fares.add(fare);
} }
} else { } else {
throw new IllegalArgumentException("cannot handle type: " + type); throw new IllegalArgumentException("cannot handle type: " + type);
} }
if (fare != null && !hideFare(fare))
fares.add(fare);
} }
} else { } else {
fares = null; fares = null;

View file

@ -149,6 +149,18 @@ public class VbbProviderLiveTest extends AbstractProviderLiveTest {
print(earlierResult); print(earlierResult);
} }
@Test
public void tripBeelitzPotsdam() throws Exception {
final Location from = new Location(LocationType.STATION, "900220005", "Beelitz", "Bahnhof");
final Location to = new Location(LocationType.STATION, "900220010", "Potsdam", "Golm");
final QueryTripsResult result = queryTrips(from, null, to, new Date(), true, null);
print(result);
final QueryTripsResult laterResult = queryMoreTrips(result.context, true);
print(laterResult);
final QueryTripsResult earlierResult = queryMoreTrips(laterResult.context, false);
print(earlierResult);
}
@Test @Test
public void shortFootwayTrip() throws Exception { public void shortFootwayTrip() throws Exception {
final Location from = new Location(LocationType.ADDRESS, null, Point.from1E6(52435193, 13473409), final Location from = new Location(LocationType.ADDRESS, null, Point.from1E6(52435193, 13473409),