Skip to content

Commit 3ee9e07

Browse files
authored
Merge pull request #45 from entur/add-rule-no-missing-store-uris-in-system-information
feature: new rule to verify store uris exist in system_information
2 parents 27fa43a + 447b19e commit 3ee9e07

File tree

6 files changed

+121
-4
lines changed

6 files changed

+121
-4
lines changed

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ List of additional rules:
2121
* `NoMissingVehicleTypesAvailableWhenVehicleTypesExists`
2222
* `NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist`
2323
* `NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles`
24-
25-
Planned rules:
26-
27-
* if free_bike_status / vehicle_status or station_information has rental uris then system_information must have store_uri in rental_apps (ios and / or android)
24+
* `NoMissingStoreUriInSystemInformation`
2825

2926
## Non-schema rules:
3027

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
*
3+
* *
4+
* *
5+
* * * Licensed under the EUPL, Version 1.2 or – as soon they will be approved by
6+
* * * the European Commission - subsequent versions of the EUPL (the "Licence");
7+
* * * You may not use this work except in compliance with the Licence.
8+
* * * You may obtain a copy of the Licence at:
9+
* * *
10+
* * * https://joinup.ec.europa.eu/software/page/eupl
11+
* * *
12+
* * * Unless required by applicable law or agreed to in writing, software
13+
* * * distributed under the Licence is distributed on an "AS IS" basis,
14+
* * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* * * See the Licence for the specific language governing permissions and
16+
* * * limitations under the Licence.
17+
* *
18+
*
19+
*/
20+
21+
package org.entur.gbfs.validation.validator.rules;
22+
23+
import com.jayway.jsonpath.DocumentContext;
24+
import com.jayway.jsonpath.JsonPath;
25+
import org.json.JSONArray;
26+
import org.json.JSONObject;
27+
28+
import java.util.Map;
29+
30+
/**
31+
* It is required to provide ios and android store uris in system_information if vehicle_status
32+
* or station_information has ios and android rental uris respectively
33+
*/
34+
public class NoMissingStoreUriInSystemInformation implements CustomRuleSchemaPatcher {
35+
36+
private static final String DATA_REQUIRED_SCHEMA_PATH = "$.properties.data.required";
37+
private static final String RENTAL_APPS_SCHEMA_PATH = "$.properties.data.properties.rental_apps";
38+
39+
40+
private final String vehicleStatusFileName;
41+
42+
43+
public NoMissingStoreUriInSystemInformation(String vehicleStatusFileName) {
44+
this.vehicleStatusFileName = vehicleStatusFileName;
45+
}
46+
47+
@Override
48+
public DocumentContext addRule(DocumentContext rawSchemaDocumentContext, Map<String, JSONObject> feeds) {
49+
boolean hasIosRentalUris = false;
50+
boolean hasAndroidRentalUris = false;
51+
52+
JSONObject vehicleStatusFeed = feeds.get(vehicleStatusFileName);
53+
54+
if (vehicleStatusFeed != null) {
55+
String vehiclesKey = vehicleStatusFileName.equals("vehicle_status") ? "vehicles" : "bikes";
56+
57+
if (!((JSONArray) JsonPath.parse(vehicleStatusFeed)
58+
.read("$.data." + vehiclesKey + "[:1].rental_uris.ios")).isEmpty()) {
59+
hasIosRentalUris = true;
60+
}
61+
62+
if (!((JSONArray) JsonPath.parse(vehicleStatusFeed)
63+
.read("$.data." + vehiclesKey + "[:1].rental_uris.android")).isEmpty()) {
64+
hasAndroidRentalUris = true;
65+
}
66+
}
67+
68+
JSONObject stationInformationFeed = feeds.get("station_information");
69+
70+
if (stationInformationFeed != null) {
71+
if (!((JSONArray) JsonPath.parse(stationInformationFeed)
72+
.read("$.data.stations[:1].rental_uris.ios")).isEmpty()) {
73+
hasIosRentalUris = true;
74+
}
75+
76+
if (!((JSONArray) JsonPath.parse(stationInformationFeed)
77+
.read("$.data.stations[:1].rental_uris.android")).isEmpty()) {
78+
hasAndroidRentalUris = true;
79+
}
80+
}
81+
82+
if (hasIosRentalUris || hasAndroidRentalUris) {
83+
84+
JSONArray systemInformationDataRequiredSchema = rawSchemaDocumentContext.read(DATA_REQUIRED_SCHEMA_PATH);
85+
systemInformationDataRequiredSchema.put("rental_apps");
86+
87+
JSONObject rentalAppsSchema = rawSchemaDocumentContext.read(RENTAL_APPS_SCHEMA_PATH);
88+
JSONArray rentalAppRequired = new JSONArray();
89+
90+
91+
if (hasIosRentalUris) {
92+
rentalAppRequired.put("ios");
93+
}
94+
95+
if (hasAndroidRentalUris) {
96+
rentalAppRequired.put("android");
97+
}
98+
99+
rentalAppsSchema.put("required", rentalAppRequired);
100+
}
101+
102+
return rawSchemaDocumentContext;
103+
}
104+
}

