Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,7 @@ public ResponseEntity<Void> cutAndPasteNode(@PathVariable("studyUuid") UUID stud
@Parameter(description = "The position where the node will be pasted relative to the reference node") @RequestParam(name = "insertMode") InsertMode insertMode,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeToCutUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeToCutUuid);
studyService.moveStudyNode(studyUuid, nodeToCutUuid, referenceNodeUuid, insertMode, userId);
return ResponseEntity.ok().build();
}
Expand Down Expand Up @@ -354,6 +355,7 @@ public ResponseEntity<Void> cutAndPasteNodeSubtree(@PathVariable("studyUuid") UU
@Parameter(description = "The reference node to where we want to paste") @RequestParam("referenceNodeUuid") UUID referenceNodeUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertNoBlockedNodeInStudy(studyUuid, subtreeToCutParentNodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, subtreeToCutParentNodeUuid);
studyService.moveStudySubtree(studyUuid, subtreeToCutParentNodeUuid, referenceNodeUuid, userId);
return ResponseEntity.ok().build();
}
Expand Down Expand Up @@ -642,7 +644,7 @@ public ResponseEntity<Void> moveModification(@PathVariable("studyUuid") UUID stu
@PathVariable("modificationUuid") UUID modificationUuid,
@Nullable @Parameter(description = "move before, if no value move to end") @RequestParam(value = "beforeUuid") UUID beforeUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeUuid);
rebuildNodeService.moveNetworkModification(studyUuid, nodeUuid, modificationUuid, beforeUuid, userId);
return ResponseEntity.ok().build();
Expand All @@ -660,7 +662,7 @@ public ResponseEntity<Void> moveOrCopyModifications(@PathVariable("studyUuid") U
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertIsStudyAndNodeExist(studyUuid, nodeUuid);
studyService.assertIsStudyAndNodeExist(originStudyUuid, originNodeUuid);
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
switch (action) {
case COPY, SPLIT_COMPOSITE, INSERT_COMPOSITE:
handleDuplicateOrInsertNetworkModifications(studyUuid, nodeUuid, originStudyUuid, originNodeUuid, modificationsToCopyInfos, userId, action);
Expand Down Expand Up @@ -1334,7 +1336,7 @@ public ResponseEntity<Void> createNetworkModification(@Parameter(description = "
@Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid,
@RequestBody String modificationAttributes,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeUuid);
rebuildNodeService.createNetworkModification(studyUuid, nodeUuid, modificationAttributes, userId);
return ResponseEntity.ok().build();
Expand All @@ -1348,7 +1350,7 @@ public ResponseEntity<Void> updateNetworkModification(@Parameter(description = "
@Parameter(description = "Network modification UUID") @PathVariable("uuid") UUID networkModificationUuid,
@RequestBody String modificationAttributes,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeUuid);
rebuildNodeService.updateNetworkModification(studyUuid, modificationAttributes, nodeUuid, networkModificationUuid, userId);
return ResponseEntity.ok().build();
Expand All @@ -1361,7 +1363,7 @@ public ResponseEntity<Void> deleteNetworkModifications(@Parameter(description =
@Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid,
@Parameter(description = "Network modification UUIDs") @RequestParam(name = "uuids", required = false) List<UUID> networkModificationUuids,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.deleteNetworkModifications(studyUuid, nodeUuid, networkModificationUuids, userId);

return ResponseEntity.ok().build();
Expand All @@ -1375,7 +1377,7 @@ public ResponseEntity<Void> stashNetworkModifications(@Parameter(description = "
@Parameter(description = "Network modification UUIDs") @RequestParam("uuids") List<UUID> networkModificationUuids,
@Parameter(description = "Stashed Modification") @RequestParam(name = "stashed", required = true) Boolean stashed,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeUuid);
if (stashed.booleanValue()) {
rebuildNodeService.stashNetworkModifications(studyUuid, nodeUuid, networkModificationUuids, userId);
Expand All @@ -1393,7 +1395,7 @@ public ResponseEntity<Void> updateNetworkModificationsMetadata(@Parameter(descri
@Parameter(description = "Network modification UUIDs") @RequestParam("uuids") List<UUID> networkModificationUuids,
@RequestBody NetworkModificationMetadata metadata,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeUuid);
rebuildNodeService.updateNetworkModificationsMetadata(studyUuid, nodeUuid, networkModificationUuids, userId, metadata);
return ResponseEntity.ok().build();
Expand All @@ -1408,8 +1410,7 @@ public ResponseEntity<Void> updateNetworkModificationsActivation(@Parameter(desc
@Parameter(description = "Network modification UUIDs") @RequestParam("uuids") Set<UUID> networkModificationUuids,
@Parameter(description = "New activated value") @RequestParam(name = "activated") Boolean activated,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertNoBuildNoComputationForRootNetworkNode(nodeUuid, rootNetworkUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.assertNoBlockedNodeInTree(nodeUuid, rootNetworkUuid);
rebuildNodeService.updateNetworkModificationsActivation(studyUuid, nodeUuid, rootNetworkUuid, networkModificationUuids, userId, activated);
return ResponseEntity.ok().build();
Expand Down Expand Up @@ -1507,12 +1508,14 @@ public ResponseEntity<Void> deleteNode(@Parameter(description = "study uuid") @P
@Operation(summary = "Move to trash the node with given id")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "The node has been successfully moved to trash"),
@ApiResponse(responseCode = "403", description = "The node can't be moved to trash"),
@ApiResponse(responseCode = "404", description = "The study or the node not found")})
public ResponseEntity<Void> stashNode(@Parameter(description = "study uuid") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "id of child to delete (move to trash)") @PathVariable("id") UUID nodeId,
@Parameter(description = "to stash a node with its children") @RequestParam(value = "stashChildren", defaultValue = "false") boolean stashChildren,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeId);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeId);
studyService.stashNode(studyUuid, nodeId, stashChildren, userId);
return ResponseEntity.ok().build();
}
Expand Down Expand Up @@ -1627,13 +1630,13 @@ public ResponseEntity<String> getUniqueNodeName(@Parameter(description = "Study
@Operation(summary = "build a study node")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study node has been built"),
@ApiResponse(responseCode = "404", description = "The study or node doesn't exist"),
@ApiResponse(responseCode = "403", description = "The study node is not a model node")})
@ApiResponse(responseCode = "403", description = "The study node can't be built")})
public ResponseEntity<Void> buildNode(@Parameter(description = "Study uuid") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertNoBlockedNodeInTree(nodeUuid, rootNetworkUuid);
studyService.assertNoBuildNoComputationForRootNetworkNode(nodeUuid, rootNetworkUuid);
studyService.assertCanUpdateNodeInTree(rootNetworkUuid, nodeUuid);
studyService.buildNode(studyUuid, nodeUuid, rootNetworkUuid, userId);
return ResponseEntity.ok().build();
}
Expand Down Expand Up @@ -1865,7 +1868,7 @@ public ResponseEntity<Void> createDynamicSimulationEvent(@Parameter(description
@Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid,
@RequestBody EventInfos event,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.createDynamicSimulationEvent(studyUuid, nodeUuid, userId, event);
return ResponseEntity.ok().build();
}
Expand All @@ -1879,7 +1882,7 @@ public ResponseEntity<Void> updateDynamicSimulationEvent(@Parameter(description
@Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid,
@RequestBody EventInfos event,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.updateDynamicSimulationEvent(studyUuid, nodeUuid, userId, event);
return ResponseEntity.ok().build();
}
Expand All @@ -1893,7 +1896,7 @@ public ResponseEntity<Void> deleteDynamicSimulationEvents(@Parameter(description
@Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid,
@Parameter(description = "Dynamic simulation event UUIDs") @RequestParam("eventUuids") List<UUID> eventUuids,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.deleteDynamicSimulationEvents(studyUuid, nodeUuid, userId, eventUuids);
return ResponseEntity.ok().build();
}
Expand Down Expand Up @@ -2110,7 +2113,7 @@ public ResponseEntity<Void> insertVoltageInitModifications(@PathVariable("studyU
@PathVariable("nodeUuid") UUID nodeUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertIsStudyAndNodeExist(studyUuid, nodeUuid);
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
studyService.assertCanUpdateNodeInStudy(studyUuid, nodeUuid);
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeUuid);
studyService.insertVoltageInitModifications(studyUuid, nodeUuid, rootNetworkUuid, userId);
return ResponseEntity.ok().build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ public interface RootNetworkNodeInfoRepository extends JpaRepository<RootNetwork

List<RootNetworkNodeInfoEntity> findAllByRootNetworkStudyIdAndNodeInfoNodeTypeAndLoadFlowResultUuidNotNull(UUID studyUuid, NetworkModificationNodeType nodeType);

@Query("SELECT count(rnni) > 0 from RootNetworkNodeInfoEntity rnni LEFT JOIN rnni.rootNetwork rn LEFT JOIN rn.study s " +
"where s.id = :studyUuid and (rnni.nodeBuildStatus.globalBuildStatus = :buildStatus or rnni.nodeBuildStatus.localBuildStatus = :buildStatus)")
boolean existsByStudyUuidAndBuildStatus(UUID studyUuid, BuildStatus buildStatus);

List<RootNetworkNodeInfoEntity> getAllByRootNetworkIdAndNodeInfoIdIn(UUID rootNetworkUuid, List<UUID> nodesUuids);

@Query(value = "SELECT count(rnni) > 0 FROM RootNetworkNodeInfoEntity rnni WHERE rnni.rootNetwork.id = :rootNetworkUuid AND rnni.nodeInfo.idNode IN :nodesUuids AND rnni.blockedNode = true ")
boolean existsByNodeUuidsAndBlockedNode(UUID rootNetworkUuid, List<UUID> nodesUuids);

@Query(value = "SELECT count(rnni) > 0 FROM RootNetworkNodeInfoEntity rnni WHERE rnni.rootNetwork.id = :rootNetworkUuid AND rnni.nodeInfo.idNode IN :nodesUuids AND" +
" (rnni.nodeBuildStatus.globalBuildStatus = :buildStatus or rnni.nodeBuildStatus.localBuildStatus = :buildStatus) ")
boolean existsByNodeUuidsAndBuildStatus(UUID rootNetworkUuid, List<UUID> nodesUuids, BuildStatus buildStatus);

/**
* Finds report UUIDs that are still referenced by other RootNetworkNodeInfo entities.
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -485,15 +485,8 @@ public List<RootNetworkNodeInfoEntity> getAllByStudyUuidWithLoadFlowResultsNotNu
return rootNetworkNodeInfoRepository.findAllByRootNetworkStudyIdAndNodeInfoNodeTypeAndLoadFlowResultUuidNotNull(studyUuid, NetworkModificationNodeType.SECURITY);
}

public void assertNoRootNetworkNodeIsBuilding(UUID studyUuid) {
if (rootNetworkNodeInfoRepository.existsByStudyUuidAndBuildStatus(studyUuid, BuildStatus.BUILDING)) {
throw new StudyException(NOT_ALLOWED, "No modification is allowed during a node building.");
}
}

public void assertNetworkNodeIsNotBuilding(UUID rootNetworkUuid, UUID nodeUuid) {
NodeBuildStatusEmbeddable buildStatusEmbeddable = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(nodeUuid, rootNetworkUuid).map(RootNetworkNodeInfoEntity::getNodeBuildStatus).orElseThrow(() -> new StudyException(NOT_FOUND, "Root network not found"));
if (buildStatusEmbeddable.getGlobalBuildStatus().isBuilding() || buildStatusEmbeddable.getLocalBuildStatus().isBuilding()) {
public void assertNoBuildingNode(UUID rootNetworkUuid, List<UUID> nodesUuids) {
if (rootNetworkNodeInfoRepository.existsByNodeUuidsAndBuildStatus(rootNetworkUuid, nodesUuids, BuildStatus.BUILDING)) {
throw new StudyException(NOT_ALLOWED, "No modification is allowed during a node building.");
}
}
Expand Down
32 changes: 18 additions & 14 deletions src/main/java/org/gridsuite/study/server/service/StudyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -1132,21 +1132,32 @@
}

@Transactional
public void assertCanUpdateModifications(UUID studyUuid, UUID nodeUuid) {
public void assertCanUpdateNodeInStudy(UUID studyUuid, UUID nodeUuid) {
assertIsNodeNotReadOnly(nodeUuid);
assertNoBuildNoComputationForNode(studyUuid, nodeUuid);
List<UUID> nodesUuids = networkModificationTreeService.getNodeTreeUuids(nodeUuid);
getStudyRootNetworks(studyUuid).forEach(rootNetwork ->
assertNoBuildNoComputationInTree(rootNetwork.getId(), nodesUuids)
);
}

@Transactional
public void assertCanUpdateNodeInTree(UUID rootNetworkUuid, UUID nodeUuid) {
assertIsNodeNotReadOnly(nodeUuid);

Check failure on line 1145 in src/main/java/org/gridsuite/study/server/service/StudyService.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Call transactional methods via an injected dependency instead of directly via 'this'.

See more on https://sonarcloud.io/project/issues?id=org.gridsuite%3Astudy-server&issues=AZzieR33Eb6nbTO7Pdb6&open=AZzieR33Eb6nbTO7Pdb6&pullRequest=964
List<UUID> nodesUuids = networkModificationTreeService.getNodeTreeUuids(nodeUuid);
assertNoBuildNoComputationInTree(rootNetworkUuid, nodesUuids);
}

private void assertNoBuildNoComputationInTree(UUID rootNetworkUuid, List<UUID> nodesUuids) {
// TODO modify computations endpoints to test multiple uuids

Check warning on line 1151 in src/main/java/org/gridsuite/study/server/service/StudyService.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Complete the task associated to this TODO comment.

See more on https://sonarcloud.io/project/issues?id=org.gridsuite%3Astudy-server&issues=AZzieR33Eb6nbTO7Pdb7&open=AZzieR33Eb6nbTO7Pdb7&pullRequest=964
nodesUuids.forEach(uuid -> rootNetworkNodeInfoService.assertComputationNotRunning(uuid, rootNetworkUuid));
rootNetworkNodeInfoService.assertNoBuildingNode(rootNetworkUuid, nodesUuids);
}

public void assertIsStudyAndNodeExist(UUID studyUuid, UUID nodeUuid) {
assertIsStudyExist(studyUuid);
assertIsNodeExist(studyUuid, nodeUuid);
}

public void assertNoBuildNoComputationForRootNetworkNode(UUID nodeUuid, UUID rootNetworkUuid) {
rootNetworkNodeInfoService.assertComputationNotRunning(nodeUuid, rootNetworkUuid);
rootNetworkNodeInfoService.assertNetworkNodeIsNotBuilding(rootNetworkUuid, nodeUuid);
}

@Transactional(readOnly = true)
public void assertNoBlockedNodeInTree(UUID nodeUuid, UUID rootNetworkUuid) {
rootNetworkNodeInfoService.assertNoBlockedNode(rootNetworkUuid, networkModificationTreeService.getNodeTreeUuids(nodeUuid));
Expand All @@ -1160,13 +1171,6 @@
);
}

public void assertNoBuildNoComputationForNode(UUID studyUuid, UUID nodeUuid) {
getStudyRootNetworks(studyUuid).forEach(rootNetwork ->
rootNetworkNodeInfoService.assertComputationNotRunning(nodeUuid, rootNetwork.getId())
);
rootNetworkNodeInfoService.assertNoRootNetworkNodeIsBuilding(studyUuid);
}

public void assertRootNodeOrBuiltNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
if (!(networkModificationTreeService.getStudyRootNodeUuid(studyUuid).equals(nodeUuid)
|| networkModificationTreeService.getNodeBuildStatus(nodeUuid, rootNetworkUuid).isBuilt())) {
Expand Down
Loading
Loading