
org.opentripplanner.updater.vehicle_rental.datasources.GbfsFreeVehicleStatusMapper Maven / Gradle / Ivy
The newest version!
package org.opentripplanner.updater.vehicle_rental.datasources;
import static java.util.Objects.requireNonNullElse;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import org.mobilitydata.gbfs.v2_3.free_bike_status.GBFSBike;
import org.mobilitydata.gbfs.v2_3.free_bike_status.GBFSRentalUris;
import org.opentripplanner.framework.i18n.NonLocalizedString;
import org.opentripplanner.service.vehiclerental.model.RentalVehicleFuel;
import org.opentripplanner.service.vehiclerental.model.RentalVehicleType;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalStationUris;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalSystem;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalVehicle;
import org.opentripplanner.transit.model.basic.Distance;
import org.opentripplanner.transit.model.basic.Ratio;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.utils.logging.Throttle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GbfsFreeVehicleStatusMapper {
private static final Logger LOG = LoggerFactory.getLogger(GbfsFreeVehicleStatusMapper.class);
private static final Throttle LOG_THROTTLE = Throttle.ofOneMinute();
private final VehicleRentalSystem system;
private final Map vehicleTypes;
public GbfsFreeVehicleStatusMapper(
VehicleRentalSystem system,
@Nullable Map vehicleTypes
) {
this.system = system;
this.vehicleTypes = new HashMap<>(requireNonNullElse(vehicleTypes, Map.of()));
}
public VehicleRentalVehicle mapFreeVehicleStatus(GBFSBike vehicle) {
if (
(vehicle.getStationId() == null || vehicle.getStationId().isBlank()) &&
vehicle.getLon() != null &&
vehicle.getLat() != null
) {
VehicleRentalVehicle rentalVehicle = new VehicleRentalVehicle();
rentalVehicle.id = new FeedScopedId(system.systemId, vehicle.getBikeId());
rentalVehicle.system = system;
rentalVehicle.name = new NonLocalizedString(getName(vehicle));
rentalVehicle.longitude = vehicle.getLon();
rentalVehicle.latitude = vehicle.getLat();
rentalVehicle.vehicleType = vehicleTypes.getOrDefault(
vehicle.getVehicleTypeId(),
RentalVehicleType.getDefaultType(system.systemId)
);
rentalVehicle.isReserved = vehicle.getIsReserved() != null ? vehicle.getIsReserved() : false;
rentalVehicle.isDisabled = vehicle.getIsDisabled() != null ? vehicle.getIsDisabled() : false;
rentalVehicle.lastReported = vehicle.getLastReported() != null
? Instant.ofEpochSecond((long) (double) vehicle.getLastReported())
: null;
var fuelRatio = Ratio.ofBoxed(vehicle.getCurrentFuelPercent(), validationErrorMessage ->
LOG_THROTTLE.throttle(() ->
LOG.warn("'currentFuelPercent' is not valid. Details: {}", validationErrorMessage)
)
).orElse(null);
var rangeMeters = Distance.ofMetersBoxed(vehicle.getCurrentRangeMeters(), error -> {
LOG_THROTTLE.throttle(() ->
LOG.warn(
"Current range meter value not valid: {} - {}",
vehicle.getCurrentRangeMeters(),
error
)
);
}).orElse(null);
// if the propulsion type has an engine current_range_meters is required
if (
vehicle.getVehicleTypeId() != null &&
vehicleTypes.get(vehicle.getVehicleTypeId()) != null &&
vehicleTypes.get(vehicle.getVehicleTypeId()).propulsionType !=
RentalVehicleType.PropulsionType.HUMAN &&
rangeMeters == null
) {
return null;
}
rentalVehicle.fuel = new RentalVehicleFuel(fuelRatio, rangeMeters);
rentalVehicle.pricingPlanId = vehicle.getPricingPlanId();
GBFSRentalUris rentalUris = vehicle.getRentalUris();
if (rentalUris != null) {
String androidUri = rentalUris.getAndroid();
String iosUri = rentalUris.getIos();
String webUri = rentalUris.getWeb();
rentalVehicle.rentalUris = new VehicleRentalStationUris(androidUri, iosUri, webUri);
}
return rentalVehicle;
} else {
return null;
}
}
private String getName(GBFSBike vehicle) {
var typeId = vehicle.getVehicleTypeId();
if (typeId != null) {
var type = vehicleTypes.get(typeId);
if (type != null && type.name != null) {
return type.name;
}
}
return RentalVehicleType.getDefaultType(system.systemId).name;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy