diff --git a/src/main/java/org/gridsuite/study/server/controller/StudyController.java b/src/main/java/org/gridsuite/study/server/controller/StudyController.java index d572b17f69..7040b1fc3c 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -36,6 +36,7 @@ import org.gridsuite.study.server.dto.networkexport.ExportNetworkStatus; import org.gridsuite.study.server.dto.networkexport.NodeExportInfos; import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos; +import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisParametersInfos; import org.gridsuite.study.server.dto.sequence.NodeSequenceType; import org.gridsuite.study.server.dto.timeseries.TimeSeriesMetadataInfos; import org.gridsuite.study.server.dto.timeseries.TimelineEventInfos; @@ -2079,7 +2080,7 @@ public ResponseEntity getDynamicMarginCalculationStatus(@Parameter(descr @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The security analysis parameters")}) public ResponseEntity getSecurityAnalysisParametersValues( @PathVariable("studyUuid") UUID studyUuid, - @RequestHeader(HEADER_USER_ID) String userId) { + @RequestHeader(HEADER_USER_ID) String userId) throws JsonProcessingException { return ResponseEntity.ok().body(studyService.getSecurityAnalysisParametersValues(studyUuid, userId)); } @@ -2186,23 +2187,40 @@ public void setAsText(final String text) throws IllegalArgumentException { @GetMapping(value = "/studies/{studyUuid}/sensitivity-analysis/parameters") @Operation(summary = "Get sensitivity analysis parameters on study") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The sensitivity analysis parameters")}) - public ResponseEntity getSensitivityAnalysisParameters( - @PathVariable("studyUuid") UUID studyUuid, - @RequestHeader(HEADER_USER_ID) String userId) { - return ResponseEntity.ok().body(studyService.getSensitivityAnalysisParameters(studyUuid, userId)); + public ResponseEntity getStudySensitivityAnalysisParameters( + @PathVariable("studyUuid") UUID studyUuid) { + return ResponseEntity.ok().body(studyService.getSensitivityAnalysisParameters(studyUuid)); } @PostMapping(value = "/studies/{studyUuid}/sensitivity-analysis/parameters") @Operation(summary = "set sensitivity analysis parameters on study, reset to default ones if empty body") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The sensitivity analysis parameters are set"), @ApiResponse(responseCode = "204", description = "Reset with user profile cannot be done")}) - public ResponseEntity setSensitivityAnalysisParameters( + public ResponseEntity setStudySensitivityAnalysisParameters( @PathVariable("studyUuid") UUID studyUuid, - @RequestBody(required = false) String sensitivityAnalysisParameters, + @RequestBody(required = false) SensitivityAnalysisParametersInfos sensitivityAnalysisParameters, @RequestHeader(HEADER_USER_ID) String userId) { return studyService.setSensitivityAnalysisParameters(studyUuid, sensitivityAnalysisParameters, userId) ? ResponseEntity.noContent().build() : ResponseEntity.ok().build(); } + @GetMapping(value = "/sensitivity-analysis/parameters/{parametersUuid}") // to move to explore-server? + @Operation(summary = "Get sensitivity analysis parameters on study") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The sensitivity analysis parameters")}) + public ResponseEntity getSensitivityAnalysisParameters( + @PathVariable("parametersUuid") UUID parametersUuid) { + return ResponseEntity.ok().body(sensitivityAnalysisService.getSensitivityAnalysisParameters(parametersUuid)); + } + + @PostMapping(value = "/sensitivity-analysis/parameters/{parametersUuid}") // to move to explore-server? + @Operation(summary = "set sensitivity analysis parameters on study, reset to default ones if empty body") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The sensitivity analysis parameters are set"), @ApiResponse(responseCode = "204", description = "Reset with user profile cannot be done")}) + public ResponseEntity setSensitivityAnalysisParameters( + @PathVariable("parametersUuid") UUID parametersUuid, + @RequestBody SensitivityAnalysisParametersInfos parameters) { + sensitivityAnalysisService.updateSensitivityAnalysisParameters(parametersUuid, parameters); + return ResponseEntity.ok().build(); + } + @PostMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/factor-count") @Operation(summary = "Get the factor count of sensitivity parameters") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The factors count of sensitivity parameters")}) diff --git a/src/main/java/org/gridsuite/study/server/dto/EquipmentsContainer.java b/src/main/java/org/gridsuite/study/server/dto/EquipmentsContainer.java new file mode 100644 index 0000000000..4814337bf0 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/EquipmentsContainer.java @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2023, 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 com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static com.fasterxml.jackson.annotation.JsonCreator.Mode.DELEGATING; + +/** + * @author Ghazwa Rehili + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class EquipmentsContainer { + + @Schema(description = "container id") + private UUID containerId; + + @Schema(description = "container name") + private String containerName; + + @JsonCreator(mode = DELEGATING) + public EquipmentsContainer(String containerId) { + this.containerId = UUID.fromString(containerId); + } + + public static List enrichEquipmentsContainer(List containerIds, Map containerNames) { + if (containerIds == null) { + return null; + } + return containerIds.stream() + .map(id -> new EquipmentsContainer(id, containerNames.get(id))) + .toList(); + } + + public static List getEquipmentsContainerUuids(List containers) { + if (containers == null) { + return null; + } + return containers.stream() + .map(EquipmentsContainer::getContainerId) + .toList(); + } +} + diff --git a/src/main/java/org/gridsuite/study/server/dto/LoadFlowParametersInfos.java b/src/main/java/org/gridsuite/study/server/dto/LoadFlowParametersInfos.java index 6c85be11c2..4aa59e15b3 100644 --- a/src/main/java/org/gridsuite/study/server/dto/LoadFlowParametersInfos.java +++ b/src/main/java/org/gridsuite/study/server/dto/LoadFlowParametersInfos.java @@ -8,6 +8,7 @@ import com.powsybl.loadflow.LoadFlowParameters; import lombok.*; +import org.gridsuite.study.server.dto.securityanalysis.LimitReductionsByVoltageLevel; import java.util.List; import java.util.Map; diff --git a/src/main/java/org/gridsuite/study/server/dto/securityanalysis/ContingencyLists.java b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/ContingencyLists.java new file mode 100644 index 0000000000..f1e4872c1b --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/ContingencyLists.java @@ -0,0 +1,26 @@ +/** + * 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.securityanalysis; + +import lombok.*; + +import java.util.List; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class ContingencyLists { + private List contingencyLists; + private String description; + private boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/securityanalysis/ContingencyListsInfos.java b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/ContingencyListsInfos.java new file mode 100644 index 0000000000..b54e69af71 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/ContingencyListsInfos.java @@ -0,0 +1,26 @@ +/** + * 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.securityanalysis; + +import lombok.*; +import org.gridsuite.study.server.dto.EquipmentsContainer; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class ContingencyListsInfos { + private List contingencyLists; + private String description; + private boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/LimitReductionsByVoltageLevel.java b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/LimitReductionsByVoltageLevel.java similarity index 85% rename from src/main/java/org/gridsuite/study/server/dto/LimitReductionsByVoltageLevel.java rename to src/main/java/org/gridsuite/study/server/dto/securityanalysis/LimitReductionsByVoltageLevel.java index ef59d48239..4a70cc350c 100644 --- a/src/main/java/org/gridsuite/study/server/dto/LimitReductionsByVoltageLevel.java +++ b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/LimitReductionsByVoltageLevel.java @@ -1,15 +1,18 @@ /** - * Copyright (c) 2024, RTE (http://www.rte-france.com) + * 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; +package org.gridsuite.study.server.dto.securityanalysis; import lombok.*; import java.util.List; +/** + * @author Caroline Jeandat {@literal } + */ @Data @Builder @NoArgsConstructor diff --git a/src/main/java/org/gridsuite/study/server/dto/securityanalysis/SecurityAnalysisParameters.java b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/SecurityAnalysisParameters.java new file mode 100644 index 0000000000..57311bbcf8 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/SecurityAnalysisParameters.java @@ -0,0 +1,39 @@ +/** + * 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.securityanalysis; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Builder +public class SecurityAnalysisParameters { + private String provider; + + private double lowVoltageAbsoluteThreshold; + + private double lowVoltageProportionalThreshold; + + private double highVoltageAbsoluteThreshold; + + private double highVoltageProportionalThreshold; + + private double flowProportionalThreshold; + + private List contingencyListsInfos; + + private List limitReductions; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/securityanalysis/SecurityAnalysisParametersInfos.java b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/SecurityAnalysisParametersInfos.java new file mode 100644 index 0000000000..44b3a5546e --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/securityanalysis/SecurityAnalysisParametersInfos.java @@ -0,0 +1,39 @@ +/** + * 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.securityanalysis; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Builder +public class SecurityAnalysisParametersInfos { + private String provider; + + private double lowVoltageAbsoluteThreshold; + + private double lowVoltageProportionalThreshold; + + private double highVoltageAbsoluteThreshold; + + private double highVoltageProportionalThreshold; + + private double flowProportionalThreshold; + + private List contingencyListsInfos; + + private List limitReductions; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/DistributionType.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/DistributionType.java new file mode 100644 index 0000000000..d8aacfbedf --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/DistributionType.java @@ -0,0 +1,17 @@ +/** + * 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.sensianalysis; + +/** + * @author Caroline Jeandat {@literal } + */ +public enum DistributionType { + PROPORTIONAL, + PROPORTIONAL_MAXP, + REGULAR, + VENTILATION +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityAnalysisParameters.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityAnalysisParameters.java new file mode 100644 index 0000000000..aafc3bff94 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityAnalysisParameters.java @@ -0,0 +1,33 @@ +/** + * 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.sensianalysis; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@Builder +public class SensitivityAnalysisParameters { + private String provider; + private UUID uuid; + private double flowFlowSensitivityValueThreshold; + private double angleFlowSensitivityValueThreshold; + private double flowVoltageSensitivityValueThreshold; + List sensitivityInjectionsSet; + List sensitivityInjection; + List sensitivityHVDC; + List sensitivityPST; + List sensitivityNodes; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityAnalysisParametersInfos.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityAnalysisParametersInfos.java new file mode 100644 index 0000000000..e70cb9e035 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityAnalysisParametersInfos.java @@ -0,0 +1,35 @@ +/** + * 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.sensianalysis; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@Builder +public class SensitivityAnalysisParametersInfos { + private String provider; + private UUID uuid; + private double flowFlowSensitivityValueThreshold; + private double angleFlowSensitivityValueThreshold; + private double flowVoltageSensitivityValueThreshold; + List sensitivityInjectionsSet; + List sensitivityInjection; + List sensitivityHVDC; + List sensitivityPST; + List sensitivityNodes; + + +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/EquipmentsContainer.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityHVDC.java similarity index 50% rename from src/main/java/org/gridsuite/study/server/dto/sensianalysis/EquipmentsContainer.java rename to src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityHVDC.java index 92ed9996dd..118144c54b 100644 --- a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/EquipmentsContainer.java +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityHVDC.java @@ -1,32 +1,28 @@ /** - * Copyright (c) 2023, RTE (http://www.rte-france.com) + * 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.sensianalysis; -import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import lombok.NoArgsConstructor; -import lombok.AllArgsConstructor; +import java.util.List; import java.util.UUID; /** - * @author Ghazwa Rehili + * @author Caroline Jeandat {@literal } */ @Getter @Setter -@NoArgsConstructor @AllArgsConstructor -public class EquipmentsContainer { - - @Schema(description = "container id") - private UUID containerId; - - @Schema(description = "container name") - private String containerName; +public class SensitivityHVDC { + List monitoredBranches; + SensitivityType sensitivityType; + List hvdcs; + List contingencies; + boolean activated; } - diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityHvdcInfos.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityHvdcInfos.java new file mode 100644 index 0000000000..acae62e703 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityHvdcInfos.java @@ -0,0 +1,28 @@ +/** + * 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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.gridsuite.study.server.dto.EquipmentsContainer; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityHvdcInfos { + List monitoredBranches; + SensitivityType sensitivityType; + List hvdcs; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjection.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjection.java new file mode 100644 index 0000000000..053b62c0ce --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjection.java @@ -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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityInjection { + List monitoredBranches; + List injections; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionInfos.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionInfos.java new file mode 100644 index 0000000000..17b5e9e4de --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionInfos.java @@ -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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.gridsuite.study.server.dto.EquipmentsContainer; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityInjectionInfos { + List monitoredBranches; + List injections; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionsSet.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionsSet.java new file mode 100644 index 0000000000..d369c60671 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionsSet.java @@ -0,0 +1,28 @@ +/** + * 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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityInjectionsSet { + List monitoredBranches; + List injections; + DistributionType distributionType; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionsSetInfos.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionsSetInfos.java new file mode 100644 index 0000000000..560a004792 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityInjectionsSetInfos.java @@ -0,0 +1,28 @@ +/** + * 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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.gridsuite.study.server.dto.EquipmentsContainer; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityInjectionsSetInfos { + List monitoredBranches; + List injections; + DistributionType distributionType; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityNodes.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityNodes.java new file mode 100644 index 0000000000..ce8bfb61ab --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityNodes.java @@ -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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityNodes { + List monitoredVoltageLevels; + List equipmentsInVoltageRegulation; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityNodesInfos.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityNodesInfos.java new file mode 100644 index 0000000000..5452841a95 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityNodesInfos.java @@ -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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.gridsuite.study.server.dto.EquipmentsContainer; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityNodesInfos { + List monitoredVoltageLevels; + List equipmentsInVoltageRegulation; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityPST.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityPST.java new file mode 100644 index 0000000000..5cc2c36b49 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityPST.java @@ -0,0 +1,28 @@ +/** + * 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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityPST { + List monitoredBranches; + SensitivityType sensitivityType; + List psts; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityPstInfos.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityPstInfos.java new file mode 100644 index 0000000000..f12bd22da5 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityPstInfos.java @@ -0,0 +1,28 @@ +/** + * 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.sensianalysis; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.gridsuite.study.server.dto.EquipmentsContainer; + +import java.util.List; + +/** + * @author Caroline Jeandat {@literal } + */ +@Getter +@Setter +@AllArgsConstructor +public class SensitivityPstInfos { + List monitoredBranches; + SensitivityType sensitivityType; + List psts; + List contingencies; + boolean activated; +} diff --git a/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityType.java b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityType.java new file mode 100644 index 0000000000..0f64c60108 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/sensianalysis/SensitivityType.java @@ -0,0 +1,15 @@ +/** + * 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.sensianalysis; + +/** + * @author Caroline Jeandat {@literal } + */ +public enum SensitivityType { + DELTA_MW, + DELTA_A +} diff --git a/src/main/java/org/gridsuite/study/server/repository/EquipmentsContainerEmbeddable.java b/src/main/java/org/gridsuite/study/server/repository/EquipmentsContainerEmbeddable.java index 7d9268e686..328f88512d 100644 --- a/src/main/java/org/gridsuite/study/server/repository/EquipmentsContainerEmbeddable.java +++ b/src/main/java/org/gridsuite/study/server/repository/EquipmentsContainerEmbeddable.java @@ -9,7 +9,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; -import org.gridsuite.study.server.dto.sensianalysis.EquipmentsContainer; +import org.gridsuite.study.server.dto.EquipmentsContainer; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/org/gridsuite/study/server/service/DirectoryService.java b/src/main/java/org/gridsuite/study/server/service/DirectoryService.java index e0adde65ee..a068de0bd3 100644 --- a/src/main/java/org/gridsuite/study/server/service/DirectoryService.java +++ b/src/main/java/org/gridsuite/study/server/service/DirectoryService.java @@ -12,6 +12,7 @@ import org.gridsuite.study.server.dto.ElementAttributes; import org.gridsuite.study.server.dto.networkexport.PermissionType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -23,6 +24,8 @@ import org.springframework.web.util.UriComponentsBuilder; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -37,6 +40,7 @@ public class DirectoryService { public static final String PARAM_ACCESS_TYPE = "accessType"; public static final String PARAM_TARGET_DIRECTORY_UUID = "targetDirectoryUuid"; public static final String PARAM_RECURSIVE_CHECK = "recursiveCheck"; + public static final String PARAM_STRICT_MODE = "strictMode"; private final RestTemplate restTemplate; @@ -56,6 +60,30 @@ public String getElementName(UUID elementUuid) { return restTemplate.getForObject(getDirectoryServerServerBaseUri() + path, String.class); } + public Map getElementNames(Set elementUuids, boolean strictMode) { + // strictMode true => returns an error if at least one element is not found + if (elementUuids.isEmpty()) { + return Map.of(); + } + + String path = UriComponentsBuilder.fromPath(DELIMITER + DIRECTORY_API_VERSION + "/element-names") + .queryParam(PARAM_IDS, elementUuids) + .queryParam(PARAM_STRICT_MODE, strictMode) + .buildAndExpand() + .toUriString(); + + ResponseEntity> response = + restTemplate.exchange( + getDirectoryServerServerBaseUri() + path, + HttpMethod.GET, + null, + new ParameterizedTypeReference<>() { + } + ); + + return response.getBody(); + } + public boolean elementExists(UUID directoryUuid, String elementName, String type) { UriComponentsBuilder pathBuilder = UriComponentsBuilder.fromPath(DELIMITER + DIRECTORY_API_VERSION + "/directories/{directoryUuid}/elements/{elementName}/types/{type}"); String path = pathBuilder.buildAndExpand(directoryUuid, elementName, type).toUriString(); diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisParametersMapper.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisParametersMapper.java new file mode 100644 index 0000000000..94fca7749c --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisParametersMapper.java @@ -0,0 +1,82 @@ +/** + * 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.service; + +import org.gridsuite.study.server.dto.EquipmentsContainer; +import org.gridsuite.study.server.dto.securityanalysis.ContingencyLists; +import org.gridsuite.study.server.dto.securityanalysis.ContingencyListsInfos; +import org.gridsuite.study.server.dto.securityanalysis.SecurityAnalysisParameters; +import org.gridsuite.study.server.dto.securityanalysis.SecurityAnalysisParametersInfos; +import org.gridsuite.study.server.dto.sensianalysis.*; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Caroline Jeandat {@literal } + */ +@Service +public class SecurityAnalysisParametersMapper { + + private final DirectoryService directoryService; + + public SecurityAnalysisParametersMapper(DirectoryService directoryService) { + this.directoryService = directoryService; + } + + public SecurityAnalysisParameters getParameters(SecurityAnalysisParametersInfos paramsInfos) { + + List contingencyLists = paramsInfos.getContingencyListsInfos().stream() + .map(clInfos -> new ContingencyLists( + EquipmentsContainer.getEquipmentsContainerUuids(clInfos.getContingencyLists()), + clInfos.getDescription(), + clInfos.isActivated())) + .toList(); + + return SecurityAnalysisParameters.builder() + .provider(paramsInfos.getProvider()) + .lowVoltageAbsoluteThreshold(paramsInfos.getLowVoltageAbsoluteThreshold()) + .lowVoltageProportionalThreshold(paramsInfos.getLowVoltageProportionalThreshold()) + .highVoltageAbsoluteThreshold(paramsInfos.getHighVoltageAbsoluteThreshold()) + .highVoltageProportionalThreshold(paramsInfos.getHighVoltageProportionalThreshold()) + .flowProportionalThreshold(paramsInfos.getFlowProportionalThreshold()) + .contingencyListsInfos(contingencyLists) + .limitReductions(paramsInfos.getLimitReductions()) + .build(); + } + + public SecurityAnalysisParametersInfos enrichParametersInfos(SecurityAnalysisParameters params) { + Map allContainerNames = getAllContainerNames(params); + + List contingencyListsInfos = params.getContingencyListsInfos().stream() + .map(cl -> new ContingencyListsInfos( + EquipmentsContainer.enrichEquipmentsContainer(cl.getContingencyLists(), allContainerNames), + cl.getDescription(), + cl.isActivated())) + .toList(); + + return SecurityAnalysisParametersInfos.builder() + .provider(params.getProvider()) + .lowVoltageAbsoluteThreshold(params.getLowVoltageAbsoluteThreshold()) + .lowVoltageProportionalThreshold(params.getLowVoltageProportionalThreshold()) + .highVoltageAbsoluteThreshold(params.getHighVoltageAbsoluteThreshold()) + .highVoltageProportionalThreshold(params.getHighVoltageProportionalThreshold()) + .flowProportionalThreshold(params.getFlowProportionalThreshold()) + .contingencyListsInfos(contingencyListsInfos) + .limitReductions(params.getLimitReductions()) + .build(); + } + + private Map getAllContainerNames(SecurityAnalysisParameters params) { + Set containerIds = params.getContingencyListsInfos().stream() + .flatMap(cl -> cl.getContingencyLists().stream()) + .collect(Collectors.toSet()); + + return directoryService.getElementNames(containerIds, false); + } +} diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index 5c9cf64b2c..37e7bda790 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -11,6 +11,8 @@ import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; +import org.gridsuite.study.server.dto.securityanalysis.SecurityAnalysisParameters; +import org.gridsuite.study.server.dto.securityanalysis.SecurityAnalysisParametersInfos; import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; @@ -52,15 +54,19 @@ public class SecurityAnalysisService extends AbstractComputationService { private final ObjectMapper objectMapper; + private final SecurityAnalysisParametersMapper parametersMapper; + @Setter private String securityAnalysisServerBaseUri; @Autowired public SecurityAnalysisService(RemoteServicesProperties remoteServicesProperties, - ObjectMapper objectMapper, RestTemplate restTemplate) { + ObjectMapper objectMapper, RestTemplate restTemplate, + SecurityAnalysisParametersMapper parametersMapper) { this.securityAnalysisServerBaseUri = remoteServicesProperties.getServiceUri("security-analysis-server"); this.objectMapper = objectMapper; this.restTemplate = restTemplate; + this.parametersMapper = parametersMapper; } public String getSecurityAnalysisResult(UUID resultUuid, UUID networkUuid, String variantId, SecurityAnalysisResultType resultType, String filters, String globalFilters, Pageable pageable) { @@ -250,7 +256,7 @@ public UUID duplicateSecurityAnalysisParameters(UUID sourceParametersUuid, Strin return restTemplate.exchange(securityAnalysisServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(null, headers), UUID.class).getBody(); } - public String getSecurityAnalysisParameters(UUID parametersUuid, String userId) { + public String getSecurityAnalysisParameters(UUID parametersUuid, String userId) throws JsonProcessingException { Objects.requireNonNull(parametersUuid); String path = UriComponentsBuilder.fromPath(DELIMITER + SECURITY_ANALYSIS_API_VERSION + PARAMETERS_URI) @@ -260,7 +266,15 @@ public String getSecurityAnalysisParameters(UUID parametersUuid, String userId) headers.set(HEADER_USER_ID, userId); headers.setContentType(MediaType.APPLICATION_JSON); - return restTemplate.exchange(securityAnalysisServerBaseUri + path, HttpMethod.GET, new HttpEntity<>(null, headers), String.class).getBody(); + SecurityAnalysisParameters params = restTemplate.exchange( + securityAnalysisServerBaseUri + path, + HttpMethod.GET, + new HttpEntity<>(null, headers), + SecurityAnalysisParameters.class + ).getBody(); + SecurityAnalysisParametersInfos enrichedParams = parametersMapper.enrichParametersInfos(params); + + return objectMapper.writeValueAsString(enrichedParams); } public UUID getSecurityAnalysisParametersUuidOrElseCreateDefaults(StudyEntity studyEntity) { diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisParametersMapper.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisParametersMapper.java new file mode 100644 index 0000000000..a405cada9e --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisParametersMapper.java @@ -0,0 +1,181 @@ +/** + * 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.service; + +import org.gridsuite.study.server.dto.EquipmentsContainer; +import org.gridsuite.study.server.dto.sensianalysis.*; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author Caroline Jeandat {@literal } + */ +@Service +public class SensitivityAnalysisParametersMapper { + + private final DirectoryService directoryService; + + public SensitivityAnalysisParametersMapper(DirectoryService directoryService) { + this.directoryService = directoryService; + } + + public SensitivityAnalysisParameters getParameters(SensitivityAnalysisParametersInfos paramsInfos) { + + List sensiInjectionsSets = paramsInfos.getSensitivityInjectionsSet().stream() + .map(injectionsSetInfos -> new SensitivityInjectionsSet( + EquipmentsContainer.getEquipmentsContainerUuids(injectionsSetInfos.getMonitoredBranches()), + EquipmentsContainer.getEquipmentsContainerUuids(injectionsSetInfos.getInjections()), + injectionsSetInfos.getDistributionType(), + EquipmentsContainer.getEquipmentsContainerUuids(injectionsSetInfos.getContingencies()), + injectionsSetInfos.isActivated())) + .toList(); + + List sensiInjections = paramsInfos.getSensitivityInjection().stream() + .map(injectionInfos -> new SensitivityInjection( + EquipmentsContainer.getEquipmentsContainerUuids(injectionInfos.getMonitoredBranches()), + EquipmentsContainer.getEquipmentsContainerUuids(injectionInfos.getInjections()), + EquipmentsContainer.getEquipmentsContainerUuids(injectionInfos.getContingencies()), + injectionInfos.isActivated())) + .toList(); + + List sensiHvdcs = paramsInfos.getSensitivityHVDC().stream() + .map(hvdcInfos -> new SensitivityHVDC( + EquipmentsContainer.getEquipmentsContainerUuids(hvdcInfos.getMonitoredBranches()), + hvdcInfos.getSensitivityType(), + EquipmentsContainer.getEquipmentsContainerUuids(hvdcInfos.getHvdcs()), + EquipmentsContainer.getEquipmentsContainerUuids(hvdcInfos.getContingencies()), + hvdcInfos.isActivated())) + .toList(); + + List sensiPsts = paramsInfos.getSensitivityPST().stream() + .map(pstInfos -> new SensitivityPST( + EquipmentsContainer.getEquipmentsContainerUuids(pstInfos.getMonitoredBranches()), + pstInfos.getSensitivityType(), + EquipmentsContainer.getEquipmentsContainerUuids(pstInfos.getPsts()), + EquipmentsContainer.getEquipmentsContainerUuids(pstInfos.getContingencies()), + pstInfos.isActivated())) + .toList(); + + List sensiNodes = paramsInfos.getSensitivityNodes().stream() + .map(nodeInfos -> new SensitivityNodes( + EquipmentsContainer.getEquipmentsContainerUuids(nodeInfos.getMonitoredVoltageLevels()), + EquipmentsContainer.getEquipmentsContainerUuids(nodeInfos.getEquipmentsInVoltageRegulation()), + EquipmentsContainer.getEquipmentsContainerUuids(nodeInfos.getContingencies()), + nodeInfos.isActivated())) + .toList(); + + return SensitivityAnalysisParameters.builder() + .uuid(paramsInfos.getUuid()) + .provider(paramsInfos.getProvider()) + .flowFlowSensitivityValueThreshold(paramsInfos.getFlowFlowSensitivityValueThreshold()) + .angleFlowSensitivityValueThreshold(paramsInfos.getAngleFlowSensitivityValueThreshold()) + .flowVoltageSensitivityValueThreshold(paramsInfos.getFlowVoltageSensitivityValueThreshold()) + .sensitivityInjectionsSet(sensiInjectionsSets) + .sensitivityInjection(sensiInjections) + .sensitivityHVDC(sensiHvdcs) + .sensitivityPST(sensiPsts) + .sensitivityNodes(sensiNodes) + .build(); + } + + public SensitivityAnalysisParametersInfos enrichParametersInfos(SensitivityAnalysisParameters params) { + Map allContainerNames = getAllContainerNames(params); + + List sensiInjectionsSets = params.getSensitivityInjectionsSet().stream() + .map(sensitivityInjectionsSet -> new SensitivityInjectionsSetInfos( + EquipmentsContainer.enrichEquipmentsContainer(sensitivityInjectionsSet.getMonitoredBranches(), allContainerNames), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityInjectionsSet.getInjections(), allContainerNames), + sensitivityInjectionsSet.getDistributionType(), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityInjectionsSet.getContingencies(), allContainerNames), + sensitivityInjectionsSet.isActivated())) + .toList(); + + List sensiInjections = params.getSensitivityInjection().stream() + .map(sensitivityInjection -> new SensitivityInjectionInfos( + EquipmentsContainer.enrichEquipmentsContainer(sensitivityInjection.getMonitoredBranches(), allContainerNames), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityInjection.getInjections(), allContainerNames), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityInjection.getContingencies(), allContainerNames), + sensitivityInjection.isActivated())) + .toList(); + + List sensiHvdcs = params.getSensitivityHVDC().stream() + .map(sensitivityHvdc -> new SensitivityHvdcInfos( + EquipmentsContainer.enrichEquipmentsContainer(sensitivityHvdc.getMonitoredBranches(), allContainerNames), + sensitivityHvdc.getSensitivityType(), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityHvdc.getHvdcs(), allContainerNames), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityHvdc.getContingencies(), allContainerNames), + sensitivityHvdc.isActivated())) + .toList(); + + List sensiPsts = params.getSensitivityPST().stream() + .map(sensitivityPst -> new SensitivityPstInfos( + EquipmentsContainer.enrichEquipmentsContainer(sensitivityPst.getMonitoredBranches(), allContainerNames), + sensitivityPst.getSensitivityType(), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityPst.getPsts(), allContainerNames), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityPst.getContingencies(), allContainerNames), + sensitivityPst.isActivated())) + .toList(); + + List sensiNodes = params.getSensitivityNodes().stream() + .map(sensitivityNode -> new SensitivityNodesInfos( + EquipmentsContainer.enrichEquipmentsContainer(sensitivityNode.getMonitoredVoltageLevels(), allContainerNames), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityNode.getEquipmentsInVoltageRegulation(), allContainerNames), + EquipmentsContainer.enrichEquipmentsContainer(sensitivityNode.getContingencies(), allContainerNames), + sensitivityNode.isActivated())) + .toList(); + + return SensitivityAnalysisParametersInfos.builder() + .uuid(params.getUuid()) + .provider(params.getProvider()) + .flowFlowSensitivityValueThreshold(params.getFlowFlowSensitivityValueThreshold()) + .angleFlowSensitivityValueThreshold(params.getAngleFlowSensitivityValueThreshold()) + .flowVoltageSensitivityValueThreshold(params.getFlowVoltageSensitivityValueThreshold()) + .sensitivityInjectionsSet(sensiInjectionsSets) + .sensitivityInjection(sensiInjections) + .sensitivityHVDC(sensiHvdcs) + .sensitivityPST(sensiPsts) + .sensitivityNodes(sensiNodes) + .build(); + } + + private Map getAllContainerNames(SensitivityAnalysisParameters params) { + Set allContainerIds = new HashSet<>(); + + params.getSensitivityInjectionsSet().forEach(sensitivityInjectionsSet -> { + allContainerIds.addAll(sensitivityInjectionsSet.getMonitoredBranches()); + allContainerIds.addAll(sensitivityInjectionsSet.getInjections()); + allContainerIds.addAll(sensitivityInjectionsSet.getContingencies()); + }); + + params.getSensitivityInjection().forEach(sensitivityInjection -> { + allContainerIds.addAll(sensitivityInjection.getMonitoredBranches()); + allContainerIds.addAll(sensitivityInjection.getInjections()); + allContainerIds.addAll(sensitivityInjection.getContingencies()); + }); + + params.getSensitivityHVDC().forEach(sensitivityHvdc -> { + allContainerIds.addAll(sensitivityHvdc.getMonitoredBranches()); + allContainerIds.addAll(sensitivityHvdc.getHvdcs()); + allContainerIds.addAll(sensitivityHvdc.getContingencies()); + }); + + params.getSensitivityPST().forEach(sensitivityPst -> { + allContainerIds.addAll(sensitivityPst.getMonitoredBranches()); + allContainerIds.addAll(sensitivityPst.getPsts()); + allContainerIds.addAll(sensitivityPst.getContingencies()); + }); + + params.getSensitivityNodes().forEach(sensitivityNode -> { + allContainerIds.addAll(sensitivityNode.getMonitoredVoltageLevels()); + allContainerIds.addAll(sensitivityNode.getEquipmentsInVoltageRegulation()); + allContainerIds.addAll(sensitivityNode.getContingencies()); + }); + + return directoryService.getElementNames(allContainerIds, false); + } +} diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java index 495ebf5c06..00f0c8d4b3 100644 --- a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java @@ -10,6 +10,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; +import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisParameters; +import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisParametersInfos; import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.SensitivityAnalysisStatus; @@ -50,12 +52,16 @@ public class SensitivityAnalysisService extends AbstractComputationService { private final ObjectMapper objectMapper; + private final SensitivityAnalysisParametersMapper parametersMapper; + SensitivityAnalysisService(RemoteServicesProperties remoteServicesProperties, RestTemplate restTemplate, - ObjectMapper objectMapper) { + ObjectMapper objectMapper, + SensitivityAnalysisParametersMapper parametersMapper) { this.sensitivityAnalysisServerBaseUri = remoteServicesProperties.getServiceUri("sensitivity-analysis-server"); this.restTemplate = restTemplate; this.objectMapper = objectMapper; + this.parametersMapper = parametersMapper; } public void setSensitivityAnalysisServerBaseUri(String sensitivityAnalysisServerBaseUri) { @@ -243,19 +249,21 @@ public UUID getSensitivityAnalysisParametersUuidOrElseCreateDefault(StudyEntity return studyEntity.getSensitivityAnalysisParametersUuid(); } - public String getSensitivityAnalysisParameters(UUID parametersUuid, String userId) { + public SensitivityAnalysisParametersInfos getSensitivityAnalysisParameters(UUID parametersUuid) { String path = UriComponentsBuilder .fromPath(DELIMITER + SENSITIVITY_ANALYSIS_API_VERSION + PARAMETERS_URI) .buildAndExpand(parametersUuid) .toUriString(); - HttpHeaders headers = new HttpHeaders(); - headers.set(HEADER_USER_ID, userId); - - HttpEntity httpEntity = new HttpEntity<>(headers); + SensitivityAnalysisParameters params = restTemplate.exchange( + sensitivityAnalysisServerBaseUri + path, + HttpMethod.GET, + new HttpEntity<>(new HttpHeaders()), + SensitivityAnalysisParameters.class + ).getBody(); - return restTemplate.exchange(sensitivityAnalysisServerBaseUri + path, HttpMethod.GET, httpEntity, String.class).getBody(); + return parametersMapper.enrichParametersInfos(params); } public UUID createDefaultSensitivityAnalysisParameters() { @@ -268,18 +276,19 @@ public UUID createDefaultSensitivityAnalysisParameters() { return restTemplate.postForObject(sensitivityAnalysisServerBaseUri + path, null, UUID.class); } - public UUID createSensitivityAnalysisParameters(String parameters) { + public UUID createSensitivityAnalysisParameters(SensitivityAnalysisParametersInfos parametersInfos) { - Objects.requireNonNull(parameters); + Objects.requireNonNull(parametersInfos); var path = UriComponentsBuilder .fromPath(DELIMITER + SENSITIVITY_ANALYSIS_API_VERSION + "/parameters") .buildAndExpand() .toUriString(); - HttpHeaders headers = new HttpHeaders(); + SensitivityAnalysisParameters parameters = parametersMapper.getParameters(parametersInfos); - HttpEntity httpEntity = new HttpEntity<>(parameters, headers); + HttpHeaders headers = new HttpHeaders(); + HttpEntity httpEntity = new HttpEntity<>(parameters, headers); return restTemplate.postForObject(sensitivityAnalysisServerBaseUri + path, httpEntity, UUID.class); } @@ -302,16 +311,16 @@ public UUID duplicateSensitivityAnalysisParameters(UUID sourceParametersUuid, St return restTemplate.postForObject(sensitivityAnalysisServerBaseUri + path, httpEntity, UUID.class); } - public void updateSensitivityAnalysisParameters(UUID parametersUuid, @Nullable String parameters) { + public void updateSensitivityAnalysisParameters(UUID parametersUuid, @Nullable SensitivityAnalysisParametersInfos parametersInfos) { var path = UriComponentsBuilder .fromPath(DELIMITER + SENSITIVITY_ANALYSIS_API_VERSION + PARAMETERS_URI) .buildAndExpand(parametersUuid) .toUriString(); + SensitivityAnalysisParameters parameters = parametersMapper.getParameters(parametersInfos); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity httpEntity = new HttpEntity<>(parameters, headers); + HttpEntity httpEntity = new HttpEntity<>(parameters, headers); restTemplate.put(sensitivityAnalysisServerBaseUri + path, httpEntity); } diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index 1d1bd28ead..222be07c97 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -31,6 +31,7 @@ import org.gridsuite.study.server.dto.networkexport.ExportNetworkStatus; import org.gridsuite.study.server.dto.networkexport.NodeExportInfos; import org.gridsuite.study.server.dto.networkexport.PermissionType; +import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisParametersInfos; import org.gridsuite.study.server.dto.sequence.NodeSequenceType; import org.gridsuite.study.server.dto.voltageinit.ContextInfos; import org.gridsuite.study.server.dto.voltageinit.parameters.StudyVoltageInitParameters; @@ -1194,7 +1195,7 @@ public LoadFlowParametersInfos getLoadFlowParametersInfos(StudyEntity studyEntit } @Transactional - public String getSecurityAnalysisParametersValues(UUID studyUuid, String userId) { + public String getSecurityAnalysisParametersValues(UUID studyUuid, String userId) throws JsonProcessingException { StudyEntity studyEntity = getStudy(studyUuid); return securityAnalysisService.getSecurityAnalysisParameters(securityAnalysisService.getSecurityAnalysisParametersUuidOrElseCreateDefaults(studyEntity), userId); } @@ -3308,15 +3309,13 @@ public void insertVoltageInitModifications(UUID studyUuid, UUID nodeUuid, UUID r } @Transactional - public String getSensitivityAnalysisParameters(UUID studyUuid, String userId) { + public SensitivityAnalysisParametersInfos getSensitivityAnalysisParameters(UUID studyUuid) { StudyEntity studyEntity = getStudy(studyUuid); - return sensitivityAnalysisService.getSensitivityAnalysisParameters( - sensitivityAnalysisService.getSensitivityAnalysisParametersUuidOrElseCreateDefault(studyEntity), - userId); + return sensitivityAnalysisService.getSensitivityAnalysisParameters(sensitivityAnalysisService.getSensitivityAnalysisParametersUuidOrElseCreateDefault(studyEntity)); } @Transactional - public boolean setSensitivityAnalysisParameters(UUID studyUuid, String parameters, String userId) { + public boolean setSensitivityAnalysisParameters(UUID studyUuid, SensitivityAnalysisParametersInfos parameters, String userId) { StudyEntity studyEntity = getStudy(studyUuid); boolean userProfileIssue = createOrUpdateSensitivityAnalysisParameters(studyEntity, parameters, userId); invalidateSensitivityAnalysisStatusOnAllNodes(studyUuid); @@ -3326,7 +3325,7 @@ public boolean setSensitivityAnalysisParameters(UUID studyUuid, String parameter return userProfileIssue; } - public boolean createOrUpdateSensitivityAnalysisParameters(StudyEntity studyEntity, String parameters, String userId) { + public boolean createOrUpdateSensitivityAnalysisParameters(StudyEntity studyEntity, SensitivityAnalysisParametersInfos parameters, String userId) { boolean userProfileIssue = false; UUID existingSensitivityAnalysisParametersUuid = studyEntity.getSensitivityAnalysisParametersUuid(); UserProfileInfos userProfileInfos = parameters == null ? userAdminService.getUserProfile(userId) : null;