Skip to content

Commit 8ad6517

Browse files
SlimaneAmarSlimane AMAR
andauthored
Fix block node build (#809)
Co-authored-by: Slimane AMAR <[email protected]>
1 parent d5cd516 commit 8ad6517

File tree

5 files changed

+154
-105
lines changed

5 files changed

+154
-105
lines changed

src/main/java/org/gridsuite/study/server/controller/StudyController.java

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -637,11 +637,20 @@ public ResponseEntity<Void> moveModification(@PathVariable("studyUuid") UUID stu
637637
@Nullable @Parameter(description = "move before, if no value move to end") @RequestParam(value = "beforeUuid") UUID beforeUuid,
638638
@RequestHeader(HEADER_USER_ID) String userId) {
639639
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
640-
studyService.assertNoBlockedBuildInStudy(studyUuid, nodeUuid);
641-
studyService.moveNetworkModifications(studyUuid, nodeUuid, nodeUuid, List.of(modificationUuid), beforeUuid, userId);
640+
handleMoveNetworkModification(studyUuid, nodeUuid, modificationUuid, beforeUuid, userId);
642641
return ResponseEntity.ok().build();
643642
}
644643

644+
private void handleMoveNetworkModification(UUID studyUuid, UUID nodeUuid, UUID modificationUuid, UUID beforeUuid, String userId) {
645+
studyService.assertNoBlockedBuildInStudy(studyUuid, nodeUuid);
646+
studyService.invalidateNodeTreeWhenMoveModification(studyUuid, nodeUuid);
647+
try {
648+
studyService.moveNetworkModifications(studyUuid, nodeUuid, nodeUuid, List.of(modificationUuid), beforeUuid, false, userId);
649+
} finally {
650+
studyService.invalidateBlockedBuildNodeTree(studyUuid, nodeUuid);
651+
}
652+
}
653+
645654
@PutMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}", produces = MediaType.APPLICATION_JSON_VALUE)
646655
@Operation(summary = "For a list of network modifications passed in body, copy or cut, then append them to target node")
647656
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The modification list has been updated.")})
@@ -653,24 +662,47 @@ public ResponseEntity<Void> moveOrCopyModifications(@PathVariable("studyUuid") U
653662
@RequestHeader(HEADER_USER_ID) String userId) {
654663
studyService.assertIsStudyAndNodeExist(studyUuid, nodeUuid);
655664
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
656-
studyService.assertNoBlockedBuildInStudy(studyUuid, nodeUuid);
657665
if (originNodeUuid != null) {
658666
studyService.assertIsNodeExist(studyUuid, originNodeUuid);
659667
studyService.assertCanUpdateModifications(studyUuid, originNodeUuid);
660668
}
661669
switch (action) {
662670
case COPY, INSERT:
663-
studyService.duplicateOrInsertNetworkModifications(studyUuid, nodeUuid, originNodeUuid, modificationsToCopyUuidList, userId, action);
671+
handleDuplicateOrInsertNetworkModifications(studyUuid, nodeUuid, originNodeUuid, modificationsToCopyUuidList, userId, action);
664672
break;
665673
case MOVE:
666-
studyService.moveNetworkModifications(studyUuid, nodeUuid, originNodeUuid, modificationsToCopyUuidList, null, userId);
674+
handleMoveNetworkModifications(studyUuid, nodeUuid, originNodeUuid, modificationsToCopyUuidList, userId);
667675
break;
668676
default:
669677
throw new StudyException(Type.UNKNOWN_ACTION_TYPE);
670678
}
671679
return ResponseEntity.ok().build();
672680
}
673681

