
org.opentripplanner.api.mapping.FareMapper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of otp Show documentation
Show all versions of otp Show documentation
The OpenTripPlanner multimodal journey planning system
package org.opentripplanner.api.mapping;
import com.google.common.collect.Multimap;
import java.util.AbstractMap.SimpleEntry;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.opentripplanner.api.model.ApiCurrency;
import org.opentripplanner.api.model.ApiFareComponent;
import org.opentripplanner.api.model.ApiFareProduct;
import org.opentripplanner.api.model.ApiFareQualifier;
import org.opentripplanner.api.model.ApiItineraryFares;
import org.opentripplanner.api.model.ApiLegProducts;
import org.opentripplanner.api.model.ApiMoney;
import org.opentripplanner.ext.fares.model.FareContainer;
import org.opentripplanner.ext.fares.model.FareProduct;
import org.opentripplanner.ext.fares.model.RiderCategory;
import org.opentripplanner.model.plan.Itinerary;
import org.opentripplanner.model.plan.Leg;
import org.opentripplanner.routing.core.FareComponent;
import org.opentripplanner.routing.core.ItineraryFares;
import org.opentripplanner.routing.core.Money;
public class FareMapper {
private final Locale locale;
public FareMapper(Locale locale) {
this.locale = locale;
}
public ApiItineraryFares mapFare(Itinerary itinerary) {
var fares = itinerary.getFares();
Map apiFare = toApiMoneys(fares);
Map> apiComponent = toApiFareComponents(fares);
return new ApiItineraryFares(
apiFare,
apiComponent,
toApiFareProducts(fares.getItineraryProducts()),
toApiLegProducts(itinerary, fares.getLegProducts())
);
}
private List toApiLegProducts(
Itinerary itinerary,
Multimap legProducts
) {
if (legProducts.isEmpty()) {
return null;
} else {
return legProducts
.keySet()
.stream()
.map(leg -> {
var index = itinerary.getLegIndex(leg);
// eventually we want to implement products that span multiple legs (but not the entire itinerary)
return new ApiLegProducts(List.of(index), toApiFareProducts(legProducts.get(leg)));
})
.toList();
}
}
private static ApiFareQualifier toApiFareQualifier(@Nullable FareContainer nullable) {
return Optional
.ofNullable(nullable)
.map(c -> new ApiFareQualifier(c.id(), c.name()))
.orElse(null);
}
private static ApiFareQualifier toApiFareQualifier(@Nullable RiderCategory nullable) {
return Optional
.ofNullable(nullable)
.map(c -> new ApiFareQualifier(c.id(), c.name()))
.orElse(null);
}
private List toApiFareProducts(Collection product) {
if (product.isEmpty()) return null; else {
return product
.stream()
.map(p ->
new ApiFareProduct(
p.id().toString(),
p.name(),
toApiMoney(p.amount()),
toApiFareQualifier(p.category()),
toApiFareQualifier(p.container())
)
)
.toList();
}
}
private Map> toApiFareComponents(ItineraryFares fare) {
return fare
.getTypes()
.stream()
.map(key -> {
var money = fare.getDetails(key).stream().map(this::toApiFareComponent).toList();
return new SimpleEntry<>(key, money);
})
.collect(Collectors.toMap(e -> e.getKey().name(), Entry::getValue));
}
private Map toApiMoneys(ItineraryFares fare) {
return fare
.getTypes()
.stream()
.map(key -> {
var money = toApiMoney(fare.getFare(key));
return new SimpleEntry<>(key, money);
})
.collect(Collectors.toMap(e -> e.getKey().name(), Entry::getValue));
}
private ApiMoney toApiMoney(Money m) {
var c = m.currency();
return new ApiMoney(
m.cents(),
new ApiCurrency(
c.getCurrencyCode(),
c.getDefaultFractionDigits(),
c.getCurrencyCode(),
c.getSymbol(locale)
)
);
}
private ApiFareComponent toApiFareComponent(FareComponent m) {
return new ApiFareComponent(m.fareId(), m.name(), toApiMoney(m.price()), m.routes());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy