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

org.opentripplanner.ext.flex.FlexAccessEgress Maven / Gradle / Ivy

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

import static org.opentripplanner.model.StopTime.MISSING_VALUE;

import java.util.Objects;
import org.opentripplanner.ext.flex.trip.FlexTrip;
import org.opentripplanner.street.search.state.State;
import org.opentripplanner.transit.model.site.RegularStop;
import org.opentripplanner.transit.model.timetable.booking.RoutingBookingInfo;
import org.opentripplanner.utils.tostring.ToStringBuilder;

public final class FlexAccessEgress {

  private final RegularStop stop;
  private final FlexPathDurations pathDurations;
  private final int boardStopPosition;
  private final int alightStopPosition;
  private final FlexTrip trip;
  private final State lastState;
  private final boolean stopReachedOnBoard;
  private final RoutingBookingInfo routingBookingInfo;

  public FlexAccessEgress(
    RegularStop stop,
    FlexPathDurations pathDurations,
    int boardStopPosition,
    int alightStopPosition,
    FlexTrip trip,
    State lastState,
    boolean stopReachedOnBoard,
    int requestedBookingTime
  ) {
    this.stop = stop;
    this.pathDurations = pathDurations;
    this.boardStopPosition = boardStopPosition;
    this.alightStopPosition = alightStopPosition;
    this.trip = Objects.requireNonNull(trip);
    this.lastState = lastState;
    this.stopReachedOnBoard = stopReachedOnBoard;
    this.routingBookingInfo = RoutingBookingInfo.of(
      requestedBookingTime,
      trip.getPickupBookingInfo(boardStopPosition)
    );
  }

  public RegularStop stop() {
    return stop;
  }

  public State lastState() {
    return lastState;
  }

  public boolean stopReachedOnBoard() {
    return stopReachedOnBoard;
  }

  public int earliestDepartureTime(int departureTime) {
    int tripDepartureTime = pathDurations.mapToFlexTripDepartureTime(departureTime);

    // Apply minimum-booking-notice
    tripDepartureTime = routingBookingInfo.earliestDepartureTime(tripDepartureTime);

    int earliestDepartureTime = trip.earliestDepartureTime(
      tripDepartureTime,
      boardStopPosition,
      alightStopPosition,
      pathDurations.trip()
    );
    if (earliestDepartureTime == MISSING_VALUE) {
      return MISSING_VALUE;
    }
    return pathDurations.mapToRouterDepartureTime(earliestDepartureTime);
  }

  public int latestArrivalTime(int arrivalTime) {
    int tripArrivalTime = pathDurations.mapToFlexTripArrivalTime(arrivalTime);
    int latestArrivalTime = trip.latestArrivalTime(
      tripArrivalTime,
      boardStopPosition,
      alightStopPosition,
      pathDurations.trip()
    );
    if (latestArrivalTime == MISSING_VALUE) {
      return MISSING_VALUE;
    }
    if (routingBookingInfo.exceedsMinimumBookingNotice(latestArrivalTime - pathDurations.trip())) {
      return MISSING_VALUE;
    }
    return pathDurations.mapToRouterArrivalTime(latestArrivalTime);
  }

  @Override
  public String toString() {
    return ToStringBuilder.of(FlexAccessEgress.class)
      .addNum("boardStopPosition", boardStopPosition)
      .addNum("alightStopPosition", alightStopPosition)
      .addObj("durations", pathDurations)
      .addObj("stop", stop)
      .addObj("trip", trip.getId())
      .addObj("lastState", lastState)
      .addBoolIfTrue("stopReachedOnBoard", stopReachedOnBoard)
      .toString();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy