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

org.opentripplanner.ext.siri.updater.azure.SiriAzureETUpdater Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.ext.siri.updater.azure;

import java.util.List;
import java.util.Objects;
import java.util.concurrent.Future;
import java.util.function.Consumer;
import javax.annotation.Nullable;
import org.opentripplanner.updater.spi.ResultLogger;
import org.opentripplanner.updater.spi.UpdateResult;
import org.opentripplanner.updater.spi.WriteToGraphCallback;
import org.opentripplanner.updater.trip.UpdateIncrementality;
import org.opentripplanner.updater.trip.metrics.TripUpdateMetrics;
import org.opentripplanner.updater.trip.siri.SiriRealTimeTripUpdateAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.org.siri.siri20.EstimatedTimetableDeliveryStructure;
import uk.org.siri.siri20.ServiceDelivery;

public class SiriAzureETUpdater implements SiriAzureMessageHandler {

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

  private final SiriRealTimeTripUpdateAdapter adapter;
  private final Consumer recordMetrics;
  private final boolean fuzzyTripMatching;
  private final String feedId;

  private WriteToGraphCallback writeToGraphCallback;

  public SiriAzureETUpdater(
    SiriAzureETUpdaterParameters config,
    SiriRealTimeTripUpdateAdapter adapter
  ) {
    this.adapter = adapter;
    this.recordMetrics = TripUpdateMetrics.streaming(config);
    this.fuzzyTripMatching = config.isFuzzyTripMatching();
    this.feedId = Objects.requireNonNull(config.feedId(), "feedId must not be null");
  }

  @Override
  public void setup(WriteToGraphCallback writeToGraphCallback) {
    this.writeToGraphCallback = writeToGraphCallback;
  }

  @Override
  @Nullable
  public Future handleMessage(ServiceDelivery serviceDelivery, String messageId) {
    var etDeliveries = serviceDelivery.getEstimatedTimetableDeliveries();
    if (etDeliveries == null || etDeliveries.isEmpty()) {
      LOG.info("Empty Siri ET message {}", messageId);
      return null;
    } else {
      return processMessage(etDeliveries);
    }
  }

  private Future processMessage(List updates) {
    return writeToGraphCallback.execute(context -> {
      var result = adapter.applyEstimatedTimetable(
        fuzzyTripMatching ? context.siriFuzzyTripMatcher() : null,
        context.entityResolver(feedId),
        feedId,
        UpdateIncrementality.DIFFERENTIAL,
        updates
      );
      ResultLogger.logUpdateResultErrors(feedId, "siri-et", result);
      recordMetrics.accept(result);
    });
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy