Skip to content
Merged
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
5 changes: 4 additions & 1 deletion src/main/java/org/gridsuite/study/server/StudyConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,10 @@ public enum SldDisplayMode {
}

public enum ModificationsActionType {
MOVE, COPY, INSERT
MOVE,
COPY,
SPLIT_COMPOSITE, // the network modifications contained into the composite modifications are extracted and inserted one by one
INSERT_COMPOSITE // the composite modifications are fully inserted as composite modifications
}

public enum Severity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -656,14 +656,14 @@ public ResponseEntity<Void> moveOrCopyModifications(@PathVariable("studyUuid") U
@RequestParam("action") ModificationsActionType action,
@RequestParam("originStudyUuid") UUID originStudyUuid,
@RequestParam("originNodeUuid") UUID originNodeUuid,
@RequestBody List<UUID> modificationsToCopyUuidList,
@RequestBody List<ModificationsToCopyInfos> modificationsToCopyInfos,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertIsStudyAndNodeExist(studyUuid, nodeUuid);
studyService.assertIsStudyAndNodeExist(originStudyUuid, originNodeUuid);
studyService.assertCanUpdateModifications(studyUuid, nodeUuid);
switch (action) {
case COPY, INSERT:
handleDuplicateOrInsertNetworkModifications(studyUuid, nodeUuid, originStudyUuid, originNodeUuid, modificationsToCopyUuidList, userId, action);
case COPY, SPLIT_COMPOSITE, INSERT_COMPOSITE:
handleDuplicateOrInsertNetworkModifications(studyUuid, nodeUuid, originStudyUuid, originNodeUuid, modificationsToCopyInfos, userId, action);
break;
case MOVE:
// we don't cut - paste modifications from different studies
Expand All @@ -672,17 +672,18 @@ public ResponseEntity<Void> moveOrCopyModifications(@PathVariable("studyUuid") U
}
studyService.assertNoBlockedNodeInStudy(studyUuid, originNodeUuid);
studyService.assertNoBlockedNodeInStudy(studyUuid, nodeUuid);
rebuildNodeService.moveNetworkModifications(studyUuid, nodeUuid, originNodeUuid, modificationsToCopyUuidList, userId);
List<UUID> modificationsToCopyInfosUuids = modificationsToCopyInfos.stream().map(ModificationsToCopyInfos::getUuid).toList();
rebuildNodeService.moveNetworkModifications(studyUuid, nodeUuid, originNodeUuid, modificationsToCopyInfosUuids, userId);
break;
}
return ResponseEntity.ok().build();
}

