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++) {
final JSONObject ovwTrfRef = ovwTrfRefList.getJSONObject(i);
final String type = ovwTrfRef.getString("type");
final int fareSetX = 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;
final JSONObject jsonFareSet = fareSetList.getJSONObject(ovwTrfRef.getInt("fareSetX"));
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 JSONObject jsonTicket = jsonFare.getJSONArray("ticketL").getJSONObject(ticketX);
final String ticketName = jsonTicket.getString("name");
@ -795,26 +793,41 @@ public abstract class AbstractHafasClientInterfaceProvider extends AbstractHafas
if (!Strings.isNullOrEmpty(currencyStr)) {
final Currency currency = Currency.getInstance(currencyStr);
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);
} else {
fare = null;
if (!hideFare(fare))
fares.add(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");
if (!Strings.isNullOrEmpty(currencyStr)) {
final Currency currency = ParserUtils.getCurrency(currencyStr);
final float price = jsonFare.getInt("prc") / 100f;
fare = new Fare(normalizeFareName(fareName), normalizeFareType(fareName), currency,
price, null, null);
} else {
fare = null;
final Fare fare = new Fare(normalizeFareName(fareName), normalizeFareType(fareName),
currency, price, null, null);
if (!hideFare(fare))
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 {
throw new IllegalArgumentException("cannot handle type: " + type);
}
if (fare != null && !hideFare(fare))
fares.add(fare);
}
} else {
fares = null;

View file

@ -149,6 +149,18 @@ public class VbbProviderLiveTest extends AbstractProviderLiveTest {
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
public void shortFootwayTrip() throws Exception {
final Location from = new Location(LocationType.ADDRESS, null, Point.from1E6(52435193, 13473409),