From a69dde0a9d15e4de4e0526147cfc332cb28b6007 Mon Sep 17 00:00:00 2001 From: Timur Shykhsefiyeu Date: Thu, 16 May 2024 17:36:03 +0200 Subject: [PATCH 1/4] add 'actual' param to /command/vehiclesToBlock --- .../api/data/ApiVehicleToBlockConfig.java | 36 +++--------- .../api/resources/TransitimeApi.java | 9 ++- .../api/resources/TransitimeResource.java | 14 +++-- .../domain/structs/VehicleToBlockConfig.java | 5 ++ .../service/VehiclesServiceImpl.java | 57 +++++++++++++------ .../service/contract/VehiclesService.java | 5 +- 6 files changed, 72 insertions(+), 54 deletions(-) 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/TransitimeApi.java b/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java index 740ad5b9f..2be62949f 100644 --- a/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java +++ b/app/src/main/java/org/transitclock/api/resources/TransitimeApi.java @@ -97,16 +97,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..a5656200f 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..41452acf8 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 @@ -111,6 +111,11 @@ public static void deleteVehicleToBlockConfig(long id, Session session) throws H throw t; } } + public static List getActualVehicleToBlockConfigs(Session session) throws HibernateException { + return session + .createQuery("FROM VehicleToBlockConfig WHERE validTo > now() ORDER BY assignmentDate DESC", VehicleToBlockConfig.class) + .list(); + } public static List getVehicleToBlockConfigsByBlockId(Session session, String blockId) throws HibernateException { return session 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); } From eae09042dacf484417eb6ebbe8ea08d9cf317aea Mon Sep 17 00:00:00 2001 From: Timur Shykhsefiyeu Date: Wed, 22 May 2024 15:42:49 +0200 Subject: [PATCH 2/4] fix condition in getActual vtbc by cast to timestamp --- .../org/transitclock/domain/structs/VehicleToBlockConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 41452acf8..241295520 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 @@ -113,7 +113,7 @@ public static void deleteVehicleToBlockConfig(long id, Session session) throws H } public static List getActualVehicleToBlockConfigs(Session session) throws HibernateException { return session - .createQuery("FROM VehicleToBlockConfig WHERE validTo > now() ORDER BY assignmentDate DESC", VehicleToBlockConfig.class) + .createQuery("FROM VehicleToBlockConfig WHERE validTo > CAST( now() AS TIMESTAMP ) ORDER BY assignmentDate DESC", VehicleToBlockConfig.class) .list(); } From 8a1b2269135aec27beab9463d0094fe729658918 Mon Sep 17 00:00:00 2001 From: Timur Shykhsefiyeu Date: Wed, 29 May 2024 17:20:42 +0200 Subject: [PATCH 3/4] add reset option after deleting a record from vehicle_to_block_config table --- .../api/resources/CommandsResource.java | 5 ++++- .../domain/structs/VehicleToBlockConfig.java | 11 ++++++++--- .../transitclock/service/CommandsServiceImpl.java | 13 +++++++------ 3 files changed, 19 insertions(+), 10 deletions(-) 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/libs/core/src/main/java/org/transitclock/domain/structs/VehicleToBlockConfig.java b/libs/core/src/main/java/org/transitclock/domain/structs/VehicleToBlockConfig.java index 241295520..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,20 +97,25 @@ 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) 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..2ca4151dd 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 try to delete a raw from {} table", + CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, VehicleToBlockConfig.class.getName())); + throw new HibernateException(ex.getMessage()); } - return null; } } From 023533576c6529adf4b30b809c8d0194e4233efa Mon Sep 17 00:00:00 2001 From: Timur Shykhsefiyeu Date: Mon, 10 Jun 2024 20:43:55 +0200 Subject: [PATCH 4/4] refactoring --- .../org/transitclock/api/resources/TransitimeResource.java | 2 +- .../java/org/transitclock/service/CommandsServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 a5656200f..1a4359cd1 100644 --- a/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java +++ b/app/src/main/java/org/transitclock/api/resources/TransitimeResource.java @@ -119,7 +119,7 @@ public ResponseEntity getVehiclesToBlock( boolean actual, String blockId) { // Get Vehicle data from server - if(actual) { + if (actual) { var actualConfigs = vehiclesService.getActualVehicleToBlockConfigs(); ApiVehicleToBlockResponse response = new ApiVehicleToBlockResponse(actualConfigs); // return actual ApiVehicles response 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 2ca4151dd..07d101774 100644 --- a/libs/core/src/main/java/org/transitclock/service/CommandsServiceImpl.java +++ b/libs/core/src/main/java/org/transitclock/service/CommandsServiceImpl.java @@ -185,8 +185,8 @@ public String removeVehicleToBlock(long id) { try (Session session = HibernateUtils.getSession()) { return VehicleToBlockConfig.deleteVehicleToBlockConfig(id, session); } catch (Exception ex) { - logger.warn("Something went wrong when try to delete a raw from {} table", - CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, VehicleToBlockConfig.class.getName())); + 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()); } }