From d470ec5f91930b1074bd0e3c52b9f704a7b78fdc Mon Sep 17 00:00:00 2001 From: sBouzols Date: Thu, 30 Apr 2026 11:22:52 +0200 Subject: [PATCH 01/11] feat(): add `getLoadFlowStatuses` Signed-off-by: sBouzols --- .../RootNetworkNodeInfoRepository.java | 2 + .../study/server/service/LoadFlowService.java | 26 +++++++++++++ .../service/RootNetworkNodeInfoService.java | 38 +++++++++++++------ .../study/server/service/StudyService.java | 3 +- .../server/NetworkModificationTreeTest.java | 6 +-- .../studycontroller/NodeControllerTest.java | 2 +- 6 files changed, 60 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkNodeInfoRepository.java b/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkNodeInfoRepository.java index 22a7fb788..ea8776807 100644 --- a/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkNodeInfoRepository.java +++ b/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkNodeInfoRepository.java @@ -49,6 +49,8 @@ public interface RootNetworkNodeInfoRepository extends JpaRepository findAllWithRootNetworkByNodeInfoId(UUID nodeInfoId); + List findAllByNodeInfoIdInAndRootNetworkId(List nodeInfoIds, UUID rootNetworkUuid); + Optional findByNodeInfoIdAndRootNetworkId(UUID nodeInfoId, UUID rootNetworkUuid); @EntityGraph(attributePaths = {"modificationsUuidsToExclude"}, type = EntityGraph.EntityGraphType.LOAD) diff --git a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java index 7945e6d33..f9631c464 100644 --- a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java @@ -28,6 +28,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.UUID; @@ -143,6 +144,22 @@ public LoadFlowStatus getLoadFlowStatus(UUID resultUuid) { return restTemplate.getForObject(loadFlowServerBaseUri + path, LoadFlowStatus.class); } + public Map getLoadFlowStatuses(List resultUuids) { + if (resultUuids == null || resultUuids.isEmpty()) { + return null; + } + + UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + LOADFLOW_API_VERSION + "/results/statuses"); + String path = uriComponentsBuilder.toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); + + return restTemplate.exchange(loadFlowServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); + } + public void stopLoadFlow(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID resultUuid, String userId) { Objects.requireNonNull(studyUuid); Objects.requireNonNull(nodeUuid); @@ -198,6 +215,15 @@ public void assertLoadFlowNotRunning(UUID resultUuid) { } } + public void assertLoadFlowsNotRunning(List resultUuids) { + Map loadFlowStatuses = getLoadFlowStatuses(resultUuids); + // this is O(n) complexity, maybe we should adapt endoint to simply check LoadFlowsNotRunning + // for a list of resultUuids returning boolean if encounter one RUNNING computation ? + if (loadFlowStatuses != null && loadFlowStatuses.containsValue(LoadFlowStatus.RUNNING)) { + throw new StudyException(COMPUTATION_RUNNING); + } + } + public List getLimitViolations(UUID resultUuid, String filters, String globalFilters, Sort sort, UUID networkUuid, String variantId) { List result = new ArrayList<>(); diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java index 002b34baf..d414ceacb 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java @@ -449,6 +449,10 @@ public Optional getRootNetworkNodeInfo(UUID nodeUuid, return rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(nodeUuid, rootNetworkUuid); } + public List getRootNetworkNodeInfos(List nodeUuids, UUID rootNetworkUuid) { + return rootNetworkNodeInfoRepository.findAllByNodeInfoIdInAndRootNetworkId(nodeUuids, rootNetworkUuid); + } + private static UUID getComputationResultUuid(RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity, ComputationType computationType) { return switch (computationType) { case LOAD_FLOW -> rootNetworkNodeInfoEntity.getLoadFlowResultUuid(); @@ -470,6 +474,14 @@ public UUID getComputationResultUuid(UUID nodeUuid, UUID rootNetworkUuid, Comput return rootNetworkNodeInfoEntityOpt.map(rootNetworkNodeInfoEntity -> getComputationResultUuid(rootNetworkNodeInfoEntity, computationType)).orElse(null); } + public List getComputationResultUuids(List nodeUuids, UUID rootNetworkUuid, ComputationType computationType) { + List rootNetworkNodeInfoEntities = getRootNetworkNodeInfos(nodeUuids, rootNetworkUuid); + return rootNetworkNodeInfoEntities.stream() + .map(rootNetworkNodeInfoEntity -> getComputationResultUuid(rootNetworkNodeInfoEntity, computationType)) + .filter(Objects::nonNull) + .toList(); + } + public List getComputationResultUuids(UUID studyUuid, ComputationType computationType) { return rootNetworkNodeInfoRepository.findAllByRootNetworkStudyId(studyUuid).stream() .map(rootNetworkNodeInfoEntity -> getComputationResultUuid(rootNetworkNodeInfoEntity, computationType)) @@ -656,19 +668,23 @@ private List getReportUuids(RootNetworkNodeInfo rootNetworkNodeInfo) { .toList(); } - public void assertComputationNotRunning(UUID nodeUuid, UUID rootNetworkUuid) { - loadFlowService.assertLoadFlowNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, LOAD_FLOW)); - securityAnalysisService.assertSecurityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SECURITY_ANALYSIS)); - dynamicSimulationService.assertDynamicSimulationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_SIMULATION)); - dynamicSecurityAnalysisService.assertDynamicSecurityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_SECURITY_ANALYSIS)); - dynamicMarginCalculationService.assertDynamicMarginCalculationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_MARGIN_CALCULATION)); - sensitivityAnalysisService.assertSensitivityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SENSITIVITY_ANALYSIS)); - shortCircuitService.assertShortCircuitAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SHORT_CIRCUIT), getComputationResultUuid(nodeUuid, rootNetworkUuid, SHORT_CIRCUIT_ONE_BUS)); - voltageInitService.assertVoltageInitNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, VOLTAGE_INITIALIZATION)); - stateEstimationService.assertStateEstimationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, STATE_ESTIMATION)); - pccMinService.assertPccMinNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, PCC_MIN)); + public void assertComputationsNotRunning(List nodeUuids, UUID rootNetworkUuid) { + nodeUuids.forEach(nodeUuid -> { + securityAnalysisService.assertSecurityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SECURITY_ANALYSIS)); + dynamicSimulationService.assertDynamicSimulationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_SIMULATION)); + dynamicSecurityAnalysisService.assertDynamicSecurityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_SECURITY_ANALYSIS)); + dynamicMarginCalculationService.assertDynamicMarginCalculationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_MARGIN_CALCULATION)); + sensitivityAnalysisService.assertSensitivityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SENSITIVITY_ANALYSIS)); + shortCircuitService.assertShortCircuitAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SHORT_CIRCUIT), getComputationResultUuid(nodeUuid, rootNetworkUuid, SHORT_CIRCUIT_ONE_BUS)); + voltageInitService.assertVoltageInitNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, VOLTAGE_INITIALIZATION)); + stateEstimationService.assertStateEstimationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, STATE_ESTIMATION)); + pccMinService.assertPccMinNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, PCC_MIN)); + }); + loadFlowService.assertLoadFlowsNotRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, LOAD_FLOW)); } + + /*************************** * GET COMPUTATION RESULTS * ***************************/ diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index 0a2566e2a..628de2519 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -1152,8 +1152,7 @@ public void assertCanBuildNode(UUID rootNetworkUuid, UUID nodeUuid) { } private void assertNoBuildNoComputationInTree(UUID rootNetworkUuid, List nodesUuids) { - // TODO modify computations endpoints to test multiple uuids - nodesUuids.forEach(uuid -> rootNetworkNodeInfoService.assertComputationNotRunning(uuid, rootNetworkUuid)); + rootNetworkNodeInfoService.assertComputationsNotRunning(nodesUuids, rootNetworkUuid); rootNetworkNodeInfoService.assertNoBuildingNode(rootNetworkUuid, nodesUuids); } diff --git a/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java b/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java index 65bac6da3..b203a2791 100644 --- a/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java +++ b/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java @@ -449,7 +449,7 @@ private void assertForbiddenNodeInsertions(UUID studyId, String userId, NetworkModificationNode security1, NetworkModificationNode security2) throws Exception { // Construction node cannot be inserted before a security node - doNothing().when(rootNetworkNodeInfoService).assertComputationNotRunning(any(), any()); + doNothing().when(rootNetworkNodeInfoService).assertComputationsNotRunning(any(), any()); mockMvc.perform(post("/v1/studies/{studyUuid}/tree/nodes?nodeToCutUuid={nodeUuid}&referenceNodeUuid={referenceNodeUuid}&insertMode={insertMode}", studyId, construction2.getId(), security1.getId(), InsertMode.BEFORE) .header(USER_ID_HEADER, userId)) @@ -637,7 +637,7 @@ void testNodeStashAndRestore() throws Exception { assertEquals("not built node", networkModificationNode.getDescription()); //stash 1 node and do the checks - doNothing().when(rootNetworkNodeInfoService).assertComputationNotRunning(any(), any()); + doNothing().when(rootNetworkNodeInfoService).assertComputationsNotRunning(any(), any()); stashNode(root.getStudyId(), children.get(0), false, Set.of(children.get(0)), userId); var stashedNode = nodeRepository.findById(children.get(0).getId()).orElseThrow(); assertTrue(stashedNode.isStashed()); @@ -1746,7 +1746,7 @@ void testNodeAliases() throws Exception { checkNodeAliasUpdateMessageReceived(root.getStudyId()); // Stashing node3 (with stashChildren=true) should result in aliases no more associated to nodes node3, node4 and node5 - doNothing().when(rootNetworkNodeInfoService).assertComputationNotRunning(any(), any()); + doNothing().when(rootNetworkNodeInfoService).assertComputationsNotRunning(any(), any()); stashNode(root.getStudyId(), node3, true, Set.of(node3, node4, node5), userId); nodeAliases = objectMapper.readValue(mockMvc.perform(get("/v1/studies/{studyUuid}/node-aliases", root.getStudyId())).andExpect(status().isOk()).andReturn() .getResponse() diff --git a/src/test/java/org/gridsuite/study/server/studycontroller/NodeControllerTest.java b/src/test/java/org/gridsuite/study/server/studycontroller/NodeControllerTest.java index b0744d095..806d2c6bd 100644 --- a/src/test/java/org/gridsuite/study/server/studycontroller/NodeControllerTest.java +++ b/src/test/java/org/gridsuite/study/server/studycontroller/NodeControllerTest.java @@ -372,7 +372,7 @@ private void cutAndPasteNode(UUID studyUuid, NetworkModificationNode nodeToCopy, boolean wasBuilt = rootNetworkNodeInfoService.getRootNetworkNodeInfo(nodeToCopy.getId(), studyTestUtils.getOneRootNetworkUuid(studyUuid)).get().getNodeBuildStatus().toDto().isBuilt(); UUID deleteModificationIndexStub = wireMockStubs.stubNetworkModificationDeleteIndex(); output.receive(TIMEOUT, studyUpdateDestination); - doNothing().when(rootNetworkNodeInfoService).assertComputationNotRunning(any(), any()); + doNothing().when(rootNetworkNodeInfoService).assertComputationsNotRunning(any(), any()); mockMvc.perform(post(STUDIES_URL + "/{studyUuid}/tree/nodes?nodeToCutUuid={nodeUuid}&referenceNodeUuid={referenceNodeUuid}&insertMode={insertMode}", studyUuid, nodeToCopy.getId(), referenceNodeUuid, insertMode) From b19f1e91205bb5832fbc67a3cbe61edb021f6227 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Tue, 12 May 2026 22:06:02 +0200 Subject: [PATCH 02/11] feat(): generalize get computation statuses service for all types of computation Co-authored-by: Copilot Signed-off-by: sBouzols --- .../server/controller/StudyController.java | 22 ++++++------ ...s.java => ShortCircuitAnalysisStatus.java} | 2 +- .../study/server/service/LoadFlowService.java | 30 +++++----------- .../study/server/service/PccMinService.java | 34 ++++++++++++++----- .../service/RootNetworkNodeInfoService.java | 33 +++++++++--------- .../service/SecurityAnalysisService.java | 31 ++++++++++++----- .../service/SensitivityAnalysisService.java | 33 +++++++++++++----- .../service/StateEstimationService.java | 33 +++++++++++++----- .../server/service/VoltageInitService.java | 31 ++++++++++++++--- .../DynamicMarginCalculationClient.java | 27 ++++++++++----- .../DynamicSecurityAnalysisClient.java | 22 +++++++++--- .../DynamicSimulationClient.java | 3 ++ .../impl/DynamicSimulationClientImpl.java | 24 ++++++++++--- .../DynamicMarginCalculationService.java | 17 +++++++++- .../DynamicSecurityAnalysisService.java | 21 +++++++++++- .../DynamicSimulationService.java | 10 ++++++ .../impl/DynamicSimulationServiceImpl.java | 18 +++++++++- .../shortcircuit/ShortCircuitService.java | 32 +++++++++++------ 18 files changed, 301 insertions(+), 122 deletions(-) rename src/main/java/org/gridsuite/study/server/dto/{ShortCircuitStatus.java => ShortCircuitAnalysisStatus.java} (91%) diff --git a/src/main/java/org/gridsuite/study/server/controller/StudyController.java b/src/main/java/org/gridsuite/study/server/controller/StudyController.java index b165475a7..10ae2db47 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -20,6 +20,8 @@ import org.gridsuite.filter.globalfilter.GlobalFilter; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.study.server.StudyApi; +import org.gridsuite.study.server.StudyConstants.CompositeModificationsActionType; +import org.gridsuite.study.server.StudyConstants.ModificationsActionType; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.computation.LoadFlowComputationInfos; import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; @@ -883,8 +885,8 @@ public ResponseEntity getShortCircuitAnalysisStatus(@Parameter(descripti @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid, @Parameter(description = "type") @RequestParam(value = "type", required = false, defaultValue = "ALL_BUSES") ShortcircuitAnalysisType type) { - String result = rootNetworkNodeInfoService.getShortCircuitAnalysisStatus(nodeUuid, rootNetworkUuid, type); - return result != null ? ResponseEntity.ok().body(result) : + ShortCircuitAnalysisStatus result = rootNetworkNodeInfoService.getShortCircuitAnalysisStatus(nodeUuid, rootNetworkUuid, type); + return result != null ? ResponseEntity.ok().body(result.name()) : ResponseEntity.noContent().build(); } @@ -976,8 +978,8 @@ public ResponseEntity getVoltageInitResult(@Parameter(description = "stu public ResponseEntity getVoltageInitStatus(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, @Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) { - String result = rootNetworkNodeInfoService.getVoltageInitStatus(nodeUuid, rootNetworkUuid); - return result != null ? ResponseEntity.ok().body(result) : + VoltageInitStatus result = rootNetworkNodeInfoService.getVoltageInitStatus(nodeUuid, rootNetworkUuid); + return result != null ? ResponseEntity.ok().body(result.name()) : ResponseEntity.noContent().build(); } @@ -1814,8 +1816,8 @@ public ResponseEntity getSensitivityAnalysisFilterOptions( public ResponseEntity getSensitivityAnalysisStatus(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, @Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) { - String result = rootNetworkNodeInfoService.getSensitivityAnalysisStatus(nodeUuid, rootNetworkUuid); - return result != null ? ResponseEntity.ok().body(result) : + SensitivityAnalysisStatus result = rootNetworkNodeInfoService.getSensitivityAnalysisStatus(nodeUuid, rootNetworkUuid); + return result != null ? ResponseEntity.ok().body(result.name()) : ResponseEntity.noContent().build(); } @@ -2403,8 +2405,8 @@ public ResponseEntity getStateEstimationResult(@Parameter(description = public ResponseEntity getStateEstimationStatus(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) { - String status = rootNetworkNodeInfoService.getStateEstimationStatus(nodeUuid, rootNetworkUuid); - return status != null ? ResponseEntity.ok().body(status) : ResponseEntity.noContent().build(); + StateEstimationStatus status = rootNetworkNodeInfoService.getStateEstimationStatus(nodeUuid, rootNetworkUuid); + return status != null ? ResponseEntity.ok().body(status.name()) : ResponseEntity.noContent().build(); } @GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/pcc-min/status") @@ -2415,8 +2417,8 @@ public ResponseEntity getStateEstimationStatus(@Parameter(description = public ResponseEntity getPccMinStatus(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, @PathVariable("rootNetworkUuid") UUID rootNetworkUuid, @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) { - String status = rootNetworkNodeInfoService.getPccMinStatus(nodeUuid, rootNetworkUuid); - return status != null ? ResponseEntity.ok().body(status) : ResponseEntity.noContent().build(); + PccMinStatus status = rootNetworkNodeInfoService.getPccMinStatus(nodeUuid, rootNetworkUuid); + return status != null ? ResponseEntity.ok().body(status.name()) : ResponseEntity.noContent().build(); } @PutMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/state-estimation/stop") diff --git a/src/main/java/org/gridsuite/study/server/dto/ShortCircuitStatus.java b/src/main/java/org/gridsuite/study/server/dto/ShortCircuitAnalysisStatus.java similarity index 91% rename from src/main/java/org/gridsuite/study/server/dto/ShortCircuitStatus.java rename to src/main/java/org/gridsuite/study/server/dto/ShortCircuitAnalysisStatus.java index 524d7a190..7204334fb 100644 --- a/src/main/java/org/gridsuite/study/server/dto/ShortCircuitStatus.java +++ b/src/main/java/org/gridsuite/study/server/dto/ShortCircuitAnalysisStatus.java @@ -9,7 +9,7 @@ /** * @author Etienne Homer */ -public enum ShortCircuitStatus { +public enum ShortCircuitAnalysisStatus { NOT_DONE, RUNNING, COMPLETED diff --git a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java index f9631c464..80ab65be7 100644 --- a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java @@ -20,6 +20,7 @@ import org.springframework.http.*; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -27,9 +28,11 @@ import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -134,19 +137,12 @@ public String getLoadFlowModifications(UUID resultUuid) { } public LoadFlowStatus getLoadFlowStatus(UUID resultUuid) { - if (resultUuid == null) { - return null; - } - - UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + LOADFLOW_API_VERSION + "/results/{resultUuid}/status"); - String path = uriComponentsBuilder.buildAndExpand(resultUuid).toUriString(); - - return restTemplate.getForObject(loadFlowServerBaseUri + path, LoadFlowStatus.class); + return getLoadFlowStatuses(List.of(resultUuid)).get(resultUuid); } public Map getLoadFlowStatuses(List resultUuids) { - if (resultUuids == null || resultUuids.isEmpty()) { - return null; + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); } UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + LOADFLOW_API_VERSION + "/results/statuses"); @@ -208,18 +204,10 @@ public void setLoadFlowServerBaseUri(String loadFlowServerBaseUri) { this.loadFlowServerBaseUri = loadFlowServerBaseUri; } - public void assertLoadFlowNotRunning(UUID resultUuid) { - LoadFlowStatus loadFlowStatus = getLoadFlowStatus(resultUuid); - if (LoadFlowStatus.RUNNING.equals(loadFlowStatus)) { - throw new StudyException(COMPUTATION_RUNNING); - } - } - - public void assertLoadFlowsNotRunning(List resultUuids) { + public void assertNoLoadFlowRunning(List resultUuids) { Map loadFlowStatuses = getLoadFlowStatuses(resultUuids); - // this is O(n) complexity, maybe we should adapt endoint to simply check LoadFlowsNotRunning - // for a list of resultUuids returning boolean if encounter one RUNNING computation ? - if (loadFlowStatuses != null && loadFlowStatuses.containsValue(LoadFlowStatus.RUNNING)) { + Set values = new HashSet<>(loadFlowStatuses.values()); + if (values.contains(LoadFlowStatus.RUNNING)) { throw new StudyException(COMPUTATION_RUNNING); } } diff --git a/src/main/java/org/gridsuite/study/server/service/PccMinService.java b/src/main/java/org/gridsuite/study/server/service/PccMinService.java index e9b9d8b09..7260e219c 100644 --- a/src/main/java/org/gridsuite/study/server/service/PccMinService.java +++ b/src/main/java/org/gridsuite/study/server/service/PccMinService.java @@ -18,10 +18,12 @@ import org.gridsuite.study.server.utils.ResultParameters; import org.gridsuite.study.server.utils.StudyUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.data.domain.Sort; import org.springframework.http.*; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -29,8 +31,11 @@ import java.net.URI; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import org.springframework.data.domain.Pageable; @@ -118,14 +123,24 @@ public void stopPccMin(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID restTemplate.put(pccMinServerBaseUri + path, Void.class); } - public String getPccMinStatus(UUID resultUuid) { - if (resultUuid == null) { - return null; + public PccMinStatus getPccMinStatus(UUID resultUuid) { + return getPccMinStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getPccMinStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); } String path = UriComponentsBuilder - .fromPath(PCC_MIN_URI + DELIMITER + "results/{resultUuid}/status") - .buildAndExpand(resultUuid).toUriString(); - return restTemplate.getForObject(pccMinServerBaseUri + path, String.class); + .fromPath(PCC_MIN_URI + DELIMITER + "results/statuses") + .toUriString(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); + return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } public void deletePccMinResults(List resultsUuids) { @@ -142,9 +157,10 @@ public Integer getPccMinResultsCount() { return restTemplate.getForObject(pccMinServerBaseUri + path, Integer.class); } - public void assertPccMinNotRunning(UUID resultUuid) { - String status = getPccMinStatus(resultUuid); - if (PccMinStatus.RUNNING.name().equals(status)) { + public void assertNoPccMinRunning(List resultUuids) { + Map pccMinStatuses = getPccMinStatuses(resultUuids); + Set values = new HashSet<>(pccMinStatuses.values()); + if (values.contains(PccMinStatus.RUNNING)) { throw new StudyException(COMPUTATION_RUNNING); } } diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java index d414ceacb..d8c12cf08 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java @@ -10,6 +10,7 @@ import lombok.NonNull; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.dto.*; +import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.ComputationsInvalidationMode; import org.gridsuite.study.server.dto.computation.LoadFlowComputationInfos; import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; @@ -669,18 +670,16 @@ private List getReportUuids(RootNetworkNodeInfo rootNetworkNodeInfo) { } public void assertComputationsNotRunning(List nodeUuids, UUID rootNetworkUuid) { - nodeUuids.forEach(nodeUuid -> { - securityAnalysisService.assertSecurityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SECURITY_ANALYSIS)); - dynamicSimulationService.assertDynamicSimulationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_SIMULATION)); - dynamicSecurityAnalysisService.assertDynamicSecurityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_SECURITY_ANALYSIS)); - dynamicMarginCalculationService.assertDynamicMarginCalculationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, DYNAMIC_MARGIN_CALCULATION)); - sensitivityAnalysisService.assertSensitivityAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SENSITIVITY_ANALYSIS)); - shortCircuitService.assertShortCircuitAnalysisNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, SHORT_CIRCUIT), getComputationResultUuid(nodeUuid, rootNetworkUuid, SHORT_CIRCUIT_ONE_BUS)); - voltageInitService.assertVoltageInitNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, VOLTAGE_INITIALIZATION)); - stateEstimationService.assertStateEstimationNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, STATE_ESTIMATION)); - pccMinService.assertPccMinNotRunning(getComputationResultUuid(nodeUuid, rootNetworkUuid, PCC_MIN)); - }); - loadFlowService.assertLoadFlowsNotRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, LOAD_FLOW)); + loadFlowService.assertNoLoadFlowRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, LOAD_FLOW)); + securityAnalysisService.assertNoSecurityAnalysisRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, SECURITY_ANALYSIS)); + dynamicSimulationService.assertNoDynamicSimulationRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, DYNAMIC_SIMULATION)); + dynamicSecurityAnalysisService.assertNoDynamicSecurityAnalysisRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, DYNAMIC_SECURITY_ANALYSIS)); + dynamicMarginCalculationService.assertNoDynamicMarginCalculationRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, DYNAMIC_MARGIN_CALCULATION)); + sensitivityAnalysisService.assertNoSensitivityAnalysisRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, SENSITIVITY_ANALYSIS)); + shortCircuitService.assertNoShortCircuitAnalysisRunning(Stream.concat(getComputationResultUuids(nodeUuids, rootNetworkUuid, SHORT_CIRCUIT).stream(), getComputationResultUuids(nodeUuids, rootNetworkUuid, SHORT_CIRCUIT_ONE_BUS).stream()).toList()); + voltageInitService.assertNoVoltageInitRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, VOLTAGE_INITIALIZATION)); + stateEstimationService.assertNoStateEstimationRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, STATE_ESTIMATION)); + pccMinService.assertNoPccMinRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, PCC_MIN)); } @@ -873,32 +872,32 @@ public DynamicMarginCalculationStatus getDynamicMarginCalculationStatus(UUID nod return dynamicMarginCalculationService.getStatus(resultUuid); } - public String getSensitivityAnalysisStatus(UUID nodeUuid, UUID rootNetworkUuid) { + public SensitivityAnalysisStatus getSensitivityAnalysisStatus(UUID nodeUuid, UUID rootNetworkUuid) { UUID resultUuid = getComputationResultUuid(nodeUuid, rootNetworkUuid, SENSITIVITY_ANALYSIS); return sensitivityAnalysisService.getSensitivityAnalysisStatus(resultUuid); } @Transactional(readOnly = true) - public String getShortCircuitAnalysisStatus(UUID nodeUuid, UUID rootNetworkUuid, ShortcircuitAnalysisType type) { + public ShortCircuitAnalysisStatus getShortCircuitAnalysisStatus(UUID nodeUuid, UUID rootNetworkUuid, ShortcircuitAnalysisType type) { UUID resultUuid = getComputationResultUuid(nodeUuid, rootNetworkUuid, type == ShortcircuitAnalysisType.ALL_BUSES ? SHORT_CIRCUIT : SHORT_CIRCUIT_ONE_BUS); return shortCircuitService.getShortCircuitAnalysisStatus(resultUuid); } @Transactional(readOnly = true) - public String getVoltageInitStatus(UUID nodeUuid, UUID rootNetworkUuid) { + public VoltageInitStatus getVoltageInitStatus(UUID nodeUuid, UUID rootNetworkUuid) { UUID resultUuid = getComputationResultUuid(nodeUuid, rootNetworkUuid, VOLTAGE_INITIALIZATION); return voltageInitService.getVoltageInitStatus(resultUuid); } @Transactional(readOnly = true) - public String getStateEstimationStatus(UUID nodeUuid, UUID rootNetworkUuid) { + public StateEstimationStatus getStateEstimationStatus(UUID nodeUuid, UUID rootNetworkUuid) { UUID resultUuid = getComputationResultUuid(nodeUuid, rootNetworkUuid, STATE_ESTIMATION); return stateEstimationService.getStateEstimationStatus(resultUuid); } @Transactional(readOnly = true) - public String getPccMinStatus(UUID nodeUuid, UUID rootNetworkUuid) { + public PccMinStatus getPccMinStatus(UUID nodeUuid, UUID rootNetworkUuid) { UUID resultUuid = getComputationResultUuid(nodeUuid, rootNetworkUuid, PCC_MIN); return pccMinService.getPccMinStatus(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index 5c9cf64b2..f6aa8ec38 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -20,19 +20,24 @@ import org.gridsuite.study.server.service.common.AbstractComputationService; import org.gridsuite.study.server.service.securityanalysis.SecurityAnalysisResultType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.*; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.io.UncheckedIOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -182,16 +187,23 @@ public void stopSecurityAnalysis(UUID studyUuid, UUID nodeUuid, UUID rootNetwork } public SecurityAnalysisStatus getSecurityAnalysisStatus(UUID resultUuid) { + return getSecurityAnalysisStatuses(List.of(resultUuid)).get(resultUuid); + } - if (resultUuid == null) { - return null; + public Map getSecurityAnalysisStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); } - String path = UriComponentsBuilder - .fromPath(DELIMITER + SECURITY_ANALYSIS_API_VERSION + "/results/{resultUuid}/status") - .buildAndExpand(resultUuid).toUriString(); + UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + SECURITY_ANALYSIS_API_VERSION + "/results/statuses"); + String path = uriComponentsBuilder.toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.getForObject(securityAnalysisServerBaseUri + path, SecurityAnalysisStatus.class); + return restTemplate.exchange(securityAnalysisServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } public void deleteSecurityAnalysisResults(List resultsUuids) { @@ -218,9 +230,10 @@ public void invalidateSaStatus(List uuids) { } } - public void assertSecurityAnalysisNotRunning(UUID resultUuid) { - SecurityAnalysisStatus sas = getSecurityAnalysisStatus(resultUuid); - if (sas == SecurityAnalysisStatus.RUNNING) { + public void assertNoSecurityAnalysisRunning(List resultUuids) { + Map securityAnalysisStatuses = getSecurityAnalysisStatuses(resultUuids); + Set values = new HashSet<>(securityAnalysisStatuses.values()); + if (values.contains(SecurityAnalysisStatus.RUNNING)) { throw new StudyException(COMPUTATION_RUNNING); } } diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java index 495ebf5c0..986b80696 100644 --- a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java @@ -16,9 +16,11 @@ import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos; import org.gridsuite.study.server.repository.StudyEntity; import org.gridsuite.study.server.service.common.AbstractComputationService; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -26,8 +28,11 @@ import java.net.URI; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -167,15 +172,24 @@ public String getSensitivityResultsFilterOptions(UUID resultUuid, String selecto return restTemplate.getForObject(uri, String.class); } - public String getSensitivityAnalysisStatus(UUID resultUuid) { - if (resultUuid == null) { - return null; + public SensitivityAnalysisStatus getSensitivityAnalysisStatus(UUID resultUuid) { + return getSensitivityAnalysisStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getSensitivityAnalysisStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); } - String path = UriComponentsBuilder.fromPath(DELIMITER + SENSITIVITY_ANALYSIS_API_VERSION + "/results/{resultUuid}/status") - .buildAndExpand(resultUuid).toUriString(); + String path = UriComponentsBuilder.fromPath(DELIMITER + SENSITIVITY_ANALYSIS_API_VERSION + "/results/statuses") + .toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.getForObject(sensitivityAnalysisServerBaseUri + path, String.class); + return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } public void stopSensitivityAnalysis(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID resultUuid, String userId) { @@ -228,9 +242,10 @@ public Integer getSensitivityAnalysisResultsCount() { return restTemplate.getForObject(sensitivityAnalysisServerBaseUri + path, Integer.class); } - public void assertSensitivityAnalysisNotRunning(UUID resultUuid) { - String sas = getSensitivityAnalysisStatus(resultUuid); - if (SensitivityAnalysisStatus.RUNNING.name().equals(sas)) { + public void assertNoSensitivityAnalysisRunning(List resultUuids) { + Map sensitivityAnalysisStatuses = getSensitivityAnalysisStatuses(resultUuids); + Set values = new HashSet<>(sensitivityAnalysisStatuses.values()); + if (values.contains(SensitivityAnalysisStatus.RUNNING)) { throw new StudyException(COMPUTATION_RUNNING); } } diff --git a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java index 9fe5f5ec8..1e0024587 100644 --- a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java +++ b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java @@ -18,20 +18,25 @@ import org.gridsuite.study.server.repository.StudyEntity; import org.gridsuite.study.server.service.common.AbstractComputationService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.io.UncheckedIOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -122,14 +127,23 @@ public void stopStateEstimation(UUID studyUuid, UUID nodeUuid, UUID rootNetworkU restTemplate.put(stateEstimationServerServerBaseUri + path, Void.class); } - public String getStateEstimationStatus(UUID resultUuid) { - if (resultUuid == null) { - return null; + public StateEstimationStatus getStateEstimationStatus(UUID resultUuid) { + return getStateEstimationStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getStateEstimationStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); } String path = UriComponentsBuilder - .fromPath(DELIMITER + STATE_ESTIMATION_API_VERSION + "/results/{resultUuid}/status") - .buildAndExpand(resultUuid).toUriString(); - return restTemplate.getForObject(stateEstimationServerServerBaseUri + path, String.class); + .fromPath(DELIMITER + STATE_ESTIMATION_API_VERSION + "/results/statuses") + .toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); + return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } public void deleteStateEstimationResults(List resultsUuids) { @@ -146,9 +160,10 @@ public Integer getStateEstimationResultsCount() { return restTemplate.getForObject(stateEstimationServerServerBaseUri + path, Integer.class); } - public void assertStateEstimationNotRunning(UUID resultUuid) { - String status = getStateEstimationStatus(resultUuid); - if (StateEstimationStatus.RUNNING.name().equals(status)) { + public void assertNoStateEstimationRunning(List resultUuids) { + Map stateEstimationStatuses = getStateEstimationStatuses(resultUuids); + Set values = new HashSet<>(stateEstimationStatuses.values()); + if (values.contains(StateEstimationStatus.RUNNING)) { throw new StudyException(COMPUTATION_RUNNING); } } diff --git a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java index a2fb4275d..0f40b5d58 100644 --- a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java +++ b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java @@ -9,6 +9,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; + +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.voltageinit.ContextInfos; @@ -19,6 +21,7 @@ import org.gridsuite.study.server.dto.VoltageInitStatus; import org.gridsuite.study.server.dto.voltageinit.parameters.VoltageInitParametersInfos; import org.gridsuite.study.server.service.common.AbstractComputationService; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; @@ -28,8 +31,11 @@ import java.io.UncheckedIOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -121,8 +127,22 @@ public String getVoltageInitResult(UUID resultUuid, UUID networkUuid, String var return getVoltageInitResultOrStatus(resultUuid, "", networkUuid, variantId, globalFilters); } - public String getVoltageInitStatus(UUID resultUuid) { - return getVoltageInitResultOrStatus(resultUuid, "/status", null, null, null); + public VoltageInitStatus getVoltageInitStatus(UUID resultUuid) { + return getVoltageInitStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getVoltageInitStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); + } + String path = UriComponentsBuilder.fromPath(DELIMITER + VOLTAGE_INIT_API_VERSION + "/results/statuses").toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); + + return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } public VoltageInitParametersInfos getVoltageInitParameters(UUID parametersUuid) { @@ -228,9 +248,10 @@ public Integer getVoltageInitResultsCount() { return restTemplate.getForObject(voltageInitServerBaseUri + path, Integer.class); } - public void assertVoltageInitNotRunning(UUID resultUuid) { - String scs = getVoltageInitStatus(resultUuid); - if (VoltageInitStatus.RUNNING.name().equals(scs)) { + public void assertNoVoltageInitRunning(List resultUuids) { + Map voltageInitStatuses = getVoltageInitStatuses(resultUuids); + Set values = new HashSet<>(voltageInitStatuses.values()); + if (values.contains(VoltageInitStatus.RUNNING)) { throw new StudyException(COMPUTATION_RUNNING); } } diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java index 919a32dbc..6e9a10f5c 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java @@ -14,6 +14,7 @@ import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.client.AbstractRestClient; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -24,6 +25,7 @@ import org.springframework.web.util.UriComponentsBuilder; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.UUID; @@ -192,19 +194,26 @@ public UUID run(@NonNull String receiver, @NonNull UUID networkUuid, String vari } // --- Related result methods --- // - public DynamicMarginCalculationStatus getStatus(@NonNull UUID resultUuid) { - Objects.requireNonNull(resultUuid); + return getStatuses(List.of(resultUuid)).get(resultUuid); + } - String resultBaseUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_MARGIN_CALCULATION_API_VERSION, DYNAMIC_MARGIN_CALCULATION_END_POINT_RESULT); + public Map getStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); + } - String url = UriComponentsBuilder - .fromUriString(resultBaseUrl + "/{resultUuid}/status") - .buildAndExpand(resultUuid) - .toUriString(); + String endPointUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_MARGIN_CALCULATION_API_VERSION, DYNAMIC_MARGIN_CALCULATION_END_POINT_RESULT); - // call dynamic-margin-calculation REST API - return getRestTemplate().getForObject(url, DynamicMarginCalculationStatus.class); + var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/statuses").buildAndExpand(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); + + return getRestTemplate().exchange(uriComponents.toUriString(), HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } public void invalidateStatus(@NonNull List resultUuids) { diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java index 925073232..803c267a4 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java @@ -14,8 +14,10 @@ import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.client.AbstractRestClient; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; @@ -23,6 +25,7 @@ import org.springframework.web.util.UriComponentsBuilder; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.UUID; @@ -178,18 +181,27 @@ public UUID run(@NonNull String receiver, @NonNull UUID networkUuid, String vari } // --- Related result methods --- // - public DynamicSecurityAnalysisStatus getStatus(@NonNull UUID resultUuid) { - Objects.requireNonNull(resultUuid); + return getStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); + } String resultBaseUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_SECURITY_ANALYSIS_API_VERSION, DYNAMIC_SECURITY_ANALYSIS_END_POINT_RESULT); - String url = UriComponentsBuilder.fromUriString(resultBaseUrl + "/{resultUuid}/status") - .buildAndExpand(resultUuid) + String url = UriComponentsBuilder.fromUriString(resultBaseUrl + "/statuses") .toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); // call dynamic-security-analysis REST API - return getRestTemplate().getForObject(url, DynamicSecurityAnalysisStatus.class); + return getRestTemplate().exchange(url, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } public void invalidateStatus(@NonNull List resultUuids) { diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClient.java index 41f27ccec..77279c019 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClient.java @@ -14,6 +14,7 @@ import org.springframework.lang.NonNull; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.DYNAMIC_SIMULATION_API_VERSION; @@ -56,6 +57,8 @@ UUID run(String receiver, UUID networkUuid, String variantId, ReportInfos report DynamicSimulationStatus getStatus(UUID resultUuid); + Map getStatuses(List resultUuids); + void invalidateStatus(List resultUuids); void deleteResults(List resultsUuids); diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java index 226cbf985..d144e4bdc 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java @@ -16,8 +16,10 @@ import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.client.AbstractRestClient; import org.gridsuite.study.server.service.client.dynamicsimulation.DynamicSimulationClient; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; @@ -25,6 +27,7 @@ import org.springframework.web.util.UriComponentsBuilder; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.UUID; @@ -203,13 +206,26 @@ public UUID getTimelineResult(UUID resultUuid) { @Override public DynamicSimulationStatus getStatus(UUID resultUuid) { - Objects.requireNonNull(resultUuid); + return getStatuses(List.of(resultUuid)).get(resultUuid); + } + + @Override + public Map getStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); + } + String endPointUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_SIMULATION_API_VERSION, DYNAMIC_SIMULATION_END_POINT_RESULT); - var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/{resultUuid}/status") - .buildAndExpand(resultUuid); + var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/statuses").buildAndExpand(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return getRestTemplate().getForObject(uriComponents.toUriString(), DynamicSimulationStatus.class); + return getRestTemplate().exchange(uriComponents.toUriString(), HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { + }).getBody(); } @Override diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java b/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java index 5595c5740..8398770a6 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java @@ -21,7 +21,10 @@ import java.io.UncheckedIOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.error.StudyBusinessErrorCode.COMPUTATION_RUNNING; @@ -83,7 +86,11 @@ public UUID runDynamicMarginCalculation(UUID nodeUuid, UUID rootNetworkUuid, UUI } public DynamicMarginCalculationStatus getStatus(UUID resultUuid) { - return resultUuid == null ? null : dynamicMarginCalculationClient.getStatus(resultUuid); + return getDynamicMarginCalculationStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getDynamicMarginCalculationStatuses(List resultUuids) { + return dynamicMarginCalculationClient.getStatuses(resultUuids); } public void invalidateStatus(List resultUuids) { @@ -122,4 +129,12 @@ public UUID getDynamicMarginCalculationParametersUuidOrElseCreateDefault(StudyEn public String getProvider(UUID parametersUuid) { return dynamicMarginCalculationClient.getProvider(parametersUuid); } + + public void assertNoDynamicMarginCalculationRunning(List resultUuids) { + Map dynamicMarginCalculationStatuses = getDynamicMarginCalculationStatuses(resultUuids); + Set values = new HashSet<>(dynamicMarginCalculationStatuses.values()); + if (values.contains(DynamicMarginCalculationStatus.RUNNING)) { + throw new StudyException(COMPUTATION_RUNNING); + } + } } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java index 56b84d635..dd1cb5382 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; + import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; @@ -21,7 +22,10 @@ import java.io.UncheckedIOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.error.StudyBusinessErrorCode.COMPUTATION_RUNNING; @@ -83,7 +87,14 @@ public UUID runDynamicSecurityAnalysis(UUID nodeUuid, UUID rootNetworkUuid, UUID } public DynamicSecurityAnalysisStatus getStatus(UUID resultUuid) { - return resultUuid == null ? null : dynamicSecurityAnalysisClient.getStatus(resultUuid); + return getDynamicSecurityAnalysisStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getDynamicSecurityAnalysisStatuses(List resultUuids) { + if (CollectionUtils.isEmpty(resultUuids)) { + return Map.of(); + } + return dynamicSecurityAnalysisClient.getStatuses(resultUuids); } public void invalidateStatus(List resultUuids) { @@ -122,4 +133,12 @@ public UUID getDynamicSecurityAnalysisParametersUuidOrElseCreateDefault(StudyEnt public String getProvider(UUID parametersUuid) { return dynamicSecurityAnalysisClient.getProvider(parametersUuid); } + + public void assertNoDynamicSecurityAnalysisRunning(List resultUuids) { + Map dynamicSecurityAnalysisStatuses = getDynamicSecurityAnalysisStatuses(resultUuids); + Set values = new HashSet<>(dynamicSecurityAnalysisStatuses.values()); + if (values.contains(DynamicSecurityAnalysisStatus.RUNNING)) { + throw new StudyException(COMPUTATION_RUNNING); + } + } } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java index 3360a4066..8ebacf121 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java @@ -16,6 +16,7 @@ import org.gridsuite.study.server.repository.StudyEntity; import java.util.List; +import java.util.Map; import java.util.UUID; /** @@ -83,6 +84,13 @@ UUID runDynamicSimulation(UUID nodeUuid, UUID rootNetworkUuid, UUID networkUuid, */ DynamicSimulationStatus getStatus(UUID resultUuid); + /** + * Get the current status of the simulations + * @param resultUuids a given list of result UUIDs + * @return a map of result UUID and its corresponding dynamic simulation status + */ + Map getDynamicSimulationStatuses(List resultUuids); + /** * invalidate status of the simulation results * @param resultUuids a given list of result UUIDs @@ -117,4 +125,6 @@ UUID runDynamicSimulation(UUID nodeUuid, UUID rootNetworkUuid, UUID networkUuid, * @return a list of time-series metadata */ List getTimeSeriesMetadataList(UUID resultUuid); + + void assertNoDynamicSimulationRunning(List computationResultUuids); } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java index fed8ce764..b7d53ed77 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java @@ -32,7 +32,10 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.stream.Stream; @@ -201,7 +204,12 @@ public List getTimelineResult(UUID resultUuid) { @Override public DynamicSimulationStatus getStatus(UUID resultUuid) { - return resultUuid == null ? null : dynamicSimulationClient.getStatus(resultUuid); + return getDynamicSimulationStatuses(List.of(resultUuid)).get(resultUuid); + } + + @Override + public Map getDynamicSimulationStatuses(List resultUuids) { + return dynamicSimulationClient.getStatuses(resultUuids); } @Override @@ -233,4 +241,12 @@ public void assertDynamicSimulationNotRunning(UUID resultUuid) { throw new StudyException(COMPUTATION_RUNNING); } } + + public void assertNoDynamicSimulationRunning(List computationResultUuids) { + Map loadFlowStatuses = getDynamicSimulationStatuses(computationResultUuids); + Set values = new HashSet<>(loadFlowStatuses.values()); + if (values.contains(DynamicSimulationStatus.RUNNING)) { + throw new StudyException(COMPUTATION_RUNNING); + } + } } diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index eed14a8c3..0d43014f2 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -16,7 +16,7 @@ import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; -import org.gridsuite.study.server.dto.ShortCircuitStatus; +import org.gridsuite.study.server.dto.ShortCircuitAnalysisStatus; import org.gridsuite.study.server.dto.VariantInfos; import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.common.AbstractComputationService; @@ -35,9 +35,11 @@ import java.net.URI; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -193,15 +195,23 @@ public String getShortCircuitAnalysisResultsPage(ResultParameters resultParamete return getShortCircuitAnalysisResource(builder.build().encode().toUri()); // need to encode because of filter JSON array } - public String getShortCircuitAnalysisStatus(UUID resultUuid) { - String resultPath = getShortCircuitAnalysisResultResourcePath(resultUuid); - if (resultPath == null) { - return null; + public ShortCircuitAnalysisStatus getShortCircuitAnalysisStatus(UUID resultUuid) { + return getShortCircuitAnalysisStatuses(List.of(resultUuid)).get(resultUuid); + } + + public Map getShortCircuitAnalysisStatuses(List resultUuids) { + if (resultUuids.isEmpty()) { + return Map.of(); } + String path = UriComponentsBuilder + .fromPath(DELIMITER + SHORT_CIRCUIT_API_VERSION + "/results/statuses") + .toUriString(); - UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(shortCircuitServerBaseUri + resultPath + "/status"); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return getShortCircuitAnalysisResource(builder.build().toUri()); + return restTemplate.exchange(shortCircuitServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { }).getBody(); } public String getShortCircuitAnalysisResource(URI resourcePath) { @@ -248,10 +258,10 @@ public Integer getShortCircuitResultsCount() { return restTemplate.getForObject(shortCircuitServerBaseUri + path, Integer.class); } - public void assertShortCircuitAnalysisNotRunning(UUID scsResultUuid, UUID oneBusScsResultUuid) { - String scs = getShortCircuitAnalysisStatus(scsResultUuid); - String oneBusScs = getShortCircuitAnalysisStatus(oneBusScsResultUuid); - if (ShortCircuitStatus.RUNNING.name().equals(scs) || ShortCircuitStatus.RUNNING.name().equals(oneBusScs)) { + public void assertNoShortCircuitAnalysisRunning(List resultUuids) { + Map shortCircuitStatuses = getShortCircuitAnalysisStatuses(resultUuids); + Set values = new HashSet<>(shortCircuitStatuses.values()); + if (values.contains(ShortCircuitAnalysisStatus.RUNNING)) { throw new StudyException(COMPUTATION_RUNNING); } } From 30a18a2ec73150dcae587d413ee5f48015b64855 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Fri, 22 May 2026 17:32:20 +0200 Subject: [PATCH 03/11] fix from review, return empty map if getStatuses requests return null Signed-off-by: sBouzols --- .../study/server/service/LoadFlowService.java | 10 ++++++++-- .../study/server/service/PccMinService.java | 10 ++++++++-- .../server/service/SecurityAnalysisService.java | 11 +++++++++-- .../server/service/SensitivityAnalysisService.java | 11 +++++++++-- .../server/service/StateEstimationService.java | 11 +++++++++-- .../study/server/service/VoltageInitService.java | 11 +++++++++-- .../DynamicMarginCalculationClient.java | 13 ++++++++++--- .../DynamicSecurityAnalysisClient.java | 13 ++++++++++--- .../impl/DynamicSimulationClientImpl.java | 13 ++++++++++--- .../service/shortcircuit/ShortCircuitService.java | 10 +++++++++- 10 files changed, 91 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java index 80ab65be7..3d4c7d851 100644 --- a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java @@ -152,8 +152,14 @@ public Map getLoadFlowStatuses(List resultUuids) { HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.exchange(loadFlowServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = restTemplate.exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public void stopLoadFlow(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID resultUuid, String userId) { diff --git a/src/main/java/org/gridsuite/study/server/service/PccMinService.java b/src/main/java/org/gridsuite/study/server/service/PccMinService.java index 7260e219c..fcf0f7b45 100644 --- a/src/main/java/org/gridsuite/study/server/service/PccMinService.java +++ b/src/main/java/org/gridsuite/study/server/service/PccMinService.java @@ -139,8 +139,14 @@ public Map getPccMinStatuses(List resultUuids) { headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = restTemplate.exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public void deletePccMinResults(List resultsUuids) { diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index f6aa8ec38..52a1563dc 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -13,6 +13,7 @@ import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; +import org.gridsuite.study.server.dto.PccMinStatus; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.RunSecurityAnalysisParametersInfos; import org.gridsuite.study.server.dto.SecurityAnalysisStatus; @@ -202,8 +203,14 @@ public Map getSecurityAnalysisStatuses(List HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.exchange(securityAnalysisServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = restTemplate.exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public void deleteSecurityAnalysisResults(List resultsUuids) { diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java index 986b80696..62b59b2e4 100644 --- a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java @@ -12,6 +12,7 @@ import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; +import org.gridsuite.study.server.dto.SecurityAnalysisStatus; import org.gridsuite.study.server.dto.SensitivityAnalysisStatus; import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos; import org.gridsuite.study.server.repository.StudyEntity; @@ -188,8 +189,14 @@ public Map getSensitivityAnalysisStatuses(List< HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = restTemplate.exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public void stopSensitivityAnalysis(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID resultUuid, String userId) { diff --git a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java index 1e0024587..dca5e9154 100644 --- a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java +++ b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java @@ -12,6 +12,7 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; +import org.gridsuite.study.server.dto.LoadFlowStatus; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.StateEstimationStatus; @@ -142,8 +143,14 @@ public Map getStateEstimationStatuses(List re headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = restTemplate.exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public void deleteStateEstimationResults(List resultsUuids) { diff --git a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java index 0f40b5d58..bce3f74c7 100644 --- a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java +++ b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java @@ -17,6 +17,7 @@ import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; +import org.gridsuite.study.server.dto.SensitivityAnalysisStatus; import org.gridsuite.study.server.dto.VariantInfos; import org.gridsuite.study.server.dto.VoltageInitStatus; import org.gridsuite.study.server.dto.voltageinit.parameters.VoltageInitParametersInfos; @@ -141,8 +142,14 @@ public Map getVoltageInitStatuses(List resultUuid HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.exchange(path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = restTemplate.exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public VoltageInitParametersInfos getVoltageInitParameters(UUID parametersUuid) { diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java index 6e9a10f5c..04e9ed959 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; +import org.gridsuite.study.server.dto.ShortCircuitAnalysisStatus; import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.client.AbstractRestClient; @@ -206,14 +207,20 @@ public Map getStatuses(List resultUu String endPointUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_MARGIN_CALCULATION_API_VERSION, DYNAMIC_MARGIN_CALCULATION_END_POINT_RESULT); var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/statuses").buildAndExpand(); - + String path = uriComponents.toUriString() HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return getRestTemplate().exchange(uriComponents.toUriString(), HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = getRestTemplate().exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public void invalidateStatus(@NonNull List resultUuids) { diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java index 803c267a4..b9df6d0a3 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; +import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.client.AbstractRestClient; @@ -192,7 +193,7 @@ public Map getStatuses(List resultUui String resultBaseUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_SECURITY_ANALYSIS_API_VERSION, DYNAMIC_SECURITY_ANALYSIS_END_POINT_RESULT); - String url = UriComponentsBuilder.fromUriString(resultBaseUrl + "/statuses") + String path = UriComponentsBuilder.fromUriString(resultBaseUrl + "/statuses") .toUriString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); @@ -200,8 +201,14 @@ public Map getStatuses(List resultUui HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); // call dynamic-security-analysis REST API - return getRestTemplate().exchange(url, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = getRestTemplate().exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public void invalidateStatus(@NonNull List resultUuids) { diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java index d144e4bdc..e83baf6d8 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; +import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus; import org.gridsuite.study.server.dto.dynamicsimulation.event.EventInfos; import org.gridsuite.study.server.service.StudyService; @@ -218,14 +219,20 @@ public Map getStatuses(List resultUuids) { String endPointUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_SIMULATION_API_VERSION, DYNAMIC_SIMULATION_END_POINT_RESULT); var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/statuses").buildAndExpand(); - + String path = uriComponents.toUriString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return getRestTemplate().exchange(uriComponents.toUriString(), HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { - }).getBody(); + Map statuses = getRestTemplate().exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } @Override diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index 0d43014f2..42a82f816 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -14,6 +14,7 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; +import org.gridsuite.study.server.dto.LoadFlowStatus; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.ShortCircuitAnalysisStatus; @@ -211,7 +212,14 @@ public Map getShortCircuitAnalysisStatuses(Lis headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); - return restTemplate.exchange(shortCircuitServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { }).getBody(); + Map statuses = restTemplate.exchange( + path, + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + } + ).getBody(); + return statuses != null ? statuses : Map.of(); } public String getShortCircuitAnalysisResource(URI resourcePath) { From 9ee2c591e6d6df540be7372f7127e482b69ee0f2 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Fri, 22 May 2026 17:35:41 +0200 Subject: [PATCH 04/11] fix typo and bad imports Signed-off-by: sBouzols --- .../study/server/service/SecurityAnalysisService.java | 1 - .../study/server/service/SensitivityAnalysisService.java | 1 - .../gridsuite/study/server/service/StateEstimationService.java | 1 - .../org/gridsuite/study/server/service/VoltageInitService.java | 1 - .../DynamicMarginCalculationClient.java | 3 +-- .../dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java | 1 - .../dynamicsimulation/impl/DynamicSimulationClientImpl.java | 1 - .../study/server/service/shortcircuit/ShortCircuitService.java | 1 - 8 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index badfabc7c..7b6d0a10c 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -13,7 +13,6 @@ import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; -import org.gridsuite.study.server.dto.PccMinStatus; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.RunSecurityAnalysisParametersInfos; import org.gridsuite.study.server.dto.SecurityAnalysisStatus; diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java index ba1d2d8d3..a9b2da4b4 100644 --- a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java @@ -12,7 +12,6 @@ import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; -import org.gridsuite.study.server.dto.SecurityAnalysisStatus; import org.gridsuite.study.server.dto.SensitivityAnalysisStatus; import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos; import org.gridsuite.study.server.repository.StudyEntity; diff --git a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java index dca5e9154..0f7621c30 100644 --- a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java +++ b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java @@ -12,7 +12,6 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; -import org.gridsuite.study.server.dto.LoadFlowStatus; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.StateEstimationStatus; diff --git a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java index bce3f74c7..35a9ddb1d 100644 --- a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java +++ b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java @@ -17,7 +17,6 @@ import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; -import org.gridsuite.study.server.dto.SensitivityAnalysisStatus; import org.gridsuite.study.server.dto.VariantInfos; import org.gridsuite.study.server.dto.VoltageInitStatus; import org.gridsuite.study.server.dto.voltageinit.parameters.VoltageInitParametersInfos; diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java index 04e9ed959..485f6c47f 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; -import org.gridsuite.study.server.dto.ShortCircuitAnalysisStatus; import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.client.AbstractRestClient; @@ -207,7 +206,7 @@ public Map getStatuses(List resultUu String endPointUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_MARGIN_CALCULATION_API_VERSION, DYNAMIC_MARGIN_CALCULATION_END_POINT_RESULT); var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/statuses").buildAndExpand(); - String path = uriComponents.toUriString() + String path = uriComponents.toUriString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java index b9df6d0a3..c4fbcc9e3 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; -import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; import org.gridsuite.study.server.service.StudyService; import org.gridsuite.study.server.service.client.AbstractRestClient; diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java index e83baf6d8..e84cbe917 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; -import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus; import org.gridsuite.study.server.dto.dynamicsimulation.event.EventInfos; import org.gridsuite.study.server.service.StudyService; diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index 42a82f816..3fd5db746 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -14,7 +14,6 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.error.StudyException; -import org.gridsuite.study.server.dto.LoadFlowStatus; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.ShortCircuitAnalysisStatus; From cb017bc13be0b8e6899b7cf1f14771ef6a04c683 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Fri, 22 May 2026 17:56:13 +0200 Subject: [PATCH 05/11] replace org.apache.commons.collections4.CollectionUtils by org.springframework.util.CollectionUtils for consistency across the codebase Signed-off-by: sBouzols --- .../org/gridsuite/study/server/service/StudyService.java | 2 +- .../study/server/service/VoltageInitService.java | 2 +- .../DynamicMarginCalculationClient.java | 2 +- .../DynamicSecurityAnalysisClient.java | 2 +- .../impl/DynamicSimulationClientImpl.java | 2 +- .../DynamicMarginCalculationService.java | 4 ++-- .../DynamicSecurityAnalysisService.java | 2 +- .../impl/DynamicSimulationServiceImpl.java | 2 +- .../server/service/shortcircuit/ShortCircuitService.java | 3 ++- .../service/client/timeseries/TimeSeriesClientTest.java | 8 +++----- 10 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index 22641de26..a0cb619b3 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -12,7 +12,6 @@ import com.powsybl.loadflow.LoadFlowParameters; import io.micrometer.common.util.StringUtils; import lombok.NonNull; -import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.filter.globalfilter.GlobalFilter; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.study.server.StudyConstants; @@ -64,6 +63,7 @@ import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.web.util.UriUtils; import java.io.UncheckedIOException; diff --git a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java index 35a9ddb1d..6b8996f40 100644 --- a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java +++ b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.voltageinit.ContextInfos; @@ -25,6 +24,7 @@ import org.springframework.http.*; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java index 485f6c47f..26db5a088 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java @@ -7,7 +7,6 @@ package org.gridsuite.study.server.service.client.dynamicmargincalculation; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; @@ -21,6 +20,7 @@ import org.springframework.http.MediaType; import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java index c4fbcc9e3..0f0204026 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java @@ -7,7 +7,6 @@ package org.gridsuite.study.server.service.client.dynamicsecurityanalysis; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; @@ -21,6 +20,7 @@ import org.springframework.http.MediaType; import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java index e84cbe917..61a7c6f64 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java @@ -7,7 +7,6 @@ package org.gridsuite.study.server.service.client.dynamicsimulation.impl; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.ReportInfos; @@ -23,6 +22,7 @@ import org.springframework.http.MediaType; import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java b/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java index 8398770a6..fb84ba9d9 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicmargincalculation.DynamicMarginCalculationStatus; @@ -17,6 +16,7 @@ import org.gridsuite.study.server.repository.StudyEntity; import org.gridsuite.study.server.service.client.dynamicmargincalculation.DynamicMarginCalculationClient; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.io.UncheckedIOException; import java.net.URLEncoder; @@ -94,7 +94,7 @@ public Map getDynamicMarginCalculationStat } public void invalidateStatus(List resultUuids) { - if (CollectionUtils.isNotEmpty(resultUuids)) { + if (!CollectionUtils.isEmpty(resultUuids)) { dynamicMarginCalculationClient.invalidateStatus(resultUuids); } } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java index dd1cb5382..04916f067 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; @@ -18,6 +17,7 @@ import org.gridsuite.study.server.repository.StudyEntity; import org.gridsuite.study.server.service.client.dynamicsecurityanalysis.DynamicSecurityAnalysisClient; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.io.UncheckedIOException; import java.net.URLEncoder; diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java index b7d53ed77..7017d7331 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java @@ -12,7 +12,6 @@ import com.powsybl.timeseries.DoubleTimeSeries; import com.powsybl.timeseries.StringTimeSeries; import com.powsybl.timeseries.TimeSeries; -import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus; @@ -26,6 +25,7 @@ import org.gridsuite.study.server.service.client.timeseries.TimeSeriesClient; import org.gridsuite.study.server.service.dynamicsimulation.DynamicSimulationService; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.io.UncheckedIOException; import java.net.URLEncoder; diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index 3fd5db746..553c3f72b 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -28,6 +28,7 @@ import org.springframework.http.*; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -200,7 +201,7 @@ public ShortCircuitAnalysisStatus getShortCircuitAnalysisStatus(UUID resultUuid) } public Map getShortCircuitAnalysisStatuses(List resultUuids) { - if (resultUuids.isEmpty()) { + if (CollectionUtils.isEmpty(resultUuids)) { return Map.of(); } String path = UriComponentsBuilder diff --git a/src/test/java/org/gridsuite/study/server/service/client/timeseries/TimeSeriesClientTest.java b/src/test/java/org/gridsuite/study/server/service/client/timeseries/TimeSeriesClientTest.java index a421880b8..48ced1fbf 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/timeseries/TimeSeriesClientTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/timeseries/TimeSeriesClientTest.java @@ -20,8 +20,6 @@ import mockwebserver3.junit5.internal.MockWebServerExtension; import okhttp3.Headers; import okhttp3.HttpUrl; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.ListUtils; import org.gridsuite.study.server.ContextConfigurationWithTestChannel; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.dto.timeseries.rest.TimeSeriesGroupRest; @@ -38,11 +36,11 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import java.util.*; -import static org.apache.commons.collections4.CollectionUtils.emptyIfNull; import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.study.server.service.client.timeseries.TimeSeriesClient.API_VERSION; import static org.gridsuite.study.server.service.client.timeseries.TimeSeriesClient.TIME_SERIES_END_POINT; @@ -92,7 +90,7 @@ public MockResponse dispatch(@NotNull RecordedRequest recordedRequest) { String method = recordedRequest.getMethod(); MockResponse response = new MockResponse(HttpStatus.NOT_FOUND.value()); - List pathSegments = ListUtils.emptyIfNull(recordedRequest.getRequestUrl().pathSegments()); + List pathSegments = Optional.ofNullable(recordedRequest.getRequestUrl().pathSegments()).orElse(List.of()); // timeseries-group/{groupUuid}/xxx if ("GET".equals(method) && path.matches(TIME_SERIES_BASE_URL + "/.*")) { @@ -111,7 +109,7 @@ public MockResponse dispatch(@NotNull RecordedRequest recordedRequest) { } } else { // take {groupUuid} at the last - String groupUuid = emptyIfNull(recordedRequest.getRequestUrl().pathSegments()).stream().reduce((first, second) -> second).orElse(""); + String groupUuid = Optional.ofNullable(recordedRequest.getRequestUrl().pathSegments()).orElse(List.of()).stream().reduce((first, second) -> second).orElse(""); String timeSeriesNames = recordedRequest.getRequestUrl().queryParameter("timeSeriesNames"); LOGGER.info("sent timeSeriesNames = {}", timeSeriesNames); List> timeseries; From f1520d808520217719a6b12800918c70305a4137 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Fri, 22 May 2026 17:56:51 +0200 Subject: [PATCH 06/11] fix isNotEmpty Signed-off-by: sBouzols --- .../dynamicsecurityanalysis/DynamicSecurityAnalysisService.java | 2 +- .../dynamicsimulation/impl/DynamicSimulationServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java index 04916f067..06cd87e06 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java @@ -98,7 +98,7 @@ public Map getDynamicSecurityAnalysisStatus } public void invalidateStatus(List resultUuids) { - if (CollectionUtils.isNotEmpty(resultUuids)) { + if (!CollectionUtils.isEmpty(resultUuids)) { dynamicSecurityAnalysisClient.invalidateStatus(resultUuids); } } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java index 7017d7331..935015fb0 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java @@ -214,7 +214,7 @@ public Map getDynamicSimulationStatuses(List resultUuids) { - if (CollectionUtils.isNotEmpty(resultUuids)) { + if (!CollectionUtils.isEmpty(resultUuids)) { dynamicSimulationClient.invalidateStatus(resultUuids); } } From 6dfee92ac33d2815d8c6441e75ae6e55ed1e67fa Mon Sep 17 00:00:00 2001 From: sBouzols Date: Fri, 22 May 2026 17:58:23 +0200 Subject: [PATCH 07/11] fix from review Signed-off-by: sBouzols --- .../DynamicMarginCalculationClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java index 26db5a088..16038f6c5 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClient.java @@ -205,7 +205,7 @@ public Map getStatuses(List resultUu String endPointUrl = buildEndPointUrl(getBaseUri(), DYNAMIC_MARGIN_CALCULATION_API_VERSION, DYNAMIC_MARGIN_CALCULATION_END_POINT_RESULT); - var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/statuses").buildAndExpand(); + var uriComponents = UriComponentsBuilder.fromUriString(endPointUrl + "/statuses").build(); String path = uriComponents.toUriString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); From eb1f4b91f68ab5867c57f65a1c01cb13dd995c79 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Tue, 26 May 2026 17:44:44 +0200 Subject: [PATCH 08/11] add computation base uri where missing Signed-off-by: sBouzols --- .../org/gridsuite/study/server/service/LoadFlowService.java | 2 +- .../gridsuite/study/server/service/SecurityAnalysisService.java | 2 +- .../study/server/service/SensitivityAnalysisService.java | 2 +- .../gridsuite/study/server/service/StateEstimationService.java | 2 +- .../org/gridsuite/study/server/service/VoltageInitService.java | 2 +- .../study/server/service/shortcircuit/ShortCircuitService.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java index 3d4c7d851..f64266141 100644 --- a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java @@ -153,7 +153,7 @@ public Map getLoadFlowStatuses(List resultUuids) { HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); Map statuses = restTemplate.exchange( - path, + loadFlowServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index 7b6d0a10c..e6c3d1cc0 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -203,7 +203,7 @@ public Map getSecurityAnalysisStatuses(List HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); Map statuses = restTemplate.exchange( - path, + securityAnalysisServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java index a9b2da4b4..900c7f30b 100644 --- a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java @@ -189,7 +189,7 @@ public Map getSensitivityAnalysisStatuses(List< HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); Map statuses = restTemplate.exchange( - path, + sensitivityAnalysisServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { diff --git a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java index 0f7621c30..1fbef4a3b 100644 --- a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java +++ b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java @@ -143,7 +143,7 @@ public Map getStateEstimationStatuses(List re HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); Map statuses = restTemplate.exchange( - path, + stateEstimationServerServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { diff --git a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java index 6b8996f40..1c6a813c4 100644 --- a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java +++ b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java @@ -142,7 +142,7 @@ public Map getVoltageInitStatuses(List resultUuid HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); Map statuses = restTemplate.exchange( - path, + voltageInitServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index 553c3f72b..e56e6ffd3 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -213,7 +213,7 @@ public Map getShortCircuitAnalysisStatuses(Lis HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); Map statuses = restTemplate.exchange( - path, + shortCircuitServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { From 9ce0fec63a3f267600566e92508ce659f415795d Mon Sep 17 00:00:00 2001 From: sBouzols Date: Wed, 27 May 2026 17:11:47 +0200 Subject: [PATCH 09/11] return null if no result present. to discuss Signed-off-by: sBouzols --- .../org/gridsuite/study/server/service/LoadFlowService.java | 3 +++ .../java/org/gridsuite/study/server/service/PccMinService.java | 3 +++ .../study/server/service/SecurityAnalysisService.java | 3 +++ .../study/server/service/SensitivityAnalysisService.java | 3 +++ .../gridsuite/study/server/service/StateEstimationService.java | 3 +++ .../org/gridsuite/study/server/service/VoltageInitService.java | 3 +++ .../dynamicsimulation/impl/DynamicSimulationClientImpl.java | 3 +++ .../DynamicMarginCalculationService.java | 3 +++ .../DynamicSecurityAnalysisService.java | 3 +++ .../dynamicsimulation/impl/DynamicSimulationServiceImpl.java | 3 +++ .../study/server/service/shortcircuit/ShortCircuitService.java | 3 +++ 11 files changed, 33 insertions(+) diff --git a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java index 27b08d9cb..ee085a792 100644 --- a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java @@ -138,6 +138,9 @@ public String getLoadFlowModifications(UUID resultUuid) { } public LoadFlowStatus getLoadFlowStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getLoadFlowStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/PccMinService.java b/src/main/java/org/gridsuite/study/server/service/PccMinService.java index ea867a101..debe94884 100644 --- a/src/main/java/org/gridsuite/study/server/service/PccMinService.java +++ b/src/main/java/org/gridsuite/study/server/service/PccMinService.java @@ -125,6 +125,9 @@ public void stopPccMin(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID } public PccMinStatus getPccMinStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getPccMinStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index 4d0b8bef4..97d787a24 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -188,6 +188,9 @@ public void stopSecurityAnalysis(UUID studyUuid, UUID nodeUuid, UUID rootNetwork } public SecurityAnalysisStatus getSecurityAnalysisStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getSecurityAnalysisStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java index a1fd0de7f..a606efa3d 100644 --- a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java @@ -174,6 +174,9 @@ public String getSensitivityResultsFilterOptions(UUID resultUuid, String selecto } public SensitivityAnalysisStatus getSensitivityAnalysisStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getSensitivityAnalysisStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java index 4323480c1..17ced28de 100644 --- a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java +++ b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java @@ -129,6 +129,9 @@ public void stopStateEstimation(UUID studyUuid, UUID nodeUuid, UUID rootNetworkU } public StateEstimationStatus getStateEstimationStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getStateEstimationStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java index d566539b1..94ac6852b 100644 --- a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java +++ b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java @@ -129,6 +129,9 @@ public String getVoltageInitResult(UUID resultUuid, UUID networkUuid, String var } public VoltageInitStatus getVoltageInitStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getVoltageInitStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java index 61a7c6f64..82a6818c0 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java @@ -206,6 +206,9 @@ public UUID getTimelineResult(UUID resultUuid) { @Override public DynamicSimulationStatus getStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java b/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java index 1322a4924..c6fb99225 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationService.java @@ -89,6 +89,9 @@ public UUID runDynamicMarginCalculation(UUID nodeUuid, UUID rootNetworkUuid, UUI } public DynamicMarginCalculationStatus getStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getDynamicMarginCalculationStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java index ff905f044..5dd75652c 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java @@ -90,6 +90,9 @@ public UUID runDynamicSecurityAnalysis(UUID nodeUuid, UUID rootNetworkUuid, UUID } public DynamicSecurityAnalysisStatus getStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getDynamicSecurityAnalysisStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java index 935015fb0..c0ed5ce16 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java @@ -204,6 +204,9 @@ public List getTimelineResult(UUID resultUuid) { @Override public DynamicSimulationStatus getStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getDynamicSimulationStatuses(List.of(resultUuid)).get(resultUuid); } diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index 0fd82755f..43965a3df 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -198,6 +198,9 @@ public String getShortCircuitAnalysisResultsPage(ResultParameters resultParamete } public ShortCircuitAnalysisStatus getShortCircuitAnalysisStatus(UUID resultUuid) { + if (resultUuid == null) { + return null; + } return getShortCircuitAnalysisStatuses(List.of(resultUuid)).get(resultUuid); } From afcf28bf4a5994e0f17a5028839523453890a662 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Fri, 19 Jun 2026 11:25:11 +0200 Subject: [PATCH 10/11] fix pccmin get statuses service Signed-off-by: sBouzols --- .../org/gridsuite/study/server/service/PccMinService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/PccMinService.java b/src/main/java/org/gridsuite/study/server/service/PccMinService.java index debe94884..e9e66dacf 100644 --- a/src/main/java/org/gridsuite/study/server/service/PccMinService.java +++ b/src/main/java/org/gridsuite/study/server/service/PccMinService.java @@ -136,7 +136,7 @@ public Map getPccMinStatuses(List resultUuids) { return Map.of(); } String path = UriComponentsBuilder - .fromPath(PCC_MIN_URI + DELIMITER + "results/statuses") + .fromPath(DELIMITER + PCC_MIN_API_VERSION + "/results/statuses") .toUriString(); HttpHeaders headers = new HttpHeaders(); @@ -144,7 +144,7 @@ public Map getPccMinStatuses(List resultUuids) { HttpEntity> httpEntity = new HttpEntity<>(resultUuids, headers); Map statuses = restTemplate.exchange( - path, + pccMinServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { From fd9226570f9a7f14b1d7bae3efa3d9f08a997874 Mon Sep 17 00:00:00 2001 From: sBouzols Date: Fri, 19 Jun 2026 12:14:11 +0200 Subject: [PATCH 11/11] test(): Add/Adapt TUs for all computation types Signed-off-by: sBouzols --- .../service/RootNetworkNodeInfoService.java | 7 +- .../study/server/utils/JsonUtils.java | 11 ++ .../study/server/utils/ThrowingConsumer.java | 15 +++ .../study/server/NetworkModificationTest.java | 108 ++++++++++++------ .../gridsuite/study/server/PccMinTest.java | 23 +++- .../study/server/SensitivityAnalysisTest.java | 15 ++- .../study/server/ShortCircuitTest.java | 23 ++-- .../study/server/SingleLineDiagramTest.java | 2 +- .../SpreadsheetConfigCollectionTest.java | 2 +- .../study/server/StateEstimationTest.java | 17 ++- .../study/server/VoltageInitTest.java | 30 +++-- .../study/server/loadflow/LoadFlowTest.java | 27 +++-- .../rootnetworks/SecurityAnalysisTest.java | 24 ++-- .../DynamicMarginCalculationClientTest.java | 11 +- .../DynamicSecurityAnalysisClientTest.java | 9 +- .../DynamicSimulationClientTest.java | 12 +- .../DynamicMarginCalculationServiceTest.java | 9 +- .../DynamicSecurityAnalysisServiceTest.java | 9 +- .../DynamicSimulationServiceTest.java | 4 +- .../wiremock/ComputationServerStubs.java | 17 ++- .../utils/wiremock/LoadflowServerStubs.java | 18 ++- 21 files changed, 269 insertions(+), 124 deletions(-) create mode 100644 src/main/java/org/gridsuite/study/server/utils/ThrowingConsumer.java diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java index d8c12cf08..a085e9e5c 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java @@ -676,14 +676,15 @@ public void assertComputationsNotRunning(List nodeUuids, UUID rootNetworkU dynamicSecurityAnalysisService.assertNoDynamicSecurityAnalysisRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, DYNAMIC_SECURITY_ANALYSIS)); dynamicMarginCalculationService.assertNoDynamicMarginCalculationRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, DYNAMIC_MARGIN_CALCULATION)); sensitivityAnalysisService.assertNoSensitivityAnalysisRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, SENSITIVITY_ANALYSIS)); - shortCircuitService.assertNoShortCircuitAnalysisRunning(Stream.concat(getComputationResultUuids(nodeUuids, rootNetworkUuid, SHORT_CIRCUIT).stream(), getComputationResultUuids(nodeUuids, rootNetworkUuid, SHORT_CIRCUIT_ONE_BUS).stream()).toList()); + shortCircuitService.assertNoShortCircuitAnalysisRunning(Stream.concat( + getComputationResultUuids(nodeUuids, rootNetworkUuid, SHORT_CIRCUIT).stream(), + getComputationResultUuids(nodeUuids, rootNetworkUuid, SHORT_CIRCUIT_ONE_BUS).stream() + ).toList()); voltageInitService.assertNoVoltageInitRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, VOLTAGE_INITIALIZATION)); stateEstimationService.assertNoStateEstimationRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, STATE_ESTIMATION)); pccMinService.assertNoPccMinRunning(getComputationResultUuids(nodeUuids, rootNetworkUuid, PCC_MIN)); } - - /*************************** * GET COMPUTATION RESULTS * ***************************/ diff --git a/src/main/java/org/gridsuite/study/server/utils/JsonUtils.java b/src/main/java/org/gridsuite/study/server/utils/JsonUtils.java index d642c0eac..697399a07 100644 --- a/src/main/java/org/gridsuite/study/server/utils/JsonUtils.java +++ b/src/main/java/org/gridsuite/study/server/utils/JsonUtils.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.function.Predicate; import static org.gridsuite.study.server.error.StudyBusinessErrorCode.UNPROCESSABLE_IMPORT_PARAMETER; @@ -104,4 +105,14 @@ public static Map serializeImportParameters(Map }); return result; } + + public static Consumer throwingJsonProcessingConsumerWrapper(ThrowingConsumer throwingConsumer) { + return i -> { + try { + throwingConsumer.accept(i); + } catch (JsonProcessingException ex) { + throw new RuntimeException(ex); + } + }; + } } diff --git a/src/main/java/org/gridsuite/study/server/utils/ThrowingConsumer.java b/src/main/java/org/gridsuite/study/server/utils/ThrowingConsumer.java new file mode 100644 index 000000000..5d278a466 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/utils/ThrowingConsumer.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2026, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.study.server.utils; + +/** + * @author Sylvain Bouzols + */ +@FunctionalInterface +public interface ThrowingConsumer { + void accept(T t) throws E; +} diff --git a/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java b/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java index 20ffe5c7c..84c2fb2fc 100644 --- a/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java +++ b/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java @@ -83,6 +83,7 @@ import static org.gridsuite.study.server.error.StudyBusinessErrorCode.NOT_FOUND; import static org.gridsuite.study.server.utils.ImpactUtils.createModificationResultWithElementImpact; import static org.gridsuite.study.server.utils.JsonUtils.getModificationContextJsonString; +import static org.gridsuite.study.server.utils.JsonUtils.throwingJsonProcessingConsumerWrapper; import static org.gridsuite.study.server.utils.MatcherCreatedStudyBasicInfos.createMatcherCreatedStudyBasicInfos; import static org.gridsuite.study.server.utils.SendInput.POST_ACTION_SEND_INPUT; import static org.gridsuite.study.server.utils.TestUtils.checkUpdateStatusMessagesReceived; @@ -92,6 +93,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; @@ -131,26 +134,12 @@ class NetworkModificationTest { private static final String DYNAMIC_SECURITY_ANALYSIS_RESULT_UUID = "2e0f05e1-8a6f-6d50-1e6c-0a9071d3f40a"; private static final String DYNAMIC_MARGIN_CALCULATION_RESULT_UUID = "52b88cb8-d3ce-4263-bd4d-8b27849d88bc"; private static final String SECURITY_ANALYSIS_RESULT_UUID = "f3a85c9b-9594-4e55-8ec7-07ea965d24eb"; - private static final String SECURITY_ANALYSIS_STATUS_JSON = "\"CONVERGED\""; - private static final String SENSITIVITY_ANALYSIS_RESULT_UUID = "b3a84c9b-9594-4e85-8ec7-07ea965d24eb"; - private static final String SENSITIVITY_ANALYSIS_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; - private static final String SHORTCIRCUIT_ANALYSIS_RESULT_UUID = "72f94d64-4fc6-11ed-bdc3-0242ac120002"; private static final String ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID = "72f94d88-4fc6-11ed-bdc3-0242ac120009"; - - private static final String SHORTCIRCUIT_ANALYSIS_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; - private static final String ONE_BUS_SHORTCIRCUIT_ANALYSIS_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; - private static final String VOLTAGE_INIT_RESULT_UUID = "37cf33ad-f4a0-4ab8-84c5-6ad2e22d9866"; - private static final String PCC_MIN_RESULT_UUID = "37cf33ad-f4a0-4ab8-84c5-6ad2e22d9863"; - - private static final String VOLTAGE_INIT_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; - private static final String STATE_ESTIMATION_RESULT_UUID = "d3a85e9b-9894-4255-8ec7-07ea965d24eb"; - private static final String STATE_ESTIMATION_STATUS_JSON = "\"COMPLETED\""; - private static final String PCC_MIN_STATUS_JSON = "\"COMPLETED\""; private static final String MODIFICATION_UUID = "796719f5-bd31-48be-be46-ef7b96951e32"; @@ -2624,15 +2613,17 @@ void testNodesInvalidation() throws Exception { List.of( SECURITY_ANALYSIS_RESULT_UUID, SENSITIVITY_ANALYSIS_RESULT_UUID, - SHORTCIRCUIT_ANALYSIS_RESULT_UUID, - ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID, VOLTAGE_INIT_RESULT_UUID, PCC_MIN_RESULT_UUID, STATE_ESTIMATION_RESULT_UUID - ).forEach(resultUuid -> { + ).forEach(throwingJsonProcessingConsumerWrapper(resultUuid -> { computationServerStubs.verifyDeleteResult(resultUuid); - computationServerStubs.verifyGetResultStatus(resultUuid); - }); + computationServerStubs.verifyGetResultStatus(mapper.writeValueAsString(List.of(resultUuid))); + })); + // must verify individually because One bus and full shorticuit analysisi statuses are checked with the same request + computationServerStubs.verifyDeleteResult(SHORTCIRCUIT_ANALYSIS_RESULT_UUID); + computationServerStubs.verifyDeleteResult(ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID); + computationServerStubs.verifyGetResultStatus(mapper.writeValueAsString(List.of(SHORTCIRCUIT_ANALYSIS_RESULT_UUID, ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID))); // Mark nodes 2 and 3 status as built rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode2Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(NOT_FOUND, "Root network not found")); @@ -2720,22 +2711,24 @@ void testRemoveLoadFlowComputationReport() throws Exception { // 1 status LF + 2 x 10 computations + 1 report computationServerStubs.verifyDeleteResult(LOADFLOW_RESULT_UUID); - computationServerStubs.verifyGetResultStatus(LOADFLOW_RESULT_UUID, 2); + computationServerStubs.verifyGetResultStatuses(mapper.writeValueAsString(List.of(LOADFLOW_RESULT_UUID)), 2); List.of( SECURITY_ANALYSIS_RESULT_UUID, DYNAMIC_SIMULATION_RESULT_UUID, DYNAMIC_SECURITY_ANALYSIS_RESULT_UUID, DYNAMIC_MARGIN_CALCULATION_RESULT_UUID, SENSITIVITY_ANALYSIS_RESULT_UUID, - SHORTCIRCUIT_ANALYSIS_RESULT_UUID, - ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID, VOLTAGE_INIT_RESULT_UUID, STATE_ESTIMATION_RESULT_UUID, PCC_MIN_RESULT_UUID - ).forEach(resultUuid -> { + ).forEach(throwingJsonProcessingConsumerWrapper(resultUuid -> { computationServerStubs.verifyDeleteResult(resultUuid); - computationServerStubs.verifyGetResultStatus(resultUuid); - }); + computationServerStubs.verifyGetResultStatus(mapper.writeValueAsString(List.of(resultUuid))); + })); + // must verify individually because One bus and full shorticuit analysisi statuses are checked with the same request + computationServerStubs.verifyDeleteResult(SHORTCIRCUIT_ANALYSIS_RESULT_UUID); + computationServerStubs.verifyDeleteResult(ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID); + computationServerStubs.verifyGetResultStatus(mapper.writeValueAsString(List.of(SHORTCIRCUIT_ANALYSIS_RESULT_UUID, ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID))); // requests for computation sub-report deletion reportServerStubs.verifyDeleteReport(); } @@ -2973,17 +2966,60 @@ private ComputationResultStubIds stubAllComputationResults() throws JsonProcessi ).forEach(resultUuid -> { deleteResultStubIds.put(resultUuid, computationServerStubs.stubDeleteResult(resultUuid)); }); - getStatusStubIds.put(LOADFLOW_RESULT_UUID, computationServerStubs.stubGetResultStatus(LOADFLOW_RESULT_UUID, mapper.writeValueAsString(LoadFlowStatus.CONVERGED))); - getStatusStubIds.put(SECURITY_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatus(SECURITY_ANALYSIS_RESULT_UUID, SECURITY_ANALYSIS_STATUS_JSON)); - getStatusStubIds.put(DYNAMIC_SIMULATION_RESULT_UUID, computationServerStubs.stubGetResultStatus(DYNAMIC_SIMULATION_RESULT_UUID, objectMapper.writeValueAsString(DynamicSimulationStatus.CONVERGED))); - getStatusStubIds.put(DYNAMIC_SECURITY_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatus(DYNAMIC_SECURITY_ANALYSIS_RESULT_UUID, objectMapper.writeValueAsString(DynamicSecurityAnalysisStatus.SUCCEED))); - getStatusStubIds.put(DYNAMIC_MARGIN_CALCULATION_RESULT_UUID, computationServerStubs.stubGetResultStatus(DYNAMIC_MARGIN_CALCULATION_RESULT_UUID, objectMapper.writeValueAsString(DynamicMarginCalculationStatus.SUCCEED))); - getStatusStubIds.put(SENSITIVITY_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatus(SENSITIVITY_ANALYSIS_RESULT_UUID, SENSITIVITY_ANALYSIS_STATUS_JSON)); - getStatusStubIds.put(SHORTCIRCUIT_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatus(SHORTCIRCUIT_ANALYSIS_RESULT_UUID, SHORTCIRCUIT_ANALYSIS_STATUS_JSON)); - getStatusStubIds.put(ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatus(ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID, ONE_BUS_SHORTCIRCUIT_ANALYSIS_STATUS_JSON)); - getStatusStubIds.put(VOLTAGE_INIT_RESULT_UUID, computationServerStubs.stubGetResultStatus(VOLTAGE_INIT_RESULT_UUID, VOLTAGE_INIT_STATUS_JSON)); - getStatusStubIds.put(STATE_ESTIMATION_RESULT_UUID, computationServerStubs.stubGetResultStatus(STATE_ESTIMATION_RESULT_UUID, STATE_ESTIMATION_STATUS_JSON)); - getStatusStubIds.put(PCC_MIN_RESULT_UUID, computationServerStubs.stubGetResultStatus(PCC_MIN_RESULT_UUID, PCC_MIN_STATUS_JSON)); + getStatusStubIds.put(LOADFLOW_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(LOADFLOW_RESULT_UUID)), + mapper.writeValueAsString(Map.of(LOADFLOW_RESULT_UUID, LoadFlowStatus.CONVERGED)) + ) + ); + getStatusStubIds.put(SECURITY_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(SECURITY_ANALYSIS_RESULT_UUID)), + mapper.writeValueAsString(Map.of(SECURITY_ANALYSIS_RESULT_UUID, SecurityAnalysisStatus.CONVERGED)) + ) + ); + getStatusStubIds.put(DYNAMIC_SIMULATION_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(DYNAMIC_SIMULATION_RESULT_UUID)), + mapper.writeValueAsString(Map.of(DYNAMIC_SIMULATION_RESULT_UUID, DynamicSimulationStatus.CONVERGED)) + ) + ); + getStatusStubIds.put(DYNAMIC_SECURITY_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(DYNAMIC_SECURITY_ANALYSIS_RESULT_UUID)), + mapper.writeValueAsString(Map.of(DYNAMIC_SECURITY_ANALYSIS_RESULT_UUID, DynamicSecurityAnalysisStatus.SUCCEED)) + ) + ); + getStatusStubIds.put(DYNAMIC_MARGIN_CALCULATION_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(DYNAMIC_MARGIN_CALCULATION_RESULT_UUID)), + mapper.writeValueAsString(Map.of(DYNAMIC_MARGIN_CALCULATION_RESULT_UUID, DynamicMarginCalculationStatus.SUCCEED)) + ) + ); + getStatusStubIds.put(SENSITIVITY_ANALYSIS_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(SENSITIVITY_ANALYSIS_RESULT_UUID)), + mapper.writeValueAsString(Map.of(SENSITIVITY_ANALYSIS_RESULT_UUID, SensitivityAnalysisStatus.COMPLETED)) + ) + ); + UUID bothShortcircuitStubid = computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(SHORTCIRCUIT_ANALYSIS_RESULT_UUID, ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID)), + mapper.writeValueAsString(Map.of( + SHORTCIRCUIT_ANALYSIS_RESULT_UUID, ShortCircuitAnalysisStatus.COMPLETED, + ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID, ShortCircuitAnalysisStatus.COMPLETED + )) + ); + getStatusStubIds.put(SHORTCIRCUIT_ANALYSIS_RESULT_UUID, bothShortcircuitStubid); + getStatusStubIds.put(ONE_BUS_SHORTCIRCUIT_ANALYSIS_RESULT_UUID, bothShortcircuitStubid); + getStatusStubIds.put(VOLTAGE_INIT_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(VOLTAGE_INIT_RESULT_UUID)), + mapper.writeValueAsString(Map.of(VOLTAGE_INIT_RESULT_UUID, VoltageInitStatus.COMPLETED)) + ) + ); + getStatusStubIds.put(STATE_ESTIMATION_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(STATE_ESTIMATION_RESULT_UUID)), + mapper.writeValueAsString(Map.of(STATE_ESTIMATION_RESULT_UUID, StateEstimationStatus.COMPLETED)) + ) + ); + getStatusStubIds.put(PCC_MIN_RESULT_UUID, computationServerStubs.stubGetResultStatuses( + mapper.writeValueAsString(List.of(PCC_MIN_RESULT_UUID)), + mapper.writeValueAsString(Map.of(PCC_MIN_RESULT_UUID, PccMinStatus.COMPLETED)) + ) + ); return new ComputationResultStubIds(deleteResultStubIds, getStatusStubIds); } diff --git a/src/test/java/org/gridsuite/study/server/PccMinTest.java b/src/test/java/org/gridsuite/study/server/PccMinTest.java index 80de9663b..013c48331 100644 --- a/src/test/java/org/gridsuite/study/server/PccMinTest.java +++ b/src/test/java/org/gridsuite/study/server/PccMinTest.java @@ -53,6 +53,10 @@ import java.util.*; import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static com.github.tomakehurst.wiremock.client.WireMock.delete; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.put; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; @@ -62,7 +66,11 @@ import static org.gridsuite.study.server.notification.NotificationService.*; import static org.junit.jupiter.api.Assertions.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc @@ -75,7 +83,7 @@ class PccMinTest { private static final String PCC_MIN_RESULT_UUID = "cf203721-6150-4203-8960-d61d815a9d16"; private static final String PCC_MIN_ERROR_RESULT_UUID = "25222222-9994-4e55-8ec7-07ea965d24eb"; private static final UUID PCCMIN_PARAMETERS_UUID = UUID.fromString("0c0f1efd-bd22-4a75-83d3-9e530245c7f2"); - private static final String PCC_MIN_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; + private static final String PCC_MIN_STATUS_JSON = "COMPLETED"; private static final String ELEMENT_UPDATE_DESTINATION = "element.update"; private static final String CASE_UUID_STRING = "00000000-8cf0-11bd-b23e-10b96e4ef00d"; @@ -278,12 +286,17 @@ void testRunAndCheckStatus() throws Exception { wireMockStubs.verifyPccMinRun(stubRun, NETWORK_UUID_STRING, VARIANT_ID); // verify pcc min status - computationServerStubs.stubGetResultStatus(PCC_MIN_RESULT_UUID, PCC_MIN_STATUS_JSON); + computationServerStubs.stubGetResultStatuses( + objectMapper.writeValueAsString(List.of(PCC_MIN_RESULT_UUID)), + objectMapper.writeValueAsString(Map.of(PCC_MIN_RESULT_UUID, PCC_MIN_STATUS_JSON)) + ); mockMvc.perform(get(PCC_MIN_URL_BASE + "status", ids.studyId, ids.rootNetworkUuid, ids.nodeId)) - .andExpect(status().isOk()) - .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.content().string(PCC_MIN_STATUS_JSON)); + .andExpectAll( + status().isOk(), + content().string(PCC_MIN_STATUS_JSON) + ); - computationServerStubs.verifyGetResultStatus(PCC_MIN_RESULT_UUID); + computationServerStubs.verifyGetResultStatus(objectMapper.writeValueAsString(List.of(PCC_MIN_RESULT_UUID))); } @Test diff --git a/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java index 0c487563f..de4802e54 100644 --- a/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java @@ -50,7 +50,7 @@ import java.util.*; import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static com.github.tomakehurst.wiremock.client.WireMock.post; +// import static com.github.tomakehurst.wiremock.client.WireMock.post; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.gridsuite.study.server.StudyConstants.HEADER_RECEIVER; import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; @@ -82,7 +82,7 @@ class SensitivityAnalysisTest { private static final String NOT_FOUND_NODE_UUID = "a3a80c9b-9594-4e55-8ec7-07ea965d24eb"; private static final String FAKE_RESULT_JSON = "fake result json"; - private static final String SENSITIVITY_ANALYSIS_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; + private static final String SENSITIVITY_ANALYSIS_STATUS_JSON = "COMPLETED"; private static final String NETWORK_UUID_STRING = "38400000-8cf0-11bd-b23e-10b96e4ef00d"; private static final String NETWORK_UUID_2_STRING = "11111111-aaaa-48be-be46-ef7b93331e32"; @@ -420,13 +420,16 @@ private void testSensitivityAnalysisWithRootNetworkUuidAndNodeUuid(UUID studyUui )); // --- 6. GET sensitivity analysis status --- - computationServerStubs.stubGetResultStatus(resultUuid, SENSITIVITY_ANALYSIS_STATUS_JSON); + computationServerStubs.stubGetResultStatuses( + objectMapper.writeValueAsString(List.of(resultUuid)), + objectMapper.writeValueAsString(Map.of(resultUuid, SENSITIVITY_ANALYSIS_STATUS_JSON)) + ); mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/status", studyUuid, rootNetworkUuid, nodeUuid)) .andExpectAll(status().isOk(), content().string(SENSITIVITY_ANALYSIS_STATUS_JSON)); - computationServerStubs.verifyGetResultStatus(resultUuid); + computationServerStubs.verifyGetResultStatus(objectMapper.writeValueAsString(List.of(resultUuid))); // --- 7. Export CSV --- String content = objectMapper.writeValueAsString(SensitivityAnalysisCsvFileInfos.builder() @@ -557,7 +560,7 @@ void testGetSensitivityAnalysisFactorCount() throws Exception { UUID firstRootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid); UUID rootNodeUuid = getRootNodeUuid(studyNameUserIdUuid); - wireMockServer.stubFor(post(urlPathMatching("/v1/networks/.*/factor-count")) + wireMockServer.stubFor(WireMock.post(urlPathMatching("/v1/networks/.*/factor-count")) .willReturn(aResponse() .withStatus(200) .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) @@ -779,7 +782,7 @@ void testResetSensitivityAnalysisParametersUserHasValidParamsInProfile() throws ); // ---------------- WireMock stubs ---------------- - wireMockServer.stubFor(post(urlPathMatching( + wireMockServer.stubFor(WireMock.post(urlPathMatching( "/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save.*")) .willReturn(ok())); diff --git a/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java b/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java index a7802e0b4..2a8608e7f 100644 --- a/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java +++ b/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java @@ -101,7 +101,7 @@ class ShortCircuitTest implements WithAssertions { private static final byte[] SHORT_CIRCUIT_ANALYSIS_CSV_RESULT = {0x00, 0x11}; - private static final String SHORT_CIRCUIT_ANALYSIS_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; + private static final String SHORT_CIRCUIT_ANALYSIS_STATUS_JSON = "COMPLETED"; private static final String SHORT_CIRCUIT_ANALYSIS_PARAMETERS_UUID_STRING = "0c0f1efd-bd22-4a75-83d3-9e530245c7f4"; private static final UUID SHORT_CIRCUIT_ANALYSIS_PARAMETERS_UUID = UUID.fromString(SHORT_CIRCUIT_ANALYSIS_PARAMETERS_UUID_STRING); @@ -271,11 +271,14 @@ void testAllBusesShortCircuit() throws Exception { status().isNoContent()); // get short circuit status - computationServerStubs.stubGetResultStatus(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, SHORT_CIRCUIT_ANALYSIS_STATUS_JSON); + computationServerStubs.stubGetResultStatuses( + objectMapper.writeValueAsString(List.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID)), + objectMapper.writeValueAsString(Map.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, SHORT_CIRCUIT_ANALYSIS_STATUS_JSON)) + ); mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/shortcircuit/status", studyNameUserIdUuid, firstRootNetworkUuid, modificationNode3Uuid)).andExpectAll( status().isOk(), content().string(SHORT_CIRCUIT_ANALYSIS_STATUS_JSON)); - computationServerStubs.verifyGetResultStatus(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID); + computationServerStubs.verifyGetResultStatus(objectMapper.writeValueAsString(List.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID))); // stop short circuit analysis shortcircuitServerStubs.stubShortCircuitStopWithPostAction(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, shortCircuitAnalysisStoppedDestination, modificationNode3Uuid, firstRootNetworkUuid); @@ -462,11 +465,14 @@ void testPagedShortCircuit() throws Exception { status().isNoContent()); // get short circuit status - computationServerStubs.stubGetResultStatus(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, SHORT_CIRCUIT_ANALYSIS_STATUS_JSON); + computationServerStubs.stubGetResultStatuses( + objectMapper.writeValueAsString(List.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID)), + objectMapper.writeValueAsString(Map.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, SHORT_CIRCUIT_ANALYSIS_STATUS_JSON)) + ); mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/shortcircuit/status", studyNameUserIdUuid, firstRootNetworkUuid, modificationNode1Uuid)).andExpectAll( status().isOk(), content().string(SHORT_CIRCUIT_ANALYSIS_STATUS_JSON)); - computationServerStubs.verifyGetResultStatus(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, 1); + computationServerStubs.verifyGetResultStatus(objectMapper.writeValueAsString(List.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID))); // stop short circuit analysis shortcircuitServerStubs.stubShortCircuitStopWithPostAction(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, shortCircuitAnalysisStoppedDestination, modificationNode1Uuid, firstRootNetworkUuid); @@ -534,14 +540,17 @@ void testOneBusShortCircuit() throws Exception { shortcircuitServerStubs.verifyGetPagedFeederResults(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, NETWORK_UUID_STRING, VARIANT_ID_2, "fakeFilters", "FULL", "0", "20", "id,DESC"); // get one bus short circuit status - computationServerStubs.stubGetResultStatus(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, SHORT_CIRCUIT_ANALYSIS_STATUS_JSON); + computationServerStubs.stubGetResultStatuses( + objectMapper.writeValueAsString(List.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID)), + objectMapper.writeValueAsString(Map.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID, SHORT_CIRCUIT_ANALYSIS_STATUS_JSON)) + ); mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/shortcircuit/status", studyNameUserIdUuid, firstRootNetworkUuid, modificationNode3Uuid) .param("type", ShortcircuitAnalysisType.ONE_BUS.name())) .andExpectAll( status().isOk(), content().string(SHORT_CIRCUIT_ANALYSIS_STATUS_JSON) ); - WireMockUtilsCriteria.verifyGetRequest(wireMockServer, "/v1/results/" + SHORT_CIRCUIT_ANALYSIS_RESULT_UUID + "/status", Map.of()); + computationServerStubs.verifyGetResultStatus(objectMapper.writeValueAsString(List.of(SHORT_CIRCUIT_ANALYSIS_RESULT_UUID))); //Test result count computationServerStubs.stubResultsCount(1); diff --git a/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java b/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java index 7fc7aadf5..6158cee42 100644 --- a/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java +++ b/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java @@ -185,7 +185,7 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), "svgandmetadata"); case "/v1/svg-and-metadata/" + NETWORK_UUID_STRING + "/voltageLevelId": { - Map sldRequestInfos = objectMapper.readValue(request.getBody().readUtf8(), new TypeReference<>() { }); + Map sldRequestInfos = objectMapper.readValue(request.getBody().snapshot().utf8(), new TypeReference<>() { }); switch (sldRequestInfos.get("sldDisplayMode")) { case SldDisplayMode.STATE_VARIABLE: return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), "svgandmetadata"); diff --git a/src/test/java/org/gridsuite/study/server/SpreadsheetConfigCollectionTest.java b/src/test/java/org/gridsuite/study/server/SpreadsheetConfigCollectionTest.java index 0ab77c20a..51a98c1a7 100644 --- a/src/test/java/org/gridsuite/study/server/SpreadsheetConfigCollectionTest.java +++ b/src/test/java/org/gridsuite/study/server/SpreadsheetConfigCollectionTest.java @@ -176,7 +176,7 @@ public MockResponse dispatch(RecordedRequest request) { } else if (path.equals("/v1/spreadsheet-config-collections") && "POST".equals(method)) { String body = null; try { - body = request.getBody().readUtf8(); + body = request.getBody().snapshot().utf8(); } catch (Exception e) { LOGGER.error("Error reading request body", e); } diff --git a/src/test/java/org/gridsuite/study/server/StateEstimationTest.java b/src/test/java/org/gridsuite/study/server/StateEstimationTest.java index 314638454..ccbacc6b5 100644 --- a/src/test/java/org/gridsuite/study/server/StateEstimationTest.java +++ b/src/test/java/org/gridsuite/study/server/StateEstimationTest.java @@ -31,6 +31,7 @@ import org.gridsuite.study.server.repository.networkmodificationtree.NetworkModificationNodeInfoRepository; import org.gridsuite.study.server.repository.rootnetwork.RootNetworkNodeInfoRepository; import org.gridsuite.study.server.service.*; +import org.gridsuite.study.server.utils.RequestWithBody; import org.gridsuite.study.server.utils.TestUtils; import org.gridsuite.study.server.utils.elasticsearch.DisableElasticsearch; import org.jetbrains.annotations.NotNull; @@ -101,7 +102,7 @@ class StateEstimationTest { private static final UUID STATE_ESTIMATION_PARAMETERS_UUID = UUID.fromString(STATE_ESTIMATION_PARAMETERS_UUID_STRING); private static final String WRONG_STATE_ESTIMATION_PARAMETERS_UUID_STRING = "72c9d1ef-d8ab-4388-a6fe-855604c2dc10"; - private static final String ESTIM_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; + private static final String ESTIM_STATUS_JSON = "COMPLETED"; private static final String VARIANT_ID = "variant_1"; private static final String VARIANT_ID_2 = "variant_2"; @@ -178,6 +179,7 @@ void setup(final MockWebServer server) throws Exception { public MockResponse dispatch(RecordedRequest request) { String path = Objects.requireNonNull(request.getPath()); String method = Objects.requireNonNull(request.getMethod()); + String body = request.getBody().snapshot().utf8(); if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?reportUuid=.*&reporterId=.*&reportType=StateEstimation&variantId=" + VARIANT_ID + "&receiver=.*")) { // estim with success @@ -193,8 +195,9 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), estimErrorResultUuidStr); } else if (path.matches("/v1/results/" + STATE_ESTIMATION_RESULT_UUID)) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), estimResultJson); - } else if (path.matches("/v1/results/" + STATE_ESTIMATION_RESULT_UUID + "/status")) { - return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), ESTIM_STATUS_JSON); + } else if (path.matches("/v1/results/statuses") && "POST".equals(method) && body.contains(STATE_ESTIMATION_RESULT_UUID)) { + return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), + objectMapper.writeValueAsString(Map.of(STATE_ESTIMATION_RESULT_UUID, ESTIM_STATUS_JSON))); } else if (path.matches("/v1/results/" + STATE_ESTIMATION_RESULT_UUID + "/stop.*")) { input.send(MessageBuilder.withPayload("") .setHeader("resultUuid", STATE_ESTIMATION_RESULT_UUID) @@ -343,7 +346,9 @@ void testComputation(final MockWebServer server) throws Exception { mockMvc.perform(get(STATE_ESTIMATION_URL_BASE + "status", ids.studyId, ids.rootNetworkUuid, ids.nodeId)).andExpectAll( status().isOk(), content().string(ESTIM_STATUS_JSON)); - assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + STATE_ESTIMATION_RESULT_UUID + "/status"))); + RequestWithBody request = TestUtils.getRequestsWithBodyDone(1, server).iterator().next(); + assertEquals("/v1/results/statuses", request.getPath()); + assertTrue(request.getBody().contains(STATE_ESTIMATION_RESULT_UUID)); } @Test @@ -476,6 +481,8 @@ void testDebugComputation(final MockWebServer server) throws Exception { mockMvc.perform(get(STATE_ESTIMATION_URL_BASE + "status", ids.studyId, ids.rootNetworkUuid, ids.nodeId)).andExpectAll( status().isOk(), content().string(ESTIM_STATUS_JSON)); - assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + STATE_ESTIMATION_RESULT_UUID + "/status"))); + RequestWithBody request = TestUtils.getRequestsWithBodyDone(1, server).iterator().next(); + assertEquals("/v1/results/statuses", request.getPath()); + assertTrue(request.getBody().contains(STATE_ESTIMATION_RESULT_UUID)); } } diff --git a/src/test/java/org/gridsuite/study/server/VoltageInitTest.java b/src/test/java/org/gridsuite/study/server/VoltageInitTest.java index 50e2c5e3e..073b631c7 100644 --- a/src/test/java/org/gridsuite/study/server/VoltageInitTest.java +++ b/src/test/java/org/gridsuite/study/server/VoltageInitTest.java @@ -51,6 +51,7 @@ import org.gridsuite.study.server.service.*; import org.gridsuite.study.server.service.shortcircuit.ShortCircuitService; import org.gridsuite.study.server.utils.MatcherJson; +import org.gridsuite.study.server.utils.RequestWithBody; import org.gridsuite.study.server.utils.TestUtils; import org.gridsuite.study.server.utils.elasticsearch.DisableElasticsearch; import org.jetbrains.annotations.NotNull; @@ -92,6 +93,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; @@ -168,7 +170,7 @@ class VoltageInitTest { private static final String VOLTAGE_INIT_PREVIEW_MODIFICATION_LIST = "[{\"type\": \"VOLTAGE_INIT_MODIFICATION\",\"uuid\": \"254a3b85-14ad-4436-bf62-3e60af831dd1\",\"date\": \"2023-09-18T10:58:32.582239Z\",\"stashed\": false,\"generators\": [],\"transformers\": [],\"staticVarCompensators\": [],\"vscConverterStations\": [],\"shuntCompensators\": []}]"; - private static final String VOLTAGE_INIT_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; + private static final String VOLTAGE_INIT_STATUS_JSON = "COMPLETED"; private static final String VARIANT_ID = "variant_1"; private static final String VARIANT_ID_2 = "variant_2"; @@ -322,6 +324,8 @@ void setup(final MockWebServer server) throws Exception { public MockResponse dispatch(RecordedRequest request) { String path = Objects.requireNonNull(request.getPath()); String method = Objects.requireNonNull(request.getMethod()); + String body = request.getBody().snapshot().utf8(); + if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_3 + "&rootNetworkName=.*&nodeName=.*")) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), voltageInitResultUuidStr2); } else if (path.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2 + ".*" + "&rootNetworkName=.*&nodeName=.*")) { @@ -332,8 +336,9 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), VOLTAGE_INIT_RESULT_JSON); } else if (path.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "\\?globalFilters=.*networkUuid=.*variantId.*")) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), VOLTAGE_INIT_RESULT_JSON); - } else if (path.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status")) { - return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), VOLTAGE_INIT_STATUS_JSON); + } else if (path.matches("/v1/results/statuses") && "POST".equals(method) && body.contains(VOLTAGE_INIT_RESULT_UUID)) { + return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), + objectMapper.writeValueAsString(Map.of(VOLTAGE_INIT_RESULT_UUID, VOLTAGE_INIT_STATUS_JSON))); } else if (path.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/modifications-group-uuid")) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), "\"" + MODIFICATIONS_GROUP_UUID + "\""); } else if (path.matches("/v1/groups/.*" + "\\?action=COPY.*")) { @@ -592,8 +597,9 @@ void testVoltageInit(final MockWebServer server) throws Exception { status().isOk(), content().string(VOLTAGE_INIT_STATUS_JSON)); - assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status"))); - + RequestWithBody request = TestUtils.getRequestsWithBodyDone(1, server).iterator().next(); + assertEquals("/v1/results/statuses", request.getPath()); + assertTrue(request.getBody().contains(VOLTAGE_INIT_RESULT_UUID)); mockMvc.perform( post("/v1/studies/{studyUuid}/voltage-init/parameters", studyNameUserIdUuid) .header("userId", "userId") @@ -721,7 +727,7 @@ void testInsertVoltageInitModifications(final MockWebServer server) throws Excep .header("userId", "userId")).andExpect(status().isOk()); assertTrue(TestUtils.getRequestsDone(4, server).stream().allMatch(r -> r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/modifications-group-uuid") || - r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status") || + r.matches("/v1/results/statuses") || r.matches("/v1/groups/.*\\?action=COPY&originGroupUuid=.*") )); @@ -735,7 +741,7 @@ void testInsertVoltageInitModifications(final MockWebServer server) throws Excep .header("userId", "userId")).andExpect(status().isOk()); assertTrue(TestUtils.getRequestsDone(7, server).stream().allMatch(r -> r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/modifications-group-uuid") || - r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status") || + r.matches("/v1/results/statuses") || r.matches("/v1/results\\?resultsUuids=" + VOLTAGE_INIT_RESULT_UUID) || r.matches("/v1/groups/.*\\?action=COPY.*") || r.matches("/v1/network-modifications/index\\?networkUuid=.*&groupUuids=.*") || @@ -753,7 +759,7 @@ void testInsertVoltageInitModifications(final MockWebServer server) throws Excep .header("userId", "userId")).andExpect(status().isOk()); assertTrue(TestUtils.getRequestsDone(5, server).stream().allMatch(r -> r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/modifications-group-uuid") || - r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status") || + r.matches("/v1/results/statuses") || r.matches("/v1/groups/.*\\?action=COPY&originGroupUuid=.*") || r.matches("/v1/network-modifications/index\\?networkUuid=.*&groupUuids=.*") )); @@ -767,7 +773,7 @@ void testInsertVoltageInitModifications(final MockWebServer server) throws Excep .header("userId", "userId")).andExpect(status().isOk()); assertTrue(TestUtils.getRequestsDone(5, server).stream().allMatch(r -> r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/modifications-group-uuid") || - r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status") || + r.matches("/v1/results/statuses") || r.matches("/v1/groups/.*\\?action=COPY.*") || r.matches("/v1/network-modifications/index\\?networkUuid=.*&groupUuids=.*") )); @@ -853,7 +859,7 @@ void testInsertVoltageInitModificationsWithTwoRootNetworks(final MockWebServer s .header("userId", "userId")).andExpect(status().isOk()); assertTrue(TestUtils.getRequestsDone(4, server).stream().allMatch(r -> r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/modifications-group-uuid") || - r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status") || + r.matches("/v1/results/statuses") || r.matches("/v1/groups/.*\\?action=COPY&originGroupUuid=.*") )); checkEquipmentUpdatingMessagesReceived(studyUuid, nodeUuid); @@ -872,7 +878,9 @@ void testInsertVoltageInitModificationsWithTwoRootNetworks(final MockWebServer s // Error case: try to generate the voltageInit modification on the second root network (where no computation has been made) mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network-modifications/voltage-init", studyUuid, secondRootNetworkUuid, nodeUuid) .header("userId", "userId")).andExpect(status().isNotFound()); - assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + VOLTAGE_INIT_RESULT_UUID + "/status"))); + RequestWithBody request = TestUtils.getRequestsWithBodyDone(1, server).iterator().next(); + assertEquals("/v1/results/statuses", request.getPath()); + assertTrue(request.getBody().contains(VOLTAGE_INIT_RESULT_UUID)); } NodeEntity insertRootNode(StudyEntity study, UUID nodeId) { diff --git a/src/test/java/org/gridsuite/study/server/loadflow/LoadFlowTest.java b/src/test/java/org/gridsuite/study/server/loadflow/LoadFlowTest.java index d6e664ce1..c3b4a4271 100644 --- a/src/test/java/org/gridsuite/study/server/loadflow/LoadFlowTest.java +++ b/src/test/java/org/gridsuite/study/server/loadflow/LoadFlowTest.java @@ -75,6 +75,7 @@ import static org.gridsuite.study.server.utils.wiremock.WireMockUtilsCriteria.removeRequestMatching; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; @@ -256,7 +257,11 @@ private void consumeLoadFlowResult(UUID studyUuid, UUID rootNetworkUuid, Network // consume loadflow result String resultUuidJson = objectMapper.writeValueAsString(new NodeReceiver(nodeUuid, rootNetworkUuid)); if (modificationNode.isSecurityNode()) { - wireMockStubs.loadflowServer.stubGetLoadflowStatus(UUID.fromString(LOADFLOW_RESULT_UUID), objectMapper.writeValueAsString(LoadFlowStatus.CONVERGED), false); + wireMockStubs.loadflowServer.stubGetLoadflowStatuses( + objectMapper.writeValueAsString(List.of(LOADFLOW_RESULT_UUID)), + objectMapper.writeValueAsString(Map.of(LOADFLOW_RESULT_UUID, LoadFlowStatus.CONVERGED)), + false + ); } MessageHeaders messageHeaders = new MessageHeaders( Map.of( @@ -271,7 +276,7 @@ private void consumeLoadFlowResult(UUID studyUuid, UUID rootNetworkUuid, Network assertNodeBlocked(nodeUuid, rootNetworkUuid, false); if (modificationNode.isSecurityNode()) { // if running successful loadflow on security node -> first children are built - wireMockStubs.loadflowServer.verifyGetLoadflowStatus(UUID.fromString(LOADFLOW_RESULT_UUID)); + wireMockStubs.loadflowServer.verifyGetLoadflowStatus(objectMapper.writeValueAsString(List.of(LOADFLOW_RESULT_UUID))); verify(studyService, times(1)).buildFirstLevelChildren(studyUuid, nodeUuid, rootNetworkUuid, "userId"); } } @@ -350,12 +355,16 @@ private void testLoadFlow(UUID studyNameUserIdUuid, NetworkModificationNode modi wireMockStubs.loadflowServer.verifyGetLoadflowResult(loadflowResultUuid); // get loadflow status - wireMockStubs.loadflowServer.stubGetLoadflowStatus(loadflowResultUuid, objectMapper.writeValueAsString(LoadFlowStatus.CONVERGED), false); + wireMockStubs.loadflowServer.stubGetLoadflowStatuses( + objectMapper.writeValueAsString(List.of(loadflowResultUuid)), + objectMapper.writeValueAsString(Map.of(loadflowResultUuid, LoadFlowStatus.CONVERGED)), + false + ); mvcResult = mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/status?withRatioTapChangers={withRatioTapChangers}", studyNameUserIdUuid, firstRootNetworkUuid, modificationNodeUuid, false)) .andExpect(status().isOk()) .andReturn(); assertEquals(LoadFlowStatus.CONVERGED.name(), mvcResult.getResponse().getContentAsString()); - wireMockStubs.loadflowServer.verifyGetLoadflowStatus(loadflowResultUuid); + wireMockStubs.loadflowServer.verifyGetLoadflowStatus(objectMapper.writeValueAsString(List.of(loadflowResultUuid))); // stop loadflow wireMockStubs.loadflowServer.stubStopLoadflow(loadflowResultUuid, modificationNodeUuid, firstRootNetworkUuid, objectMapper.writeValueAsString(LoadFlowStatus.CONVERGED)); @@ -806,11 +815,15 @@ void testGetLoadFlowParametersId() throws Exception { } @Test - void testGetStatusNotFound() { + void testGetStatusNotFound() throws Exception { UUID notExistingNetworkUuid = UUID.fromString(LOADFLOW_ERROR_RESULT_UUID); - wireMockStubs.loadflowServer.stubGetLoadflowStatus(UUID.fromString(LOADFLOW_ERROR_RESULT_UUID), null, true); + wireMockStubs.loadflowServer.stubGetLoadflowStatuses( + objectMapper.writeValueAsString(List.of(LOADFLOW_ERROR_RESULT_UUID)), + null, + true + ); assertThrows(HttpClientErrorException.NotFound.class, () -> loadFlowService.getLoadFlowStatus(notExistingNetworkUuid), NOT_FOUND.name()); - wireMockStubs.loadflowServer.verifyGetLoadflowStatus(UUID.fromString(LOADFLOW_ERROR_RESULT_UUID)); + wireMockStubs.loadflowServer.verifyGetLoadflowStatus(objectMapper.writeValueAsString(List.of(LOADFLOW_ERROR_RESULT_UUID))); } @Test diff --git a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java index ba6539ea5..f90155524 100644 --- a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java @@ -57,7 +57,6 @@ import java.util.UUID; import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static com.github.tomakehurst.wiremock.client.WireMock.post; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.gridsuite.study.server.StudyConstants.HEADER_RECEIVER; import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; @@ -97,7 +96,7 @@ class SecurityAnalysisTest { private static final byte[] SECURITY_ANALYSIS_NMK_CONTINGENCIES_RESULT_CSV_ZIPPED = {0x02, 0x03}; private static final byte[] SECURITY_ANALYSIS_NMK_CONSTRAINTS_RESULT_CSV_ZIPPED = {0x04, 0x03}; private static final byte[] SECURITY_ANALYSIS_NMK_CUT_OFF_POWER_RESULT_CSV_ZIPPED = {0x05, 0x03}; - private static final String SECURITY_ANALYSIS_STATUS_JSON = "\"CONVERGED\""; + private static final String SECURITY_ANALYSIS_STATUS_JSON = "CONVERGED"; private static final ContingencyCount CONTINGENCIES_COUNT = new ContingencyCount(2, 0); public static final String SECURITY_ANALYSIS_DEFAULT_PARAMETERS_JSON = "{\"lowVoltageAbsoluteThreshold\":0.0,\"lowVoltageProportionalThreshold\":0.0,\"highVoltageAbsoluteThreshold\":0.0,\"highVoltageProportionalThreshold\":0.0,\"flowProportionalThreshold\":0.1}"; @@ -292,7 +291,7 @@ void getResultZippedCsv() throws Exception { * RUN SECURITY ANALYSIS END */ - wireMockServer.stubFor(post(urlPathEqualTo( + wireMockServer.stubFor(WireMock.post(urlPathEqualTo( "/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/nmk-contingencies-result/csv" )).withQueryParam("resultType", equalTo(SecurityAnalysisResultType.NMK_CONTINGENCIES.name())) .withRequestBody(equalToJson(objectMapper.writeValueAsString(CSV_TRANSLATION_DTO_STRING))) @@ -303,7 +302,7 @@ void getResultZippedCsv() throws Exception { )); // get N security analysis result zipped csv - wireMockServer.stubFor(post(urlPathEqualTo( + wireMockServer.stubFor(WireMock.post(urlPathEqualTo( "/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/n-result/csv" )).withRequestBody(equalToJson(objectMapper.writeValueAsString(CSV_TRANSLATION_DTO_STRING))) .willReturn(aResponse() @@ -324,7 +323,7 @@ void getResultZippedCsv() throws Exception { // get NMK_CONTINGENCIES security analysis result zipped csv wireMockServer.stubFor( - post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/nmk-contingencies-result/csv")) + WireMock.post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/nmk-contingencies-result/csv")) .withRequestBody(equalTo(CSV_TRANSLATION_DTO_STRING)) .willReturn(aResponse() .withStatus(200) @@ -348,7 +347,7 @@ void getResultZippedCsv() throws Exception { // get NMK_CONSTRAINTS security analysis result zipped csv wireMockServer.stubFor( - post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/nmk-constraints-result/csv")) + WireMock.post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/nmk-constraints-result/csv")) .withRequestBody(equalTo(CSV_TRANSLATION_DTO_STRING)) .willReturn(aResponse() .withStatus(200) @@ -371,7 +370,7 @@ void getResultZippedCsv() throws Exception { // get NMK_CUT_OFF_POWER security analysis result zipped csv wireMockServer.stubFor( - post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/nmk-cut-off-power-result/csv")) + WireMock.post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/nmk-cut-off-power-result/csv")) .withRequestBody(equalTo(CSV_TRANSLATION_DTO_STRING)) .willReturn(aResponse() .withStatus(200) @@ -416,7 +415,7 @@ void getResultZippedCsvNotFound() throws Exception { // get NOT_FOUND security analysis result zipped csv wireMockServer.stubFor( - post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_OTHER_NODE_RESULT_UUID + "/n-result/csv")) + WireMock.post(urlPathEqualTo("/v1/results/" + SECURITY_ANALYSIS_OTHER_NODE_RESULT_UUID + "/n-result/csv")) .withRequestBody(equalTo(CSV_TRANSLATION_DTO_STRING)) .willReturn(aResponse() .withStatus(404) @@ -645,10 +644,13 @@ private void testSecurityAnalysisWithRootNetworkUuidAndNodeUuid(UUID studyUuid, securityAnalysisServerStubs.verifyGetNmkCutOffPowerConstraintsResult(resultUuid, Map.of("page", WireMock.matching(".*"))); // --- 8. GET security analysis status --- - computationServerStubs.stubGetResultStatus(resultUuid, SECURITY_ANALYSIS_STATUS_JSON); + computationServerStubs.stubGetResultStatuses( + objectMapper.writeValueAsString(List.of(resultUuid)), + objectMapper.writeValueAsString(Map.of(resultUuid, SECURITY_ANALYSIS_STATUS_JSON)) + ); mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/status", studyUuid, rootNetworkUuid, nodeUuid)).andExpectAll( status().isOk()).andReturn(); - computationServerStubs.verifyGetResultStatus(resultUuid); + computationServerStubs.verifyGetResultStatus(objectMapper.writeValueAsString(List.of(resultUuid))); // stop security analysis computationServerStubs.stubComputationStop(resultUuid); @@ -882,7 +884,7 @@ void testResetSecurityAnalysisParametersUserHasValidParamsInProfile() throws Exc UUID rootNodeUuid = getRootNode(studyUuid).getId(); UUID firstRootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyUuid); NetworkModificationNode modificationNode1 = createNetworkModificationNode(studyUuid, rootNodeUuid, UUID.randomUUID(), VARIANT_ID, "node 1"); - wireMockServer.stubFor(post(urlPathMatching("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save.*")) + wireMockServer.stubFor(WireMock.post(urlPathMatching("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save.*")) .willReturn(ok())); userAdminServerStubs.stubGetUserProfile(VALID_PARAMS_IN_PROFILE_USER_ID, USER_PROFILE_VALID_PARAMS_JSON); computationServerStubs.stubDeleteParameters(SECURITY_ANALYSIS_PARAMETERS_UUID_STRING); diff --git a/src/test/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClientTest.java b/src/test/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClientTest.java index 49c5e96d2..cb3efafbf 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClientTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/dynamicmargincalculation/DynamicMarginCalculationClientTest.java @@ -25,16 +25,18 @@ import org.springframework.web.client.RestTemplate; import java.util.List; +import java.util.Map; import java.util.UUID; import static com.github.tomakehurst.wiremock.client.WireMock.absent; +import static com.github.tomakehurst.wiremock.client.WireMock.containing; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.study.server.StudyConstants.*; import static org.gridsuite.study.server.notification.NotificationService.HEADER_USER_ID; import static org.gridsuite.study.server.service.client.RestClient.DELIMITER; import static org.gridsuite.study.server.service.client.dynamicmargincalculation.DynamicMarginCalculationClient.*; import static org.gridsuite.study.server.service.client.util.UrlUtil.buildEndPointUrl; -import static org.gridsuite.study.server.utils.assertions.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; /** @@ -348,10 +350,11 @@ void testRun() throws Exception { @Test void testGetStatus() throws Exception { // configure mock server response - String url = RESULT_BASE_URL + DELIMITER + RESULT_UUID + "/status"; - wireMockServer.stubFor(WireMock.get(WireMock.urlEqualTo(url)) + String url = RESULT_BASE_URL + DELIMITER + "statuses"; + wireMockServer.stubFor(WireMock.post(WireMock.urlEqualTo(url)) + .withRequestBody(containing(RESULT_UUID.toString())) .willReturn(WireMock.ok() - .withBody(objectMapper.writeValueAsString(DynamicMarginCalculationStatus.SUCCEED)) + .withBody(objectMapper.writeValueAsString(Map.of(RESULT_UUID, DynamicMarginCalculationStatus.SUCCEED))) .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) )); // call service to test diff --git a/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java b/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java index 5918f9bae..8b915bf9b 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java @@ -25,9 +25,11 @@ import org.springframework.web.client.RestTemplate; import java.util.List; +import java.util.Map; import java.util.UUID; import static com.github.tomakehurst.wiremock.client.WireMock.absent; +import static com.github.tomakehurst.wiremock.client.WireMock.containing; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static org.gridsuite.study.server.StudyConstants.*; import static org.gridsuite.study.server.notification.NotificationService.HEADER_USER_ID; @@ -347,10 +349,11 @@ void testRun() throws Exception { @Test void testGetStatus() throws Exception { // configure mock server response - String url = RESULT_BASE_URL + DELIMITER + RESULT_UUID + "/status"; - wireMockServer.stubFor(WireMock.get(WireMock.urlEqualTo(url)) + String url = RESULT_BASE_URL + DELIMITER + "statuses"; + wireMockServer.stubFor(WireMock.post(WireMock.urlEqualTo(url)) + .withRequestBody(containing(RESULT_UUID.toString())) .willReturn(WireMock.ok() - .withBody(objectMapper.writeValueAsString(DynamicSecurityAnalysisStatus.SUCCEED)) + .withBody(objectMapper.writeValueAsString(Map.of(RESULT_UUID, DynamicSecurityAnalysisStatus.SUCCEED))) .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) )); // call service to test diff --git a/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java b/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java index d43042259..3592ff1c1 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java @@ -26,8 +26,10 @@ import org.springframework.web.client.RestTemplate; import java.util.List; +import java.util.Map; import java.util.UUID; +import static com.github.tomakehurst.wiremock.client.WireMock.containing; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.study.server.StudyConstants.*; @@ -408,10 +410,11 @@ void testGetTimelineResultGivenBadUuid() { @Test void testGetStatus() throws Exception { - // configure mock server response for test get status result - results/{resultUuid}/status - wireMockServer.stubFor(WireMock.get(WireMock.urlEqualTo(DYNAMIC_SIMULATION_RESULT_BASE_URL + DELIMITER + RESULT_UUID + DELIMITER + "status")) + // configure mock server response for test get status result - results/statuses + wireMockServer.stubFor(WireMock.post(WireMock.urlEqualTo(DYNAMIC_SIMULATION_RESULT_BASE_URL + DELIMITER + "statuses")) + .withRequestBody(containing(RESULT_UUID.toString())) .willReturn(WireMock.ok() - .withBody(objectMapper.writeValueAsString(DynamicSimulationStatus.CONVERGED)) + .withBody(objectMapper.writeValueAsString(Map.of(RESULT_UUID, DynamicSimulationStatus.CONVERGED))) .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) )); DynamicSimulationStatus status = dynamicSimulationClient.getStatus(RESULT_UUID); @@ -422,7 +425,8 @@ void testGetStatus() throws Exception { @Test void testGetStatusGivenBadUuid() { // configure mock server response - wireMockServer.stubFor(WireMock.get(WireMock.urlEqualTo(DYNAMIC_SIMULATION_RESULT_BASE_URL + DELIMITER + RESULT_NOT_FOUND_UUID + DELIMITER + "status")) + wireMockServer.stubFor(WireMock.post(WireMock.urlEqualTo(DYNAMIC_SIMULATION_RESULT_BASE_URL + DELIMITER + "statuses")) + .withRequestBody(containing(RESULT_NOT_FOUND_UUID.toString())) .willReturn(WireMock.notFound() )); assertThrows( diff --git a/src/test/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationServiceTest.java b/src/test/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationServiceTest.java index 29b785f00..b51f4259d 100644 --- a/src/test/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/dynamicmargincalculation/DynamicMarginCalculationServiceTest.java @@ -17,6 +17,7 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -130,7 +131,7 @@ void testRunDynamicSimulation() { @Test void testGetStatus() { // setup DynamicMarginCalculationClient mock - given(dynamicMarginCalculationClient.getStatus(RESULT_UUID)).willReturn(DynamicMarginCalculationStatus.SUCCEED); + given(dynamicMarginCalculationClient.getStatuses(List.of(RESULT_UUID))).willReturn(Map.of(RESULT_UUID, DynamicMarginCalculationStatus.SUCCEED)); // call method to be tested DynamicMarginCalculationStatus status = dynamicMarginCalculationService.getStatus(RESULT_UUID); @@ -178,18 +179,18 @@ void testResultCount() { @Test void testAssertDynamicSecurityAnalysisNotRunning() { - when(dynamicMarginCalculationClient.getStatus(RESULT_UUID)).thenReturn(DynamicMarginCalculationStatus.SUCCEED); + when(dynamicMarginCalculationClient.getStatuses(List.of(RESULT_UUID))).thenReturn(Map.of(RESULT_UUID, DynamicMarginCalculationStatus.SUCCEED)); // test not running assertDoesNotThrow(() -> dynamicMarginCalculationService.assertDynamicMarginCalculationNotRunning(RESULT_UUID)); - verify(dynamicMarginCalculationClient, times(1)).getStatus(RESULT_UUID); + verify(dynamicMarginCalculationClient, times(1)).getStatuses(List.of(RESULT_UUID)); } @Test void testAssertDynamicSecurityAnalysisRunning() { // setup for running node - given(dynamicMarginCalculationClient.getStatus(RESULT_UUID_RUNNING)).willReturn(DynamicMarginCalculationStatus.RUNNING); + given(dynamicMarginCalculationClient.getStatuses(List.of(RESULT_UUID_RUNNING))).willReturn(Map.of(RESULT_UUID_RUNNING, DynamicMarginCalculationStatus.RUNNING)); // test running assertStudyException(() -> dynamicMarginCalculationService.assertDynamicMarginCalculationNotRunning(RESULT_UUID_RUNNING), diff --git a/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java b/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java index e84f31ee4..0ede2480a 100644 --- a/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java @@ -17,6 +17,7 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -129,7 +130,7 @@ void testRunDynamicSimulation() { @Test void testGetStatus() { // setup DynamicSecurityAnalysisClient mock - given(dynamicSecurityAnalysisClient.getStatus(RESULT_UUID)).willReturn(DynamicSecurityAnalysisStatus.SUCCEED); + given(dynamicSecurityAnalysisClient.getStatuses(List.of(RESULT_UUID))).willReturn(Map.of(RESULT_UUID, DynamicSecurityAnalysisStatus.SUCCEED)); // call method to be tested DynamicSecurityAnalysisStatus status = dynamicSecurityAnalysisService.getStatus(RESULT_UUID); @@ -177,18 +178,18 @@ void testResultCount() { @Test void testAssertDynamicSecurityAnalysisNotRunning() { - when(dynamicSecurityAnalysisClient.getStatus(RESULT_UUID)).thenReturn(DynamicSecurityAnalysisStatus.SUCCEED); + when(dynamicSecurityAnalysisClient.getStatuses(List.of(RESULT_UUID))).thenReturn(Map.of(RESULT_UUID, DynamicSecurityAnalysisStatus.SUCCEED)); // test not running assertDoesNotThrow(() -> dynamicSecurityAnalysisService.assertDynamicSecurityAnalysisNotRunning(RESULT_UUID)); - verify(dynamicSecurityAnalysisClient, times(1)).getStatus(RESULT_UUID); + verify(dynamicSecurityAnalysisClient, times(1)).getStatuses(List.of(RESULT_UUID)); } @Test void testAssertDynamicSecurityAnalysisRunning() { // setup for running node - given(dynamicSecurityAnalysisClient.getStatus(RESULT_UUID_RUNNING)).willReturn(DynamicSecurityAnalysisStatus.RUNNING); + given(dynamicSecurityAnalysisClient.getStatuses(List.of(RESULT_UUID_RUNNING))).willReturn(Map.of(RESULT_UUID_RUNNING, DynamicSecurityAnalysisStatus.RUNNING)); // test running assertStudyException(() -> dynamicSecurityAnalysisService.assertDynamicSecurityAnalysisNotRunning(RESULT_UUID_RUNNING), diff --git a/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java b/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java index 9107a3527..9aed066e1 100644 --- a/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java @@ -265,7 +265,7 @@ void testGetTimelineResultGivenBadType() throws Exception { @Test void testGetStatus() { // setup DynamicSimulationClient mock - given(dynamicSimulationClient.getStatus(RESULT_UUID)).willReturn(DynamicSimulationStatus.CONVERGED); + given(dynamicSimulationClient.getStatuses(List.of(RESULT_UUID))).willReturn(Map.of(RESULT_UUID, DynamicSimulationStatus.CONVERGED)); // call method to be tested DynamicSimulationStatus status = dynamicSimulationService.getStatus(RESULT_UUID); @@ -295,7 +295,7 @@ void testAssertDynamicSimulationNotRunning() { @Test void testAssertDynamicSimulationRunning() { // setup for running node - given(dynamicSimulationClient.getStatus(RESULT_UUID_RUNNING)).willReturn(DynamicSimulationStatus.RUNNING); + given(dynamicSimulationClient.getStatuses(List.of(RESULT_UUID_RUNNING))).willReturn(Map.of(RESULT_UUID_RUNNING, DynamicSimulationStatus.RUNNING)); given(rootNetworkNodeInfoService.getComputationResultUuid(NODE_UUID_RUNNING, ROOTNETWORK_UUID, ComputationType.DYNAMIC_SIMULATION)).willReturn(RESULT_UUID_RUNNING); // test running diff --git a/src/test/java/org/gridsuite/study/server/utils/wiremock/ComputationServerStubs.java b/src/test/java/org/gridsuite/study/server/utils/wiremock/ComputationServerStubs.java index f3cccbf20..c2cd99092 100644 --- a/src/test/java/org/gridsuite/study/server/utils/wiremock/ComputationServerStubs.java +++ b/src/test/java/org/gridsuite/study/server/utils/wiremock/ComputationServerStubs.java @@ -23,6 +23,7 @@ /** * @author Maissa Souissi + * @author Sylvain Bouzols */ public class ComputationServerStubs { private final WireMockServer wireMock; @@ -63,6 +64,14 @@ public UUID stubGetResultStatus(String resultUuid, String statusJson) { .withBody(statusJson))).getId(); } + public UUID stubGetResultStatuses(String resultUuidsAsJson, String responseBody) { + return wireMock.stubFor(WireMock.post(WireMock.urlPathEqualTo("/v1/results/statuses")) + .withRequestBody(equalToJson(resultUuidsAsJson)) + .willReturn(WireMock.ok() + .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .withBody(responseBody))).getId(); + } + public UUID stubGetResult(String resultUuid, String statusJson) { return wireMock.stubFor(WireMock.get(WireMock.urlPathEqualTo("/v1/results/" + resultUuid)).withQueryParam("mode", WireMock.equalTo("FULL")) .willReturn(WireMock.ok() @@ -74,12 +83,12 @@ public void verifyComputationStop(String resultUuid, Map