682+
private void handleDuplicateOrInsertNetworkModifications(UUID studyUuid, UUID targetNodeUuid, UUID originNodeUuid, List<UUID> modificationsToCopyUuidList, String userId, ModificationsActionType action) {
683+
studyService.assertNoBlockedBuildInStudy(studyUuid, targetNodeUuid);
684+
studyService.invalidateNodeTreeWithLF(studyUuid, targetNodeUuid);
685+
try {
686+
studyService.duplicateOrInsertNetworkModifications(studyUuid, targetNodeUuid, originNodeUuid, modificationsToCopyUuidList, userId, action);
687+
} finally {
688+
studyService.invalidateBlockedBuildNodeTree(studyUuid, targetNodeUuid);
689+
}
690+
}
691+
692+
private void handleMoveNetworkModifications(UUID studyUuid, UUID targetNodeUuid, UUID originNodeUuid, List<UUID> modificationsToCopyUuidList, String userId) {
693+
studyService.assertNoBlockedBuildInStudy(studyUuid, originNodeUuid);
694+
studyService.assertNoBlockedBuildInStudy(studyUuid, targetNodeUuid);
695+
boolean isTargetInDifferentNodeTree = studyService.invalidateNodeTreeWhenMoveModifications(studyUuid, targetNodeUuid, originNodeUuid);
696+
try {
697+
studyService.moveNetworkModifications(studyUuid, targetNodeUuid, originNodeUuid, modificationsToCopyUuidList, null, isTargetInDifferentNodeTree, userId);
698+
} finally {
699+
studyService.invalidateBlockedBuildNodeTree(studyUuid, originNodeUuid);
700+
if (isTargetInDifferentNodeTree) {
701+
studyService.invalidateBlockedBuildNodeTree(studyUuid, targetNodeUuid);
702+
}
703+
}
704+
}
705+
674706
@PutMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/run")
675707
@Operation(summary = "run loadflow on study")
676708
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow has started")})
@@ -1302,10 +1334,19 @@ public ResponseEntity<Void> createNetworkModification(@Parameter(description = "
13021334
@RequestHeader(HEADER_USER_ID) String userId) {
13031335
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
13041336
studyService.assertNoBlockedBuildInStudy(studyUuid, nodeUuid);
1305-
studyService.createNetworkModification(studyUuid, modificationAttributes, nodeUuid, userId);
1337+
handleCreateNetworkModification(studyUuid, nodeUuid, modificationAttributes, userId);
13061338
return ResponseEntity.ok().build();
13071339
}
13081340

1341+
private void handleCreateNetworkModification(UUID studyUuid, UUID nodeUuid, String modificationAttributes, String userId) {
1342+
studyService.invalidateNodeTreeWithLF(studyUuid, nodeUuid);
1343+
try {
1344+
studyService.createNetworkModification(studyUuid, nodeUuid, modificationAttributes, userId);
1345+
} finally {
1346+
studyService.invalidateBlockedBuildNodeTree(studyUuid, nodeUuid);
1347+
}
1348+
}
1349+
13091350
@PutMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications/{uuid}")
13101351
@Operation(summary = "Update a modification in the study network")
13111352
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The network modification was updated"), @ApiResponse(responseCode = "404", description = "The study/node is not found")})

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,9 @@ public void assertNoBlockedBuildInNodeTree(UUID nodeUuid, UUID rootNetworkUuid)
10081008

10091009
@Transactional(readOnly = true)
10101010
public void assertNoBlockedBuildInStudy(UUID studyUuid, UUID nodeUuid) {
1011+
if (nodeUuid == null) {
1012+
throw new StudyException(MISSING_PARAMETER, "The parameter 'nodeUuid' must be defined !");
1013+
}
10111014
List<UUID> nodesUuids = networkModificationTreeService.getNodeTreeUuids(nodeUuid);
10121015
getStudyRootNetworks(studyUuid).stream().forEach(rootNetwork ->
10131016
rootNetworkNodeInfoService.assertNoBlockedBuild(rootNetwork.getId(), nodesUuids)
@@ -1645,12 +1648,10 @@ private void removeSecurityAnalysisParameters(@Nullable UUID securityAnalysisPar
16451648
}
16461649

16471650
@Transactional
1648-
public void createNetworkModification(UUID studyUuid, String createModificationAttributes, UUID nodeUuid, String userId) {
1651+
public void createNetworkModification(UUID studyUuid, UUID nodeUuid, String createModificationAttributes, String userId) {
16491652
List<UUID> childrenUuids = networkModificationTreeService.getChildrenUuids(nodeUuid);
16501653
notificationService.emitStartModificationEquipmentNotification(studyUuid, nodeUuid, childrenUuids, NotificationService.MODIFICATIONS_CREATING_IN_PROGRESS);
16511654
try {
1652-
invalidateNodeTreeWithLF(studyUuid, nodeUuid, ComputationsInvalidationMode.ALL);
1653-
16541655
UUID groupUuid = networkModificationTreeService.getModificationGroupUuid(nodeUuid);
16551656
List<RootNetworkEntity> studyRootNetworkEntities = getStudyRootNetworks(studyUuid);
16561657

@@ -1671,7 +1672,6 @@ public void createNetworkModification(UUID studyUuid, String createModificationA
16711672
}
16721673
}
16731674
} finally {
1674-
invalidateBlockedBuildNodeTree(studyUuid, nodeUuid);
16751675
notificationService.emitEndModificationEquipmentNotification(studyUuid, nodeUuid, childrenUuids);
16761676
}
16771677
notificationService.emitElementUpdated(studyUuid, userId);
@@ -1874,7 +1874,6 @@ private void invalidateNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid)
18741874
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
18751875
}
18761876
}
1877-
// Invalidate only one node
18781877

18791878
private void invalidateNode(UUID studyUuid, UUID nodeUuid) {
18801879
getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity ->
@@ -1890,6 +1889,30 @@ private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, InvalidateNodeTre
18901889
invalidateNodeTree(studyUuid, nodeUuid, rootNetworkEntity.getId(), invalidateTreeParameters));
18911890
}
18921891

