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

org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationService Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.ext.stopconsolidation.internal;

import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;
import javax.annotation.Nonnull;
import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository;
import org.opentripplanner.ext.stopconsolidation.StopConsolidationService;
import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup;
import org.opentripplanner.ext.stopconsolidation.model.StopReplacement;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.transit.model.organization.Agency;
import org.opentripplanner.transit.model.site.StopLocation;
import org.opentripplanner.transit.service.TransitModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DefaultStopConsolidationService implements StopConsolidationService {

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

  private final StopConsolidationRepository repo;
  private final TransitModel transitModel;

  public DefaultStopConsolidationService(
    StopConsolidationRepository repo,
    TransitModel transitModel
  ) {
    this.repo = Objects.requireNonNull(repo);
    this.transitModel = Objects.requireNonNull(transitModel);
  }

  @Override
  public List replacements() {
    return repo
      .groups()
      .stream()
      .flatMap(group -> {
        var primaryStop = transitModel.getStopModel().getRegularStop(group.primary());
        if (primaryStop == null) {
          LOG.error(
            "Could not find primary stop with id {}. Ignoring stop group {}.",
            group.primary(),
            group
          );
          return Stream.empty();
        } else {
          return group.secondaries().stream().map(r -> new StopReplacement(primaryStop, r));
        }
      })
      .toList();
  }

  @Override
  public List secondaryStops() {
    return replacements().stream().map(StopReplacement::secondary).toList();
  }

  @Override
  public boolean isPrimaryStop(StopLocation stop) {
    return repo.groups().stream().anyMatch(r -> r.primary().equals(stop.getId()));
  }

  @Override
  public boolean isSecondaryStop(StopLocation stop) {
    return repo.groups().stream().anyMatch(r -> r.secondaries().contains(stop.getId()));
  }

  @Override
  public boolean isPartOfConsolidatedStop(StopLocation sl) {
    return isSecondaryStop(sl) || isPrimaryStop(sl);
  }

  @Override
  public boolean isActive() {
    return !repo.groups().isEmpty();
  }

  @Override
  public StopLocation agencySpecificStop(StopLocation stop, Agency agency) {
    if (agency.getId().getFeedId().equals(stop.getId().getFeedId())) {
      return stop;
    } else {
      return findAgencySpecificStop(stop, agency).orElse(stop);
    }
  }

  @Nonnull
  private Optional findAgencySpecificStop(StopLocation stop, Agency agency) {
    return repo
      .groups()
      .stream()
      .filter(r -> r.primary().equals(stop.getId()))
      .flatMap(g -> g.secondaries().stream())
      .filter(secondary -> secondary.getFeedId().equals(agency.getId().getFeedId()))
      .findAny()
      .map(id -> transitModel.getStopModel().getRegularStop(id));
  }

  @Override
  public Optional primaryStop(FeedScopedId id) {
    var primaryId = repo
      .groups()
      .stream()
      .filter(g -> g.secondaries().contains(id))
      .map(ConsolidatedStopGroup::primary)
      .findAny()
      .orElse(id);
    return Optional.ofNullable(transitModel.getStopModel().getRegularStop(primaryId));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy