Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
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 @@ -26,6 +26,7 @@
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;

/**
* @author Franck Lecuyer <franck.lecuyer at rte-france.com>
Expand Down Expand Up @@ -88,24 +89,24 @@ 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 ResponseEntity<NetworkModificationsResult> handleNetworkModifications(@Parameter(description = "updated group UUID, where modifications are pasted") @PathVariable("groupUuid") UUID targetGroupUuid,
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) {
return switch (action) {
case COPY ->
ResponseEntity.ok().body(networkModificationService.duplicateModifications(targetGroupUuid, originGroupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()));
networkModificationService.duplicateModifications(targetGroupUuid, originGroupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body);
case INSERT ->
ResponseEntity.ok().body(networkModificationService.insertCompositeModifications(targetGroupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()));
networkModificationService.insertCompositeModifications(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 ResponseEntity.ok().body(networkModificationService.moveModifications(targetGroupUuid, sourceGroupUuid, beforeModificationUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond(), applyModifications));
yield networkModificationService.moveModifications(targetGroupUuid, sourceGroupUuid, beforeModificationUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond(), applyModifications).thenApply(ResponseEntity.ok()::body);
}
};
}
Expand All @@ -131,11 +132,11 @@ public ResponseEntity<List<UUID>> getModificationGroups() {
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "The network modification was created"),
@ApiResponse(responseCode = "404", description = "The network or equipment was not found")})
public ResponseEntity<NetworkModificationsResult> createNetworkModification(
public CompletableFuture<ResponseEntity<NetworkModificationsResult>> createNetworkModification(
@Parameter(description = "Group UUID") @RequestParam(name = "groupUuid") UUID groupUuid,
@RequestBody Pair<ModificationInfos, List<ModificationApplicationContext>> modificationContextInfos) {
modificationContextInfos.getFirst().check();
return ResponseEntity.ok().body(networkModificationService.createNetworkModification(groupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()));
return networkModificationService.createNetworkModification(groupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body);
}

@PutMapping(value = "/network-modifications/{uuid}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@

import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;

import static org.gridsuite.modification.server.report.NetworkModificationServerReportResourceBundle.ERROR_MESSAGE_KEY;

Expand Down Expand Up @@ -92,7 +93,7 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq
* medium : preloadingStrategy = COLLECTION
* large : preloadingStrategy = ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW
*/
public NetworkModificationResult applyModifications(ModificationApplicationGroup modificationInfosGroup, NetworkInfos networkInfos) {
public CompletableFuture<NetworkModificationResult> applyModifications(ModificationApplicationGroup modificationInfosGroup, NetworkInfos networkInfos) {
PreloadingStrategy preloadingStrategy = modificationInfosGroup.modifications().stream()
.map(ModificationEntity::getType)
.map(ModificationType::valueOf)
Expand All @@ -101,15 +102,21 @@ public NetworkModificationResult applyModifications(ModificationApplicationGroup
.orElse(PreloadingStrategy.NONE);

NetworkStoreListener listener = NetworkStoreListener.create(networkInfos.getNetwork(), networkInfos.getNetworkUuuid(), networkStoreService, equipmentInfosService, applicationInfosService, collectionThreshold);
ApplicationStatus groupApplicationStatus;
if (preloadingStrategy == PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW) {
groupApplicationStatus = largeNetworkModificationExecutionService
.supplyAsync(() -> apply(modificationInfosGroup, listener))
.join();
return largeNetworkModificationExecutionService
.supplyAsync(() -> applyAndFlush(modificationInfosGroup, listener));
} else {
groupApplicationStatus = apply(modificationInfosGroup, listener);
return CompletableFuture.completedFuture(applyAndFlush(modificationInfosGroup, listener));
}
}

public NetworkModificationResult applyModificationsBlocking(ModificationApplicationGroup modificationInfosGroup, NetworkInfos networkInfos) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this code in a test class

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch thanks

return this.applyModifications(modificationInfosGroup, networkInfos).join();
}

private NetworkModificationResult applyAndFlush(ModificationApplicationGroup modificationInfosGroup,
NetworkStoreListener listener) {
ApplicationStatus groupApplicationStatus = apply(modificationInfosGroup, listener);
return flushModificationApplications(groupApplicationStatus, listener);
}

Expand Down Expand Up @@ -142,15 +149,18 @@ public NetworkModificationResult applyModifications(List<ModificationApplication
.orElse(PreloadingStrategy.NONE);

NetworkStoreListener listener = NetworkStoreListener.create(networkInfos.getNetwork(), networkInfos.getNetworkUuuid(), networkStoreService, equipmentInfosService, applicationInfosService, collectionThreshold);
List<ApplicationStatus> groupsApplicationStatuses;
if (preloadingStrategy == PreloadingStrategy.ALL_COLLECTIONS_NEEDED_FOR_BUS_VIEW) {
groupsApplicationStatuses = largeNetworkModificationExecutionService
.supplyAsync(() -> apply(modificationInfosGroups, listener))
return largeNetworkModificationExecutionService
.supplyAsync(() -> applyAndFlush(modificationInfosGroups, listener))
.join();
} else {
groupsApplicationStatuses = apply(modificationInfosGroups, listener);
return applyAndFlush(modificationInfosGroups, listener);
}
}

private NetworkModificationResult applyAndFlush(List<ModificationApplicationGroup> modificationInfosGroups,
NetworkStoreListener listener) {
List<ApplicationStatus> groupsApplicationStatuses = apply(modificationInfosGroups, listener);
return flushModificationApplications(groupsApplicationStatuses, listener);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ public List<ModificationEntity> saveModifications(UUID groupUuid, List<Modificat
@Transactional // To have all create in the same transaction (atomic)
// TODO Remove transaction when errors will no longer be sent to the front
public List<ModificationEntity> saveModificationInfos(UUID groupUuid, List<ModificationInfos> modifications) {
return saveModificationInfosNonTransactional(groupUuid, modifications);
}

private List<ModificationEntity> saveModificationInfosNonTransactional(UUID groupUuid,
List<ModificationInfos> modifications) {
List<ModificationEntity> entities = modifications.stream().map(ModificationEntity::fromDTO).toList();

return saveModificationsNonTransactional(groupUuid, entities);
Expand Down Expand Up @@ -165,6 +170,20 @@ private List<ModificationEntity> saveModificationsNonTransactional(UUID groupUui
@Transactional
// TODO Remove transaction when errors will no longer be sent to the front
public List<ModificationEntity> moveModifications(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
return moveModificationsNonTransactional(destinationGroupUuid, originGroupUuid, modificationsToMoveUUID, referenceModificationUuid);
}

@Transactional
public List<ModificationEntity> moveModificationsFullDto(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
List<ModificationEntity> movedModifications = moveModificationsNonTransactional(destinationGroupUuid, originGroupUuid, modificationsToMoveUUID, referenceModificationUuid);
// Force load subentities/collections, needed later when the transaction is closed
// to avoid LazyInitialisationException. Maybe better to refactor to return the dto ?
// And refactor to more efficiently load the data (avoid 1+N) ?
movedModifications.forEach(ModificationEntity::toModificationInfos);
return movedModifications;
}

private List<ModificationEntity> moveModificationsNonTransactional(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
// read origin group and modifications
ModificationGroupEntity originModificationGroupEntity = getModificationGroup(originGroupUuid);
List<ModificationEntity> originModificationEntities = originModificationGroupEntity.getModifications()
Expand Down Expand Up @@ -443,7 +462,7 @@ public ModificationInfos getModificationInfos(ModificationEntity modificationEnt
return modificationEntity.toModificationInfos();
}

public List<ModificationEntity> getModificationsEntities(List<UUID> groupUuids, boolean onlyStashed) {
private List<ModificationEntity> getModificationsEntitiesNonTransactional(List<UUID> groupUuids, boolean onlyStashed) {
Stream<ModificationEntity> entityStream = groupUuids.stream().flatMap(this::getModificationEntityStream);
if (onlyStashed) {
return entityStream.filter(m -> m.getStashed() == onlyStashed).toList();
Expand All @@ -452,6 +471,21 @@ public List<ModificationEntity> getModificationsEntities(List<UUID> groupUuids,
}
}

//TODO ? should be @Transactional(readOnly = true)
public List<ModificationEntity> getModificationsEntities(List<UUID> groupUuids, boolean onlyStashed) {
return getModificationsEntitiesNonTransactional(groupUuids, onlyStashed);
}

@Transactional(readOnly = true)
public List<ModificationEntity> getModificationsEntitiesFullDto(List<UUID> groupUuids, boolean onlyStashed) {
List<ModificationEntity> modificationsEntities = getModificationsEntitiesNonTransactional(groupUuids, onlyStashed);
// Force load subentities/collections, needed later when the transaction is closed
// to avoid LazyInitialisationException. Maybe better to refactor to return the dto ?
// And refactor to more efficiently load the data (avoid 1+N) ?
modificationsEntities.forEach(ModificationEntity::toModificationInfos);
return modificationsEntities;
}

@Transactional(readOnly = true)
public ModificationInfos getModificationInfo(UUID modificationUuid) {
return getModificationInfos(getModificationEntity(modificationUuid));
Expand Down Expand Up @@ -525,6 +559,10 @@ public Integer getModificationsCount(@NonNull UUID groupUuid, boolean stashed) {

@Transactional(readOnly = true)
public List<ModificationInfos> getModificationsInfos(@NonNull List<UUID> uuids) {
return getModificationsInfosNonTransactional(uuids);
}

private List<ModificationInfos> getModificationsInfosNonTransactional(List<UUID> uuids) {
// Spring-data findAllById doc says: the order of elements in the result is not guaranteed
Map<UUID, ModificationEntity> entities = modificationRepository.findAllById(uuids)
.stream()
Expand Down Expand Up @@ -553,6 +591,10 @@ public List<ModificationInfos> getBasicNetworkModificationsFromComposite(@NonNul

@Transactional(readOnly = true)
public List<ModificationInfos> getCompositeModificationsInfos(@NonNull List<UUID> uuids) {
return getCompositeModificationsInfosNonTransactional(uuids);
}

private List<ModificationInfos> getCompositeModificationsInfosNonTransactional(@NonNull List<UUID> uuids) {
List<ModificationInfos> entities = new ArrayList<>();
uuids.forEach(uuid -> {
List<UUID> foundEntities = modificationRepository.findModificationIdsByCompositeModificationId(uuid);
Expand All @@ -568,6 +610,10 @@ public List<ModificationInfos> getCompositeModificationsInfos(@NonNull List<UUID

@Transactional(readOnly = true)
public List<ModificationInfos> getActiveModificationsInfos(@NonNull UUID groupUuid) {
return getActiveModificationsInfosNonTransactional(groupUuid);
}

private List<ModificationInfos> getActiveModificationsInfosNonTransactional(UUID groupUuid) {
return getModificationEntityStream(groupUuid).filter(m -> !m.getStashed()).map(this::getModificationInfos).toList();
}

Expand Down Expand Up @@ -812,4 +858,16 @@ private void deleteTabularModificationSubModifications(TabularModificationEntity
throw new UnsupportedOperationException(String.format("No sub-modifications deletion for modification type: %s", tabularModificationType));
}
}

@Transactional
public List<ModificationEntity> saveDuplicateModifications(@NonNull UUID targetGroupUuid, UUID originGroupUuid, @NonNull List<UUID> modificationsUuids) {
List<ModificationInfos> modificationInfos = originGroupUuid != null ? getActiveModificationsInfosNonTransactional(originGroupUuid) : getModificationsInfosNonTransactional(modificationsUuids);
return saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
}

@Transactional
public List<ModificationEntity> saveCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List<UUID> modificationsUuids) {
List<ModificationInfos> modificationInfos = getCompositeModificationsInfosNonTransactional(modificationsUuids);
return saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
}
}
Loading