1892+
@Transactional
1893+
public void invalidateNodeTreeWhenMoveModification(UUID studyUuid, UUID nodeUuid) {
1894+
invalidateNodeTree(studyUuid, nodeUuid, InvalidateNodeTreeParameters.ALL);
1895+
}
1896+
1897+
@Transactional
1898+
public boolean invalidateNodeTreeWhenMoveModifications(UUID studyUuid, UUID targetNodeUuid, UUID originNodeUuid) {
1899+
boolean isTargetInDifferentNodeTree = !targetNodeUuid.equals(originNodeUuid)
1900+
&& !networkModificationTreeService.isAChild(originNodeUuid, targetNodeUuid);
1901+
1902+
invalidateNodeTree(studyUuid, originNodeUuid);
1903+
1904+
if (isTargetInDifferentNodeTree) {
1905+
invalidateNodeTreeWithLF(studyUuid, targetNodeUuid, ComputationsInvalidationMode.ALL);
1906+
}
1907+
1908+
return isTargetInDifferentNodeTree;
1909+
}
1910+
1911+
@Transactional
1912+
public void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid) {
1913+
invalidateNodeTreeWithLF(studyUuid, nodeUuid, ComputationsInvalidationMode.ALL);
1914+
}
1915+
18931916
private void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, ComputationsInvalidationMode computationsInvalidationMode) {
18941917
getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity ->
18951918
invalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkEntity.getId(), computationsInvalidationMode)
@@ -1927,7 +1950,8 @@ private void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkU
19271950
}
19281951
}
19291952

