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

org.opentripplanner.transit.model.timetable.ScheduledTripTimesBuilder Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.transit.model.timetable;

import java.util.BitSet;
import java.util.List;
import javax.annotation.Nullable;
import org.opentripplanner.framework.i18n.I18NString;
import org.opentripplanner.transit.model.framework.DeduplicatorService;
import org.opentripplanner.transit.model.timetable.booking.BookingInfo;
import org.opentripplanner.utils.time.TimeUtils;

public class ScheduledTripTimesBuilder {

  private static final int NOT_SET = -1;
  private static final BitSet EMPTY_BIT_SET = new BitSet(0);

  private int timeShift;
  private int serviceCode;
  private int[] arrivalTimes;
  private int[] departureTimes;
  private BitSet timepoints;
  private Trip trip;
  private List dropOffBookingInfos;
  private List pickupBookingInfos;
  private I18NString[] headsigns;
  private String[][] headsignVias;
  private int[] gtfsSequenceOfStopIndex;
  private final DeduplicatorService deduplicator;

  ScheduledTripTimesBuilder(@Nullable DeduplicatorService deduplicator) {
    this(0, NOT_SET, null, null, null, null, null, null, null, null, null, deduplicator);
  }

  ScheduledTripTimesBuilder(
    int timeShift,
    int serviceCode,
    int[] arrivalTimes,
    int[] departureTimes,
    BitSet timepoints,
    Trip trip,
    List dropOffBookingInfos,
    List pickupBookingInfos,
    I18NString[] headsigns,
    String[][] headsignVias,
    int[] gtfsSequenceOfStopIndex,
    DeduplicatorService deduplicator
  ) {
    this.timeShift = timeShift;
    this.serviceCode = serviceCode;
    this.arrivalTimes = arrivalTimes;
    this.departureTimes = departureTimes;
    this.timepoints = timepoints;
    this.trip = trip;
    this.dropOffBookingInfos = dropOffBookingInfos;
    this.pickupBookingInfos = pickupBookingInfos;
    this.headsigns = headsigns;
    this.headsignVias = headsignVias;
    this.gtfsSequenceOfStopIndex = gtfsSequenceOfStopIndex;
    this.deduplicator = deduplicator == null ? DeduplicatorService.NOOP : deduplicator;
  }

  public int timeShift() {
    return timeShift;
  }

  public ScheduledTripTimesBuilder withTimeShift(int timeShift) {
    this.timeShift = timeShift;
    return this;
  }

  /**
   * Add the {@code delta} to the existing timeShift. This is useful when moving a trip
   * from one time-zone to another.
   */
  public ScheduledTripTimesBuilder plusTimeShift(int delta) {
    this.timeShift += delta;
    return this;
  }

  public int serviceCode() {
    return serviceCode;
  }

  public ScheduledTripTimesBuilder withServiceCode(int serviceCode) {
    this.serviceCode = serviceCode;
    return this;
  }

  public int[] arrivalTimes() {
    return arrivalTimes;
  }

  public ScheduledTripTimesBuilder withArrivalTimes(int[] arrivalTimes) {
    this.arrivalTimes = deduplicator.deduplicateIntArray(arrivalTimes);
    return this;
  }

  /** For unit testing, uses {@link TimeUtils#time(java.lang.String)}. */
  public ScheduledTripTimesBuilder withArrivalTimes(String arrivalTimes) {
    return withArrivalTimes(TimeUtils.times(arrivalTimes));
  }

  public int[] departureTimes() {
    return departureTimes;
  }

  public ScheduledTripTimesBuilder withDepartureTimes(int[] departureTimes) {
    this.departureTimes = deduplicator.deduplicateIntArray(departureTimes);
    return this;
  }

  /** For unit testing, uses {@link TimeUtils#time(java.lang.String)}. */
  public ScheduledTripTimesBuilder withDepartureTimes(String departureTimes) {
    return withDepartureTimes(TimeUtils.times(departureTimes));
  }

  public BitSet timepoints() {
    return timepoints == null ? EMPTY_BIT_SET : timepoints;
  }

  public ScheduledTripTimesBuilder withTimepoints(BitSet timepoints) {
    this.timepoints = deduplicator.deduplicateBitSet(timepoints);
    return this;
  }

  public Trip trip() {
    return trip;
  }

  public ScheduledTripTimesBuilder withTrip(Trip trip) {
    this.trip = trip;
    return this;
  }

  public List dropOffBookingInfos() {
    return dropOffBookingInfos == null ? List.of() : dropOffBookingInfos;
  }

  public ScheduledTripTimesBuilder withDropOffBookingInfos(List dropOffBookingInfos) {
    this.dropOffBookingInfos = deduplicator.deduplicateImmutableList(
      BookingInfo.class,
      dropOffBookingInfos
    );
    return this;
  }

  public List pickupBookingInfos() {
    return pickupBookingInfos == null ? List.of() : pickupBookingInfos;
  }

  public ScheduledTripTimesBuilder withPickupBookingInfos(List pickupBookingInfos) {
    this.pickupBookingInfos = deduplicator.deduplicateImmutableList(
      BookingInfo.class,
      pickupBookingInfos
    );
    return this;
  }

  public I18NString[] headsigns() {
    return headsigns;
  }

  public ScheduledTripTimesBuilder withHeadsigns(I18NString[] headsigns) {
    this.headsigns = deduplicator.deduplicateObjectArray(I18NString.class, headsigns);
    return this;
  }

  public String[][] headsignVias() {
    return headsignVias;
  }

  public ScheduledTripTimesBuilder withHeadsignVias(String[][] headsignVias) {
    this.headsignVias = deduplicator.deduplicateString2DArray(headsignVias);
    return this;
  }

  public int[] gtfsSequenceOfStopIndex() {
    return gtfsSequenceOfStopIndex;
  }

  public ScheduledTripTimesBuilder withGtfsSequenceOfStopIndex(int[] gtfsSequenceOfStopIndex) {
    this.gtfsSequenceOfStopIndex = deduplicator.deduplicateIntArray(gtfsSequenceOfStopIndex);
    return this;
  }

  public ScheduledTripTimes build() {
    normalizeTimes();
    return new ScheduledTripTimes(this);
  }

  /**
   * Times are always shifted to zero based on the first departure time. This is essential for
   * frequencies and deduplication.
   */
  private void normalizeTimes() {
    if (departureTimes == null) {
      this.departureTimes = arrivalTimes;
    }
    if (arrivalTimes == null) {
      this.arrivalTimes = departureTimes;
    }

    int shift = departureTimes[0];
    if (shift == 0) {
      return;
    }
    this.departureTimes = timeShift(departureTimes, shift);
    if (arrivalTimes != departureTimes) {
      this.arrivalTimes = timeShift(arrivalTimes, shift);
    }
    this.timeShift += shift;
  }

  int[] timeShift(int[] a, int shift) {
    if (shift == 0) {
      return a;
    }
    for (int i = 0; i < a.length; i++) {
      a[i] -= shift;
    }
    return a;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy