Skip to content

Commit

Permalink
Merge pull request #2 from goeuropa/block_ids_for_allservice_ids
Browse files Browse the repository at this point in the history
  • Loading branch information
wkulesza authored Mar 27, 2024
2 parents d5fb68f + 2e2a02f commit 566c918
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 41 deletions.
35 changes: 35 additions & 0 deletions app/src/main/java/org/transitclock/api/data/ApiServiceId.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/* (C)2023 */
package org.transitclock.api.data;

import jakarta.xml.bind.annotation.XmlAttribute;

import java.util.List;
import java.util.Map;

/**
* A short description of a serviceId. For when outputting list of block IDs for service.
*
* @author SkiBu Smith
*/
public class ApiServiceId {

@XmlAttribute
private String id;

@XmlAttribute
private List<String> blockIds;

/********************** Member Functions **************************/

/**
* Need a no-arg constructor for Jersey. Otherwise get really obtuse "MessageBodyWriter not
* found for media type=application/json" exception.
*/
protected ApiServiceId() {
}

public ApiServiceId(String serviceId, List<String> blockIds) {
this.id = serviceId;
this.blockIds = blockIds;
}
}
41 changes: 41 additions & 0 deletions app/src/main/java/org/transitclock/api/data/ApiServiceIds.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/* (C)2023 */
package org.transitclock.api.data;

