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
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ public SecurityAnalysisController(SecurityAnalysisService securityAnalysisServic
schema = @Schema(implementation = SecurityAnalysisResult.class))})})
public ResponseEntity<SecurityAnalysisResult> run(@Parameter(description = "Network UUID") @PathVariable("networkUuid") UUID networkUuid,
@Parameter(description = "Variant Id") @RequestParam(name = "variantId", required = false) String variantId,
@Parameter(description = "Contingency list name") @RequestParam(name = "contingencyListName", required = false) List<String> contigencyListNames,
@Parameter(description = "Provider") @RequestParam(name = "provider", required = false) String provider,
@Parameter(description = "reportUuid") @RequestParam(name = "reportUuid", required = false) UUID reportUuid,
@Parameter(description = "reporterId") @RequestParam(name = "reporterId", required = false) String reporterId,
Expand All @@ -79,22 +78,21 @@ public ResponseEntity<SecurityAnalysisResult> run(@Parameter(description = "Netw
securityAnalysisParametersService.createRunContext(
networkUuid,
variantId,
new RunContextParametersInfos(contigencyListNames, parametersUuid, loadFlowParametersUuid),
new RunContextParametersInfos(parametersUuid, loadFlowParametersUuid),
null,
new ReportInfos(reportUuid, reporterId, reportType),
userId));
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result);
}

