All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.ext.smoovebikerental.SmooveBikeRentalDataSource Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.ext.smoovebikerental;

import com.fasterxml.jackson.databind.JsonNode;
import java.util.Map;
import org.opentripplanner.framework.i18n.NonLocalizedString;
import org.opentripplanner.framework.io.OtpHttpClient;
import org.opentripplanner.framework.io.OtpHttpClientFactory;
import org.opentripplanner.service.vehiclerental.model.RentalVehicleType;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalPlace;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalStation;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalSystem;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.updater.spi.DataSource;
import org.opentripplanner.updater.spi.GenericJsonDataSource;
import org.opentripplanner.updater.vehicle_rental.datasources.VehicleRentalDatasource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Implementation of a VehicleRentalDataSource for the Smoove GIR SabiWeb used in Helsinki.
 *
 * @see DataSource
 */
public class SmooveBikeRentalDataSource
  extends GenericJsonDataSource
  implements VehicleRentalDatasource {

  private static final Logger LOG = LoggerFactory.getLogger(SmooveBikeRentalDataSource.class);

  public static final String DEFAULT_NETWORK_NAME = "smoove";

  private final boolean overloadingAllowed;

  private final String networkName;
  private final RentalVehicleType vehicleType;
  private final VehicleRentalSystem system;

  public SmooveBikeRentalDataSource(SmooveBikeRentalDataSourceParameters config) {
    this(config, new OtpHttpClientFactory());
  }

  public SmooveBikeRentalDataSource(
    SmooveBikeRentalDataSourceParameters config,
    OtpHttpClientFactory otpHttpClientFactory
  ) {
    super(config.url(), "result", config.httpHeaders(), otpHttpClientFactory.create(LOG));
    networkName = config.getNetwork(DEFAULT_NETWORK_NAME);
    vehicleType = RentalVehicleType.getDefaultType(networkName);
    overloadingAllowed = config.overloadingAllowed();
    system = new VehicleRentalSystem(
      networkName,
      "fi",
      "Helsinki/Espoo",
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      "Europe/Helsinki",
      null,
      null,
      null
    );
  }

  /**
   * 
   * {
   *    "result" : [
   *       {
   *          "name" : "004 Hamn",
   *          "operative" : true,
   *          "coordinates" : "60.167913,24.952269",
   *          "style" : "",
   *          "avl_bikes" : 1,
   *          "free_slots" : 11,
   *          "total_slots" : 12,
   *       },
   *       ...
   *    ]
   * }
   * 
*/ @Override protected VehicleRentalStation parseElement(JsonNode node) { VehicleRentalStation station = new VehicleRentalStation(); String[] nameParts = node.path("name").asText().split("\\s", 2); station.id = new FeedScopedId(networkName, nameParts[0]); station.name = new NonLocalizedString(nameParts[1]); String[] coordinates = node.path("coordinates").asText().split(","); try { station.latitude = Double.parseDouble(coordinates[0].trim()); station.longitude = Double.parseDouble(coordinates[1].trim()); } catch (NumberFormatException e) { // E.g. coordinates is empty LOG.warn("Error parsing bike rental station {}", station.id, e); return null; } if (!node.path("style").asText().equals("Station on")) { station.isRenting = false; station.isReturning = false; station.vehiclesAvailable = 0; station.spacesAvailable = 0; station.capacity = node.path("total_slots").asInt(); } else { station.vehiclesAvailable = node.path("avl_bikes").asInt(); station.spacesAvailable = node.path("free_slots").asInt(); station.capacity = node.path("total_slots").asInt(); } station.vehicleTypesAvailable = Map.of(vehicleType, station.vehiclesAvailable); station.vehicleSpacesAvailable = Map.of(vehicleType, station.spacesAvailable); station.overloadingAllowed = overloadingAllowed; station.system = system; return station; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy