Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block ids for all service IDs. #2

Merged
merged 3 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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();
}
Loading