OTP Debug
-
-
+
+
diff --git a/application/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java b/application/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java
index f742ddb131a..50452899deb 100644
--- a/application/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java
+++ b/application/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java
@@ -18,7 +18,7 @@
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.codecs.Codec;
import org.apache.lucene.codecs.PostingsFormat;
-import org.apache.lucene.codecs.lucene912.Lucene912Codec;
+import org.apache.lucene.codecs.lucene101.Lucene101Codec;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StoredField;
@@ -34,7 +34,7 @@
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.suggest.document.Completion912PostingsFormat;
+import org.apache.lucene.search.suggest.document.Completion101PostingsFormat;
import org.apache.lucene.search.suggest.document.CompletionAnalyzer;
import org.apache.lucene.search.suggest.document.ContextQuery;
import org.apache.lucene.search.suggest.document.ContextSuggestField;
@@ -203,8 +203,8 @@ private StopCluster toStopCluster(Document document) {
static IndexWriterConfig iwcWithSuggestField(Analyzer analyzer, final Set suggestFields) {
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
- Codec filterCodec = new Lucene912Codec() {
- final PostingsFormat postingsFormat = new Completion912PostingsFormat();
+ Codec filterCodec = new Lucene101Codec() {
+ final PostingsFormat postingsFormat = new Completion101PostingsFormat();
@Override
public PostingsFormat getPostingsFormatForField(String field) {
@@ -285,7 +285,7 @@ private Stream matchingDocuments(
.stream(topDocs.scoreDocs)
.map(scoreDoc -> {
try {
- return searcher.doc(scoreDoc.doc);
+ return searcher.storedFields().document(scoreDoc.doc);
} catch (IOException e) {
throw new RuntimeException(e);
}
@@ -330,7 +330,7 @@ private Stream matchingDocuments(
.stream(topDocs.scoreDocs)
.map(scoreDoc -> {
try {
- return searcher.doc(scoreDoc.doc);
+ return searcher.storedFields().document(scoreDoc.doc);
} catch (IOException e) {
throw new RuntimeException(e);
}
diff --git a/application/src/ext/java/org/opentripplanner/ext/parkAndRideApi/ParkAndRideResource.java b/application/src/ext/java/org/opentripplanner/ext/parkAndRideApi/ParkAndRideResource.java
index 747ba0617ec..611f4d46420 100644
--- a/application/src/ext/java/org/opentripplanner/ext/parkAndRideApi/ParkAndRideResource.java
+++ b/application/src/ext/java/org/opentripplanner/ext/parkAndRideApi/ParkAndRideResource.java
@@ -42,7 +42,7 @@ public ParkAndRideResource(
// - serverContext.graphFinder(). This needs at least a comment!
// - This can be replaced with a search done with the SiteRepository
// - if we have a radius search there.
- this.graphFinder = new DirectGraphFinder(serverContext.transitService()::findRegularStops);
+ this.graphFinder = new DirectGraphFinder(serverContext.transitService()::findRegularStopsByBoundingBox);
}
/** Envelopes are in latitude, longitude format */
diff --git a/application/src/ext/java/org/opentripplanner/ext/restapi/resources/IndexAPI.java b/application/src/ext/java/org/opentripplanner/ext/restapi/resources/IndexAPI.java
index 7dbfabed156..b9c049f547e 100644
--- a/application/src/ext/java/org/opentripplanner/ext/restapi/resources/IndexAPI.java
+++ b/application/src/ext/java/org/opentripplanner/ext/restapi/resources/IndexAPI.java
@@ -200,7 +200,7 @@ public List getStopsInRadius(
radius = Math.min(radius, MAX_STOP_SEARCH_RADIUS);
- return new DirectGraphFinder(serverContext.transitService()::findRegularStops)
+ return new DirectGraphFinder(serverContext.transitService()::findRegularStopsByBoundingBox)
.findClosestStops(new Coordinate(lon, lat), radius)
.stream()
.map(it -> StopMapper.mapToApiShort(it.stop, it.distance))
@@ -221,10 +221,9 @@ public List getStopsInRadius(
new Coordinate(maxLon, maxLat)
);
- var stops = transitService().findRegularStops(envelope);
+ var stops = transitService().findRegularStopsByBoundingBox(envelope);
return stops
.stream()
- .filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()))
.map(StopMapper::mapToApiShort)
.toList();
}
diff --git a/application/src/ext/java/org/opentripplanner/ext/vectortiles/layers/stops/StopsLayerBuilder.java b/application/src/ext/java/org/opentripplanner/ext/vectortiles/layers/stops/StopsLayerBuilder.java
index 141157f8f3e..c1e03cdefca 100644
--- a/application/src/ext/java/org/opentripplanner/ext/vectortiles/layers/stops/StopsLayerBuilder.java
+++ b/application/src/ext/java/org/opentripplanner/ext/vectortiles/layers/stops/StopsLayerBuilder.java
@@ -44,7 +44,7 @@ public StopsLayerBuilder(
protected List getGeometries(Envelope query) {
return transitService
- .findRegularStops(query)
+ .findRegularStopsByBoundingBox(query)
.stream()
.filter(filter)
.map(stop -> {
diff --git a/application/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java b/application/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java
index c56540a73f9..fa38deeab84 100644
--- a/application/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java
+++ b/application/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java
@@ -752,9 +752,8 @@ public DataFetcher> stopsByBbox() {
);
Stream stopStream = getTransitService(environment)
- .findRegularStops(envelope)
- .stream()
- .filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()));
+ .findRegularStopsByBoundingBox(envelope)
+ .stream();
if (args.getGraphQLFeeds() != null) {
List feedIds = args.getGraphQLFeeds();
diff --git a/application/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java b/application/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java
index 922f9f5244b..0561ec9de85 100644
--- a/application/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java
+++ b/application/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java
@@ -3,6 +3,7 @@
import static java.lang.Boolean.TRUE;
import static java.util.Collections.emptyList;
import static org.opentripplanner.apis.transmodel.mapping.SeverityMapper.getTransmodelSeverity;
+import static org.opentripplanner.apis.transmodel.mapping.TransitIdMapper.mapIDToDomain;
import static org.opentripplanner.apis.transmodel.mapping.TransitIdMapper.mapIDsToDomainNullSafe;
import static org.opentripplanner.apis.transmodel.model.EnumTypes.FILTER_PLACE_TYPE_ENUM;
import static org.opentripplanner.apis.transmodel.model.EnumTypes.MULTI_MODAL_MODE;
@@ -115,6 +116,7 @@
import org.opentripplanner.routing.graphfinder.PlaceType;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalPlace;
import org.opentripplanner.transit.api.model.FilterValues;
+import org.opentripplanner.transit.api.request.FindRegularStopsByBoundingBoxRequest;
import org.opentripplanner.transit.api.request.TripRequest;
import org.opentripplanner.transit.model.basic.TransitMode;
import org.opentripplanner.transit.model.framework.FeedScopedId;
@@ -439,10 +441,7 @@ private GraphQLSchema create() {
.build()
)
.dataFetcher(env ->
- StopPlaceType.fetchStopPlaceById(
- TransitIdMapper.mapIDToDomain(env.getArgument("id")),
- env
- )
+ StopPlaceType.fetchStopPlaceById(mapIDToDomain(env.getArgument("id")), env)
)
.build()
)
@@ -576,7 +575,7 @@ private GraphQLSchema create() {
.dataFetcher(environment ->
GqlUtil
.getTransitService(environment)
- .getStopLocation(TransitIdMapper.mapIDToDomain(environment.getArgument("id")))
+ .getStopLocation(mapIDToDomain(environment.getArgument("id")))
)
.build()
)
@@ -610,7 +609,7 @@ private GraphQLSchema create() {
}
TransitService transitService = GqlUtil.getTransitService(environment);
return ((List) environment.getArgument("ids")).stream()
- .map(id -> transitService.getStopLocation(TransitIdMapper.mapIDToDomain(id)))
+ .map(id -> transitService.getStopLocation(mapIDToDomain(id)))
.collect(Collectors.toList());
}
if (environment.getArgument("name") == null) {
@@ -661,7 +660,14 @@ private GraphQLSchema create() {
.build()
)
.argument(
- GraphQLArgument.newArgument().name("authority").type(Scalars.GraphQLString).build()
+ GraphQLArgument
+ .newArgument()
+ .name("authority")
+ .deprecate(
+ "This is the Transmodel namespace or the GTFS feedID - avoid using this. Request a new field if necessary."
+ )
+ .type(Scalars.GraphQLString)
+ .build()
)
.argument(
GraphQLArgument
@@ -669,7 +675,7 @@ private GraphQLSchema create() {
.name("filterByInUse")
.description("If true only quays with at least one visiting line are included.")
.type(Scalars.GraphQLBoolean)
- .defaultValue(Boolean.FALSE)
+ .defaultValueProgrammatic(Boolean.FALSE)
.build()
)
.dataFetcher(environment -> {
@@ -683,24 +689,19 @@ private GraphQLSchema create() {
environment.getArgument("maximumLatitude")
)
);
+
+ var authority = environment.getArgument("authority");
+ var filterInUse = environment.getArgument("filterByInUse");
+
+ FindRegularStopsByBoundingBoxRequest findRegularStopsByBoundingBoxRequest = FindRegularStopsByBoundingBoxRequest
+ .of(envelope)
+ .withFeedId(authority)
+ .filterByInUse(filterInUse)
+ .build();
+
return GqlUtil
.getTransitService(environment)
- .findRegularStops(envelope)
- .stream()
- .filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()))
- .filter(stop ->
- environment.getArgument("authority") == null ||
- stop.getId().getFeedId().equalsIgnoreCase(environment.getArgument("authority"))
- )
- .filter(stop -> {
- boolean filterByInUse = TRUE.equals(environment.getArgument("filterByInUse"));
- boolean inUse = !GqlUtil
- .getTransitService(environment)
- .findPatterns(stop, true)
- .isEmpty();
- return !filterByInUse || inUse;
- })
- .collect(Collectors.toList());
+ .findRegularStopsByBoundingBox(findRegularStopsByBoundingBoxRequest);
})
.build()
)
@@ -1438,7 +1439,7 @@ private GraphQLSchema create() {
.build()
)
.dataFetcher(environment -> {
- var bikeParkId = TransitIdMapper.mapIDToDomain(environment.getArgument("id"));
+ var bikeParkId = mapIDToDomain(environment.getArgument("id"));
return GqlUtil
.getVehicleParkingService(environment)
.listBikeParks()
@@ -1573,7 +1574,7 @@ private GraphQLSchema create() {
return GqlUtil
.getTransitService(environment)
.getTransitAlertService()
- .getAlertById(TransitIdMapper.mapIDToDomain(situationNumber));
+ .getAlertById(mapIDToDomain(situationNumber));
})
.build()
)
diff --git a/application/src/main/java/org/opentripplanner/apis/transmodel/model/stop/StopPlaceType.java b/application/src/main/java/org/opentripplanner/apis/transmodel/model/stop/StopPlaceType.java
index fa755e8c6f7..9b8fd25c68a 100644
--- a/application/src/main/java/org/opentripplanner/apis/transmodel/model/stop/StopPlaceType.java
+++ b/application/src/main/java/org/opentripplanner/apis/transmodel/model/stop/StopPlaceType.java
@@ -546,9 +546,8 @@ public static Collection fetchStopPlaces(
);
Stream stations = transitService
- .findRegularStops(envelope)
+ .findRegularStopsByBoundingBox(envelope)
.stream()
- .filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()))
.map(StopLocation::getParentStation)
.filter(Objects::nonNull)
.distinct();
diff --git a/application/src/main/java/org/opentripplanner/apis/vectortiles/GraphInspectorVectorTileResource.java b/application/src/main/java/org/opentripplanner/apis/vectortiles/GraphInspectorVectorTileResource.java
index 0576e91f312..0336a57c5de 100644
--- a/application/src/main/java/org/opentripplanner/apis/vectortiles/GraphInspectorVectorTileResource.java
+++ b/application/src/main/java/org/opentripplanner/apis/vectortiles/GraphInspectorVectorTileResource.java
@@ -183,7 +183,7 @@ private static LayerBuilder> createLayerBuilder(
case RegularStop -> new StopLayerBuilder<>(
layerParameters,
locale,
- e -> context.transitService().findRegularStops(e)
+ e -> context.transitService().findRegularStopsByBoundingBox(e)
);
case AreaStop -> new StopLayerBuilder<>(
layerParameters,
diff --git a/application/src/main/java/org/opentripplanner/graph_builder/module/StreetLinkerModule.java b/application/src/main/java/org/opentripplanner/graph_builder/module/StreetLinkerModule.java
index 83a6f282204..d50659f275c 100644
--- a/application/src/main/java/org/opentripplanner/graph_builder/module/StreetLinkerModule.java
+++ b/application/src/main/java/org/opentripplanner/graph_builder/module/StreetLinkerModule.java
@@ -103,7 +103,7 @@ public void linkTransitStops(Graph graph, TimetableRepository timetableRepositor
continue;
}
// check if stop is already linked, to allow multiple idempotent linking cycles
- if (tStop.isConnectedToGraph()) {
+ if (isAlreadyLinked(tStop, stopLocationsUsedForFlexTrips)) {
continue;
}
@@ -127,6 +127,26 @@ public void linkTransitStops(Graph graph, TimetableRepository timetableRepositor
LOG.info(progress.completeMessage());
}
+ /**
+ * Determines if a given transit stop vertex is already linked to the street network, taking into
+ * account that flex stops need special linking to both a walkable and drivable edge. For example,
+ * the {@link OsmBoardingLocationsModule}, which runs before this one, often links stops to
+ * walkable edges only.
+ *
+ * @param stopVertex The transit stop vertex to be checked.
+ * @param stopLocationsUsedForFlexTrips A set of stop locations that are used for flexible trips.
+ */
+ private static boolean isAlreadyLinked(
+ TransitStopVertex stopVertex,
+ Set stopLocationsUsedForFlexTrips
+ ) {
+ if (stopLocationsUsedForFlexTrips.contains(stopVertex.getStop())) {
+ return stopVertex.isLinkedToDrivableEdge() && stopVertex.isLinkedToWalkableEdge();
+ } else {
+ return stopVertex.isConnectedToGraph();
+ }
+ }
+
/**
* Link a stop to the nearest "relevant" edges.
*
diff --git a/application/src/main/java/org/opentripplanner/graph_builder/module/nearbystops/StraightLineNearbyStopFinder.java b/application/src/main/java/org/opentripplanner/graph_builder/module/nearbystops/StraightLineNearbyStopFinder.java
index 5b304d0d20c..ccdcb68446b 100644
--- a/application/src/main/java/org/opentripplanner/graph_builder/module/nearbystops/StraightLineNearbyStopFinder.java
+++ b/application/src/main/java/org/opentripplanner/graph_builder/module/nearbystops/StraightLineNearbyStopFinder.java
@@ -22,7 +22,7 @@ public StraightLineNearbyStopFinder(TransitService transitService, Duration dura
// We need to accommodate straight line distance (in meters) but when streets are present we
// use an earliest arrival search, which optimizes on time. Ideally we'd specify in meters,
// but we don't have much of a choice here. Use the default walking speed to convert.
- this.directGraphFinder = new DirectGraphFinder(transitService::findRegularStops);
+ this.directGraphFinder = new DirectGraphFinder(transitService::findRegularStopsByBoundingBox);
}
/**
diff --git a/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java b/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java
index 55bc87f5cad..e2debf79916 100644
--- a/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java
+++ b/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java
@@ -624,7 +624,7 @@ public void populateProperties(WayPropertySet props) {
props.setSlopeOverride(new BestMatchSpecifier("indoor=yes"), true);
}
- public void populateNotesAndNames(WayPropertySet props) {
+ static void populateNotesAndNames(WayPropertySet props) {
/* and the notes */
// TODO: The curly brackets in the string below mean that the CreativeNamer should substitute in OSM tag values.
// However they are not taken into account when passed to the translation function.
@@ -667,6 +667,7 @@ public void populateNotesAndNames(WayPropertySet props) {
props.createNames("highway=footway", "name.pedestrian_path");
props.createNames("highway=bridleway", "name.bridleway");
props.createNames("highway=footway;bicycle=no", "name.pedestrian_path");
+ props.createNames("highway=corridor", "name.corridor");
// Platforms
props.createNames("otp:route_ref=*", "name.otp_route_ref");
diff --git a/application/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java b/application/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java
index f088a3de60e..139bac6dcc9 100644
--- a/application/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java
+++ b/application/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java
@@ -121,7 +121,7 @@ public interface OtpServerRequestContext {
TraverseVisitor traverseVisitor();
default GraphFinder graphFinder() {
- return GraphFinder.getInstance(graph(), transitService()::findRegularStops);
+ return GraphFinder.getInstance(graph(), transitService()::findRegularStopsByBoundingBox);
}
FlexParameters flexParameters();
diff --git a/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/UpdatersConfig.java b/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/UpdatersConfig.java
index ac69b43e275..a71d5ee40f8 100644
--- a/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/UpdatersConfig.java
+++ b/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/UpdatersConfig.java
@@ -8,7 +8,9 @@
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_AZURE_ET_UPDATER;
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_AZURE_SX_UPDATER;
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_ET_GOOGLE_PUBSUB_UPDATER;
+import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_ET_LITE;
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_ET_UPDATER;
+import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_SX_LITE;
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_SX_UPDATER;
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.STOP_TIME_UPDATER;
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.VEHICLE_PARKING;
@@ -30,7 +32,9 @@
import org.opentripplanner.standalone.config.routerconfig.updaters.MqttGtfsRealtimeUpdaterConfig;
import org.opentripplanner.standalone.config.routerconfig.updaters.PollingTripUpdaterConfig;
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriETGooglePubsubUpdaterConfig;
+import org.opentripplanner.standalone.config.routerconfig.updaters.SiriETLiteUpdaterConfig;
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriETUpdaterConfig;
+import org.opentripplanner.standalone.config.routerconfig.updaters.SiriSXLiteUpdaterConfig;
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriSXUpdaterConfig;
import org.opentripplanner.standalone.config.routerconfig.updaters.VehicleParkingUpdaterConfig;
import org.opentripplanner.standalone.config.routerconfig.updaters.VehiclePositionsUpdaterConfig;
@@ -44,6 +48,8 @@
import org.opentripplanner.updater.siri.updater.SiriETUpdaterParameters;
import org.opentripplanner.updater.siri.updater.SiriSXUpdaterParameters;
import org.opentripplanner.updater.siri.updater.google.SiriETGooglePubsubUpdaterParameters;
+import org.opentripplanner.updater.siri.updater.lite.SiriETLiteUpdaterParameters;
+import org.opentripplanner.updater.siri.updater.lite.SiriSXLiteUpdaterParameters;
import org.opentripplanner.updater.trip.MqttGtfsRealtimeUpdaterParameters;
import org.opentripplanner.updater.trip.PollingTripUpdaterParameters;
import org.opentripplanner.updater.vehicle_parking.VehicleParkingUpdaterParameters;
@@ -182,6 +188,16 @@ public List getSiriSXUpdaterParameters() {
return getParameters(SIRI_SX_UPDATER);
}
+ @Override
+ public List getSiriETLiteUpdaterParameters() {
+ return getParameters(SIRI_ET_LITE);
+ }
+
+ @Override
+ public List getSiriSXLiteUpdaterParameters() {
+ return getParameters(SIRI_SX_LITE);
+ }
+
@Override
public List getMqttGtfsRealtimeUpdaterParameters() {
return getParameters(MQTT_GTFS_RT_UPDATER);
@@ -218,8 +234,10 @@ public enum Type {
REAL_TIME_ALERTS(GtfsRealtimeAlertsUpdaterConfig::create),
VEHICLE_POSITIONS(VehiclePositionsUpdaterConfig::create),
SIRI_ET_UPDATER(SiriETUpdaterConfig::create),
+ SIRI_ET_LITE(SiriETLiteUpdaterConfig::create),
SIRI_ET_GOOGLE_PUBSUB_UPDATER(SiriETGooglePubsubUpdaterConfig::create),
SIRI_SX_UPDATER(SiriSXUpdaterConfig::create),
+ SIRI_SX_LITE(SiriSXLiteUpdaterConfig::create),
SIRI_AZURE_ET_UPDATER(SiriAzureETUpdaterConfig::create),
SIRI_AZURE_SX_UPDATER(SiriAzureSXUpdaterConfig::create);
diff --git a/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/SiriETLiteUpdaterConfig.java b/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/SiriETLiteUpdaterConfig.java
new file mode 100644
index 00000000000..b26bdd2a727
--- /dev/null
+++ b/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/SiriETLiteUpdaterConfig.java
@@ -0,0 +1,39 @@
+package org.opentripplanner.standalone.config.routerconfig.updaters;
+
+import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_7;
+
+import java.time.Duration;
+import org.opentripplanner.standalone.config.framework.json.NodeAdapter;
+import org.opentripplanner.updater.siri.updater.lite.SiriETLiteUpdaterParameters;
+
+public class SiriETLiteUpdaterConfig {
+
+ public static SiriETLiteUpdaterParameters create(String configRef, NodeAdapter c) {
+ return new SiriETLiteUpdaterParameters(
+ configRef,
+ c.of("feedId").since(V2_7).summary("The ID of the feed to apply the updates to.").asString(),
+ c
+ .of("url")
+ .since(V2_7)
+ .summary("The URL to send the HTTP requests to.")
+ .description(SiriSXUpdaterConfig.URL_DESCRIPTION)
+ .asUri(),
+ c
+ .of("frequency")
+ .since(V2_7)
+ .summary("How often the updates should be retrieved.")
+ .asDuration(Duration.ofMinutes(1)),
+ c
+ .of("timeout")
+ .since(V2_7)
+ .summary("The HTTP timeout to download the updates.")
+ .asDuration(Duration.ofSeconds(15)),
+ c
+ .of("fuzzyTripMatching")
+ .since(V2_7)
+ .summary("If the fuzzy trip matcher should be used to match trips.")
+ .asBoolean(false),
+ HttpHeadersConfig.headers(c, V2_7)
+ );
+ }
+}
diff --git a/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/SiriSXLiteUpdaterConfig.java b/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/SiriSXLiteUpdaterConfig.java
new file mode 100644
index 00000000000..27c1bcba0be
--- /dev/null
+++ b/application/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/SiriSXLiteUpdaterConfig.java
@@ -0,0 +1,46 @@
+package org.opentripplanner.standalone.config.routerconfig.updaters;
+
+import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_0;
+import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_7;
+
+import java.time.Duration;
+import org.opentripplanner.standalone.config.framework.json.NodeAdapter;
+import org.opentripplanner.updater.siri.updater.lite.SiriSXLiteUpdaterParameters;
+
+public class SiriSXLiteUpdaterConfig {
+
+ public static SiriSXLiteUpdaterParameters create(String configRef, NodeAdapter c) {
+ return new SiriSXLiteUpdaterParameters(
+ configRef,
+ c.of("feedId").since(V2_7).summary("The ID of the feed to apply the updates to.").asString(),
+ c
+ .of("url")
+ .since(V2_7)
+ .summary("The URL to send the HTTP requests to.")
+ .description(SiriSXUpdaterConfig.URL_DESCRIPTION)
+ .asUri(),
+ c
+ .of("frequency")
+ .since(V2_7)
+ .summary("How often the updates should be retrieved.")
+ .asDuration(Duration.ofMinutes(1)),
+ c
+ .of("timeout")
+ .since(V2_7)
+ .summary("The HTTP timeout to download the updates.")
+ .asDuration(Duration.ofSeconds(15)),
+ c
+ .of("earlyStart")
+ .since(V2_0)
+ .summary("This value is subtracted from the actual validity defined in the message.")
+ .description(
+ """
+ Normally the planned departure time is used, so setting this to 10s will cause the
+ SX-message to be included in trip-results 10 seconds before the the planned departure
+ time."""
+ )
+ .asDuration(Duration.ZERO),
+ HttpHeadersConfig.headers(c, V2_7)
+ );
+ }
+}
diff --git a/application/src/main/java/org/opentripplanner/street/model/vertex/TransitStopVertex.java b/application/src/main/java/org/opentripplanner/street/model/vertex/TransitStopVertex.java
index 82c977902b0..5b1b1dfa6a8 100644
--- a/application/src/main/java/org/opentripplanner/street/model/vertex/TransitStopVertex.java
+++ b/application/src/main/java/org/opentripplanner/street/model/vertex/TransitStopVertex.java
@@ -1,9 +1,14 @@
package org.opentripplanner.street.model.vertex;
+import static org.opentripplanner.street.search.TraverseMode.CAR;
+import static org.opentripplanner.street.search.TraverseMode.WALK;
+
import java.util.HashSet;
import java.util.Set;
import org.opentripplanner.street.model.edge.Edge;
import org.opentripplanner.street.model.edge.PathwayEdge;
+import org.opentripplanner.street.model.edge.StreetTransitEntityLink;
+import org.opentripplanner.street.search.TraverseMode;
import org.opentripplanner.transit.model.basic.Accessibility;
import org.opentripplanner.transit.model.basic.TransitMode;
import org.opentripplanner.transit.model.site.RegularStop;
@@ -94,4 +99,37 @@ public StationElement getStationElement() {
public boolean isConnectedToGraph() {
return getDegreeOut() + getDegreeIn() > 0;
}
+
+ /**
+ * Determines if this vertex is linked (via a {@link StreetTransitEntityLink}) to a drivable edge
+ * in the street network.
+ *
+ * This method is slow: only use this during graph build.
+ */
+ public boolean isLinkedToDrivableEdge() {
+ return isLinkedToEdgeWhichAllows(CAR);
+ }
+
+ /**
+ * Determines if this vertex is linked (via a {@link StreetTransitEntityLink}) to a walkable edge
+ * in the street network.
+ *
+ * This method is slow: only use this during graph build.
+ */
+ public boolean isLinkedToWalkableEdge() {
+ return isLinkedToEdgeWhichAllows(WALK);
+ }
+
+ private boolean isLinkedToEdgeWhichAllows(TraverseMode traverseMode) {
+ return getOutgoing()
+ .stream()
+ .anyMatch(edge ->
+ edge instanceof StreetTransitEntityLink> link &&
+ link
+ .getToVertex()
+ .getOutgoingStreetEdges()
+ .stream()
+ .anyMatch(se -> se.canTraverse(traverseMode))
+ );
+ }
}
diff --git a/application/src/main/java/org/opentripplanner/transit/api/model/FilterValues.java b/application/src/main/java/org/opentripplanner/transit/api/model/FilterValues.java
index 391b2531231..63befe3add6 100644
--- a/application/src/main/java/org/opentripplanner/transit/api/model/FilterValues.java
+++ b/application/src/main/java/org/opentripplanner/transit/api/model/FilterValues.java
@@ -1,8 +1,8 @@
package org.opentripplanner.transit.api.model;
-import com.beust.jcommander.internal.Nullable;
import java.util.Collection;
import java.util.NoSuchElementException;
+import javax.annotation.Nullable;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.transit.service.TransitService;
diff --git a/application/src/main/java/org/opentripplanner/transit/api/request/FindRegularStopsByBoundingBoxRequest.java b/application/src/main/java/org/opentripplanner/transit/api/request/FindRegularStopsByBoundingBoxRequest.java
new file mode 100644
index 00000000000..476e23d7cd8
--- /dev/null
+++ b/application/src/main/java/org/opentripplanner/transit/api/request/FindRegularStopsByBoundingBoxRequest.java
@@ -0,0 +1,48 @@
+package org.opentripplanner.transit.api.request;
+
+import javax.annotation.Nullable;
+import org.locationtech.jts.geom.Envelope;
+import org.opentripplanner.transit.model.site.RegularStop;
+
+/**
+ * A request for {@link RegularStop}s within a bounding box.
+ *
+ * This request is used to retrieve {@link RegularStop}s that are within a provided bounding box and
+ * match the other criteria.
+ */
+public class FindRegularStopsByBoundingBoxRequest {
+
+ private final Envelope envelope;
+
+ @Nullable
+ private final String feedId;
+
+ private final boolean filterByInUse;
+
+ FindRegularStopsByBoundingBoxRequest(
+ Envelope envelope,
+ @Nullable String feedId,
+ boolean filterByInUse
+ ) {
+ this.envelope = envelope;
+ this.feedId = feedId;
+ this.filterByInUse = filterByInUse;
+ }
+
+ public static FindRegularStopsByBoundingBoxRequestBuilder of(Envelope envelope) {
+ return new FindRegularStopsByBoundingBoxRequestBuilder(envelope);
+ }
+
+ public Envelope envelope() {
+ return envelope;
+ }
+
+ @Nullable
+ public String feedId() {
+ return feedId;
+ }
+
+ public boolean filterByInUse() {
+ return filterByInUse;
+ }
+}
diff --git a/application/src/main/java/org/opentripplanner/transit/api/request/FindRegularStopsByBoundingBoxRequestBuilder.java b/application/src/main/java/org/opentripplanner/transit/api/request/FindRegularStopsByBoundingBoxRequestBuilder.java
new file mode 100644
index 00000000000..49d31c33db9
--- /dev/null
+++ b/application/src/main/java/org/opentripplanner/transit/api/request/FindRegularStopsByBoundingBoxRequestBuilder.java
@@ -0,0 +1,32 @@
+package org.opentripplanner.transit.api.request;
+
+import javax.annotation.Nullable;
+import org.locationtech.jts.geom.Envelope;
+
+public class FindRegularStopsByBoundingBoxRequestBuilder {
+
+ private final Envelope envelope;
+
+ @Nullable
+ private String feedId;
+
+ private boolean filterByInUse = false;
+
+ FindRegularStopsByBoundingBoxRequestBuilder(Envelope envelope) {
+ this.envelope = envelope;
+ }
+
+ public FindRegularStopsByBoundingBoxRequestBuilder withFeedId(@Nullable String feedId) {
+ this.feedId = feedId;
+ return this;
+ }
+
+ public FindRegularStopsByBoundingBoxRequestBuilder filterByInUse(boolean filterByInUse) {
+ this.filterByInUse = filterByInUse;
+ return this;
+ }
+
+ public FindRegularStopsByBoundingBoxRequest build() {
+ return new FindRegularStopsByBoundingBoxRequest(envelope, feedId, filterByInUse);
+ }
+}
diff --git a/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequest.java b/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequest.java
index c61bb8ad107..54dd1c7aea6 100644
--- a/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequest.java
+++ b/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequest.java
@@ -23,7 +23,7 @@ public class TripOnServiceDateRequest {
private final FilterValues netexInternalPlanningCodes;
private final FilterValues alterations;
- protected TripOnServiceDateRequest(
+ TripOnServiceDateRequest(
RequiredFilterValues serviceDates,
FilterValues agencies,
FilterValues routes,
@@ -41,7 +41,7 @@ protected TripOnServiceDateRequest(
this.alterations = alterations;
}
- public static TripOnServiceDateRequestBuilder of(RequiredFilterValues serviceDates) {
+ public static TripOnServiceDateRequestBuilder of(RequiredFilterValues serviceDates) {
return new TripOnServiceDateRequestBuilder(serviceDates);
}
diff --git a/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequestBuilder.java b/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequestBuilder.java
index 534557c15d8..3181819a400 100644
--- a/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequestBuilder.java
+++ b/application/src/main/java/org/opentripplanner/transit/api/request/TripOnServiceDateRequestBuilder.java
@@ -30,9 +30,9 @@ public class TripOnServiceDateRequestBuilder {
"alterations",
List.of()
);
- private RequiredFilterValues serviceDates;
+ private final RequiredFilterValues serviceDates;
- protected TripOnServiceDateRequestBuilder(RequiredFilterValues serviceDates) {
+ TripOnServiceDateRequestBuilder(RequiredFilterValues serviceDates) {
this.serviceDates = serviceDates;
}
diff --git a/application/src/main/java/org/opentripplanner/transit/api/request/TripRequest.java b/application/src/main/java/org/opentripplanner/transit/api/request/TripRequest.java
index c73e800582b..5e05b472937 100644
--- a/application/src/main/java/org/opentripplanner/transit/api/request/TripRequest.java
+++ b/application/src/main/java/org/opentripplanner/transit/api/request/TripRequest.java
@@ -17,7 +17,7 @@ public class TripRequest {
private final FilterValues netexInternalPlanningCodes;
private final FilterValues serviceDates;
- protected TripRequest(
+ TripRequest(
FilterValues agencies,
FilterValues routes,
FilterValues netexInternalPlanningCodes,
diff --git a/application/src/main/java/org/opentripplanner/transit/api/request/TripRequestBuilder.java b/application/src/main/java/org/opentripplanner/transit/api/request/TripRequestBuilder.java
index 3a2f80a3e34..32ca31d5cd6 100644
--- a/application/src/main/java/org/opentripplanner/transit/api/request/TripRequestBuilder.java
+++ b/application/src/main/java/org/opentripplanner/transit/api/request/TripRequestBuilder.java
@@ -21,7 +21,7 @@ public class TripRequestBuilder {
List.of()
);
- protected TripRequestBuilder() {}
+ TripRequestBuilder() {}
public TripRequestBuilder withAgencies(FilterValues agencies) {
this.agencies = agencies;
diff --git a/application/src/main/java/org/opentripplanner/transit/model/filter/expr/ExpressionBuilder.java b/application/src/main/java/org/opentripplanner/transit/model/filter/expr/ExpressionBuilder.java
index f2910a4c8d2..87533ab1b5e 100644
--- a/application/src/main/java/org/opentripplanner/transit/model/filter/expr/ExpressionBuilder.java
+++ b/application/src/main/java/org/opentripplanner/transit/model/filter/expr/ExpressionBuilder.java
@@ -22,6 +22,11 @@ public static ExpressionBuilder of() {
return new ExpressionBuilder<>();
}
+ public ExpressionBuilder matches(Matcher matcher) {
+ matchers.add(matcher);
+ return this;
+ }
+
public ExpressionBuilder atLeastOneMatch(
FilterValues filterValues,
Function> matcherProvider
diff --git a/application/src/main/java/org/opentripplanner/transit/model/filter/expr/GenericUnaryMatcher.java b/application/src/main/java/org/opentripplanner/transit/model/filter/expr/GenericUnaryMatcher.java
new file mode 100644
index 00000000000..0ac6c5f17ee
--- /dev/null
+++ b/application/src/main/java/org/opentripplanner/transit/model/filter/expr/GenericUnaryMatcher.java
@@ -0,0 +1,33 @@
+package org.opentripplanner.transit.model.filter.expr;
+
+import java.util.function.Predicate;
+
+/**
+ * A generic matcher that takes a predicate function that returns a boolean given the matched type.
+ *
+ * @param The type of the entity being matched.
+ */
+public class GenericUnaryMatcher implements Matcher {
+
+ private final String typeName;
+ private final Predicate matchPredicate;
+
+ /**
+ * @param typeName The typeName appears in the toString for easier debugging.
+ * @param matchPredicate The predicate that will be used to test the entity being matched.
+ */
+ public GenericUnaryMatcher(String typeName, Predicate matchPredicate) {
+ this.typeName = typeName;
+ this.matchPredicate = matchPredicate;
+ }
+
+ @Override
+ public boolean match(T entity) {
+ return matchPredicate.test(entity);
+ }
+
+ @Override
+ public String toString() {
+ return "GenericUnaryMatcher: " + typeName;
+ }
+}
diff --git a/application/src/main/java/org/opentripplanner/transit/model/filter/transit/RegularStopMatcherFactory.java b/application/src/main/java/org/opentripplanner/transit/model/filter/transit/RegularStopMatcherFactory.java
new file mode 100644
index 00000000000..261e7057d95
--- /dev/null
+++ b/application/src/main/java/org/opentripplanner/transit/model/filter/transit/RegularStopMatcherFactory.java
@@ -0,0 +1,47 @@
+package org.opentripplanner.transit.model.filter.transit;
+
+import java.util.function.Predicate;
+import org.opentripplanner.transit.api.request.FindRegularStopsByBoundingBoxRequest;
+import org.opentripplanner.transit.model.filter.expr.EqualityMatcher;
+import org.opentripplanner.transit.model.filter.expr.ExpressionBuilder;
+import org.opentripplanner.transit.model.filter.expr.GenericUnaryMatcher;
+import org.opentripplanner.transit.model.filter.expr.Matcher;
+import org.opentripplanner.transit.model.site.RegularStop;
+
+/**
+ * A factory for creating matchers for {@link RegularStop} objects.
+ *
+ * This factory is used to create matchers for {@link RegularStop} objects based on a request. The
+ * resulting matcher can be used to filter a list of {@link RegularStop} objects.
+ */
+public class RegularStopMatcherFactory {
+
+ /**
+ * Creates a matcher that filters {@link RegularStop} objects with the provided {@code request}
+ * and {@code inUseProvider}. The {@code inUseProvider} is used to determine if a {@link RegularStop} is
+ * in use. The inUseProvider is an injected function, because the check is done by the transit service
+ * which has access to all stops and routes. A stop is used if it has routes visiting the stop.
+ */
+ public static Matcher of(
+ FindRegularStopsByBoundingBoxRequest request,
+ Predicate inUseProvider
+ ) {
+ ExpressionBuilder expr = ExpressionBuilder.of();
+
+ if (request.feedId() != null) {
+ expr.matches(feedId(request.feedId()));
+ }
+ if (request.filterByInUse()) {
+ expr.matches(inUseMatcher(inUseProvider));
+ }
+ return expr.build();
+ }
+
+ static Matcher feedId(String feedId) {
+ return new EqualityMatcher<>("feedId", feedId, stop -> stop.getId().getFeedId());
+ }
+
+ static Matcher inUseMatcher(Predicate inUseProvider) {
+ return new GenericUnaryMatcher<>("inUse", inUseProvider);
+ }
+}
diff --git a/application/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java b/application/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java
index cf5bb11c3b3..d27fe138ef4 100644
--- a/application/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java
+++ b/application/src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java
@@ -35,11 +35,13 @@
import org.opentripplanner.routing.services.TransitAlertService;
import org.opentripplanner.routing.stoptimes.ArrivalDeparture;
import org.opentripplanner.routing.stoptimes.StopTimesHelper;
+import org.opentripplanner.transit.api.request.FindRegularStopsByBoundingBoxRequest;
import org.opentripplanner.transit.api.request.TripOnServiceDateRequest;
import org.opentripplanner.transit.api.request.TripRequest;
import org.opentripplanner.transit.model.basic.Notice;
import org.opentripplanner.transit.model.basic.TransitMode;
import org.opentripplanner.transit.model.filter.expr.Matcher;
+import org.opentripplanner.transit.model.filter.transit.RegularStopMatcherFactory;
import org.opentripplanner.transit.model.filter.transit.TripMatcherFactory;
import org.opentripplanner.transit.model.filter.transit.TripOnServiceDateMatcherFactory;
import org.opentripplanner.transit.model.framework.AbstractTransitEntity;
@@ -698,11 +700,27 @@ public ZonedDateTime getTransitServiceStarts() {
}
@Override
- public Collection findRegularStops(Envelope envelope) {
+ public Collection findRegularStopsByBoundingBox(Envelope envelope) {
OTPRequestTimeoutException.checkForTimeout();
return timetableRepository.getSiteRepository().findRegularStops(envelope);
}
+ @Override
+ public Collection findRegularStopsByBoundingBox(
+ FindRegularStopsByBoundingBoxRequest request
+ ) {
+ OTPRequestTimeoutException.checkForTimeout();
+ Collection stops = timetableRepository
+ .getSiteRepository()
+ .findRegularStops(request.envelope());
+
+ Matcher matcher = RegularStopMatcherFactory.of(
+ request,
+ stop -> !findPatterns(stop, true).isEmpty()
+ );
+ return stops.stream().filter(matcher::match).toList();
+ }
+
@Override
public Collection findAreaStops(Envelope envelope) {
OTPRequestTimeoutException.checkForTimeout();
diff --git a/application/src/main/java/org/opentripplanner/transit/service/StopModelIndex.java b/application/src/main/java/org/opentripplanner/transit/service/StopModelIndex.java
index 13a8c0d278d..effa8f95f7e 100644
--- a/application/src/main/java/org/opentripplanner/transit/service/StopModelIndex.java
+++ b/application/src/main/java/org/opentripplanner/transit/service/StopModelIndex.java
@@ -71,10 +71,17 @@ class SiteRepositoryIndex {
}
/**
- * Find a regular stop in the spatial index
+ * Find a regular stop in the spatial index, where the stop is inside of the passed Envelope.
+ *
+ * @param envelope - The {@link Envelope} to search for stops in.
+ * @return A collection of {@link RegularStop}s that are inside of the passed envelope.
*/
Collection findRegularStops(Envelope envelope) {
- return regularStopSpatialIndex.query(envelope);
+ return regularStopSpatialIndex
+ .query(envelope)
+ .stream()
+ .filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()))
+ .toList();
}
MultiModalStation getMultiModalStationForStation(Station station) {
diff --git a/application/src/main/java/org/opentripplanner/transit/service/TransitService.java b/application/src/main/java/org/opentripplanner/transit/service/TransitService.java
index 11a628508d6..6e005b355d1 100644
--- a/application/src/main/java/org/opentripplanner/transit/service/TransitService.java
+++ b/application/src/main/java/org/opentripplanner/transit/service/TransitService.java
@@ -24,6 +24,7 @@
import org.opentripplanner.routing.algorithm.raptoradapter.transit.TransitLayer;
import org.opentripplanner.routing.services.TransitAlertService;
import org.opentripplanner.routing.stoptimes.ArrivalDeparture;
+import org.opentripplanner.transit.api.request.FindRegularStopsByBoundingBoxRequest;
import org.opentripplanner.transit.api.request.TripOnServiceDateRequest;
import org.opentripplanner.transit.api.request.TripRequest;
import org.opentripplanner.transit.model.basic.Notice;
@@ -271,7 +272,7 @@ List findTripTimeOnDate(
boolean transitFeedCovers(Instant dateTime);
- Collection findRegularStops(Envelope envelope);
+ Collection findRegularStopsByBoundingBox(Envelope envelope);
Collection findAreaStops(Envelope envelope);
@@ -287,6 +288,7 @@ List findTripTimeOnDate(
* So, if more patterns of mode BUS than RAIL visit the group, the result will be [BUS,RAIL].
*/
List findTransitModes(StopLocationsGroup station);
+
/**
* For a {@link StopLocation} return its modes.
*
{leg.mode}{' '}
{leg.line && (
diff --git a/client/src/components/ItineraryList/ItineraryPaginationControl.tsx b/client/src/components/ItineraryList/ItineraryPaginationControl.tsx
index bf74c83fbca..dc197a2451e 100644
--- a/client/src/components/ItineraryList/ItineraryPaginationControl.tsx
+++ b/client/src/components/ItineraryList/ItineraryPaginationControl.tsx
@@ -18,7 +18,9 @@ export function ItineraryPaginationControl({
size="sm"
disabled={!previousPageCursor || loading}
onClick={() => {
- previousPageCursor && onPagination(previousPageCursor);
+ if (previousPageCursor) {
+ onPagination(previousPageCursor);
+ }
}}
>
Previous page
@@ -28,7 +30,9 @@ export function ItineraryPaginationControl({
size="sm"
disabled={!nextPageCursor || loading}
onClick={() => {
- nextPageCursor && onPagination(nextPageCursor);
+ if (nextPageCursor) {
+ onPagination(nextPageCursor);
+ }
}}
>
Next page
diff --git a/client/src/util/getApiUrl.ts b/client/src/util/getApiUrl.ts
index 34d25068342..87687fbe602 100644
--- a/client/src/util/getApiUrl.ts
+++ b/client/src/util/getApiUrl.ts
@@ -6,7 +6,7 @@ export const getApiUrl = () => {
// e.g. if it is a relative path
new URL(endpoint);
return endpoint;
- } catch (e) {
+ } catch (_) {
return `${window.location.origin}${endpoint}`;
}
};
diff --git a/doc/templates/StopConsolidation.md b/doc/templates/StopConsolidation.md
index 70866882bd1..ef32a3c29d6 100644
--- a/doc/templates/StopConsolidation.md
+++ b/doc/templates/StopConsolidation.md
@@ -32,7 +32,7 @@ This has the following consequences
- It makes real-time trip updates referencing a stop id much more complicated and in many cases
impossible to resolve.
- You can only reference a stop by its sequence, which only works in GTFS-RT, not Siri.
+ You can only reference a stop by its sequence, which only works in GTFS-RT, not SIRI.
- Fare calculation and transfers are unlikely to work as expected.
diff --git a/doc/templates/UpdaterConfig.md b/doc/templates/UpdaterConfig.md
index aab5631e6e2..21db7bdb6a4 100644
--- a/doc/templates/UpdaterConfig.md
+++ b/doc/templates/UpdaterConfig.md
@@ -82,8 +82,8 @@ GBFS form factors:
## Other updaters in sandboxes
- [Vehicle parking](sandbox/VehicleParking.md)
-- [Siri over HTTP](sandbox/siri/SiriUpdater.md)
-- [Siri over Google Cloud PubSub](sandbox/siri/SiriGooglePubSubUpdater.md)
-- [Siri over Azure Message Bus](sandbox/siri/SiriAzureUpdater.md)
+- [SIRI over HTTP](sandbox/siri/SiriUpdater.md)
+- [SIRI over Google Cloud PubSub](sandbox/siri/SiriGooglePubSubUpdater.md)
+- [SIRI over Azure Message Bus](sandbox/siri/SiriAzureUpdater.md)
- [VehicleRentalServiceDirectory](sandbox/VehicleRentalServiceDirectory.md)
diff --git a/doc/templates/sandbox/siri/SiriAzureUpdater.md b/doc/templates/sandbox/siri/SiriAzureUpdater.md
index 85e22e30bda..5e9e1065519 100644
--- a/doc/templates/sandbox/siri/SiriAzureUpdater.md
+++ b/doc/templates/sandbox/siri/SiriAzureUpdater.md
@@ -1,6 +1,6 @@
-# Siri Azure Updater
+# SIRI Azure Updater
-This is a sandbox extension developed by Skånetrafiken that allows OTP to fetch Siri ET & SX messages
+This is a sandbox extension developed by Skånetrafiken that allows OTP to fetch SIRI ET & SX messages
through *Azure Service Bus*.
It also enables OTP to download historical data from en HTTP endpoint on startup.
@@ -17,11 +17,11 @@ Documentation available [here](../../examples/skanetrafiken/Readme.md).
To enable the SIRI updater you need to add it to the updaters section of the `router-config.json`.
-### Siri Azure ET Updater
+### SIRI Azure ET Updater
-### Siri Azure SX Updater
+### SIRI Azure SX Updater
diff --git a/doc/templates/sandbox/siri/SiriGooglePubSubUpdater.md b/doc/templates/sandbox/siri/SiriGooglePubSubUpdater.md
index 09fd3996bef..9d3fff5e00d 100644
--- a/doc/templates/sandbox/siri/SiriGooglePubSubUpdater.md
+++ b/doc/templates/sandbox/siri/SiriGooglePubSubUpdater.md
@@ -1,4 +1,4 @@
-# Siri-ET Google PubSub Updater
+# SIRI-ET Google PubSub Updater
Support for consuming SIRI-ET messages over a Google Cloud PubSub subscription.
Similarly to the SIRI-ET HTTP updater, this updater is developed to support the Nordic SIRI profile
@@ -23,7 +23,7 @@ the [Norwegian SIRI profile](https://enturas.atlassian.net/wiki/spaces/PUBLIC/pa
To enable the SIRI-ET Google PubSub updater you need to add it to the updaters section
of the `router-config.json`.
-### Siri-ET via Google PubSub
+### SIRI-ET via Google PubSub
diff --git a/doc/templates/sandbox/siri/SiriUpdater.md b/doc/templates/sandbox/siri/SiriUpdater.md
index f695d304475..bed90ded3a3 100644
--- a/doc/templates/sandbox/siri/SiriUpdater.md
+++ b/doc/templates/sandbox/siri/SiriUpdater.md
@@ -1,35 +1,50 @@
-# Siri Updater
+# SIRI Updaters
-Support for consuming SIRI ET and SX messages. The updater is developed to support the Nordic
-SIRI profile which is a subset of the SIRI specification.
+Support for consuming SIRI ET and SX messages via HTTPS. The updaters aim to support the [Nordic
+and EPIP SIRI profiles](../../features-explained/Netex-Siri-Compatibility.md) which
+are subsets of the SIRI specification.
+
+For more documentation about the Norwegian profile and data, go to
+the [Entur Real-Time Data](https://developer.entur.org/pages-real-time-intro) documentation and
+the [Norwegian SIRI profile](https://enturas.atlassian.net/wiki/spaces/PUBLIC/pages/637370420/Norwegian+SIRI+profile).
## Contact Info
- Lasse Tyrihjell, Entur, Norway
-
-## Documentation
-
-This updater consumes SIRI real time information. It is developed by Entur and supports the Nordic
-Profile for SIRI. It should be possible to develop it further to support a broader set of the SIRI
-specification.
-
-For more documentation goto
-the [Entur Real-Time Data](https://developer.entur.org/pages-real-time-intro) documentation and
-the [Norwegian SIRI profile](https://enturas.atlassian.net/wiki/spaces/PUBLIC/pages/637370420/Norwegian+SIRI+profile)
-.
+- Leonard Ehrenfried, Germany
## Configuration
-To enable the SIRI updater you need to add it to the updaters section of the `router-config.json`.
+To enable the SIRI updater you need to add it to the `updaters` section of the `router-config.json`.
-### Siri-ET via HTTPS
+### SIRI-ET Request/Response via HTTPS
-### Siri-SX via HTTPS
+### SIRI-SX Request/Response via HTTPS
+### SIRI-ET Lite
+
+SIRI Lite is [not very well](https://nextcloud.leonard.io/s/2tdYdmYBGtLQMfi/download?path=&files=Proposition-Profil-SIRI-Lite-initial-v1-3%20en.pdf)
+[specified](https://normes.transport.data.gouv.fr/normes/siri/profil-france/#protocoles-d%C3%A9change-des-donn%C3%A9es-siri),
+but this updater supports the following definition:
+
+Fetching XML-formatted SIRI messages as single GET request rather than the more common request/response
+flow. This means that the XML feed must contain all updates for all trips, just like it is the case
+for GTFS-RT TripUpdates.
+
+
+
+### SIRI-SX Lite
+
+This updater follows the same definition of SIRI Lite as the SIRI-ET one: it downloads the entire
+feed in a single HTTP GET request.
+
+
+
+
## Changelog
- Initial version of SIRI updater (October 2019)
diff --git a/doc/user/Changelog.md b/doc/user/Changelog.md
index 1ff69082268..b859f87f19a 100644
--- a/doc/user/Changelog.md
+++ b/doc/user/Changelog.md
@@ -66,6 +66,10 @@ based on merged pull requests. Search GitHub issues and pull requests for smalle
- Add query for cancelled trips to GTFS GraphQL API [#5393](https://github.com/opentripplanner/OpenTripPlanner/pull/5393)
- Enable mode-specific transfers by storing mode information in transfers [#6293](https://github.com/opentripplanner/OpenTripPlanner/pull/6293)
- Add default penalty to all car API modes [#6302](https://github.com/opentripplanner/OpenTripPlanner/pull/6302)
+- Make flex linking work together with boarding locations [#6311](https://github.com/opentripplanner/OpenTripPlanner/pull/6311)
+- Add fallback name for corridors [#6303](https://github.com/opentripplanner/OpenTripPlanner/pull/6303)
+- Implement SIRI Lite [#6284](https://github.com/opentripplanner/OpenTripPlanner/pull/6284)
+- Add a matcher API for filters in the transit service used for regularStop lookup [#6234](https://github.com/opentripplanner/OpenTripPlanner/pull/6234)
[](AUTOMATIC_CHANGELOG_PLACEHOLDER_DO_NOT_REMOVE)
## 2.6.0 (2024-09-18)
@@ -411,7 +415,7 @@ based on merged pull requests. Search GitHub issues and pull requests for smalle
- Preserve language in SIRI/GTFS-RT alert messages [#4117](https://github.com/opentripplanner/OpenTripPlanner/pull/4117)
- Use board/alight cost only for transits [#4079](https://github.com/opentripplanner/OpenTripPlanner/pull/4079)
- Improve SIRI real-time performance by reducing stopPattern duplicates [#4038](https://github.com/opentripplanner/OpenTripPlanner/pull/4038)
-- Siri updaters for Azure ServiceBus [#4106](https://github.com/opentripplanner/OpenTripPlanner/pull/4106)
+- SIRI updaters for Azure ServiceBus [#4106](https://github.com/opentripplanner/OpenTripPlanner/pull/4106)
- Fallback to recorded/expected arrival/departure time if other one is missing in SIRI-ET [#4055](https://github.com/opentripplanner/OpenTripPlanner/pull/4055)
- Allow overriding GBFS system_id with configuration [#4147](https://github.com/opentripplanner/OpenTripPlanner/pull/4147)
- Fix error with transfer-slack and GTFS minTransferTime [#4120](https://github.com/opentripplanner/OpenTripPlanner/pull/4120)
@@ -419,7 +423,7 @@ based on merged pull requests. Search GitHub issues and pull requests for smalle
- Don't indicate stop has been updated when NO_DATA is defined [#3962](https://github.com/opentripplanner/OpenTripPlanner/pull/3962)
- Implement nearby searches for car and bicycle parking [#4165](https://github.com/opentripplanner/OpenTripPlanner/pull/4165)
- Do not link cars to stop vertices in routing [#4166](https://github.com/opentripplanner/OpenTripPlanner/pull/4166)
-- Add Siri real-time occupancy info [#4180](https://github.com/opentripplanner/OpenTripPlanner/pull/4180)
+- Add SIRI real-time occupancy info [#4180](https://github.com/opentripplanner/OpenTripPlanner/pull/4180)
- Add gtfs stop description translations [#4158](https://github.com/opentripplanner/OpenTripPlanner/pull/4158)
- Add option to discard min transfer times [#4195](https://github.com/opentripplanner/OpenTripPlanner/pull/4195)
- Use negative delay from first stop in a GTFS RT update in previous stop times when required [#4035](https://github.com/opentripplanner/OpenTripPlanner/pull/4035)
diff --git a/doc/user/RouterConfiguration.md b/doc/user/RouterConfiguration.md
index 7dae97fd74c..82d14f36392 100644
--- a/doc/user/RouterConfiguration.md
+++ b/doc/user/RouterConfiguration.md
@@ -878,6 +878,17 @@ Used to group requests when monitoring OTP.
"feedId" : "parking",
"sourceType" : "siri-fm",
"url" : "https://transmodel.api.opendatahub.com/siri-lite/fm/parking"
+ },
+ {
+ "type" : "siri-et-lite",
+ "feedId" : "sta",
+ "url" : "https://example.com/siri-lite/estimated-timetable/xml",
+ "fuzzyTripMatching" : true
+ },
+ {
+ "type" : "siri-sx-lite",
+ "feedId" : "sta",
+ "url" : "https://example.com/siri-lite/situation-exchange/xml"
}
],
"rideHailingServices" : [
diff --git a/doc/user/UpdaterConfig.md b/doc/user/UpdaterConfig.md
index f61cce12f54..068b61f112e 100644
--- a/doc/user/UpdaterConfig.md
+++ b/doc/user/UpdaterConfig.md
@@ -427,8 +427,8 @@ This is temporary and will be removed in a future version of OTP. Use this to sp
## Other updaters in sandboxes
- [Vehicle parking](sandbox/VehicleParking.md)
-- [Siri over HTTP](sandbox/siri/SiriUpdater.md)
-- [Siri over Google Cloud PubSub](sandbox/siri/SiriGooglePubSubUpdater.md)
-- [Siri over Azure Message Bus](sandbox/siri/SiriAzureUpdater.md)
+- [SIRI over HTTP](sandbox/siri/SiriUpdater.md)
+- [SIRI over Google Cloud PubSub](sandbox/siri/SiriGooglePubSubUpdater.md)
+- [SIRI over Azure Message Bus](sandbox/siri/SiriAzureUpdater.md)
- [VehicleRentalServiceDirectory](sandbox/VehicleRentalServiceDirectory.md)
diff --git a/doc/user/examples/skanetrafiken/Readme.md b/doc/user/examples/skanetrafiken/Readme.md
index a611c839140..acaf212719a 100644
--- a/doc/user/examples/skanetrafiken/Readme.md
+++ b/doc/user/examples/skanetrafiken/Readme.md
@@ -38,7 +38,7 @@ To reduce graph size, only data for northern part of Denmark is used.
## Real-time
The **Azure Service Bus** is used to propagate SIRI SX and ET real-time messages to OTP.
-This is solved through Siri Azure updaters that Skånetrafiken had implemented in OTP. There are
+This is solved through SIRI Azure updaters that Skånetrafiken had implemented in OTP. There are
separate updaters for SIRI SX and ET.
Those updaters are used to provide data for Swedish traffic (NeTEx). Right now, there is no
connection to any real-time source for danish traffic (GTFS data).
@@ -77,7 +77,7 @@ Those two parameters are used to define time boundaries for the messages.
Both endpoints generate XML response which is an SIRI object containing SX or ET messages. Messages
are
-formatted according to Siri Nordic Profile.
+formatted according to SIRI Nordic Profile.
Since in SIRI ET standard each messages contains all necessary data, Skånetrafikens implementation
of the
endpoint returns only the last message
diff --git a/doc/user/features-explained/Netex-Siri-Compatibility.md b/doc/user/features-explained/Netex-Siri-Compatibility.md
index 731011be8e0..10c64f6a5c0 100644
--- a/doc/user/features-explained/Netex-Siri-Compatibility.md
+++ b/doc/user/features-explained/Netex-Siri-Compatibility.md
@@ -12,7 +12,7 @@ Different countries are currently using different incompatible "profiles" of NeT
underway to converge on a single European standard profile. This is based in large part on the
Nordic profile used by Entur.
-The Nordic profile is the only profile that has been thoroughly tested in production in OTP and is
+The Nordic profile is the only one that has been thoroughly tested in production in OTP and is
used in Norway, Finland and Sweden.
### EPIP
@@ -22,7 +22,7 @@ is an attempt to unify other country profiles and support in OTP is adequate, bu
to tell how much of EPIP is supported since it is a very large profile. The current status
of the support is tracked on [Github](https://github.com/opentripplanner/OpenTripPlanner/issues/3640).
-Sometimes it is difficult to tell if a file conforms to EPIP so to find out, you can run the following
+Sometimes it is not easy to figure out if a file conforms to EPIP so to find out, you can run the following
commands:
```
diff --git a/doc/user/requirements.txt b/doc/user/requirements.txt
index ee0eb31d65c..7adb0f88f82 100644
--- a/doc/user/requirements.txt
+++ b/doc/user/requirements.txt
@@ -1,4 +1,4 @@
mkdocs==1.6.1
-mkdocs-material==9.5.39
+mkdocs-material==9.5.49
mike@git+https://github.com/jimporter/mike.git@f0522f245e64687dd18384fbd86b721175711474
mkdocs-no-sitemap-plugin==0.0.1
diff --git a/doc/user/sandbox/StopConsolidation.md b/doc/user/sandbox/StopConsolidation.md
index d0e18a9ce30..547f3200296 100644
--- a/doc/user/sandbox/StopConsolidation.md
+++ b/doc/user/sandbox/StopConsolidation.md
@@ -32,7 +32,7 @@ This has the following consequences
- It makes real-time trip updates referencing a stop id much more complicated and in many cases
impossible to resolve.
- You can only reference a stop by its sequence, which only works in GTFS-RT, not Siri.
+ You can only reference a stop by its sequence, which only works in GTFS-RT, not SIRI.
- Fare calculation and transfers are unlikely to work as expected.
diff --git a/doc/user/sandbox/siri/SiriAzureUpdater.md b/doc/user/sandbox/siri/SiriAzureUpdater.md
index 898e70d7b84..02d602c48d2 100644
--- a/doc/user/sandbox/siri/SiriAzureUpdater.md
+++ b/doc/user/sandbox/siri/SiriAzureUpdater.md
@@ -1,6 +1,6 @@
-# Siri Azure Updater
+# SIRI Azure Updater
-This is a sandbox extension developed by Skånetrafiken that allows OTP to fetch Siri ET & SX messages
+This is a sandbox extension developed by Skånetrafiken that allows OTP to fetch SIRI ET & SX messages
through *Azure Service Bus*.
It also enables OTP to download historical data from en HTTP endpoint on startup.
@@ -17,7 +17,7 @@ Documentation available [here](../../examples/skanetrafiken/Readme.md).
To enable the SIRI updater you need to add it to the updaters section of the `router-config.json`.
-### Siri Azure ET Updater
+### SIRI Azure ET Updater
@@ -105,7 +105,7 @@ Has to be present for authenticationMethod SharedAccessKey. This should be Prima
-### Siri Azure SX Updater
+### SIRI Azure SX Updater
diff --git a/doc/user/sandbox/siri/SiriGooglePubSubUpdater.md b/doc/user/sandbox/siri/SiriGooglePubSubUpdater.md
index 5232696ad9b..ed09522b224 100644
--- a/doc/user/sandbox/siri/SiriGooglePubSubUpdater.md
+++ b/doc/user/sandbox/siri/SiriGooglePubSubUpdater.md
@@ -1,4 +1,4 @@
-# Siri-ET Google PubSub Updater
+# SIRI-ET Google PubSub Updater
Support for consuming SIRI-ET messages over a Google Cloud PubSub subscription.
Similarly to the SIRI-ET HTTP updater, this updater is developed to support the Nordic SIRI profile
@@ -23,7 +23,7 @@ the [Norwegian SIRI profile](https://enturas.atlassian.net/wiki/spaces/PUBLIC/pa
To enable the SIRI-ET Google PubSub updater you need to add it to the updaters section
of the `router-config.json`.
-### Siri-ET via Google PubSub
+### SIRI-ET via Google PubSub
diff --git a/doc/user/sandbox/siri/SiriUpdater.md b/doc/user/sandbox/siri/SiriUpdater.md
index 28f2f9a85db..a6f7781e293 100644
--- a/doc/user/sandbox/siri/SiriUpdater.md
+++ b/doc/user/sandbox/siri/SiriUpdater.md
@@ -1,28 +1,23 @@
-# Siri Updater
+# SIRI Updaters
-Support for consuming SIRI ET and SX messages. The updater is developed to support the Nordic
-SIRI profile which is a subset of the SIRI specification.
+Support for consuming SIRI ET and SX messages via HTTPS. The updaters aim to support the [Nordic
+and EPIP SIRI profiles](../../features-explained/Netex-Siri-Compatibility.md) which
+are subsets of the SIRI specification.
+
+For more documentation about the Norwegian profile and data, go to
+the [Entur Real-Time Data](https://developer.entur.org/pages-real-time-intro) documentation and
+the [Norwegian SIRI profile](https://enturas.atlassian.net/wiki/spaces/PUBLIC/pages/637370420/Norwegian+SIRI+profile).
## Contact Info
- Lasse Tyrihjell, Entur, Norway
-
-## Documentation
-
-This updater consumes SIRI real time information. It is developed by Entur and supports the Nordic
-Profile for SIRI. It should be possible to develop it further to support a broader set of the SIRI
-specification.
-
-For more documentation goto
-the [Entur Real-Time Data](https://developer.entur.org/pages-real-time-intro) documentation and
-the [Norwegian SIRI profile](https://enturas.atlassian.net/wiki/spaces/PUBLIC/pages/637370420/Norwegian+SIRI+profile)
-.
+- Leonard Ehrenfried, Germany
## Configuration
-To enable the SIRI updater you need to add it to the updaters section of the `router-config.json`.
+To enable the SIRI updater you need to add it to the `updaters` section of the `router-config.json`.
-### Siri-ET via HTTPS
+### SIRI-ET Request/Response via HTTPS
@@ -89,7 +84,7 @@ HTTP headers to add to the request. Any header key, value can be inserted.
-### Siri-SX via HTTPS
+### SIRI-SX Request/Response via HTTPS
@@ -166,6 +161,148 @@ HTTP headers to add to the request. Any header key, value can be inserted.
+### SIRI-ET Lite
+
+SIRI Lite is [not very well](https://nextcloud.leonard.io/s/2tdYdmYBGtLQMfi/download?path=&files=Proposition-Profil-SIRI-Lite-initial-v1-3%20en.pdf)
+[specified](https://normes.transport.data.gouv.fr/normes/siri/profil-france/#protocoles-d%C3%A9change-des-donn%C3%A9es-siri),
+but this updater supports the following definition:
+
+Fetching XML-formatted SIRI messages as single GET request rather than the more common request/response
+flow. This means that the XML feed must contain all updates for all trips, just like it is the case
+for GTFS-RT TripUpdates.
+
+
+
+
+| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
+|----------------------------|:---------------:|----------------------------------------------------------------------------|:----------:|---------------|:-----:|
+| type = "siri-et-lite" | `enum` | The type of the updater. | *Required* | | 1.5 |
+| feedId | `string` | The ID of the feed to apply the updates to. | *Required* | | 2.7 |
+| frequency | `duration` | How often the updates should be retrieved. | *Optional* | `"PT1M"` | 2.7 |
+| fuzzyTripMatching | `boolean` | If the fuzzy trip matcher should be used to match trips. | *Optional* | `false` | 2.7 |
+| timeout | `duration` | The HTTP timeout to download the updates. | *Optional* | `"PT15S"` | 2.7 |
+| [url](#u__15__url) | `uri` | The URL to send the HTTP requests to. | *Required* | | 2.7 |
+| [headers](#u__15__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.7 |
+
+
+##### Parameter details
+
+
url
+
+**Since version:** `2.7` ∙ **Type:** `uri` ∙ **Cardinality:** `Required`
+**Path:** /updaters/[15]
+
+The URL to send the HTTP requests to.
+
+Use the file protocol to set a directory for reading updates from a directory. The file
+loader will look for xml files: '*.xml' in the configured directory. The files are
+renamed by the loader when processed:
+
+ _a.xml_ ➞ _a.xml.inProgress_ ➞ _a.xml.ok_ or _a.xml.failed_
+
+
+
+
headers
+
+**Since version:** `2.7` ∙ **Type:** `map of string` ∙ **Cardinality:** `Optional`
+**Path:** /updaters/[15]
+
+HTTP headers to add to the request. Any header key, value can be inserted.
+
+
+
+##### Example configuration
+
+```JSON
+// router-config.json
+{
+ "updaters" : [
+ {
+ "type" : "siri-et-lite",
+ "feedId" : "sta",
+ "url" : "https://example.com/siri-lite/estimated-timetable/xml",
+ "fuzzyTripMatching" : true
+ }
+ ]
+}
+```
+
+
+
+### SIRI-SX Lite
+
+This updater follows the same definition of SIRI Lite as the SIRI-ET one: it downloads the entire
+feed in a single HTTP GET request.
+
+
+
+
+| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
+|----------------------------------|:---------------:|----------------------------------------------------------------------------|:----------:|---------------|:-----:|
+| type = "siri-sx-lite" | `enum` | The type of the updater. | *Required* | | 1.5 |
+| [earlyStart](#u__16__earlyStart) | `duration` | This value is subtracted from the actual validity defined in the message. | *Optional* | `"PT0S"` | 2.0 |
+| feedId | `string` | The ID of the feed to apply the updates to. | *Required* | | 2.7 |
+| frequency | `duration` | How often the updates should be retrieved. | *Optional* | `"PT1M"` | 2.7 |
+| timeout | `duration` | The HTTP timeout to download the updates. | *Optional* | `"PT15S"` | 2.7 |
+| [url](#u__16__url) | `uri` | The URL to send the HTTP requests to. | *Required* | | 2.7 |
+| [headers](#u__16__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.7 |
+
+
+##### Parameter details
+
+
earlyStart
+
+**Since version:** `2.0` ∙ **Type:** `duration` ∙ **Cardinality:** `Optional` ∙ **Default value:** `"PT0S"`
+**Path:** /updaters/[16]
+
+This value is subtracted from the actual validity defined in the message.
+
+Normally the planned departure time is used, so setting this to 10s will cause the
+SX-message to be included in trip-results 10 seconds before the the planned departure
+time.
+
+
url
+
+**Since version:** `2.7` ∙ **Type:** `uri` ∙ **Cardinality:** `Required`
+**Path:** /updaters/[16]
+
+The URL to send the HTTP requests to.
+
+Use the file protocol to set a directory for reading updates from a directory. The file
+loader will look for xml files: '*.xml' in the configured directory. The files are
+renamed by the loader when processed:
+
+ _a.xml_ ➞ _a.xml.inProgress_ ➞ _a.xml.ok_ or _a.xml.failed_
+
+
+
+
headers
+
+**Since version:** `2.7` ∙ **Type:** `map of string` ∙ **Cardinality:** `Optional`
+**Path:** /updaters/[16]
+
+HTTP headers to add to the request. Any header key, value can be inserted.
+
+
+
+##### Example configuration
+
+```JSON
+// router-config.json
+{
+ "updaters" : [
+ {
+ "type" : "siri-sx-lite",
+ "feedId" : "sta",
+ "url" : "https://example.com/siri-lite/situation-exchange/xml"
+ }
+ ]
+}
+```
+
+
+
+
## Changelog
- Initial version of SIRI updater (October 2019)
diff --git a/mkdocs.yml b/mkdocs.yml
index 51245f6c3b8..0ebcb7ddd4d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -91,7 +91,7 @@ nav:
- "Stop Area Relations": 'StopAreas.md'
- "Street Graph Pruning": 'IslandPruning.md'
- Accessibility: 'Accessibility.md'
- - NeTex and Siri compatibility: 'features-explained/Netex-Siri-Compatibility.md'
+ - NeTEx and SIRI compatibility: 'features-explained/Netex-Siri-Compatibility.md'
- "Travel Time Analysis": 'Analysis.md'
- "Logging": "Logging.md"
- Development:
diff --git a/pom.xml b/pom.xml
index 27eada4007b..0e43acff179 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,13 +65,13 @@
2.18.23.1.95.11.4
- 1.14.1
+ 1.14.25.6.01.5.12
- 9.12.0
+ 10.1.02.0.162.0.15
- 1.27
+ 1.284.0.5UTF-8