diff --git a/app/src/main/java/org/transitclock/api/data/ApiVehicleToBlockConfig.java b/app/src/main/java/org/transitclock/api/data/ApiVehicleToBlockConfig.java
index 9c4444def..751496b2b 100644
--- a/app/src/main/java/org/transitclock/api/data/ApiVehicleToBlockConfig.java
+++ b/app/src/main/java/org/transitclock/api/data/ApiVehicleToBlockConfig.java
@@ -8,14 +8,6 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
-/**
- * Contains the data for a single vehicle.
- *
- *
Note: @XmlType(propOrder=""...) is used to get the elements to be output in desired order
- * instead of the default of alphabetical. This makes the resulting JSON/XML more readable.
- *
- * @author SkiBu Smith
- */
@Data
public class ApiVehicleToBlockConfig {
@@ -40,26 +32,14 @@ public class ApiVehicleToBlockConfig {
@JsonProperty
protected String blockId;
- /**
- * Need a no-arg constructor for Jersey. Otherwise get really obtuse "MessageBodyWriter not
- * found for media type=application/json" exception.
- */
- protected ApiVehicleToBlockConfig() {}
- /**
- * Takes a Vehicle object for client/server communication and constructs a ApiVehicle object for
- * the API.
- *
- * @param vehicle
- * @param uiType If should be labeled as "minor" in output for UI.
- */
- public ApiVehicleToBlockConfig(IpcVehicleToBlockConfig vTBC) {
- id = vTBC.getId();
- vehicleId = vTBC.getVehicleId();
- tripId = vTBC.getTripId();
- blockId = vTBC.getBlockId();
- validFrom = vTBC.getValidFrom();
- validTo = vTBC.getValidTo();
- assignmentDate = vTBC.getAssignmentDate();
+ public ApiVehicleToBlockConfig(IpcVehicleToBlockConfig vehicleToBlockConfig) {
+ id = vehicleToBlockConfig.getId();
+ vehicleId = vehicleToBlockConfig.getVehicleId();
+ tripId = vehicleToBlockConfig.getTripId();
+ blockId = vehicleToBlockConfig.getBlockId();
+ validFrom = vehicleToBlockConfig.getValidFrom();
+ validTo = vehicleToBlockConfig.getValidTo();
+ assignmentDate = vehicleToBlockConfig.getAssignmentDate();
}
}
diff --git a/app/src/main/java/org/transitclock/api/resources/CommandsResource.java b/app/src/main/java/org/transitclock/api/resources/CommandsResource.java
index 322df01e9..77fe14087 100644
--- a/app/src/main/java/org/transitclock/api/resources/CommandsResource.java
+++ b/app/src/main/java/org/transitclock/api/resources/CommandsResource.java
@@ -276,7 +276,10 @@ public ResponseEntity removeVehicleToBlock(
StandardParameters stdParameters,
long id) {
try {
- commandsService.removeVehicleToBlock(id);
+ // Remove vehicle
+ var vehicleId = commandsService.removeVehicleToBlock(id);
+ // Reset vehicle
+ commandsService.setVehicleUnpredictable(vehicleId);
} catch (Exception e) {
// If problem getting data then return a Bad Request
throw WebUtils.badRequestException(e);
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 bda9b1859..901793e5c 100644
--- a/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java
+++ b/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java
@@ -98,16 +98,19 @@ ResponseEntity getVehicles(
int numberPredictions);
@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")
+ summary = "Returns data for vehicles assignment for specific block id",
+ description = "Returns data for vehicles assignment for specific block id")
@GetMapping(
value = "/command/vehiclesToBlock",
produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}
)
ResponseEntity getVehiclesToBlock(
StandardParameters stdParameters,
+ @Parameter(description = "If set 'true', returns only the data with actual time windows.")
+ @RequestParam(value = "actual", required = false, defaultValue = "false")
+ boolean actual,
@Parameter(description = "Block id")
- @RequestParam(value = "blockId")
+ @RequestParam(value = "blockId", required = false)
String blockId);
/**
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 b784711d3..1a4359cd1 100644
--- a/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java
+++ b/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java
@@ -116,13 +116,19 @@ public ResponseEntity getVehicles(
@Override
public ResponseEntity getVehiclesToBlock(
StandardParameters stdParameters,
+ boolean actual,
String blockId) {
// Get Vehicle data from server
- var result = vehiclesService.getVehicleToBlockConfig(blockId);
- ApiVehicleToBlockResponse res = new ApiVehicleToBlockResponse(result);
-
+ if (actual) {
+ var actualConfigs = vehiclesService.getActualVehicleToBlockConfigs();
+ ApiVehicleToBlockResponse response = new ApiVehicleToBlockResponse(actualConfigs);
+ // return actual ApiVehicles response
+ return ResponseEntity.ok(response);
+ }
+ var configs = vehiclesService.getVehicleToBlockConfigByBlockId(blockId);
+ ApiVehicleToBlockResponse response = new ApiVehicleToBlockResponse(configs);
// return ApiVehicles response
- return ResponseEntity.ok(res);
+ return ResponseEntity.ok(response);
}
@Override
diff --git a/libs/core/src/main/java/org/transitclock/domain/structs/VehicleToBlockConfig.java b/libs/core/src/main/java/org/transitclock/domain/structs/VehicleToBlockConfig.java
index 84c2b9c22..2ea22ff34 100644
--- a/libs/core/src/main/java/org/transitclock/domain/structs/VehicleToBlockConfig.java
+++ b/libs/core/src/main/java/org/transitclock/domain/structs/VehicleToBlockConfig.java
@@ -97,21 +97,31 @@ public static void updateVehicleToBlockConfig(VehicleToBlockConfig vehicleToBloc
session.merge(vehicleToBlockConfig);
}
- public static void deleteVehicleToBlockConfig(long id, Session session) throws HibernateException {
+ public static String deleteVehicleToBlockConfig(long id, Session session) throws HibernateException {
+ String vehicleId = session
+ .createQuery("FROM VehicleToBlockConfig WHERE id = :id", VehicleToBlockConfig.class)
+ .setParameter("id", id).getSingleResult().getVehicleId();
+
Transaction transaction = session.beginTransaction();
try {
- session
- .createMutationQuery("delete from VehicleToBlockConfig where id = :id")
+ session.createMutationQuery("delete from VehicleToBlockConfig where id = :id")
.setParameter("id", id)
.executeUpdate();
transaction.commit();
+ return vehicleId;
} catch (Throwable t) {
transaction.rollback();
throw t;
}
}
+ public static List getActualVehicleToBlockConfigs(Session session) throws HibernateException {
+ return session
+ .createQuery("FROM VehicleToBlockConfig WHERE validTo > CAST( now() AS TIMESTAMP ) ORDER BY assignmentDate DESC", VehicleToBlockConfig.class)
+ .list();
+ }
+
public static List getVehicleToBlockConfigsByBlockId(Session session, String blockId) throws HibernateException {
return session
.createQuery("FROM VehicleToBlockConfig WHERE blockId = :blockId ORDER BY assignmentDate DESC", VehicleToBlockConfig.class)
diff --git a/libs/core/src/main/java/org/transitclock/service/CommandsServiceImpl.java b/libs/core/src/main/java/org/transitclock/service/CommandsServiceImpl.java
index 8602a8fe1..07d101774 100644
--- a/libs/core/src/main/java/org/transitclock/service/CommandsServiceImpl.java
+++ b/libs/core/src/main/java/org/transitclock/service/CommandsServiceImpl.java
@@ -1,7 +1,9 @@
/* (C)2023 */
package org.transitclock.service;
+import com.google.common.base.CaseFormat;
import lombok.extern.slf4j.Slf4j;
+import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -180,13 +182,12 @@ public String addVehicleToBlock(
@Override
public String removeVehicleToBlock(long id) {
- Session session = HibernateUtils.getSession();
- try {
- VehicleToBlockConfig.deleteVehicleToBlockConfig(id, session);
- session.close();
+ try (Session session = HibernateUtils.getSession()) {
+ return VehicleToBlockConfig.deleteVehicleToBlockConfig(id, session);
} catch (Exception ex) {
- session.close();
+ logger.warn("Something went wrong when trying to delete a raw from {} table",
+ CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, VehicleToBlockConfig.class.getSimpleName()));
+ throw new HibernateException(ex.getMessage());
}
- return null;
}
}
diff --git a/libs/core/src/main/java/org/transitclock/service/VehiclesServiceImpl.java b/libs/core/src/main/java/org/transitclock/service/VehiclesServiceImpl.java
index 5a1197426..65e1ca15a 100644
--- a/libs/core/src/main/java/org/transitclock/service/VehiclesServiceImpl.java
+++ b/libs/core/src/main/java/org/transitclock/service/VehiclesServiceImpl.java
@@ -5,6 +5,8 @@
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Session;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
import org.transitclock.core.avl.assigner.BlockInfoProvider;
import org.transitclock.core.dataCache.VehicleDataCache;
import org.transitclock.domain.hibernate.HibernateUtils;
@@ -25,6 +27,7 @@
import java.io.Serializable;
import java.util.*;
+import java.util.stream.Collectors;
@Slf4j
@Component
@@ -370,31 +373,49 @@ public Collection getVehiclesForBlocks() {
}
@Override
- public Collection getVehicleToBlockConfig(String blockId) {
+ public Collection getActualVehicleToBlockConfigs() {
List result = new ArrayList<>();
- try (Session session = HibernateUtils.getSession()){
- for (VehicleToBlockConfig vTBC : VehicleToBlockConfig.getVehicleToBlockConfigsByBlockId(session, blockId)) {
- result.add(new IpcVehicleToBlockConfig(vTBC));
- }
- } catch (Exception ex) {
- logger.error("Something happened while fetching the VehicleToBlockConfig.", ex);
+ try (Session session = HibernateUtils.getSession()) {
+ return VehicleToBlockConfig.getActualVehicleToBlockConfigs(session).stream()
+ .map(IpcVehicleToBlockConfig::new)
+ .collect(Collectors.toList());
+ } catch (Exception ex) {
+ logger.error("Something happened while fetching the data: ", ex);
}
- return result;
+ return List.of();
+ }
+
+ @Override
+ public Collection getVehicleToBlockConfigByBlockId(String blockId) {
+ try (Session session = HibernateUtils.getSession()) {
+ if (!StringUtils.isEmpty(blockId)) {
+ return VehicleToBlockConfig.getVehicleToBlockConfigsByBlockId(session, blockId)
+ .stream()
+ .map(IpcVehicleToBlockConfig::new)
+ .collect(Collectors.toList());
+ }
+ return VehicleToBlockConfig.getVehicleToBlockConfigs(session)
+ .stream()
+ .map(IpcVehicleToBlockConfig::new)
+ .collect(Collectors.toList());
+ } catch (Exception ex) {
+ logger.error("Something happened while fetching the data.", ex);
+ }
+ return List.of();
}
@Override
public Collection getVehicleToBlockConfigByVehicleId(String vehicleId) {
- List result = new ArrayList<>();
- Session session = HibernateUtils.getSession();
- try {
- for (var vTBC : VehicleToBlockConfig.getVehicleToBlockConfigsByVehicleId(session, vehicleId)) {
- result.add(new IpcVehicleToBlockConfig(vTBC));
- }
- session.close();
+
+ try (Session session = HibernateUtils.getSession()) {
+ return VehicleToBlockConfig.getVehicleToBlockConfigsByVehicleId(session, vehicleId)
+ .stream()
+ .map(IpcVehicleToBlockConfig::new)
+ .collect(Collectors.toList());
} catch (Exception ex) {
- session.close();
+ logger.error("Something happened while fetching the data.", ex);
}
- return result;
+ return List.of();
}
/**
@@ -434,5 +455,5 @@ public int compare(IpcActiveBlock b1, IpcActiveBlock b2) {
if (blockStartTime1 > blockStartTime2) return 1;
return 0;
}
- };
+ }
}
diff --git a/libs/core/src/main/java/org/transitclock/service/contract/VehiclesService.java b/libs/core/src/main/java/org/transitclock/service/contract/VehiclesService.java
index 396a3c39f..cc6f5dd8d 100644
--- a/libs/core/src/main/java/org/transitclock/service/contract/VehiclesService.java
+++ b/libs/core/src/main/java/org/transitclock/service/contract/VehiclesService.java
@@ -9,6 +9,7 @@
import org.transitclock.service.dto.IpcVehicleToBlockConfig;
import java.util.Collection;
+import java.util.List;
/**
* Defines the RMI interface used for obtaining vehicle information.
@@ -174,7 +175,9 @@ Collection getActiveBlocks(Collection routeIds, int allo
*/
int getNumActiveBlocks(Collection routeIds, int allowableBeforeTimeSecs);
- Collection getVehicleToBlockConfig(String blockId);
+ Collection getActualVehicleToBlockConfigs();
+
+ Collection getVehicleToBlockConfigByBlockId(String blockId);
Collection getVehicleToBlockConfigByVehicleId(String vehicleId);
}