private void handleDuplicateOrInsertNetworkModifications(UUID targetStudyUuid, UUID targetNodeUuid, UUID originStudyUuid, UUID originNodeUuid, List<UUID> modificationsToCopyUuidList, String userId, ModificationsActionType action) {
private void handleDuplicateOrInsertNetworkModifications(UUID targetStudyUuid, UUID targetNodeUuid, UUID originStudyUuid, UUID originNodeUuid, List<ModificationsToCopyInfos> modificationsToCopy, String userId, ModificationsActionType action) {
studyService.assertNoBlockedNodeInStudy(targetStudyUuid, targetNodeUuid);
studyService.invalidateNodeTreeWithLF(targetStudyUuid, targetNodeUuid);
try {
studyService.duplicateOrInsertNetworkModifications(targetStudyUuid, targetNodeUuid, originStudyUuid, originNodeUuid, modificationsToCopyUuidList, userId, action);
studyService.duplicateOrInsertNetworkModifications(targetStudyUuid, targetNodeUuid, originStudyUuid, originNodeUuid, modificationsToCopy, userId, action);
} finally {
studyService.unblockNodeTree(targetStudyUuid, targetNodeUuid);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* 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.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.UUID;

/**
* @author Mathieu Deharbe <mathieu.deharbe at rte-france.com>
*/
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class ModificationsToCopyInfos {
private UUID uuid;

private String compositeName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.gridsuite.study.server.RemoteServicesProperties;
import org.gridsuite.study.server.StudyConstants;
import org.gridsuite.study.server.dto.BuildInfos;
import org.gridsuite.study.server.dto.ModificationsToCopyInfos;
import org.gridsuite.study.server.dto.NodeReceiver;
import org.gridsuite.study.server.dto.modification.ModificationApplicationContext;
import org.gridsuite.study.server.dto.modification.NetworkModificationMetadata;
Expand Down Expand Up @@ -246,7 +247,7 @@ public void stopBuild(@NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid) {
restTemplate.put(getNetworkModificationServerURI(false) + path, null);
}

public NetworkModificationsResult moveModifications(UUID originGroupUuid, UUID targetGroupUuid, UUID beforeUuid, Pair<List<UUID>, List<ModificationApplicationContext>> modificationContextInfos, boolean buildTargetNode) {
public NetworkModificationsResult moveModifications(UUID originGroupUuid, UUID targetGroupUuid, UUID beforeUuid, Pair<List<ModificationsToCopyInfos>, List<ModificationApplicationContext>> modificationContextInfos, boolean buildTargetNode) {
var path = UriComponentsBuilder.fromPath(GROUP_PATH)
.queryParam(QUERY_PARAM_ACTION, ModificationsActionType.MOVE.name())
.queryParam("originGroupUuid", originGroupUuid)
Expand All @@ -257,7 +258,7 @@ public NetworkModificationsResult moveModifications(UUID originGroupUuid, UUID t

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Pair<List<UUID>, List<ModificationApplicationContext>>> httpEntity = new HttpEntity<>(modificationContextInfos, headers);
HttpEntity<Pair<List<ModificationsToCopyInfos>, List<ModificationApplicationContext>>> httpEntity = new HttpEntity<>(modificationContextInfos, headers);

return restTemplate.exchange(
getNetworkModificationServerURI(false) + path.buildAndExpand(targetGroupUuid).toUriString(),
Expand All @@ -267,12 +268,12 @@ public NetworkModificationsResult moveModifications(UUID originGroupUuid, UUID t
}

public NetworkModificationsResult duplicateOrInsertModifications(UUID groupUuid, ModificationsActionType action,
Pair<List<UUID>, List<ModificationApplicationContext>> modificationContextInfos) {
Pair<List<ModificationsToCopyInfos>, List<ModificationApplicationContext>> modificationContextInfos) {
return handleModifications(groupUuid, null, action, modificationContextInfos);
}

private NetworkModificationsResult handleModifications(UUID groupUuid, UUID originGroupUuid, ModificationsActionType action,
Pair<List<UUID>, List<ModificationApplicationContext>> modificationContextInfos) {
Pair<List<ModificationsToCopyInfos>, List<ModificationApplicationContext>> modificationContextInfos) {
var path = UriComponentsBuilder.fromPath(GROUP_PATH)
.queryParam(QUERY_PARAM_ACTION, action.name());

Expand All @@ -282,7 +283,7 @@ private NetworkModificationsResult handleModifications(UUID groupUuid, UUID orig

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Pair<List<UUID>, List<ModificationApplicationContext>>> httpEntity = new HttpEntity<>(modificationContextInfos, headers);
HttpEntity<Pair<List<ModificationsToCopyInfos>, List<ModificationApplicationContext>>> httpEntity = new HttpEntity<>(modificationContextInfos, headers);

return restTemplate.exchange(
getNetworkModificationServerURI(false) + path.buildAndExpand(groupUuid).toUriString(),
Expand Down Expand Up @@ -312,7 +313,7 @@ public Map<UUID, UUID> duplicateModificationsGroup(UUID sourceGroupUuid, UUID gr
).getBody();
}

public NetworkModificationsResult duplicateModificationsFromGroup(UUID groupUuid, UUID originGroupUuid, Pair<List<UUID>, List<ModificationApplicationContext>> modificationContextInfos) {
public NetworkModificationsResult duplicateModificationsFromGroup(UUID groupUuid, UUID originGroupUuid, Pair<List<ModificationsToCopyInfos>, List<ModificationApplicationContext>> modificationContextInfos) {
return handleModifications(groupUuid, originGroupUuid, StudyConstants.ModificationsActionType.COPY, modificationContextInfos);
}

Expand Down
18 changes: 13 additions & 5 deletions src/main/java/org/gridsuite/study/server/service/StudyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2496,7 +2496,8 @@ public void moveNetworkModifications(@NonNull UUID studyUuid, UUID targetNodeUui
.map(rootNetworkEntity -> rootNetworkNodeInfoService.getNetworkModificationApplicationContext(rootNetworkEntity.getId(), targetNodeUuid, rootNetworkEntity.getNetworkUuid()))
.toList();

NetworkModificationsResult networkModificationsResult = networkModificationService.moveModifications(originGroupUuid, targetGroupUuid, beforeUuid, Pair.of(modificationUuidList, modificationApplicationContexts), isTargetInDifferentNodeTree);
List<ModificationsToCopyInfos> modificationsToCopyInfos = modificationUuidList.stream().map(modifUuid -> ModificationsToCopyInfos.builder().uuid(modifUuid).build()).toList();
NetworkModificationsResult networkModificationsResult = networkModificationService.moveModifications(originGroupUuid, targetGroupUuid, beforeUuid, Pair.of(modificationsToCopyInfos, modificationApplicationContexts), isTargetInDifferentNodeTree);
rootNetworkNodeInfoService.moveModificationsToExclude(originNodeUuid, targetNodeUuid, networkModificationsResult.modificationUuids());

// Target node
Expand Down Expand Up @@ -2525,7 +2526,14 @@ private void emitNetworkModificationImpactsForAllRootNetworks(List<Optional<Netw
}

@Transactional
public void duplicateOrInsertNetworkModifications(UUID targetStudyUuid, UUID targetNodeUuid, UUID originStudyUuid, UUID originNodeUuid, List<UUID> modificationsUuis, String userId, StudyConstants.ModificationsActionType action) {
public void duplicateOrInsertNetworkModifications(
UUID targetStudyUuid,
UUID targetNodeUuid,
UUID originStudyUuid,
UUID originNodeUuid,
List<ModificationsToCopyInfos> modifications,
String userId,
StudyConstants.ModificationsActionType action) {
List<UUID> childrenUuids = networkModificationTreeService.getChildrenUuids(targetNodeUuid);
notificationService.emitStartModificationEquipmentNotification(targetStudyUuid, targetNodeUuid, childrenUuids, NotificationService.MODIFICATIONS_UPDATING_IN_PROGRESS);
try {
Expand All @@ -2538,12 +2546,12 @@ public void duplicateOrInsertNetworkModifications(UUID targetStudyUuid, UUID tar
.map(rootNetworkEntity -> rootNetworkNodeInfoService.getNetworkModificationApplicationContext(rootNetworkEntity.getId(), targetNodeUuid, rootNetworkEntity.getNetworkUuid()))
.toList();

NetworkModificationsResult networkModificationResults = networkModificationService.duplicateOrInsertModifications(groupUuid, action, Pair.of(modificationsUuis, modificationApplicationContexts));
NetworkModificationsResult networkModificationResults = networkModificationService.duplicateOrInsertModifications(groupUuid, action, Pair.of(modifications, modificationApplicationContexts));

if (targetStudyUuid.equals(originStudyUuid)) {
Map<UUID, UUID> originToDuplicateModificationsUuids = new HashMap<>();
for (int i = 0; i < modificationsUuis.size(); i++) {
originToDuplicateModificationsUuids.put(modificationsUuis.get(i), networkModificationResults.modificationUuids().get(i));
for (int i = 0; i < modifications.size(); i++) {
originToDuplicateModificationsUuids.put(modifications.get(i).getUuid(), networkModificationResults.modificationUuids().get(i));
}
rootNetworkNodeInfoService.copyModificationsToExclude(originNodeUuid, targetNodeUuid, originToDuplicateModificationsUuids);
}
Expand Down
Loading