diff --git a/docs/RouterConfiguration.md b/docs/RouterConfiguration.md
index 503b8c7370f..e0f1d81b590 100644
--- a/docs/RouterConfiguration.md
+++ b/docs/RouterConfiguration.md
@@ -764,6 +764,12 @@ Used to group requests when monitoring OTP.
"Authorization" : "${BIKELY_AUTHORIZATION}"
}
},
+ {
+ "type" : "vehicle-parking",
+ "feedId" : "noi",
+ "sourceType" : "noi-open-data-hub",
+ "url" : "https://parking.otp.opendatahub.com/parking/all.json"
+ },
{
"type" : "stop-time-updater",
"frequency" : "1m",
diff --git a/docs/UpdaterConfig.md b/docs/UpdaterConfig.md
index 973874be66a..3e0907f60ad 100644
--- a/docs/UpdaterConfig.md
+++ b/docs/UpdaterConfig.md
@@ -92,20 +92,20 @@ The information is downloaded in a single HTTP request and polled regularly.
| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
|-----------------------------------------------------------------------|:---------------:|----------------------------------------------------------------------------|:----------:|----------------------|:-----:|
| type = "stop-time-updater" | `enum` | The type of the updater. | *Required* | | 1.5 |
-| [backwardsDelayPropagationType](#u__5__backwardsDelayPropagationType) | `enum` | How backwards propagation should be handled. | *Optional* | `"required-no-data"` | 2.2 |
+| [backwardsDelayPropagationType](#u__6__backwardsDelayPropagationType) | `enum` | How backwards propagation should be handled. | *Optional* | `"required-no-data"` | 2.2 |
| feedId | `string` | Which feed the updates apply to. | *Required* | | 1.5 |
| frequency | `duration` | How often the data should be downloaded. | *Optional* | `"PT1M"` | 1.5 |
| fuzzyTripMatching | `boolean` | If the trips should be matched fuzzily. | *Optional* | `false` | 1.5 |
-| [url](#u__5__url) | `string` | The URL of the GTFS-RT resource. | *Required* | | 1.5 |
-| [headers](#u__5__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
+| [url](#u__6__url) | `string` | The URL of the GTFS-RT resource. | *Required* | | 1.5 |
+| [headers](#u__6__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
##### Parameter details
-
backwardsDelayPropagationType
+backwardsDelayPropagationType
**Since version:** `2.2` ∙ **Type:** `enum` ∙ **Cardinality:** `Optional` ∙ **Default value:** `"required-no-data"`
-**Path:** /updaters/[5]
+**Path:** /updaters/[6]
**Enum values:** `required-no-data` | `required` | `always`
How backwards propagation should be handled.
@@ -124,19 +124,19 @@ How backwards propagation should be handled.
The updated times are exposed through APIs.
-url
+url
**Since version:** `1.5` ∙ **Type:** `string` ∙ **Cardinality:** `Required`
-**Path:** /updaters/[5]
+**Path:** /updaters/[6]
The URL of the GTFS-RT resource.
`file:` URLs are also supported if you want to read a file from the local disk.
-
+
**Since version:** `2.3` ∙ **Type:** `map of string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[5]
+**Path:** /updaters/[6]
HTTP headers to add to the request. Any header key, value can be inserted.
@@ -178,7 +178,7 @@ This system powers the realtime updates in Helsinki and more information can be
| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
|-----------------------------------------------------------------------|:---------:|----------------------------------------------|:----------:|----------------------|:-----:|
| type = "mqtt-gtfs-rt-updater" | `enum` | The type of the updater. | *Required* | | 1.5 |
-| [backwardsDelayPropagationType](#u__6__backwardsDelayPropagationType) | `enum` | How backwards propagation should be handled. | *Optional* | `"required-no-data"` | 2.2 |
+| [backwardsDelayPropagationType](#u__7__backwardsDelayPropagationType) | `enum` | How backwards propagation should be handled. | *Optional* | `"required-no-data"` | 2.2 |
| feedId | `string` | The feed id to apply the updates to. | *Required* | | 2.0 |
| fuzzyTripMatching | `boolean` | Whether to match trips fuzzily. | *Optional* | `false` | 2.0 |
| qos | `integer` | QOS level. | *Optional* | `0` | 2.0 |
@@ -188,10 +188,10 @@ This system powers the realtime updates in Helsinki and more information can be
##### Parameter details
-backwardsDelayPropagationType
+backwardsDelayPropagationType
**Since version:** `2.2` ∙ **Type:** `enum` ∙ **Cardinality:** `Optional` ∙ **Default value:** `"required-no-data"`
-**Path:** /updaters/[6]
+**Path:** /updaters/[7]
**Enum values:** `required-no-data` | `required` | `always`
How backwards propagation should be handled.
@@ -247,24 +247,24 @@ The information is downloaded in a single HTTP request and polled regularly.
| frequency | `duration` | How often the positions should be updated. | *Optional* | `"PT1M"` | 2.2 |
| fuzzyTripMatching | `boolean` | Whether to match trips fuzzily. | *Optional* | `false` | 2.5 |
| url | `uri` | The URL of GTFS-RT protobuf HTTP resource to download the positions from. | *Required* | | 2.2 |
-| [features](#u__7__features) | `enum set` | Which features of GTFS RT vehicle positions should be loaded into OTP. | *Optional* | | 2.5 |
-| [headers](#u__7__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
+| [features](#u__8__features) | `enum set` | Which features of GTFS RT vehicle positions should be loaded into OTP. | *Optional* | | 2.5 |
+| [headers](#u__8__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
##### Parameter details
-features
+features
**Since version:** `2.5` ∙ **Type:** `enum set` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[7]
+**Path:** /updaters/[8]
**Enum values:** `position` | `stop-position` | `occupancy`
Which features of GTFS RT vehicle positions should be loaded into OTP.
-
+
**Since version:** `2.3` ∙ **Type:** `map of string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[7]
+**Path:** /updaters/[8]
HTTP headers to add to the request. Any header key, value can be inserted.
diff --git a/docs/sandbox/siri/SiriAzureUpdater.md b/docs/sandbox/siri/SiriAzureUpdater.md
index 3b5c536946d..c6ddf9f3ebe 100644
--- a/docs/sandbox/siri/SiriAzureUpdater.md
+++ b/docs/sandbox/siri/SiriAzureUpdater.md
@@ -24,14 +24,14 @@ To enable the SIRI updater you need to add it to the updaters section of the `ro
| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
|------------------------------------------------------------|:----------:|------------------------------------------------------------------|:----------:|---------------------|:-----:|
| type = "siri-azure-et-updater" | `enum` | The type of the updater. | *Required* | | 1.5 |
-| [authenticationType](#u__11__authenticationType) | `enum` | Which authentication type to use | *Optional* | `"sharedaccesskey"` | 2.5 |
+| [authenticationType](#u__12__authenticationType) | `enum` | Which authentication type to use | *Optional* | `"sharedaccesskey"` | 2.5 |
| autoDeleteOnIdle | `duration` | The time after which an inactive subscription is removed. | *Optional* | `"PT1H"` | 2.5 |
-| [customMidnight](#u__11__customMidnight) | `integer` | Time on which time breaks into new day. | *Optional* | `0` | 2.2 |
+| [customMidnight](#u__12__customMidnight) | `integer` | Time on which time breaks into new day. | *Optional* | `0` | 2.2 |
| feedId | `string` | The ID of the feed to apply the updates to. | *Optional* | | 2.2 |
-| [fullyQualifiedNamespace](#u__11__fullyQualifiedNamespace) | `string` | Service Bus fully qualified namespace used for authentication. | *Optional* | | 2.5 |
+| [fullyQualifiedNamespace](#u__12__fullyQualifiedNamespace) | `string` | Service Bus fully qualified namespace used for authentication. | *Optional* | | 2.5 |
| fuzzyTripMatching | `boolean` | Whether to apply fuzzyTripMatching on the updates | *Optional* | `false` | 2.2 |
| prefetchCount | `integer` | The number of messages to fetch from the subscription at a time. | *Optional* | `10` | 2.5 |
-| [servicebus-url](#u__11__servicebus_url) | `string` | Service Bus connection used for authentication. | *Optional* | | 2.2 |
+| [servicebus-url](#u__12__servicebus_url) | `string` | Service Bus connection used for authentication. | *Optional* | | 2.2 |
| topic | `string` | Service Bus topic to connect to. | *Optional* | | 2.2 |
| history | `object` | Configuration for fetching historical data on startup | *Optional* | | 2.2 |
| fromDateTime | `string` | Datetime boundary for historical data | *Optional* | `"-P1D"` | 2.2 |
@@ -41,36 +41,36 @@ To enable the SIRI updater you need to add it to the updaters section of the `ro
##### Parameter details
-authenticationType
+authenticationType
**Since version:** `2.5` ∙ **Type:** `enum` ∙ **Cardinality:** `Optional` ∙ **Default value:** `"sharedaccesskey"`
-**Path:** /updaters/[11]
+**Path:** /updaters/[12]
**Enum values:** `sharedaccesskey` | `federatedidentity`
Which authentication type to use
-customMidnight
+customMidnight
**Since version:** `2.2` ∙ **Type:** `integer` ∙ **Cardinality:** `Optional` ∙ **Default value:** `0`
-**Path:** /updaters/[11]
+**Path:** /updaters/[12]
Time on which time breaks into new day.
It is common that operating day date breaks a little bit later than midnight so that the switch happens when traffic is at the lowest point. Parameter uses 24-hour format. If the switch happens on 4 am then set this field to 4.
-fullyQualifiedNamespace
+fullyQualifiedNamespace
**Since version:** `2.5` ∙ **Type:** `string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[11]
+**Path:** /updaters/[12]
Service Bus fully qualified namespace used for authentication.
Has to be present for authenticationMethod FederatedIdentity.
-servicebus-url
+servicebus-url
**Since version:** `2.2` ∙ **Type:** `string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[11]
+**Path:** /updaters/[12]
Service Bus connection used for authentication.
@@ -112,14 +112,14 @@ Has to be present for authenticationMethod SharedAccessKey. This should be Prima
| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
|------------------------------------------------------------|:----------:|------------------------------------------------------------------|:----------:|---------------------|:-----:|
| type = "siri-azure-sx-updater" | `enum` | The type of the updater. | *Required* | | 1.5 |
-| [authenticationType](#u__10__authenticationType) | `enum` | Which authentication type to use | *Optional* | `"sharedaccesskey"` | 2.5 |
+| [authenticationType](#u__11__authenticationType) | `enum` | Which authentication type to use | *Optional* | `"sharedaccesskey"` | 2.5 |
| autoDeleteOnIdle | `duration` | The time after which an inactive subscription is removed. | *Optional* | `"PT1H"` | 2.5 |
-| [customMidnight](#u__10__customMidnight) | `integer` | Time on which time breaks into new day. | *Optional* | `0` | 2.2 |
+| [customMidnight](#u__11__customMidnight) | `integer` | Time on which time breaks into new day. | *Optional* | `0` | 2.2 |
| feedId | `string` | The ID of the feed to apply the updates to. | *Optional* | | 2.2 |
-| [fullyQualifiedNamespace](#u__10__fullyQualifiedNamespace) | `string` | Service Bus fully qualified namespace used for authentication. | *Optional* | | 2.5 |
+| [fullyQualifiedNamespace](#u__11__fullyQualifiedNamespace) | `string` | Service Bus fully qualified namespace used for authentication. | *Optional* | | 2.5 |
| fuzzyTripMatching | `boolean` | Whether to apply fuzzyTripMatching on the updates | *Optional* | `false` | 2.2 |
| prefetchCount | `integer` | The number of messages to fetch from the subscription at a time. | *Optional* | `10` | 2.5 |
-| [servicebus-url](#u__10__servicebus_url) | `string` | Service Bus connection used for authentication. | *Optional* | | 2.2 |
+| [servicebus-url](#u__11__servicebus_url) | `string` | Service Bus connection used for authentication. | *Optional* | | 2.2 |
| topic | `string` | Service Bus topic to connect to. | *Optional* | | 2.2 |
| history | `object` | Configuration for fetching historical data on startup | *Optional* | | 2.2 |
| fromDateTime | `string` | Datetime boundary for historical data. | *Optional* | `"-P1D"` | 2.2 |
@@ -130,36 +130,36 @@ Has to be present for authenticationMethod SharedAccessKey. This should be Prima
##### Parameter details
-authenticationType
+authenticationType
**Since version:** `2.5` ∙ **Type:** `enum` ∙ **Cardinality:** `Optional` ∙ **Default value:** `"sharedaccesskey"`
-**Path:** /updaters/[10]
+**Path:** /updaters/[11]
**Enum values:** `sharedaccesskey` | `federatedidentity`
Which authentication type to use
-customMidnight
+customMidnight
**Since version:** `2.2` ∙ **Type:** `integer` ∙ **Cardinality:** `Optional` ∙ **Default value:** `0`
-**Path:** /updaters/[10]
+**Path:** /updaters/[11]
Time on which time breaks into new day.
It is common that operating day date breaks a little bit later than midnight so that the switch happens when traffic is at the lowest point. Parameter uses 24-hour format. If the switch happens on 4 am then set this field to 4.
-fullyQualifiedNamespace
+fullyQualifiedNamespace
**Since version:** `2.5` ∙ **Type:** `string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[10]
+**Path:** /updaters/[11]
Service Bus fully qualified namespace used for authentication.
Has to be present for authenticationMethod FederatedIdentity.
-servicebus-url
+servicebus-url
**Since version:** `2.2` ∙ **Type:** `string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[10]
+**Path:** /updaters/[11]
Service Bus connection used for authentication.
diff --git a/docs/sandbox/siri/SiriUpdater.md b/docs/sandbox/siri/SiriUpdater.md
index f6c4c3f999f..72ab45d0f39 100644
--- a/docs/sandbox/siri/SiriUpdater.md
+++ b/docs/sandbox/siri/SiriUpdater.md
@@ -37,16 +37,16 @@ To enable the SIRI updater you need to add it to the updaters section of the `ro
| previewInterval | `duration` | TODO | *Optional* | | 2.0 |
| requestorRef | `string` | The requester reference. | *Optional* | | 2.0 |
| timeout | `duration` | The HTTP timeout to download the updates. | *Optional* | `"PT15S"` | 2.0 |
-| [url](#u__8__url) | `string` | The URL to send the HTTP requests to. | *Required* | | 2.0 |
-| [headers](#u__8__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
+| [url](#u__9__url) | `string` | The URL to send the HTTP requests to. | *Required* | | 2.0 |
+| [headers](#u__9__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
##### Parameter details
-url
+url
**Since version:** `2.0` ∙ **Type:** `string` ∙ **Cardinality:** `Required`
-**Path:** /updaters/[8]
+**Path:** /updaters/[9]
The URL to send the HTTP requests to.
@@ -58,10 +58,10 @@ renamed by the loader when processed:
-
+
**Since version:** `2.3` ∙ **Type:** `map of string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[8]
+**Path:** /updaters/[9]
HTTP headers to add to the request. Any header key, value can be inserted.
@@ -93,25 +93,25 @@ HTTP headers to add to the request. Any header key, value can be inserted.
-| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
-|---------------------------------|:---------------:|--------------------------------------------------------------------------------------------------------|:----------:|---------------|:-----:|
-| type = "siri-sx-updater" | `enum` | The type of the updater. | *Required* | | 1.5 |
-| blockReadinessUntilInitialized | `boolean` | Whether catching up with the updates should block the readiness check from returning a 'ready' result. | *Optional* | `false` | 2.0 |
-| [earlyStart](#u__9__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.0 |
-| frequency | `duration` | How often the updates should be retrieved. | *Optional* | `"PT1M"` | 2.0 |
-| requestorRef | `string` | The requester reference. | *Optional* | | 2.0 |
-| timeout | `duration` | The HTTP timeout to download the updates. | *Optional* | `"PT15S"` | 2.0 |
-| [url](#u__9__url) | `string` | The URL to send the HTTP requests to. Supports http/https and file protocol. | *Required* | | 2.0 |
-| [headers](#u__9__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
+| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
+|----------------------------------|:---------------:|--------------------------------------------------------------------------------------------------------|:----------:|---------------|:-----:|
+| type = "siri-sx-updater" | `enum` | The type of the updater. | *Required* | | 1.5 |
+| blockReadinessUntilInitialized | `boolean` | Whether catching up with the updates should block the readiness check from returning a 'ready' result. | *Optional* | `false` | 2.0 |
+| [earlyStart](#u__10__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.0 |
+| frequency | `duration` | How often the updates should be retrieved. | *Optional* | `"PT1M"` | 2.0 |
+| requestorRef | `string` | The requester reference. | *Optional* | | 2.0 |
+| timeout | `duration` | The HTTP timeout to download the updates. | *Optional* | `"PT15S"` | 2.0 |
+| [url](#u__10__url) | `string` | The URL to send the HTTP requests to. Supports http/https and file protocol. | *Required* | | 2.0 |
+| [headers](#u__10__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.3 |
##### Parameter details
-earlyStart
+earlyStart
**Since version:** `2.0` ∙ **Type:** `duration` ∙ **Cardinality:** `Optional` ∙ **Default value:** `"PT0S"`
-**Path:** /updaters/[9]
+**Path:** /updaters/[10]
This value is subtracted from the actual validity defined in the message.
@@ -119,10 +119,10 @@ Normally the planned departure time is used, so setting this to 10s will cause t
SX-message to be included in trip-results 10 seconds before the the planned departure
time.
-url
+url
**Since version:** `2.0` ∙ **Type:** `string` ∙ **Cardinality:** `Required`
-**Path:** /updaters/[9]
+**Path:** /updaters/[10]
The URL to send the HTTP requests to. Supports http/https and file protocol.
@@ -135,10 +135,10 @@ renamed by the loader when processed:
-
+
**Since version:** `2.3` ∙ **Type:** `map of string` ∙ **Cardinality:** `Optional`
-**Path:** /updaters/[9]
+**Path:** /updaters/[10]
HTTP headers to add to the request. Any header key, value can be inserted.
diff --git a/src/ext/java/org/opentripplanner/ext/vehicleparking/noi/NoiUpdater.java b/src/ext/java/org/opentripplanner/ext/vehicleparking/noi/NoiUpdater.java
index 9bd64d9612f..d5ef7e63d13 100644
--- a/src/ext/java/org/opentripplanner/ext/vehicleparking/noi/NoiUpdater.java
+++ b/src/ext/java/org/opentripplanner/ext/vehicleparking/noi/NoiUpdater.java
@@ -3,6 +3,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import org.opentripplanner.framework.geometry.WgsCoordinate;
import org.opentripplanner.framework.i18n.NonLocalizedString;
+import org.opentripplanner.framework.tostring.ToStringBuilder;
import org.opentripplanner.routing.vehicle_parking.VehicleParking;
import org.opentripplanner.routing.vehicle_parking.VehicleParkingSpaces;
import org.opentripplanner.routing.vehicle_parking.VehicleParkingState;
@@ -15,12 +16,11 @@
public class NoiUpdater extends GenericJsonDataSource {
private static final String JSON_PARSE_PATH = "data/stations";
-
- private final String feedId;
+ private final NoiUpdaterParameters params;
public NoiUpdater(NoiUpdaterParameters parameters) {
super(parameters.url().toString(), JSON_PARSE_PATH, parameters.httpHeaders());
- this.feedId = parameters.feedId();
+ this.params = parameters;
}
@Override
@@ -38,14 +38,14 @@ protected VehicleParking parseElement(JsonNode jsonNode) {
throw new IllegalArgumentException("Unknown type '%s'".formatted(type));
}
- var vehicleParkId = new FeedScopedId(feedId, jsonNode.path("station_id").asText());
+ var vehicleParkId = new FeedScopedId(params.feedId(), jsonNode.path("station_id").asText());
var name = new NonLocalizedString(jsonNode.path("name").asText());
double lat = jsonNode.path("lat").asDouble();
double lon = jsonNode.path("lon").asDouble();
var coordinate = new WgsCoordinate(lat, lon);
VehicleParking.VehicleParkingEntranceCreator entrance = builder ->
builder
- .entranceId(new FeedScopedId(feedId, vehicleParkId.getId() + "/entrance"))
+ .entranceId(new FeedScopedId(params.feedId(), vehicleParkId.getId() + "/entrance"))
.coordinate(coordinate)
.walkAccessible(true)
.carAccessible(true);
@@ -66,4 +66,12 @@ protected VehicleParking parseElement(JsonNode jsonNode) {
private static VehicleParkingSpaces extractSpaces(JsonNode jsonNode, String free) {
return VehicleParkingSpaces.builder().carSpaces(jsonNode.get(free).asInt()).build();
}
+
+ @Override
+ public String toString() {
+ return ToStringBuilder
+ .of(this.getClass())
+ .addStr("url", this.params.url().toString())
+ .toString();
+ }
}
diff --git a/src/main/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingUpdater.java b/src/main/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingUpdater.java
index 3d2e9b21e29..185de6bddb7 100644
--- a/src/main/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingUpdater.java
+++ b/src/main/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingUpdater.java
@@ -8,6 +8,7 @@
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
+import org.opentripplanner.framework.tostring.ToStringBuilder;
import org.opentripplanner.routing.graph.Graph;
import org.opentripplanner.routing.linking.DisposableEdgeCollection;
import org.opentripplanner.routing.linking.LinkingDirection;
@@ -68,7 +69,7 @@ public void setGraphUpdaterManager(WriteToGraphCallback saveResultOnGraph) {
}
@Override
- protected void runPolling() throws Exception {
+ protected void runPolling() {
LOG.debug("Updating vehicle parkings from {}", source);
if (!source.update()) {
LOG.debug("No updates");
@@ -239,4 +240,9 @@ private void removeVehicleParkingEdgesFromGraph(
graph.remove(entranceVertex);
}
}
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.of(this.getClass()).addObj("source", source).toString();
+ }
}