@PostMapping(value = "/networks/{networkUuid}/run-and-save", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
@PostMapping(value = "/networks/{networkUuid}/run-and-save", produces = APPLICATION_JSON_VALUE)
@Operation(summary = "Run a security analysis on a network and save results in the database")
@ApiResponses(value = {@ApiResponse(responseCode = "200",
description = "The security analysis has been performed and results have been saved to database",
content = {@Content(mediaType = APPLICATION_JSON_VALUE,
schema = @Schema(implementation = SecurityAnalysisResult.class))})})
public ResponseEntity<UUID> runAndSave(@Parameter(description = "Network UUID") @PathVariable("networkUuid") UUID networkUuid,
@Parameter(description = "Variant Id") @RequestParam(name = "variantId", required = false) String variantId,
@Parameter(description = "Contingency list name") @RequestParam(name = "contingencyListName", required = false) List<String> contigencyListNames,
@Parameter(description = "Result receiver") @RequestParam(name = "receiver", required = false) String receiver,
@Parameter(description = "reportUuid") @RequestParam(name = "reportUuid", required = false) UUID reportUuid,
@Parameter(description = "reporterId") @RequestParam(name = "reporterId", required = false) String reporterId,
Expand All @@ -106,7 +104,7 @@ public ResponseEntity<UUID> runAndSave(@Parameter(description = "Network UUID")
securityAnalysisParametersService.createRunContext(
networkUuid,
variantId,
new RunContextParametersInfos(contigencyListNames, parametersUuid, loadFlowParametersUuid),
new RunContextParametersInfos(parametersUuid, loadFlowParametersUuid),
receiver,
new ReportInfos(reportUuid, reporterId, reportType),
userId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.gridsuite.securityanalysis.server.dto.LimitReductionsByVoltageLevel;
import org.gridsuite.securityanalysis.server.dto.SecurityAnalysisParametersValues;
import org.gridsuite.securityanalysis.server.dto.parameters.LimitReductionsByVoltageLevel;
import org.gridsuite.securityanalysis.server.dto.parameters.SecurityAnalysisParametersValues;
import org.gridsuite.securityanalysis.server.service.SecurityAnalysisParametersService;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
Expand All @@ -21,6 +21,8 @@
import java.util.List;
import java.util.UUID;

import static org.gridsuite.computation.service.NotificationService.HEADER_USER_ID;

/**
* @author Abdelsalem Hedhili <abdelsalem.hedhili at rte-france.com>
*/
Expand Down Expand Up @@ -57,8 +59,9 @@ public ResponseEntity<UUID> createDefaultParameters() {
@ApiResponse(responseCode = "200", description = "parameters were duplicated"),
@ApiResponse(responseCode = "404", description = "source parameters were not found")})
public ResponseEntity<UUID> duplicateParameters(
@Parameter(description = "source parameters UUID") @RequestParam(name = "duplicateFrom") UUID sourceParametersUuid) {
return parametersService.duplicateParameters(sourceParametersUuid).map(duplicatedParametersUuid -> ResponseEntity.ok()
@Parameter(description = "source parameters UUID") @RequestParam(name = "duplicateFrom") UUID sourceParametersUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
return parametersService.duplicateParameters(sourceParametersUuid, userId).map(duplicatedParametersUuid -> ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(duplicatedParametersUuid))
.orElse(ResponseEntity.notFound().build());
Expand All @@ -70,8 +73,9 @@ public ResponseEntity<UUID> duplicateParameters(
@ApiResponse(responseCode = "200", description = "parameters were returned"),
@ApiResponse(responseCode = "404", description = "parameters were not found")})
public ResponseEntity<SecurityAnalysisParametersValues> getParameters(
@Parameter(description = "parameters UUID") @PathVariable(value = "uuid") UUID parametersUuid) {
return parametersService.getParameters(parametersUuid)
@Parameter(description = "parameters UUID") @PathVariable(value = "uuid") UUID parametersUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
return parametersService.getParameters(parametersUuid, userId)
.map(parametersValues -> ResponseEntity.ok().body(parametersValues))
.orElse(ResponseEntity.notFound().build());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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.securityanalysis.server.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.UUID;

/**
* partial type from ElementAttributes (Directory-server)
* @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>}
*/
@AllArgsConstructor
@NoArgsConstructor
public class ElementAttributes {
@Getter
private UUID elementUuid;
@Setter
@Getter
private String elementName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;
import java.util.UUID;

/**
Expand All @@ -20,8 +19,6 @@
@Getter
@Schema(description = "to help create a securityAnalysisRunContext")
public class RunContextParametersInfos {
private List<String> contingencyListNames;

private UUID securityAnalysisParametersUuid;

private UUID loadFlowParametersUuid;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@
import lombok.Builder;

import java.util.List;
import java.util.UUID;

@Builder
public record SecurityAnalysisParametersDTO(
SecurityAnalysisParameters securityAnalysisParameters,
List<UUID> contingencyListUuids,
List<List<Double>> limitReductions
) { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* 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.securityanalysis.server.dto.parameters;
import lombok.*;

import java.util.List;

/**
* @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>}
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ContingencyListsInfos {
private List<IdNameInfos> contingencyLists;
private String description;
private boolean activated;
}
Original file line number Diff line number Diff line change
@@ -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.securityanalysis.server.dto.parameters;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.UUID;

/**
* @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>}
*/
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class IdNameInfos {
private UUID id;
private String name;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* 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.securityanalysis.server.dto;
package org.gridsuite.securityanalysis.server.dto.parameters;

import lombok.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
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.securityanalysis.server.dto;
package org.gridsuite.securityanalysis.server.dto.parameters;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
Expand Down Expand Up @@ -36,6 +36,8 @@ public class SecurityAnalysisParametersValues {

private double flowProportionalThreshold;

private List<ContingencyListsInfos> contingencyListsInfos;

private List<LimitReductionsByVoltageLevel> limitReductions;

public SecurityAnalysisParametersEntity toEntity() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public ContingencyEntity(String contingencyId, String status, List<ContingencyEl
private UUID uuid;

private String contingencyId;

@Setter
@ManyToOne(fetch = FetchType.LAZY)
private SecurityAnalysisResultEntity result;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/**
* 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.securityanalysis.server.entities;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;
import java.util.UUID;

/**
* @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>}
*/
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "parameters_contingency_lists", indexes = {@Index(name = "idx_parameters_contingency_lists_security_analysis_parameters_id", columnList = "security_analysis_parameters_id")})
public class ParametersContingencyListEntity {

@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "id")
private UUID id;

@ElementCollection
@CollectionTable(
name = "parameters_contingency_lists_contingency_list",
joinColumns = @JoinColumn(name = "parameters_contingency_lists_id"),
foreignKey = @ForeignKey(name = "parameters_contingency_lists_id_fk")
)
@Column(name = "contingency_list_id")
private List<UUID> contingencyListIds;

@Column(name = "description")
private String description;

@Column(name = "activated")
private boolean activated;

@ManyToOne
@JoinColumn(name = "security_analysis_parameters_id", foreignKey = @ForeignKey(name = "security_analysis_parameters_id_fk"))
private SecurityAnalysisParametersEntity securityAnalysisParameters;

public ParametersContingencyListEntity(List<UUID> contingencyListIds, String description, boolean activated) {
this.contingencyListIds = contingencyListIds;
this.description = description;
this.activated = activated;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@

import jakarta.persistence.*;
import lombok.*;
import org.gridsuite.securityanalysis.server.dto.SecurityAnalysisParametersValues;
import org.gridsuite.securityanalysis.server.dto.parameters.IdNameInfos;
import org.gridsuite.securityanalysis.server.dto.parameters.ContingencyListsInfos;
import org.gridsuite.securityanalysis.server.dto.parameters.SecurityAnalysisParametersValues;
import org.springframework.lang.Nullable;

import java.util.ArrayList;
Expand Down Expand Up @@ -55,11 +57,25 @@ public SecurityAnalysisParametersEntity(SecurityAnalysisParametersValues securit
@Column(name = "flowProportionalThreshold")
private double flowProportionalThreshold;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "securityAnalysisParameters")
@OrderColumn(name = "index")
private List<ParametersContingencyListEntity> contingencyLists;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "security_analysis_parameters_id", foreignKey = @ForeignKey(name = "securityAnalysisParametersEntity_limitReductions_fk"))
@OrderColumn(name = "index")
private List<LimitReductionEntity> limitReductions;

public List<UUID> getActivatedContingencyListUuids() {
if (contingencyLists == null) {
return List.of();
}
return this.contingencyLists.stream()
.filter(ParametersContingencyListEntity::isActivated)
.flatMap(contingencyList -> contingencyList.getContingencyListIds().stream())
.toList();
}

public List<List<Double>> toLimitReductionsValues() {
return this.limitReductions.stream().map(LimitReductionEntity::getReductions).map(ArrayList::new).collect(Collectors.toList());
}
Expand All @@ -75,9 +91,37 @@ private void assignAttributes(SecurityAnalysisParametersValues securityAnalysisP
this.highVoltageProportionalThreshold = securityAnalysisParametersValues.getHighVoltageProportionalThreshold();
this.lowVoltageAbsoluteThreshold = securityAnalysisParametersValues.getLowVoltageAbsoluteThreshold();
this.lowVoltageProportionalThreshold = securityAnalysisParametersValues.getLowVoltageProportionalThreshold();
assignContingencyLists(securityAnalysisParametersValues.getContingencyListsInfos());
assignLimitReductions(securityAnalysisParametersValues.getLimitReductionsValues());
}

private void assignContingencyLists(List<ContingencyListsInfos> contingencyListsInfos) {
if (contingencyListsInfos == null) {
return;
}

List<ParametersContingencyListEntity> entities = contingencyListsInfos.stream()
.map(listsInfos -> {
List<UUID> contingencyListIds = listsInfos.getContingencyLists().stream()
.map(IdNameInfos::getId)
.toList();
ParametersContingencyListEntity entity = new ParametersContingencyListEntity(
contingencyListIds,
listsInfos.getDescription(),
listsInfos.isActivated()
);
entity.setSecurityAnalysisParameters(this);
return entity;
})
.toList();
if (contingencyLists == null) {
contingencyLists = entities;
} else {
contingencyLists.clear();
contingencyLists.addAll(entities);
}
}

private void assignLimitReductions(@Nullable List<List<Double>> values) {
if (values == null) {
return;
Expand All @@ -95,4 +139,3 @@ public void updateProvider(String provider) {
this.provider = provider;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public ActionsService(
this.restTemplate = restTemplate;
}

public List<ContingencyInfos> getContingencyList(List<String> ids, UUID networkUuid, String variantId) {
public List<ContingencyInfos> getContingencyList(List<UUID> ids, UUID networkUuid, String variantId) {
Objects.requireNonNull(ids);
Objects.requireNonNull(networkUuid);
if (ids.isEmpty()) {
Expand Down
Loading