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

org.opentripplanner.graph_builder.module.TimeZoneAdjusterModule Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.graph_builder.module;

import jakarta.inject.Inject;
import java.time.Duration;
import java.time.Instant;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.Map;
import org.opentripplanner.graph_builder.model.GraphBuilderModule;
import org.opentripplanner.transit.model.network.TripPattern;
import org.opentripplanner.transit.service.TimetableRepository;

/**
 * Adjust all scheduled times to match the transit model timezone.
 */
public class TimeZoneAdjusterModule implements GraphBuilderModule {

  private final TimetableRepository timetableRepository;

  @Inject
  public TimeZoneAdjusterModule(TimetableRepository timetableRepository) {
    this.timetableRepository = timetableRepository;
  }

  @Override
  public void buildGraph() {
    // TODO: We assume that all time zones follow the same DST rules. In reality we need to split up
    //  the services for each DST transition
    final Instant serviceStart = timetableRepository.getTransitServiceStarts().toInstant();
    var graphOffset = Duration.ofSeconds(
      timetableRepository.getTimeZone().getRules().getOffset(serviceStart).getTotalSeconds()
    );

    Map agencyShift = new HashMap<>();

    timetableRepository
      .getAllTripPatterns()
      .forEach(pattern -> {
        var timeShift = agencyShift.computeIfAbsent(
          pattern.getRoute().getAgency().getTimezone(),
          zoneId ->
            (graphOffset.minusSeconds(zoneId.getRules().getOffset(serviceStart).getTotalSeconds()))
        );

        if (timeShift.isZero()) {
          return;
        }

        TripPattern updatedPattern = pattern
          .copy()
          .withScheduledTimeTableBuilder(builder ->
            builder.updateAllTripTimes(tt -> tt.adjustTimesToGraphTimeZone(timeShift))
          )
          .build();
        // replace the original pattern with the updated pattern in the transit model
        timetableRepository.addTripPattern(updatedPattern.getId(), updatedPattern);
      });
    timetableRepository.index();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy