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
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
<sonar.organization>gridsuite</sonar.organization>
<sonar.projectKey>org.gridsuite:network-modification-server</sonar.projectKey>
<!-- TODO network-modification.version remove when included in gridsuite-dependencies -->
<network-modification.version>0.66.0</network-modification.version>
<network-modification.version>0.67.0</network-modification.version>
<!-- TODO network-store.version remove when included in powsybl-ws-dependencies -->
<network-store-client.version>1.38.0</network-store-client.version>
<!-- FIXME to remove when powsybl-ws-dependencies upgrades to springboot 3.5.9 -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.gridsuite.modification.dto.ModificationInfos;
import org.gridsuite.modification.dto.ModificationsToCopyInfos;
import org.gridsuite.modification.server.dto.*;
import org.gridsuite.modification.server.dto.catalog.LineTypeInfos;
import org.gridsuite.modification.server.service.LineTypesCatalogService;
Expand All @@ -37,7 +38,10 @@
public class NetworkModificationController {

private enum GroupModificationAction {
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
}

private final NetworkModificationService networkModificationService;
Expand Down Expand Up @@ -89,24 +93,32 @@ public ResponseEntity<Map<UUID, UUID>> duplicateGroup(@RequestParam("groupUuid")
@PutMapping(value = "/groups/{groupUuid}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "For a list of network modifications passed in body, Move them before another one or at the end of the list, or Duplicate them at the end of the list, or Insert them (composite) at the end of the list")
@ApiResponse(responseCode = "200", description = "The modification list of the group has been updated.")
public CompletableFuture<ResponseEntity<NetworkModificationsResult>> handleNetworkModifications(@Parameter(description = "updated group UUID, where modifications are pasted") @PathVariable("groupUuid") UUID targetGroupUuid,
@Parameter(description = "kind of modification", required = true) @RequestParam(value = "action") GroupModificationAction action,
@Parameter(description = "the modification Uuid to move before (MOVE option, empty means moving at the end)") @RequestParam(value = "before", required = false) UUID beforeModificationUuid,
@Parameter(description = "origin group UUID, where modifications are copied or cut") @RequestParam(value = "originGroupUuid", required = false) UUID originGroupUuid,
@Parameter(description = "modifications can be applied (default is true)") @RequestParam(value = "build", required = false, defaultValue = "true") Boolean canApply,
@RequestBody Pair<List<UUID>, List<ModificationApplicationContext>> modificationContextInfos) {
public CompletableFuture<ResponseEntity<NetworkModificationsResult>> handleNetworkModifications(
@Parameter(description = "updated group UUID, where modifications are pasted") @PathVariable("groupUuid") UUID targetGroupUuid,
@Parameter(description = "kind of modification", required = true) @RequestParam(value = "action") GroupModificationAction action,
@Parameter(description = "the modification Uuid to move before (MOVE option, empty means moving at the end)") @RequestParam(value = "before", required = false) UUID beforeModificationUuid,
@Parameter(description = "origin group UUID, where modifications are copied or cut") @RequestParam(value = "originGroupUuid", required = false) UUID originGroupUuid,
@Parameter(description = "modifications can be applied (default is true)") @RequestParam(value = "build", required = false, defaultValue = "true") Boolean canApply,
@RequestBody Pair<List<ModificationsToCopyInfos>, List<ModificationApplicationContext>> modificationContextInfos) {
List<UUID> modificationsUuids = modificationContextInfos.getFirst().stream().map(ModificationsToCopyInfos::getUuid).toList();
return switch (action) {
case COPY ->
networkModificationService.duplicateModifications(targetGroupUuid, originGroupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body);
case INSERT ->
networkModificationService.insertCompositeModifications(targetGroupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body);
networkModificationService.duplicateModifications(targetGroupUuid, originGroupUuid, modificationsUuids, modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body);
case SPLIT_COMPOSITE ->
networkModificationService.splitCompositeModifications(targetGroupUuid, modificationsUuids, modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body);
case INSERT_COMPOSITE ->
networkModificationService.insertCompositeModificationsIntoGroup(
targetGroupUuid,
modificationContextInfos.getFirst(),
modificationContextInfos.getSecond()
).thenApply(ResponseEntity.ok()::body);
case MOVE -> {
UUID sourceGroupUuid = originGroupUuid == null ? targetGroupUuid : originGroupUuid;
boolean applyModifications = canApply;
if (sourceGroupUuid.equals(targetGroupUuid)) {
applyModifications = false;
}
yield networkModificationService.moveModifications(targetGroupUuid, sourceGroupUuid, beforeModificationUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond(), applyModifications).thenApply(ResponseEntity.ok()::body);
yield networkModificationService.moveModifications(targetGroupUuid, sourceGroupUuid, beforeModificationUuid, modificationsUuids, modificationContextInfos.getSecond(), applyModifications).thenApply(ResponseEntity.ok()::body);
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import lombok.Setter;
import org.gridsuite.modification.dto.CompositeModificationInfos;
import org.gridsuite.modification.dto.ModificationInfos;
import org.hibernate.annotations.ColumnDefault;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -27,6 +28,10 @@
@Table(name = "composite_modification")
public class CompositeModificationEntity extends ModificationEntity {

@Column(name = "name")
@ColumnDefault("'My Composite'")
private String name;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(
name = "compositeModificationSubModifications",
Expand All @@ -44,6 +49,7 @@ public CompositeModificationEntity(@NonNull CompositeModificationInfos composite
public CompositeModificationInfos toModificationInfos() {
List<ModificationInfos> modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).toList();
return CompositeModificationInfos.builder()
.name(getName())
.activated(getActivated())
.description(getDescription())
.date(getDate())
Expand All @@ -56,6 +62,7 @@ public CompositeModificationInfos toModificationInfos() {
// when we go back to an empty list, dont use addAll() on the list because JPA could start
// @OrderColumn to 1 instead of 0
private void assignAttributes(CompositeModificationInfos compositeModificationInfos) {
this.setName(compositeModificationInfos.getName());
modifications.clear();
modifications = compositeModificationInfos.getModifications().stream()
.map(ModificationEntity::fromDTO)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,15 @@ public UUID createNetworkCompositeModification(@NonNull List<UUID> modificationU
return modificationRepository.save(compositeEntity).getId();
}

public CompositeModificationInfos cloneCompositeModification(@NonNull ModificationsToCopyInfos compositeModification) {
CompositeModificationInfos newCompositeInfos = CompositeModificationInfos.builder().modifications(List.of()).build();
List<ModificationInfos> copiedModifications = getCompositeModificationsInfosNonTransactional(List.of(compositeModification.getUuid())).stream()
.toList();
newCompositeInfos.setModifications(copiedModifications);
newCompositeInfos.setName(compositeModification.getCompositeName());
return newCompositeInfos;
}

public void updateCompositeModification(@NonNull UUID compositeUuid, @NonNull List<UUID> modificationUuids) {
ModificationEntity modificationEntity = modificationRepository.findById(compositeUuid)
.orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, compositeUuid)));
Expand Down Expand Up @@ -765,4 +774,17 @@ public List<ModificationInfos> saveCompositeModifications(@NonNull UUID targetGr
// We can't return modificationInfos directly because it wouldn't have the IDs coming from the new saved entities
return newEntities.stream().map(ModificationEntity::toModificationInfos).toList();
}

@Transactional
public List<ModificationInfos> insertCompositeModificationsIntoGroup(
@NonNull UUID targetGroupUuid,
@NonNull List<ModificationsToCopyInfos> compositeModifications) {
List<ModificationInfos> newCompositeModifications = new ArrayList<>();
for (ModificationsToCopyInfos compositeModification : compositeModifications) {
CompositeModificationInfos newCompositeModification = cloneCompositeModification(compositeModification);
newCompositeModifications.add(newCompositeModification);
}
List<ModificationEntity> newEntities = saveModificationInfosNonTransactional(targetGroupUuid, newCompositeModifications);
return newEntities.stream().map(ModificationEntity::toModificationInfos).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.gridsuite.modification.NetworkModificationException;
import org.gridsuite.modification.dto.GenerationDispatchInfos;
import org.gridsuite.modification.dto.ModificationInfos;
import org.gridsuite.modification.dto.ModificationsToCopyInfos;
import org.gridsuite.modification.server.NetworkModificationServerException;
import org.gridsuite.modification.server.dto.*;
import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos;
Expand Down Expand Up @@ -397,8 +398,22 @@ public CompletableFuture<NetworkModificationsResult> duplicateModifications(@Non
new NetworkModificationsResult(ids, result));
}

public CompletableFuture<NetworkModificationsResult> insertCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List<UUID> modificationsUuids, @NonNull List<ModificationApplicationContext> applicationContexts) {
List<ModificationInfos> modifications = networkModificationRepository.saveCompositeModifications(targetGroupUuid, modificationsUuids);
/**
* all their network modifications are extracted from the composite modifications and inserted into the group
*/
public CompletableFuture<NetworkModificationsResult> splitCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List<UUID> compositeModificationsUuids, @NonNull List<ModificationApplicationContext> applicationContexts) {
List<ModificationInfos> modifications = networkModificationRepository.saveCompositeModifications(targetGroupUuid, compositeModificationsUuids);
List<UUID> ids = modifications.stream().map(ModificationInfos::getUuid).toList();
return applyModifications(targetGroupUuid, modifications, applicationContexts).thenApply(result ->
new NetworkModificationsResult(ids, result));
}

public CompletableFuture<NetworkModificationsResult> insertCompositeModificationsIntoGroup(
@NonNull UUID targetGroupUuid,
@NonNull List<ModificationsToCopyInfos> compositeModifications,
@NonNull List<ModificationApplicationContext> applicationContexts) {
List<ModificationInfos> modifications = networkModificationRepository.insertCompositeModificationsIntoGroup(
targetGroupUuid, compositeModifications);
List<UUID> ids = modifications.stream().map(ModificationInfos::getUuid).toList();
return applyModifications(targetGroupUuid, modifications, applicationContexts).thenApply(result ->
new NetworkModificationsResult(ids, result));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<changeSet author="deharbemat (generated)" id="1770384121049-15">
<addColumn tableName="composite_modification">
<column defaultValue="My Composite" name="name" type="varchar(255)"/>
</addColumn>
</changeSet>
</databaseChangeLog>
3 changes: 3 additions & 0 deletions src/main/resources/db/changelog/db.changelog-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -453,3 +453,6 @@ databaseChangeLog:
- include:
file: changesets/changelog_20251215T152152Z.xml
relativeToChangelogFile: true
- include:
file: changesets/changelog_20260206T132143Z.xml
relativeToChangelogFile: true
Loading