diff --git a/app/src/main/java/org/transitclock/api/data/ApiServiceId.java b/app/src/main/java/org/transitclock/api/data/ApiServiceId.java new file mode 100644 index 00000000..57a8136f --- /dev/null +++ b/app/src/main/java/org/transitclock/api/data/ApiServiceId.java @@ -0,0 +1,25 @@ +/* (C)2023 */ +package org.transitclock.api.data; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * A short description of a serviceId. For when outputting list of block IDs for service. + */ +@Data +public class ApiServiceId { + + @JsonProperty + private String id; + + @JsonProperty + private List blockIds; + + public ApiServiceId(String serviceId, List blockIds) { + this.id = serviceId; + this.blockIds = blockIds; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/transitclock/api/data/ApiServiceIdResponse.java b/app/src/main/java/org/transitclock/api/data/ApiServiceIdResponse.java new file mode 100644 index 00000000..c225d4ec --- /dev/null +++ b/app/src/main/java/org/transitclock/api/data/ApiServiceIdResponse.java @@ -0,0 +1,31 @@ +/* (C)2023 */ +package org.transitclock.api.data; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * For outputting simple list of unsorted service IDs with lists of sorted block IDs + */ +@Data +public class ApiServiceIdResponse { + + @JsonProperty + private List serviceIds; + + /** + * Creates the API unsorted version of list of IDs. + * + * @param services + */ + public ApiServiceIdResponse(Map> services) { + serviceIds = services.entrySet() + .stream() + .map(entry -> new ApiServiceId(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java b/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java index f7b6b3a4..fd353421 100644 --- a/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java +++ b/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java @@ -18,6 +18,7 @@ import org.transitclock.api.data.ApiRoutesDetailsResponse; import org.transitclock.api.data.ApiSchedulesHorizStops; import org.transitclock.api.data.ApiSchedulesVertStopsResponse; +import org.transitclock.api.data.ApiServiceIdResponse; import org.transitclock.api.data.ApiTrip; import org.transitclock.api.data.ApiTripPatternsResponse; import org.transitclock.api.data.ApiTripWithTravelTimes; @@ -870,6 +871,23 @@ ResponseEntity getScheduleHorizStops( tags = {"base data", "serviceId"}) ResponseEntity getServiceIds(StandardParameters stdParameters); + /** + * Handles the "serviceIds" command. Returns list of all service IDs with assigned blocks. + * + * @param stdParameters + * + * @return + * + * @ + */ + @GetMapping(value = "/command/serviceIdsWithBlocks", + produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) + @Operation( + summary = "Retrives all service id with block ids.", + description = "Retrives all service id with block ids.", + tags = {"base data", "serviceId"}) + ResponseEntity getServiceIdsWithBlocks(StandardParameters stdParameters); + /** * Handles the currentServiceIds command. Returns list of service IDs that are currently active. * diff --git a/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java b/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java index ca2587a8..4f00e88a 100644 --- a/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java +++ b/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java @@ -24,6 +24,7 @@ import org.transitclock.api.data.ApiRoutesResponse; import org.transitclock.api.data.ApiSchedulesHorizStops; import org.transitclock.api.data.ApiSchedulesVertStopsResponse; +import org.transitclock.api.data.ApiServiceIdResponse; import org.transitclock.api.data.ApiTrip; import org.transitclock.api.data.ApiTripPatternsResponse; import org.transitclock.api.data.ApiTripWithTravelTimes; @@ -866,6 +867,20 @@ public ResponseEntity getServiceIds(StandardParameters stdParame } } + @Override + public ResponseEntity getServiceIdsWithBlocks(StandardParameters stdParameters) { + try { + // Get Vehicle data from server + Map> idsWithBlockIds = configService.getServiceIdsWithBlockIds(); + + ApiServiceIdResponse apiServiceIds = new ApiServiceIdResponse(idsWithBlockIds); + return stdParameters.createResponse(apiServiceIds); + } catch (Exception e) { + // If problem getting data then return a Bad Request + throw WebUtils.badRequestException(e); + } + } + @Override public ResponseEntity getCurrentServiceIds(StandardParameters stdParameters) { try { diff --git a/libs/core/src/main/java/org/transitclock/gtfs/DbConfig.java b/libs/core/src/main/java/org/transitclock/gtfs/DbConfig.java index 1ae5d4d4..d721b35c 100644 --- a/libs/core/src/main/java/org/transitclock/gtfs/DbConfig.java +++ b/libs/core/src/main/java/org/transitclock/gtfs/DbConfig.java @@ -684,6 +684,23 @@ public int getBlockCount() { return blockCount; } + /** + * Returns sorted lists of block IDs what belong to all service IDs + * + * @return Map of all service IDs with belong to block IDs + */ + public Map> getBlockIdsForAllServiceIds() { + Map> serviceIdsWithBlocks = new HashMap<>(); + + blocksByServiceMap.forEach((key, element) -> { + List ids = new ArrayList<>(); + element.forEach((innerKey, block) -> ids.add(block.getId())); + Collections.sort(ids); + serviceIdsWithBlocks.put(key, ids); + }); + return serviceIdsWithBlocks; + } + /** * Returns blocks for the specified blockId for all service IDs. * diff --git a/libs/core/src/main/java/org/transitclock/service/ConfigServiceImpl.java b/libs/core/src/main/java/org/transitclock/service/ConfigServiceImpl.java index f33dad3e..d2edc83f 100644 --- a/libs/core/src/main/java/org/transitclock/service/ConfigServiceImpl.java +++ b/libs/core/src/main/java/org/transitclock/service/ConfigServiceImpl.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import org.transitclock.core.dataCache.PredictionDataCache; @@ -389,4 +390,12 @@ public List getRoutesByStopId(String stopId) { null)) .collect(Collectors.toList()); } -} \ No newline at end of file + + /* (non-Javadoc) + * @see org.transitclock.ipc.interfaces.ConfigInterface#getServiceIdsWithBlockIds() + */ + @Override + public Map> getServiceIdsWithBlockIds() { + return dbConfig.getBlockIdsForAllServiceIds(); + } +} diff --git a/libs/core/src/main/java/org/transitclock/service/contract/ConfigService.java b/libs/core/src/main/java/org/transitclock/service/contract/ConfigService.java index 68dad043..e3a928e7 100644 --- a/libs/core/src/main/java/org/transitclock/service/contract/ConfigService.java +++ b/libs/core/src/main/java/org/transitclock/service/contract/ConfigService.java @@ -14,6 +14,7 @@ import java.util.Collection; import java.util.List; +import java.util.Map; /** * Defines the RMI interface for getting configuration data. @@ -52,7 +53,7 @@ IpcRoute getRoute(String routeIdOrShortName, String directionId, String stopId, /** * Obtains ordered list of route details * - * @param routeIdOrShortName + * @param routeIdsOrShortNames * @return */ List getRoutes(List routeIdsOrShortNames); @@ -184,4 +185,12 @@ IpcRoute getRoute(String routeIdOrShortName, String directionId, String stopId, * @return list of IpcRoute */ List getRoutesByStopId(String stopId); + + + /** + * Returns sorted lists of block IDs what belong to all service IDs + * + * @return Map of service IDs with belong block IDs + */ + Map> getServiceIdsWithBlockIds(); }