src/main/java/org/entur/gbfs/validation/validator/versions/Version21.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.entur.gbfs.validation.validator.rules.NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles;
2222
import org.entur.gbfs.validation.validator.rules.CustomRuleSchemaPatcher;
23+
import org.entur.gbfs.validation.validator.rules.NoMissingStoreUriInSystemInformation;
2324
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist;
2425
import org.entur.gbfs.validation.validator.rules.NoInvalidReferenceToVehicleTypesInStationStatus;
2526
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypesAvailableWhenVehicleTypesExists;
@@ -55,6 +56,9 @@ public class Version21 extends AbstractVersion {
5556
"free_bike_status", List.of(
5657
new NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist("free_bike_status"),
5758
new NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles("free_bike_status")
59+
),
60+
"system_information", List.of(
61+
new NoMissingStoreUriInSystemInformation("free_bike_status")
5862
)
5963
);
6064

src/main/java/org/entur/gbfs/validation/validator/versions/Version22.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.entur.gbfs.validation.validator.rules.NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles;
2222
import org.entur.gbfs.validation.validator.rules.CustomRuleSchemaPatcher;
23+
import org.entur.gbfs.validation.validator.rules.NoMissingStoreUriInSystemInformation;
2324
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist;
2425
import org.entur.gbfs.validation.validator.rules.NoInvalidReferenceToVehicleTypesInStationStatus;
2526
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypesAvailableWhenVehicleTypesExists;
@@ -55,6 +56,9 @@ public class Version22 extends AbstractVersion {
5556
"free_bike_status", List.of(
5657
new NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist("free_bike_status"),
5758
new NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles("free_bike_status")
59+
),
60+
"system_information", List.of(
61+
new NoMissingStoreUriInSystemInformation("free_bike_status")
5862
)
5963
);
6064

src/main/java/org/entur/gbfs/validation/validator/versions/Version23.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.entur.gbfs.validation.validator.rules.NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles;
2222
import org.entur.gbfs.validation.validator.rules.CustomRuleSchemaPatcher;
2323
import org.entur.gbfs.validation.validator.rules.NoInvalidReferenceToPricingPlansInVehicleTypes;
24+
import org.entur.gbfs.validation.validator.rules.NoMissingStoreUriInSystemInformation;
2425
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist;
2526
import org.entur.gbfs.validation.validator.rules.NoInvalidReferenceToVehicleTypesInStationStatus;
2627
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypesAvailableWhenVehicleTypesExists;
@@ -59,6 +60,9 @@ public class Version23 extends AbstractVersion {
5960
"free_bike_status", List.of(
6061
new NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist("free_bike_status"),
6162
new NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles("free_bike_status")
63+
),
64+
"system_information", List.of(
65+
new NoMissingStoreUriInSystemInformation("free_bike_status")
6266
)
6367
);
6468

src/main/java/org/entur/gbfs/validation/validator/versions/Version30_RC.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.entur.gbfs.validation.validator.rules.NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles;
2222
import org.entur.gbfs.validation.validator.rules.CustomRuleSchemaPatcher;
2323
import org.entur.gbfs.validation.validator.rules.NoInvalidReferenceToPricingPlansInVehicleTypes;
24+
import org.entur.gbfs.validation.validator.rules.NoMissingStoreUriInSystemInformation;
2425
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist;
2526
import org.entur.gbfs.validation.validator.rules.NoInvalidReferenceToVehicleTypesInStationStatus;
2627
import org.entur.gbfs.validation.validator.rules.NoMissingVehicleTypesAvailableWhenVehicleTypesExists;
@@ -58,6 +59,9 @@ public class Version30_RC extends AbstractVersion {
5859
"vehicle_status", List.of(
5960
new NoMissingVehicleTypeIdInVehicleStatusWhenVehicleTypesExist("vehicle_status"),
6061
new NoMissingCurrentRangeMetersInVehicleStatusForMotorizedVehicles("vehicle_status")
62+
),
63+
"system_information", List.of(
64+
new NoMissingStoreUriInSystemInformation("vehicle_status")
6165
)
6266
);
6367

0 commit comments

Comments
 (0)