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 093d7f7e5..9d2c503d7 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -1331,7 +1331,7 @@ public ResponseEntity unbuildNode(@Parameter(description = "Study uuid") @ @Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid, @RequestHeader(HEADER_USER_ID) String userId) { // unbuildStudyNode only reaches the children of a security node whose loadflow has run - NodeActivityType unbuildType = studyService.isSecurityNodeWithLoadflowDone(nodeUuid, rootNetworkUuid) + NodeActivityType unbuildType = networkModificationTreeService.isSecurityNodeWithLoadFlowDone(nodeUuid, rootNetworkUuid) ? UNBUILD_CHILDREN : UNBUILD; nodeActivityRunnerService.runWith(unbuildType, studyUuid, rootNetworkUuid, List.of(nodeUuid), () -> studyService.unbuildStudyNode(studyUuid, nodeUuid, rootNetworkUuid, userId)); diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java index 1e83be5c0..1333e3223 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java @@ -1072,48 +1072,6 @@ private BuildInfos getBuildInfos(UUID nodeUuid, UUID rootNetworkUuid) { return buildInfos; } - private InvalidateNodeInfos invalidateNode(UUID nodeUuid, UUID rootNetworkUuid) { - NodeEntity nodeEntity = getNodeEntity(nodeUuid); - - InvalidateNodeInfos invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL); - - fillIndexedNodeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos); - - notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), List.of(nodeUuid), rootNetworkUuid); - - return invalidateNodeInfos; - } - - private InvalidateNodeInfos invalidateNodeTree(UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters) { - InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos(); - - // Node status before invalidation - NodeEntity nodeEntity = getNodeEntity(nodeUuid); - boolean isModificationNode = nodeEntity.getType().equals(NodeType.NETWORK_MODIFICATION); - boolean isNodeBuilt = doGetNodeBuildStatus(nodeEntity.getIdNode(), rootNetworkUuid).isBuilt(); - boolean shouldInvalidateIndexedInfos = isNodeBuilt || hasAnyBuiltChildren(nodeEntity, rootNetworkUuid); - - // First node - if (isModificationNode && !invalidateTreeParameters.isOnlyChildren()) { - invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, invalidateTreeParameters); - } - - // Invalidate indexed nodes - if (shouldInvalidateIndexedInfos) { - fillIndexedNodeTreeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos, - isNodeBuilt && (invalidateTreeParameters.isOnlyChildren() || invalidateTreeParameters.isOnlyChildrenBuildStatus())); - } - - // Children - invalidateNodeInfos.add(invalidateChildrenNodes(nodeUuid, rootNetworkUuid)); - - if (!invalidateNodeInfos.getNodeUuids().isEmpty()) { - notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), invalidateNodeInfos.getNodeUuids().stream().toList(), rootNetworkUuid); - } - - return invalidateNodeInfos; - } - /** Children are always invalidated in full, whatever was asked of the node itself. */ private InvalidateNodeInfos invalidateChildrenNodes(UUID nodeUuid, UUID rootNetworkUuid) { InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos(); @@ -1386,30 +1344,21 @@ public ExportNetworkStatus getExportNetworkStatus(UUID exportUuid) { } @Transactional - public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters, boolean skipDeleteVariants) { - AtomicReference startTime = new AtomicReference<>(null); - startTime.set(System.nanoTime()); - - InvalidateNodeInfos invalidateNodeInfos = invalidateNodeTree(nodeUuid, rootNetworkUuid, invalidateTreeParameters); - invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid)); - deleteInvalidationInfos(invalidateNodeInfos, skipDeleteVariants); - - if (!isRootNode(nodeUuid)) { - emitAllComputationStatusChanged(studyUuid, nodeUuid, rootNetworkUuid, invalidateTreeParameters.computationsInvalidationMode()); - } - - if (startTime.get() != null) { - LOGGER.trace("unbuild node '{}' of study '{}' : {} seconds", nodeUuid, studyUuid, - TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get())); - } + public void invalidateNode(UUID studyUuid, UUID nodeUuid) { + rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> + handleInvalidateNode(studyUuid, nodeUuid, rootNetworkEntity.getId())); } @Transactional public void invalidateNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) { + handleInvalidateNode(studyUuid, nodeUuid, rootNetworkUuid); + } + + private void handleInvalidateNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) { AtomicReference startTime = new AtomicReference<>(null); startTime.set(System.nanoTime()); - InvalidateNodeInfos invalidateNodeInfos = invalidateNode(nodeUuid, rootNetworkUuid); + InvalidateNodeInfos invalidateNodeInfos = handleInvalidateNode(nodeUuid, rootNetworkUuid); invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid)); deleteInvalidationInfos(invalidateNodeInfos); @@ -1421,6 +1370,18 @@ public void invalidateNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) } } + private InvalidateNodeInfos handleInvalidateNode(UUID nodeUuid, UUID rootNetworkUuid) { + NodeEntity nodeEntity = getNodeEntity(nodeUuid); + + InvalidateNodeInfos invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL); + + fillIndexedNodeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos); + + notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), List.of(nodeUuid), rootNetworkUuid); + + return invalidateNodeInfos; + } + private CompletableFuture deleteInvalidationInfos(InvalidateNodeInfos invalidateNodeInfos) { return deleteInvalidationInfos(invalidateNodeInfos, false); } @@ -1451,4 +1412,104 @@ private void emitAllComputationStatusChanged(UUID studyUuid, UUID nodeUuid, UUID notificationService.emitStudyChanged(studyUuid, nodeUuid, rootNetworkUuid, NotificationService.UPDATE_TYPE_ALL_COMPUTATION_STATUS); } } + + @Transactional(readOnly = true) + public boolean isSecurityNodeWithLoadFlowDone(@NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid) { + return testSecurityNodeWithLoadFlowDone(nodeUuid, rootNetworkUuid); + } + + private boolean testSecurityNodeWithLoadFlowDone(@NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid) { + return isSecurityNode(nodeUuid) && rootNetworkNodeInfoService.isLoadflowDone(nodeUuid, rootNetworkUuid); + } + + @Transactional + public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters, boolean skipDeleteVariants) { + handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, invalidateTreeParameters, skipDeleteVariants); + } + + @Transactional + public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) { + handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL, false); + } + + @Transactional + public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, InvalidateNodeTreeParameters invalidateTreeParameters) { + rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> + handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkEntity.getId(), invalidateTreeParameters, false)); + } + + @Transactional + public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid) { + rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> + handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkEntity.getId(), InvalidateNodeTreeParameters.ALL, false)); + } + + @Transactional + public void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode computationsInvalidationMode) { + rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> + handleInvalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkEntity.getId(), computationsInvalidationMode) + ); + } + + @Transactional + public void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode computationsInvalidationMode) { + handleInvalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkUuid, computationsInvalidationMode); + } + + private void handleInvalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode computationsInvalidationMode) { + boolean invalidateAll = testSecurityNodeWithLoadFlowDone(nodeUuid, rootNetworkUuid); + InvalidateNodeTreeParameters invalidateNodeTreeParameters = InvalidateNodeTreeParameters.builder() + .invalidationMode(invalidateAll ? InvalidateNodeTreeParameters.InvalidationMode.ALL : InvalidateNodeTreeParameters.InvalidationMode.ONLY_CHILDREN_BUILD_STATUS) + .computationsInvalidationMode(invalidateAll ? InvalidateNodeTreeParameters.ComputationsInvalidationMode.ALL : computationsInvalidationMode) + .build(); + handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, invalidateNodeTreeParameters, false); + } + + private void handleInvalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters, boolean skipDeleteVariants) { + AtomicReference startTime = new AtomicReference<>(null); + startTime.set(System.nanoTime()); + + InvalidateNodeInfos invalidateNodeInfos = handleInvalidateNodeTree(nodeUuid, rootNetworkUuid, invalidateTreeParameters); + invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid)); + deleteInvalidationInfos(invalidateNodeInfos, skipDeleteVariants); + + if (!isRootNode(nodeUuid)) { + emitAllComputationStatusChanged(studyUuid, nodeUuid, rootNetworkUuid, invalidateTreeParameters.computationsInvalidationMode()); + } + + if (startTime.get() != null) { + LOGGER.trace("unbuild node '{}' of study '{}' : {} seconds", nodeUuid, studyUuid, + TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get())); + } + } + + private InvalidateNodeInfos handleInvalidateNodeTree(UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters) { + InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos(); + + // Node status before invalidation + NodeEntity nodeEntity = getNodeEntity(nodeUuid); + boolean isModificationNode = nodeEntity.getType().equals(NodeType.NETWORK_MODIFICATION); + boolean isNodeBuilt = doGetNodeBuildStatus(nodeEntity.getIdNode(), rootNetworkUuid).isBuilt(); + boolean shouldInvalidateIndexedInfos = isNodeBuilt || hasAnyBuiltChildren(nodeEntity, rootNetworkUuid); + + // First node + if (isModificationNode && !invalidateTreeParameters.isOnlyChildren()) { + invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, invalidateTreeParameters); + } + + // Invalidate indexed nodes + if (shouldInvalidateIndexedInfos) { + fillIndexedNodeTreeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos, + isNodeBuilt && (invalidateTreeParameters.isOnlyChildren() || invalidateTreeParameters.isOnlyChildrenBuildStatus())); + } + + // Children + invalidateNodeInfos.add(invalidateChildrenNodes(nodeUuid, rootNetworkUuid)); + + if (!invalidateNodeInfos.getNodeUuids().isEmpty()) { + notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), invalidateNodeInfos.getNodeUuids().stream().toList(), rootNetworkUuid); + } + + return invalidateNodeInfos; + } } diff --git a/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java b/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java index 837eba1e5..5e501133b 100644 --- a/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java +++ b/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java @@ -6,6 +6,7 @@ */ package org.gridsuite.study.server.service; +import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters; import org.gridsuite.study.server.dto.modification.ModificationMoveInfos; import org.gridsuite.study.server.dto.modification.NetworkModificationMetadata; import org.gridsuite.study.server.nodeactivity.NodeActivityRunnerService; @@ -42,7 +43,7 @@ public void createNetworkModification(UUID studyUuid, UUID nodeUuid, String modi } private void handleCreateNetworkModification(UUID studyUuid, UUID nodeUuid, String modificationAttributes, String userId) { - studyService.invalidateNodeTreeWithLF(studyUuid, nodeUuid); + networkModificationTreeService.invalidateNodeTreeWithLF(studyUuid, nodeUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode.ALL); studyService.createNetworkModification(studyUuid, nodeUuid, modificationAttributes, userId); } 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 ef627bae7..0517e1205 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -18,7 +18,6 @@ import org.gridsuite.study.server.StudyConstants; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.ComputationsInvalidationMode; -import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.InvalidationMode; import org.gridsuite.study.server.dto.caseimport.CaseImportAction; import org.gridsuite.study.server.dto.computation.ComputationParameterUUIDs; import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos; @@ -391,7 +390,7 @@ public void createRootNetwork(@NonNull UUID studyUuid, @NonNull RootNetworkInfos */ private void invalidatePreviousRootNetworkNodeTree(StudyEntity studyEntity) { UUID rootNodeUuid = networkModificationTreeService.getStudyRootNodeUuid(studyEntity.getId()); - invalidateNodeTree(studyEntity.getId(), rootNodeUuid, studyEntity.getFirstRootNetwork().getId()); + networkModificationTreeService.invalidateNodeTree(studyEntity.getId(), rootNodeUuid, studyEntity.getFirstRootNetwork().getId()); } private void updateRootNetworkBasicInfos(UUID studyUuid, RootNetworkInfos rootNetworkInfos, boolean updateCase) { @@ -1286,7 +1285,7 @@ public void updateNetworkModification(UUID studyUuid, String updateModificationA List childrenUuids = networkModificationTreeService.getChildrenUuids(nodeUuid); try { networkModificationRestService.updateModification(updateModificationAttributes, modificationUuid, userId); - invalidateNodeTree(studyUuid, nodeUuid); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid); } finally { notificationService.emitModificationsUpdated(studyUuid, nodeUuid, childrenUuids); } @@ -1354,11 +1353,6 @@ public boolean isNodeBuilt(@NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid return networkModificationTreeService.getNodeBuildStatus(nodeUuid, rootNetworkUuid).isBuilt(); } - @Transactional(readOnly = true) - public boolean isSecurityNodeWithLoadflowDone(@NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid) { - return networkModificationTreeService.isSecurityNode(nodeUuid) && rootNetworkNodeInfoService.isLoadflowDone(nodeUuid, rootNetworkUuid); - } - public void handleBuildSuccess(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, NetworkModificationResult networkModificationResult) { LOGGER.info("Build completed for node '{}'", nodeUuid); @@ -1385,8 +1379,8 @@ public void unbuildStudyNode(@NonNull UUID studyUuid, @NonNull UUID nodeUuid, @N // if loadflow was run on a security node, all children node might have been impacted with loadflow modifications // we need to invalidate them all - if (self.isSecurityNodeWithLoadflowDone(nodeUuid, rootNetworkUuid)) { - invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid); + if (networkModificationTreeService.isSecurityNodeWithLoadFlowDone(nodeUuid, rootNetworkUuid)) { + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid); } else { networkModificationTreeService.invalidateNode(studyUuid, nodeUuid, rootNetworkUuid); } @@ -1437,7 +1431,7 @@ public void duplicateStudyNode(UUID sourceStudyUuid, UUID targetStudyUuid, UUID UUID duplicatedNodeUuid = networkModificationTreeService.duplicateStudyNode(nodeToCopyUuid, referenceNodeUuid, insertMode, userId); boolean invalidateBuild = networkModificationTreeService.hasModifications(nodeToCopyUuid, false); if (invalidateBuild) { - invalidateNodeTree(targetStudyUuid, duplicatedNodeUuid, InvalidateNodeTreeParameters.ONLY_CHILDREN_BUILD_STATUS); + networkModificationTreeService.invalidateNodeTree(targetStudyUuid, duplicatedNodeUuid, InvalidateNodeTreeParameters.ONLY_CHILDREN_BUILD_STATUS); } notificationService.emitElementUpdated(targetStudyUuid, userId); } @@ -1458,10 +1452,10 @@ public void moveStudyNode(UUID studyUuid, UUID nodeToMoveUuid, UUID referenceNod //Unbuilding moved node or new children if necessary if (shouldUnbuildChildren) { - invalidateNodeTree(studyUuid, nodeToMoveUuid); - oldChildren.forEach(child -> invalidateNodeTree(studyUuid, child.getIdNode())); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeToMoveUuid); + oldChildren.forEach(child -> networkModificationTreeService.invalidateNodeTree(studyUuid, child.getIdNode())); } else { - invalidateNode(studyUuid, nodeToMoveUuid); + networkModificationTreeService.invalidateNode(studyUuid, nodeToMoveUuid); } notificationService.emitElementUpdated(studyUuid, userId); } @@ -1502,40 +1496,26 @@ public void moveStudySubtree(UUID studyUuid, UUID parentNodeToMoveUuid, UUID ref rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> { UUID rootNetworkUuid = rootNetworkEntity.getId(); if (networkModificationTreeService.getNodeBuildStatus(parentNodeToMoveUuid, rootNetworkUuid).isBuilt()) { - invalidateNodeTree(studyUuid, parentNodeToMoveUuid); + networkModificationTreeService.invalidateNodeTree(studyUuid, parentNodeToMoveUuid); } allChildren.stream() .filter(childUuid -> networkModificationTreeService.getNodeBuildStatus(childUuid, rootNetworkUuid).isBuilt()) - .forEach(childUuid -> invalidateNodeTree(studyUuid, childUuid)); + .forEach(childUuid -> networkModificationTreeService.invalidateNodeTree(studyUuid, childUuid)); }); notificationService.emitSubtreeMoved(studyUuid, parentNodeToMoveUuid, referenceNodeUuid); notificationService.emitElementUpdated(studyUuid, userId); } - private void invalidateNode(UUID studyUuid, UUID nodeUuid) { - rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> - networkModificationTreeService.invalidateNode(studyUuid, nodeUuid, rootNetworkEntity.getId())); - } - - private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid) { - invalidateNodeTree(studyUuid, nodeUuid, InvalidateNodeTreeParameters.ALL); - } - - private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, InvalidateNodeTreeParameters invalidateTreeParameters) { - rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> - invalidateNodeTree(studyUuid, nodeUuid, rootNetworkEntity.getId(), invalidateTreeParameters)); - } - @Transactional public void invalidateNodeTreeWhenMoveModification(UUID studyUuid, UUID nodeUuid) { - invalidateNodeTree(studyUuid, nodeUuid, InvalidateNodeTreeParameters.ALL); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid, InvalidateNodeTreeParameters.ALL); } @Transactional public void sharedModificationsUpdatedNotification(UUID nodeUuid, List networkModificationUuids) { UUID studyUuid = networkModificationTreeService.getStudyUuidForNodeId(nodeUuid); - invalidateNodeTree(studyUuid, nodeUuid); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid); notificationService.emitSharedModificationsUpdated(studyUuid, nodeUuid, networkModificationUuids); } @@ -1544,43 +1524,15 @@ public boolean invalidateNodeTreeWhenMoveModifications(UUID studyUuid, UUID targ boolean isTargetInDifferentNodeTree = !targetNodeUuid.equals(originNodeUuid) && !networkModificationTreeService.isAChild(originNodeUuid, targetNodeUuid); - invalidateNodeTree(studyUuid, originNodeUuid, InvalidateNodeTreeParameters.ALL); + networkModificationTreeService.invalidateNodeTree(studyUuid, originNodeUuid, InvalidateNodeTreeParameters.ALL); if (isTargetInDifferentNodeTree) { - invalidateNodeTreeWithLF(studyUuid, targetNodeUuid, ComputationsInvalidationMode.ALL); + networkModificationTreeService.invalidateNodeTreeWithLF(studyUuid, targetNodeUuid, ComputationsInvalidationMode.ALL); } return isTargetInDifferentNodeTree; } - @Transactional - public void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid) { - invalidateNodeTreeWithLF(studyUuid, nodeUuid, ComputationsInvalidationMode.ALL); - } - - private void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, ComputationsInvalidationMode computationsInvalidationMode) { - rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity -> - invalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkEntity.getId(), computationsInvalidationMode) - ); - } - - private void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, ComputationsInvalidationMode computationsInvalidationMode) { - boolean invalidateAll = self.isSecurityNodeWithLoadflowDone(nodeUuid, rootNetworkUuid); - InvalidateNodeTreeParameters invalidateNodeTreeParameters = InvalidateNodeTreeParameters.builder() - .invalidationMode(invalidateAll ? InvalidationMode.ALL : InvalidationMode.ONLY_CHILDREN_BUILD_STATUS) - .computationsInvalidationMode(invalidateAll ? ComputationsInvalidationMode.ALL : computationsInvalidationMode) - .build(); - invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, invalidateNodeTreeParameters); - } - - private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) { - invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL); - } - - private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters) { - networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, invalidateTreeParameters, false); - } - @Transactional public void deleteNetworkModifications(UUID studyUuid, UUID nodeUuid, List modificationsUuids, String userId) { assertIsStudyExist(studyUuid); @@ -1616,7 +1568,7 @@ public void stashNetworkModifications(UUID studyUuid, UUID nodeUuid, List } UUID groupId = networkModificationTreeService.getModificationGroupUuid(nodeUuid); networkModificationRestService.stashModifications(groupId, modificationsUuids, userId); - invalidateNodeTree(studyUuid, nodeUuid); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid); } finally { notificationService.emitModificationsUpdated(studyUuid, nodeUuid, childrenUuids); } @@ -1633,7 +1585,7 @@ public void updateNetworkModificationsMetadata(UUID studyUuid, UUID nodeUuid, Li UUID groupId = networkModificationTreeService.getModificationGroupUuid(nodeUuid); networkModificationRestService.updateModificationsMetadata(groupId, modificationsUuids, metadata, userId); if (metadata.getActivated() != null || metadata.getName() != null) { - invalidateNodeTree(studyUuid, nodeUuid); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid); } } finally { notificationService.emitModificationsUpdated(studyUuid, nodeUuid, childrenUuids); @@ -1668,7 +1620,7 @@ public void updateNetworkModificationsApplicabilityInRootNetwork(UUID studyUuid, assertCanUpdateSharedModifications(new ArrayList<>(modificationsUuids), userId); networkModificationRestService.updateRootNetworkApplicability(new ArrayList<>(modificationsUuids), rootNetworkService.getRootNetworkTag(rootNetworkUuid), applicable); - invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid); } finally { notificationService.emitModificationsUpdated(studyUuid, nodeUuid, Optional.of(rootNetworkUuid), childrenUuids); } @@ -1684,7 +1636,7 @@ public void restoreNetworkModifications(UUID studyUuid, UUID nodeUuid, List nodeIds, boolean deleteChildr networkModificationTreeService.doDeleteNode(nodeId, deleteChildren, deleteNodeInfos); if (invalidateChildrenBuild) { - childrenNodes.forEach(nodeEntity -> invalidateNodeTree(studyUuid, nodeEntity.getIdNode())); + childrenNodes.forEach(nodeEntity -> networkModificationTreeService.invalidateNodeTree(studyUuid, nodeEntity.getIdNode())); } if (startTime.get() != null && LOGGER.isTraceEnabled()) { @@ -1766,7 +1718,7 @@ public void stashNode(UUID studyUuid, UUID nodeId, boolean stashChildren, String if (unbuildChildren) { rootNetworkUuids.forEach(rootNetworkId -> - invalidateNodeTree(studyUuid, nodeId, rootNetworkId)); + networkModificationTreeService.invalidateNodeTree(studyUuid, nodeId, rootNetworkId)); } else { rootNetworkUuids.forEach(rootNetworkId -> networkModificationTreeService.invalidateNode(studyUuid, nodeId, rootNetworkId) @@ -2039,7 +1991,7 @@ private void duplicateModificationsOrInsertComposites( UUID targetNodeUuid, BiFunction, NetworkModificationsResult> handleModifications, String userId) { - invalidateNodeTreeWithLF(targetStudyUuid, targetNodeUuid, ComputationsInvalidationMode.ALL); + networkModificationTreeService.invalidateNodeTreeWithLF(targetStudyUuid, targetNodeUuid, ComputationsInvalidationMode.ALL); List childrenUuids = networkModificationTreeService.getChildrenUuids(targetNodeUuid); try { checkStudyContainsNode(targetStudyUuid, targetNodeUuid); @@ -2426,7 +2378,7 @@ public void insertVoltageInitModifications(UUID studyUuid, UUID nodeUuid, UUID r try { checkStudyContainsNode(studyUuid, nodeUuid); - invalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode.PRESERVE_VOLTAGE_INIT_RESULTS); + networkModificationTreeService.invalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode.PRESERVE_VOLTAGE_INIT_RESULTS); // voltageInit modification should apply only on the root network where the computation has been made: // - application context will point to the computation root network only diff --git a/src/test/java/org/gridsuite/study/server/StudyServiceTest.java b/src/test/java/org/gridsuite/study/server/StudyServiceTest.java index e395633fa..a5b551fc9 100644 --- a/src/test/java/org/gridsuite/study/server/StudyServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/StudyServiceTest.java @@ -7,7 +7,6 @@ package org.gridsuite.study.server; import org.gridsuite.study.server.dto.ComputationType; -import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters; import org.gridsuite.study.server.dto.QuotaState; import org.gridsuite.study.server.dto.QuotaType; import org.gridsuite.study.server.error.StudyException; @@ -17,7 +16,6 @@ import org.gridsuite.study.server.networkmodificationtree.entities.NodeType; import org.gridsuite.study.server.notification.NotificationService; import org.gridsuite.study.server.repository.networkmodificationtree.NodeRepository; -import org.gridsuite.study.server.repository.rootnetwork.RootNetworkEntity; import org.gridsuite.study.server.service.NetworkModificationTreeService; import org.gridsuite.study.server.service.RootNetworkService; import org.gridsuite.study.server.service.StudyService; @@ -253,23 +251,14 @@ void testGetOperationQuotaStatusReflectsConfiguredFlag() { void testSharedModificationsUpdatedNotification() { UUID studyUuid = UUID.randomUUID(); UUID nodeUuid = UUID.randomUUID(); - UUID rootNetwork1Uuid = UUID.randomUUID(); - UUID rootNetwork2Uuid = UUID.randomUUID(); List networkModificationUuids = List.of(UUID.randomUUID(), UUID.randomUUID()); doReturn(studyUuid).when(networkModificationTreeService).getStudyUuidForNodeId(nodeUuid); - doReturn(List.of( - RootNetworkEntity.builder().id(rootNetwork1Uuid).build(), - RootNetworkEntity.builder().id(rootNetwork2Uuid).build() - )).when(rootNetworkService).getStudyRootNetworks(studyUuid); - doNothing().when(networkModificationTreeService).invalidateNodeTree(any(), any(), any(), any(), anyBoolean()); + doNothing().when(networkModificationTreeService).invalidateNodeTree(any(), any()); studyService.sharedModificationsUpdatedNotification(nodeUuid, networkModificationUuids); - verify(networkModificationTreeService, times(1)) - .invalidateNodeTree(studyUuid, nodeUuid, rootNetwork1Uuid, InvalidateNodeTreeParameters.ALL, false); - verify(networkModificationTreeService, times(1)) - .invalidateNodeTree(studyUuid, nodeUuid, rootNetwork2Uuid, InvalidateNodeTreeParameters.ALL, false); + verify(networkModificationTreeService, times(1)).invalidateNodeTree(studyUuid, nodeUuid); verify(notificationService, times(1)).emitSharedModificationsUpdated(studyUuid, nodeUuid, networkModificationUuids); }