1930-
private void invalidateBlockedBuildNodeTree(UUID studyUuid, UUID nodeUuid) {
1953+
@Transactional
1954+
public void invalidateBlockedBuildNodeTree(UUID studyUuid, UUID nodeUuid) {
19311955
getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity ->
19321956
networkModificationTreeService.invalidateBlockedBuildNodeTree(rootNetworkEntity.getId(), nodeUuid)
19331957
);
@@ -2190,17 +2214,12 @@ public RootNetworkIndexationStatus getRootNetworkIndexationStatus(UUID studyUuid
21902214
}
21912215

21922216
@Transactional
2193-
public void moveNetworkModifications(UUID studyUuid, UUID targetNodeUuid, UUID originNodeUuid, List<UUID> modificationUuidList, UUID beforeUuid, String userId) {
2217+
public void moveNetworkModifications(UUID studyUuid, UUID targetNodeUuid, UUID originNodeUuid, List<UUID> modificationUuidList, UUID beforeUuid, boolean isTargetInDifferentNodeTree, String userId) {
21942218
if (originNodeUuid == null) {
21952219
throw new StudyException(MISSING_PARAMETER, "The parameter 'originNodeUuid' must be defined when moving modifications");
21962220
}
21972221

21982222
boolean isTargetDifferentNode = !targetNodeUuid.equals(originNodeUuid);
2199-
// Target node must not be built (incremental mode) when:
2200-
// - the move is a cut & paste or a position change inside the same node
2201-
// - the move is a cut & paste between 2 nodes and the target node belongs to the source node subtree
2202-
boolean isTargetChildNode = networkModificationTreeService.isAChild(originNodeUuid, targetNodeUuid);
2203-
boolean isTargetInDifferentNodeTree = isTargetDifferentNode && !isTargetChildNode;
22042223

22052224
List<UUID> childrenUuids = networkModificationTreeService.getChildrenUuids(targetNodeUuid);
22062225
List<UUID> originNodeChildrenUuids = new ArrayList<>();
@@ -2212,11 +2231,6 @@ public void moveNetworkModifications(UUID studyUuid, UUID targetNodeUuid, UUID o
22122231
try {
22132232
checkStudyContainsNode(studyUuid, targetNodeUuid);
22142233

2215-
invalidateNodeTree(studyUuid, originNodeUuid);
2216-
if (isTargetInDifferentNodeTree) {
2217-
invalidateNodeTreeWithLF(studyUuid, targetNodeUuid, ComputationsInvalidationMode.ALL);
2218-
}
2219-
22202234
StudyEntity studyEntity = studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND));
22212235
List<RootNetworkEntity> studyRootNetworkEntities = studyEntity.getRootNetworks();
22222236
UUID originGroupUuid = networkModificationTreeService.getModificationGroupUuid(originNodeUuid);
@@ -2234,10 +2248,6 @@ public void moveNetworkModifications(UUID studyUuid, UUID targetNodeUuid, UUID o
22342248
emitNetworkModificationImpactsForAllRootNetworks(networkModificationsResult.modificationResults(), studyEntity, targetNodeUuid);
22352249
}
22362250
} finally {
2237-
invalidateBlockedBuildNodeTree(studyUuid, originNodeUuid);
2238-
if (isTargetInDifferentNodeTree) {
2239-
invalidateBlockedBuildNodeTree(studyUuid, targetNodeUuid);
2240-
}
22412251
notificationService.emitEndModificationEquipmentNotification(studyUuid, targetNodeUuid, childrenUuids);
22422252
if (isTargetDifferentNode) {
22432253
notificationService.emitEndModificationEquipmentNotification(studyUuid, originNodeUuid, originNodeChildrenUuids);
@@ -2265,8 +2275,6 @@ public void duplicateOrInsertNetworkModifications(UUID studyUuid, UUID targetNod
22652275
try {
22662276
checkStudyContainsNode(studyUuid, targetNodeUuid);
22672277

2268-
invalidateNodeTreeWithLF(studyUuid, targetNodeUuid, ComputationsInvalidationMode.ALL);
2269-
22702278
List<RootNetworkEntity> studyRootNetworkEntities = getStudyRootNetworks(studyUuid);
22712279
UUID groupUuid = networkModificationTreeService.getModificationGroupUuid(targetNodeUuid);
22722280

@@ -2295,7 +2303,6 @@ public void duplicateOrInsertNetworkModifications(UUID studyUuid, UUID targetNod
22952303
}
22962304

22972305
} finally {
2298-
invalidateBlockedBuildNodeTree(studyUuid, targetNodeUuid);
22992306
notificationService.emitEndModificationEquipmentNotification(studyUuid, targetNodeUuid, childrenUuids);
23002307
}
23012308
notificationService.emitElementUpdated(studyUuid, userId);

0 commit comments

Comments
 (0)