Skip to content

Commit

Permalink
PR #22: Endpoints: command/serviceIds, command/vehiclesToBlock & Trac…
Browse files Browse the repository at this point in the history
…car module
  • Loading branch information
vesavlad committed Apr 4, 2024
2 parents b5481b2 + 1e551a6 commit 9f2d710
Show file tree
Hide file tree
Showing 21 changed files with 2,792 additions and 118 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)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ protected ApiVehicleToBlockConfig() {}
* Takes a Vehicle object for client/server communication and constructs a ApiVehicle object for
* the API. Sets UiMode to UiMode.NORMAL.
*
* @param vTBC
* @param vehicleToBlockConfig
*/
public ApiVehicleToBlockConfig(IpcVehicleToBlockConfig vTBC) {
super(vTBC);
public ApiVehicleToBlockConfig(IpcVehicleToBlockConfig vehicleToBlockConfig) {
super(vehicleToBlockConfig);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,18 @@ public abstract class ApiVehicleToBlockConfigAbstract {
protected ApiVehicleToBlockConfigAbstract() {}

/**
* Takes a Vehicle object for client/server communication and constructs a ApiVehicle object for
* Takes a VehicleToBlockConfig object for client/server communication and constructs a ApiVehicleToBlockConfig object for
* the API.
*
* @param vehicle
* @param uiType If should be labeled as "minor" in output for UI.
* @param vehicleToBlockConfig
*/
public ApiVehicleToBlockConfigAbstract(IpcVehicleToBlockConfig vTBC) {
id = vTBC.getId();
vehicleId = vTBC.getVehicleId();
tripId = vTBC.getTripId();
blockId = vTBC.getBlockId();
validFrom = vTBC.getValidFrom();
validTo = vTBC.getValidTo();
assignmentDate = vTBC.getAssignmentDate();
public ApiVehicleToBlockConfigAbstract(IpcVehicleToBlockConfig vehicleToBlockConfig) {
id = vehicleToBlockConfig.getId();
vehicleId = vehicleToBlockConfig.getVehicleId();
tripId = vehicleToBlockConfig.getTripId();
blockId = vehicleToBlockConfig.getBlockId();
validFrom = vehicleToBlockConfig.getValidFrom();
validTo = vehicleToBlockConfig.getValidTo();
assignmentDate = vehicleToBlockConfig.getAssignmentDate();
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
/* (C)2023 */
package org.transitclock.api.data;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import org.transitclock.service.dto.IpcVehicleToBlockConfig;

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

/**
* For when have list of VehicleDetails. By using this class can control the element name when data
* is output.
Expand All @@ -27,23 +26,16 @@ public class ApiVehicleToBlockConfigs {
* Need a no-arg constructor for Jersey. Otherwise get really obtuse "MessageBodyWriter not
* found for media type=application/json" exception.
*/
protected ApiVehicleToBlockConfigs() {}
protected ApiVehicleToBlockConfigs() {
}

/**
* For constructing a ApiVehiclesDetails object from a Collection of Vehicle objects.
* For constructing a ApiVehicleToBlockConfigs object from a Collection of VehicleToBlockConfig objects.
*
* @param vehicles
* @param agencyId
* @param uiTypesForVehicles Specifies how vehicles should be drawn in UI. Can be NORMAL,
* SECONDARY, or MINOR
* @param assigned
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public ApiVehicleToBlockConfigs(Collection<IpcVehicleToBlockConfig> vehicles)
throws IllegalAccessException, InvocationTargetException {
public ApiVehicleToBlockConfigs(List<IpcVehicleToBlockConfig> vehicles) {
vehiclesData = new ArrayList<ApiVehicleToBlockConfig>();

for (IpcVehicleToBlockConfig vehicleToBlock : vehicles) {
vehiclesData.add(new ApiVehicleToBlockConfig(vehicleToBlock));
}
Expand Down
77 changes: 34 additions & 43 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 All @@ -76,7 +50,6 @@
import org.transitclock.service.dto.IpcTripPattern;
import org.transitclock.service.dto.IpcVehicle;
import org.transitclock.service.dto.IpcVehicleConfig;
import org.transitclock.service.dto.IpcVehicleToBlockConfig;
import org.transitclock.service.contract.ConfigInterface;
import org.transitclock.service.contract.PredictionsInterface;
import org.transitclock.service.contract.PredictionsInterface.RouteStop;
Expand Down Expand Up @@ -196,28 +169,38 @@ public Response getVehicles(

@Operation(
summary = "Returns data for vehicles assignment for specific block in current day",
description = "Returns data for vehicles assignment for specific block in current day")
description = "Returns data for vehicles assignment for specific block in current day",
tags = {"vehicle", "block"})
@Path("/command/vehiclesToBlock")
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response getVehiclesToBlock(
@BeanParam StandardParameters stdParameters,
@Parameter(description = "Block id") @QueryParam(value = "blockId") String blockId)
@Parameter(description = "If set 'true', returns only the data with actual time windows.", required = false)
@QueryParam(value = "actual")
boolean isActual,
@Parameter(description = "If set, returns only the data for that block Id.", required = false)
@QueryParam(value = "blockId")
String blockId)
throws WebApplicationException {

stdParameters.validate();
Collection<IpcVehicleToBlockConfig> result = null;

try {
// Get Vehicle data from server
VehiclesInterface inter = stdParameters.getVehiclesInterface();

result = inter.getVehicleToBlockConfig(blockId);

ApiVehicleToBlockConfigs apiVTBC = new ApiVehicleToBlockConfigs(result);
if(isActual){
var actualConfigs = inter.getActualVehicleToBlockConfigs();
ApiVehicleToBlockConfigs vehiclesToBlocks = new ApiVehicleToBlockConfigs(actualConfigs);
// return actual ApiVehicleToBlockConfigs response
return stdParameters.createResponse(vehiclesToBlocks);
}
var configs = inter.getVehicleToBlockConfigByBlockId(blockId);

// return ApiVehicles response
return stdParameters.createResponse(apiVTBC);
ApiVehicleToBlockConfigs vehiclesToBlocks = new ApiVehicleToBlockConfigs(configs);
// return ApiVehicleToBlockConfigs response
return stdParameters.createResponse(vehiclesToBlocks);
} catch (Exception e) {
// If problem getting data then return a Bad Request
throw WebUtils.badRequestException(e);
Expand Down Expand Up @@ -1254,13 +1237,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 +1985,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 'true', returns serviceIds with assigned blockIds", required = false)
@QueryParam(value = "withBlockIds")
boolean 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) {
ApiServiceIds serviceIdsWithBlockIds = new ApiServiceIds(inter.getServiceIdsWithBlockIds());
return stdParameters.createResponse(serviceIdsWithBlockIds);
}
List<String> ids = inter.getServiceIds();

ApiIds apiIds = new ApiIds(ids);
Expand Down
5 changes: 5 additions & 0 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jakarta-xmlbind-annotations</artifactId>
</dependency>
<dependency>
<groupId>pl.goeuropa</groupId>
<artifactId>traccar-client</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>

<build>
Expand Down
25 changes: 25 additions & 0 deletions core/src/main/java/org/transitclock/config/data/TraccarConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/* (C)2023 */
package org.transitclock.config.data;

import org.transitclock.config.StringConfigValue;


public class TraccarConfig {
/**
* Traccar properties for log in by "TraccarAVLModule"
*
* @return
*/
public static final StringConfigValue TRACCAREMAIL = new StringConfigValue("transitclock.avl.traccar.email", null,
"This is the username for the traccar server api.");

public static final StringConfigValue TRACCARPASSWORD = new StringConfigValue("transitclock.avl.traccar.password",
null, "This is the password for the traccar server api");

public static final StringConfigValue TRACCARBASEURL = new StringConfigValue("transitclock.avl.traccar.baseurl",
null, "This is the url for the traccar server api.");

public static final StringConfigValue TRACCARSOURCE = new StringConfigValue("transitclock.avl.traccar.source",
"TRACCAR", "This is the value recorded in the source for the AVL Report.");

}
6 changes: 3 additions & 3 deletions core/src/main/java/org/transitclock/core/AvlProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -1386,12 +1386,12 @@ public void processAvlReport(AvlReport avlReport) {
}
try (Session session = HibernateUtils.getSession()) {
String blockId = null;
for (VehicleToBlockConfig vTBC :
for (VehicleToBlockConfig vehicleToBlock :
VehicleToBlockConfig.getVehicleToBlockConfigsByVehicleId(session, avlReport.getVehicleId())) {
Date d = new Date();

if (d.after(vTBC.getValidFrom()) && d.before(vTBC.getValidTo())) {
blockId = vTBC.getBlockId();
if (d.after(vehicleToBlock.getValidFrom()) && d.before(vehicleToBlock.getValidTo())) {
blockId = vehicleToBlock.getBlockId();
break;
}
}
Expand Down
Loading

0 comments on commit 9f2d710

Please sign in to comment.