import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* For outputting simple list of unsorted service IDs with lists of sorted block IDs
*
* @author SkiBu Smith
*/
@XmlRootElement
public class ApiServiceIds {

@XmlElement(name= "serviceIds")
private List<ApiServiceId> apiServiceIds;

/********************** Member Functions **************************/

/**
* Need a no-arg constructor for Jersey. Otherwise get really obtuse "MessageBodyWriter not
* found for media type=application/json" exception.
*/
protected ApiServiceIds() {
}

/**
* Creates the API unsorted version of list of IDs.
*
* @param serviceIds
*/
public ApiServiceIds(Map<String, List<String>> serviceIds) {
apiServiceIds = new ArrayList<>();
serviceIds.forEach((key, list) -> apiServiceIds
.add(new ApiServiceId(key,list)));
}
}
50 changes: 16 additions & 34 deletions app/src/main/java/org/transitclock/api/resources/TransitimeApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,33 +26,7 @@
import jakarta.ws.rs.core.Response;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Session;
import org.transitclock.api.data.ApiActiveBlocks;
import org.transitclock.api.data.ApiActiveBlocksRoutes;
import org.transitclock.api.data.ApiAdherenceSummary;
import org.transitclock.api.data.ApiAgencies;
import org.transitclock.api.data.ApiAgency;
import org.transitclock.api.data.ApiBlock;
import org.transitclock.api.data.ApiBlocks;
import org.transitclock.api.data.ApiBlocksTerse;
import org.transitclock.api.data.ApiCalendars;
import org.transitclock.api.data.ApiCurrentServerDate;
import org.transitclock.api.data.ApiDirections;
import org.transitclock.api.data.ApiExportsData;
import org.transitclock.api.data.ApiIds;
import org.transitclock.api.data.ApiPredictions;
import org.transitclock.api.data.ApiRmiServerStatus;
import org.transitclock.api.data.ApiRoutes;
import org.transitclock.api.data.ApiRoutesDetails;
import org.transitclock.api.data.ApiSchedulesHorizStops;
import org.transitclock.api.data.ApiSchedulesVertStops;
import org.transitclock.api.data.ApiServerStatus;
import org.transitclock.api.data.ApiTrip;
import org.transitclock.api.data.ApiTripPatterns;
import org.transitclock.api.data.ApiTripWithTravelTimes;
import org.transitclock.api.data.ApiVehicleConfigs;
import org.transitclock.api.data.ApiVehicleToBlockConfigs;
import org.transitclock.api.data.ApiVehicles;
import org.transitclock.api.data.ApiVehiclesDetails;
import org.transitclock.api.data.*;
import org.transitclock.api.utils.PredsByLoc;
import org.transitclock.api.utils.StandardParameters;
import org.transitclock.api.utils.WebUtils;
Expand Down Expand Up @@ -1254,13 +1228,13 @@ public Response getBlocks(
@Operation(
summary = "Retrives a list of all blockId for the specified service ID",
description = "Retrives a list of all blockId for the specified service ID."
+ "Every trip is associated with a block.",
+ " Every trip is associated with a block.",
tags = {"base data", "trip", "block"})
public Response getBlockIds(
@BeanParam StandardParameters stdParameters,
@Parameter(description = "if set, returns only the data for that serviceId.", required = false)
@QueryParam(value = "serviceId")
String serviceId)
@Parameter(description = "If set, returns only the data for that serviceId.", required = false)
@QueryParam(value = "serviceId")
String serviceId)
throws WebApplicationException {
// Make sure request is valid
stdParameters.validate();
Expand Down Expand Up @@ -2002,16 +1976,24 @@ public Response getAllCalendars(@BeanParam StandardParameters stdParameters) thr
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Operation(
summary = "Retrives all service id.",
description = "Retrives all service id.",
summary = "Retrives all service id. Optionally, retrives all service id with blockIds",
description = "Retrives all service id. Optionally, retrives all service id with blockIds",
tags = {"base data", "serviceId"})
public Response getServiceIds(@BeanParam StandardParameters stdParameters) throws WebApplicationException {
public Response getServiceIds(@BeanParam StandardParameters stdParameters,
@Parameter (description = "If set \"blocks\", returns assigned blockIds to all serviceIds", required = false)
@QueryParam(value = "withBlockIds")
String withBlockIds) throws WebApplicationException {
// Make sure request is valid
stdParameters.validate();

try {
// Get Vehicle data from server
ConfigInterface inter = stdParameters.getConfigInterface();
// Get service IDs with block Ids
if (withBlockIds != null && withBlockIds.equals("blocks")){
ApiServiceIds serviceIdsWithBlockIds = new ApiServiceIds(inter.getServiceIdsWithBlockIds());
return stdParameters.createResponse(serviceIdsWithBlockIds);
}
List<String> ids = inter.getServiceIds();

ApiIds apiIds = new ApiIds(ids);
Expand Down
24 changes: 18 additions & 6 deletions core/src/main/java/org/transitclock/gtfs/DbConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
import lombok.extern.slf4j.Slf4j;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.transitclock.Core;
import org.transitclock.core.ServiceUtils;
import org.transitclock.domain.hibernate.HibernateUtils;
Expand All @@ -31,10 +29,7 @@
import org.transitclock.domain.structs.Transfer;
import org.transitclock.domain.structs.Trip;
import org.transitclock.domain.structs.TripPattern;
import org.transitclock.utils.IntervalTimer;
import org.transitclock.utils.MapKey;
import org.transitclock.utils.SystemTime;
import org.transitclock.utils.Time;
import org.transitclock.utils.*;

/**
* Reads all the configuration data from the database. The data is based on GTFS but is heavily
Expand Down Expand Up @@ -686,6 +681,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<String, List<String>> getBlockIdsForAllServiceIds() {
Map<String, List<String>> serviceIdsWithBlocks = new HashMap<>();

blocksByServiceMap.forEach((key, element) -> {
List<String> ids = new ArrayList<>();
element.forEach((innerKey, block) -> ids.add(block.getId()));
StringUtils.sortIdsNumerically(ids);
serviceIdsWithBlocks.put(key, ids);
});
return serviceIdsWithBlocks;
}

/**
* Returns blocks for the specified blockId for all service IDs.
*
Expand Down
11 changes: 11 additions & 0 deletions core/src/main/java/org/transitclock/service/ConfigServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -360,4 +361,14 @@ public List<String> getBlockIds(String serviceId) {
.distinct()
.collect(Collectors.toList());
}

/* (non-Javadoc)
* @see org.transitclock.ipc.interfaces.ConfigInterface#getBlockIds()
*/
@Override
public Map<String, List<String>> getServiceIdsWithBlockIds() {
return Core.getInstance()
.getDbConfig()
.getBlockIdsForAllServiceIds();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
* Defines the RMI interface for getting configuration data.
Expand Down Expand Up @@ -51,7 +52,7 @@ IpcRoute getRoute(String routeIdOrShortName, String directionId, String stopId,
/**
* Obtains ordered list of route details
*
* @param routeIdOrShortName
* @param routeIdsOrShortNames
* @return
*/
List<IpcRoute> getRoutes(List<String> routeIdsOrShortNames);
Expand Down Expand Up @@ -174,4 +175,11 @@ IpcRoute getRoute(String routeIdOrShortName, String directionId, String stopId,
* @return vehicle IDs
*/
List<String> getBlockIds(String serviceId);

/**
* Returns sorted lists of block IDs what belong to all service IDs
*
* @return Map of service IDs with belong block IDs
*/
Map<String, List<String>> getServiceIdsWithBlockIds();
}

0 comments on commit 566c918

Please sign in to comment.