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

org.opentripplanner.ext.vehicleparking.liipi.LiipiHubToVehicleParkingGroupMapper Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.ext.vehicleparking.liipi;

import com.bedatadriven.jackson.datatype.jts.parsers.GenericGeometryParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.locationtech.jts.geom.Geometry;
import org.opentripplanner.framework.geometry.GeometryUtils;
import org.opentripplanner.framework.geometry.WgsCoordinate;
import org.opentripplanner.framework.i18n.I18NString;
import org.opentripplanner.framework.i18n.NonLocalizedString;
import org.opentripplanner.framework.i18n.TranslatedString;
import org.opentripplanner.service.vehicleparking.model.VehicleParkingGroup;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Maps a Liipi Park hub into a {@link VehicleParkingGroup}.
 */
public class LiipiHubToVehicleParkingGroupMapper {

  private static final Logger log = LoggerFactory.getLogger(
    LiipiHubToVehicleParkingGroupMapper.class
  );

  private static final GenericGeometryParser GEOMETRY_PARSER = new GenericGeometryParser(
    GeometryUtils.getGeometryFactory()
  );

  private final String feedId;

  public LiipiHubToVehicleParkingGroupMapper(String feedId) {
    this.feedId = feedId;
  }

  public Map parseHub(JsonNode jsonNode) {
    var hubId = LiipiParkToVehicleParkingMapper.createIdForNode(jsonNode, "id", feedId);
    try {
      Map translations = new HashMap<>();
      JsonNode nameNode = jsonNode.path("name");
      nameNode
        .fieldNames()
        .forEachRemaining(lang -> {
          String name = nameNode.path(lang).asText();
          if (!name.isEmpty()) {
            translations.put(lang, nameNode.path(lang).asText());
          }
        });
      I18NString name = translations.isEmpty()
        ? new NonLocalizedString(hubId.getId())
        : TranslatedString.getI18NString(translations, true, false);
      Geometry geometry = GEOMETRY_PARSER.geometryFromJson(jsonNode.path("location"));
      var vehicleParkingGroup = VehicleParkingGroup.of(hubId)
        .withName(name)
        .withCoordinate(new WgsCoordinate(geometry.getCentroid()))
        .build();
      var vehicleParkingIds = getVehicleParkingIds((ArrayNode) jsonNode.get("facilityIds"), hubId);
      if (vehicleParkingIds == null) {
        return null;
      }

      var hubForPark = new HashMap();

      vehicleParkingIds.forEach(vehicleParkingId ->
        hubForPark.put(vehicleParkingId, vehicleParkingGroup)
      );

      return hubForPark;
    } catch (Exception e) {
      log.warn("Error parsing hub {}", hubId, e);
      return null;
    }
  }

  public List getVehicleParkingIds(ArrayNode facilityIdsNode, FeedScopedId hubId) {
    if (facilityIdsNode == null || !facilityIdsNode.isArray() || facilityIdsNode.isEmpty()) {
      log.warn("Hub {} contained no facilities", hubId);
      return null;
    }
    var vehicleParkingIds = new ArrayList();
    for (JsonNode jsonNode : facilityIdsNode) {
      vehicleParkingIds.add(new FeedScopedId(feedId, jsonNode.asText()));
    }
    return vehicleParkingIds;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy