From 3098a81cbafd46631b0d5029987f3b2a6b4f4227 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Fri, 22 May 2026 17:35:45 +0200 Subject: [PATCH 1/3] Simplification try Signed-off-by: Etienne Homer --- .../service/RootNetworkNodeInfoService.java | 21 ++++------ .../server/service/RootNetworkService.java | 39 ++++++++++--------- .../study/server/service/StudyService.java | 4 +- .../server/SupervisionControllerTest.java | 2 +- 4 files changed, 31 insertions(+), 35 deletions(-) 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 c54fd5abc..50809d5cc 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java @@ -640,19 +640,14 @@ public void deleteRootNetworkNodeRemoteInfos(List rootNetwo CompletableFuture.allOf(getRemoteDeletions(getRemoteDeletionInfos(rootNetworkNodeInfos)).toArray(CompletableFuture[]::new)); } - // New method specifically for the supervision/invalidate path - @Transactional(readOnly = true) - public void deleteRootNetworkNodeRemoteInfosByUuids(List rootNetworkUuids) { - if (rootNetworkUuids == null || rootNetworkUuids.isEmpty()) { - return; - } - List rootNetworkNodeInfos = rootNetworkUuids.stream() - .flatMap(rnUuid -> rootNetworkNodeInfoRepository.findAllByRootNetworkId(rnUuid).stream()) - .map(RootNetworkNodeInfoEntity::toDto) - .toList(); - // Do not wait completion and do not throw exception - CompletableFuture.allOf(getRemoteDeletions(getRemoteDeletionInfos(rootNetworkNodeInfos)).toArray(CompletableFuture[]::new)); - } +// // New method specifically for the supervision/invalidate path +// public void deleteRootNetworkNodeRemoteInfosByUuids(List rootNetworkUuids, List rootNetworkNodeInfos) { +// if (rootNetworkUuids == null || rootNetworkUuids.isEmpty()) { +// return; +// } +// // Do not wait completion and do not throw exception +// CompletableFuture.allOf(getRemoteDeletions(getRemoteDeletionInfos(rootNetworkNodeInfos)).toArray(CompletableFuture[]::new)); +// } @Transactional public ModificationApplicationContext getNetworkModificationApplicationContext(UUID rootNetworkUuid, UUID nodeUuid, UUID networkUuid) { diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java index 0c73da75a..3d31dae1c 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java @@ -239,36 +239,39 @@ public void deleteRootNetworks(StudyEntity studyEntity, Stream rootNetwork } public void deleteRootNetworks(StudyEntity studyEntity, List rootNetworksInfos) { - deleteRootNetworkRemoteInfos(rootNetworksInfos); + invalidateRootNetworkRemoteInfos(rootNetworksInfos, false, true); studyEntity.deleteRootNetworks(rootNetworksInfos.stream().map(RootNetworkInfos::getId).collect(Collectors.toSet())); } - public void deleteRootNetworkRemoteInfos(List rootNetworkInfos) { - CompletableFuture.allOf( - // delete remote data ids set in root network - studyServerExecutionService.runAsync(() -> reportService.deleteReports(rootNetworkInfos.stream().map(RootNetworkInfos::getReportUuid).toList())), - studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(equipmentInfosService::deleteEquipmentIndexes)), - studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(networkStoreService::deleteNetwork)), - studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getCaseInfos().getCaseUuid()).filter(Objects::nonNull).forEach(caseService::deleteCase)) - ); - // delete remote data ids set in root network node infos - rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfos(rootNetworkInfos.stream().map(RootNetworkInfos::getRootNetworkNodeInfos).filter(Objects::nonNull).flatMap(Collection::stream).toList()); - } - - public void invalidateRootNetworkRemoteInfos(List rootNetworkInfos, boolean blocking) { +// public void deleteRootNetworkRemoteInfos(List rootNetworkInfos) { +// CompletableFuture.allOf( +// // delete remote data ids set in root network +// studyServerExecutionService.runAsync(() -> reportService.deleteReports(rootNetworkInfos.stream().map(RootNetworkInfos::getReportUuid).toList())), +// studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(equipmentInfosService::deleteEquipmentIndexes)), +// studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(networkStoreService::deleteNetwork)), +// studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getCaseInfos().getCaseUuid()).filter(Objects::nonNull).forEach(caseService::deleteCase)) +// ); +// +// // delete remote data ids set in root network node infos +// rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfos(rootNetworkInfos.stream().map(RootNetworkInfos::getRootNetworkNodeInfos).filter(Objects::nonNull).flatMap(Collection::stream).toList()); +// } + + public void invalidateRootNetworkRemoteInfos(List rootNetworkInfos, boolean blocking, boolean deleteCase) { ArrayList> futures = new ArrayList<>(); // delete remote data ids set in root network futures.add(studyServerExecutionService.runAsync(() -> reportService.deleteReports(rootNetworkInfos.stream().map(RootNetworkInfos::getReportUuid).toList()))); futures.add(studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(equipmentInfosService::deleteEquipmentIndexes))); futures.add(studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(networkStoreService::deleteNetwork))); + if (deleteCase) { + studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getCaseInfos().getCaseUuid()).filter(Objects::nonNull).forEach(caseService::deleteCase)); + } if (blocking) { CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).join(); } // delete remote data ids set in root network node infos - rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfosByUuids( - rootNetworkInfos.stream().map(RootNetworkInfos::getId).toList() - ); +// rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfosByUuids(rootNetworkInfos.stream().map(RootNetworkInfos::getId).toList()); + rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfos(rootNetworkInfos.stream().map(RootNetworkInfos::getRootNetworkNodeInfos).filter(Objects::nonNull).flatMap(Collection::stream).toList()); } public Optional getRootNetworkRequest(UUID rootNetworkUuid) { @@ -354,12 +357,10 @@ public boolean isRootNetworkTagExistsInStudy(UUID studyUuid, String rootNetworkT rootNetworkRequestRepository.findByTagAndStudyUuid(rootNetworkTag, studyUuid).isPresent(); } - @Transactional(readOnly = true) public List getStudyRootNetwork(StudyEntity study) { return study.getRootNetworks(); } - @Transactional(readOnly = true) public List getStudyRootNetworkIds(UUID studyUuid) { return rootNetworkRepository.findAllByStudyId(studyUuid).stream() .map(RootNetworkEntity::getId) 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 9140fcc60..36a04bad0 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -611,7 +611,7 @@ public void deleteStudyIfNotCreationInProgress(UUID studyUuid) { startTime.set(System.nanoTime()); // delete all distant resources linked to rootNetworks - rootNetworkService.deleteRootNetworkRemoteInfos(deleteStudyInfos.getRootNetworkInfosList()); + rootNetworkService.invalidateRootNetworkRemoteInfos(deleteStudyInfos.getRootNetworkInfosList(), false, true); // delete all distant resources linked to nodes studyServerExecutionService.runAsync(() -> deleteStudyInfos.getModificationGroupUuids().stream().filter(Objects::nonNull).forEach(networkModificationService::deleteModifications)); @@ -3946,7 +3946,7 @@ public void invalidateStudyRootNetwork(UUID studyUuid, UUID rootNetworkUuid, Str // First we unbuild all nodes doUnbuildNodeTree(studyUuid, rootNodeUuid, true, true, userId); // Then we erase data linked to root node on all root networks - rootNetworkService.invalidateRootNetworkRemoteInfos(List.of(rootNetworkService.getRootNetworkInfos(rootNetworkUuid)), true); + rootNetworkService.invalidateRootNetworkRemoteInfos(List.of(rootNetworkService.getRootNetworkInfos(rootNetworkUuid)), true, false); rootNetworkService.updateRootNetworkIndexationStatus(studyUuid, rootNetworkUuid, RootNetworkIndexationStatus.NOT_INDEXED); } finally { networkModificationTreeService.unblockNodeTree(rootNetworkUuid, rootNodeUuid); diff --git a/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java b/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java index a3ef753c3..0766cc7b5 100644 --- a/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java +++ b/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java @@ -322,7 +322,7 @@ void testInvalidateStudy() throws Exception { // Remote root-network data was deleted Mockito.verify(rootNetworkService, Mockito.times(1)) - .invalidateRootNetworkRemoteInfos(any(), eq(true)); + .invalidateRootNetworkRemoteInfos(any(), eq(true), eq(false)); Mockito.verify(networkStoreService, Mockito.times(1)).deleteNetwork(NETWORK_UUID); // Indexation flipped to NOT_INDEXED so the auto-detect path will reimport on reopen From ea62461a5491889b748f3508f49e0152a3f9db03 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Fri, 22 May 2026 18:03:16 +0200 Subject: [PATCH 2/3] add entity graph Signed-off-by: Etienne Homer --- .../server/repository/rootnetwork/RootNetworkRepository.java | 3 +++ .../org/gridsuite/study/server/service/RootNetworkService.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java b/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java index 876701ea8..bf5cbb0de 100644 --- a/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java +++ b/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java @@ -28,6 +28,9 @@ public interface RootNetworkRepository extends JpaRepository findWithRootNetworkNodeInfosById(UUID rootNetworkUuid); + @EntityGraph(attributePaths = {"rootNetworkNodeInfos.modificationReports", "rootNetworkNodeInfos.computationReports"}, type = EntityGraph.EntityGraphType.LOAD) + Optional findWithRootNetworkNodeInfosAndReportsById(UUID rootNetworkUuid); + boolean existsByIdAndStudyId(UUID rootNetworkUuid, UUID studyUuid); int countAllByStudyId(UUID studyUuid); diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java index 3d31dae1c..5230e236f 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java @@ -369,7 +369,7 @@ public List getStudyRootNetworkIds(UUID studyUuid) { @Transactional(readOnly = true) public RootNetworkInfos getRootNetworkInfos(UUID rootNetworkUuid) { - return getRootNetwork(rootNetworkUuid) + return rootNetworkRepository.findWithRootNetworkNodeInfosAndReportsById(rootNetworkUuid) .orElseThrow(() -> new StudyException(NOT_FOUND, "Root network not found")) .toDto(); } From 1f45449e252d5e19b4c984d9d7c50ec22c81b7b5 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Fri, 22 May 2026 18:04:44 +0200 Subject: [PATCH 3/3] clean Signed-off-by: Etienne Homer --- .../server/service/RootNetworkNodeInfoService.java | 9 --------- .../study/server/service/RootNetworkService.java | 14 -------------- 2 files changed, 23 deletions(-) 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 50809d5cc..002b34baf 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java @@ -640,15 +640,6 @@ public void deleteRootNetworkNodeRemoteInfos(List rootNetwo CompletableFuture.allOf(getRemoteDeletions(getRemoteDeletionInfos(rootNetworkNodeInfos)).toArray(CompletableFuture[]::new)); } -// // New method specifically for the supervision/invalidate path -// public void deleteRootNetworkNodeRemoteInfosByUuids(List rootNetworkUuids, List rootNetworkNodeInfos) { -// if (rootNetworkUuids == null || rootNetworkUuids.isEmpty()) { -// return; -// } -// // Do not wait completion and do not throw exception -// CompletableFuture.allOf(getRemoteDeletions(getRemoteDeletionInfos(rootNetworkNodeInfos)).toArray(CompletableFuture[]::new)); -// } - @Transactional public ModificationApplicationContext getNetworkModificationApplicationContext(UUID rootNetworkUuid, UUID nodeUuid, UUID networkUuid) { RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(nodeUuid, rootNetworkUuid).orElseThrow(() -> new StudyException(NOT_FOUND, "Root network not found")); diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java index 5230e236f..b6771b787 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java @@ -244,19 +244,6 @@ public void deleteRootNetworks(StudyEntity studyEntity, List r studyEntity.deleteRootNetworks(rootNetworksInfos.stream().map(RootNetworkInfos::getId).collect(Collectors.toSet())); } -// public void deleteRootNetworkRemoteInfos(List rootNetworkInfos) { -// CompletableFuture.allOf( -// // delete remote data ids set in root network -// studyServerExecutionService.runAsync(() -> reportService.deleteReports(rootNetworkInfos.stream().map(RootNetworkInfos::getReportUuid).toList())), -// studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(equipmentInfosService::deleteEquipmentIndexes)), -// studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(networkStoreService::deleteNetwork)), -// studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getCaseInfos().getCaseUuid()).filter(Objects::nonNull).forEach(caseService::deleteCase)) -// ); -// -// // delete remote data ids set in root network node infos -// rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfos(rootNetworkInfos.stream().map(RootNetworkInfos::getRootNetworkNodeInfos).filter(Objects::nonNull).flatMap(Collection::stream).toList()); -// } - public void invalidateRootNetworkRemoteInfos(List rootNetworkInfos, boolean blocking, boolean deleteCase) { ArrayList> futures = new ArrayList<>(); // delete remote data ids set in root network @@ -270,7 +257,6 @@ public void invalidateRootNetworkRemoteInfos(List rootNetworkI CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).join(); } // delete remote data ids set in root network node infos -// rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfosByUuids(rootNetworkInfos.stream().map(RootNetworkInfos::getId).toList()); rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfos(rootNetworkInfos.stream().map(RootNetworkInfos::getRootNetworkNodeInfos).filter(Objects::nonNull).flatMap(Collection::stream).toList()); }