Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
037b712
refactor(): parameters management adaptation from loadflow-server
sBouzols Oct 30, 2025
963ac7f
Merge remote-tracking branch 'origin/main' into add_specific_parameters
sBouzols Oct 30, 2025
8e86e9e
fix MockitoSpyBean
sBouzols Oct 30, 2025
aa55771
feat(): Add get specific-parameters endpoint
sBouzols Nov 5, 2025
e08b1f6
Merge branch 'main' into add_specific_parameters
sBouzols Nov 5, 2025
c08dcf9
fix unused import
sBouzols Nov 5, 2025
085c7ef
fix TU
sBouzols Nov 6, 2025
f52aeb9
Merge branch 'main' into add_specific_parameters
sBouzols Nov 12, 2025
f80efdb
license header
sBouzols Nov 12, 2025
c489bc9
Merge branch 'add_specific_parameters' of https://github.com/gridsuit…
sBouzols Nov 12, 2025
85b880a
clean code
sBouzols Nov 12, 2025
1d37fa8
tests(SCParameters): Add some test for coverage
sBouzols Nov 12, 2025
9bc46aa
remove unused import
sBouzols Nov 12, 2025
ae15fb0
remove unused entity clone code
sBouzols Nov 12, 2025
502922b
test(): add a test to check duplication of parameters containing spec…
sBouzols Nov 12, 2025
c927c6e
unused import
sBouzols Nov 12, 2025
b7d114a
remove empty test class
sBouzols Nov 12, 2025
4cf9b4b
Merge branch 'main' into add_specific_parameters
sBouzols Nov 17, 2025
73a90f6
fix some sonar issues
sBouzols Nov 17, 2025
c448c5e
Merge branch 'main' into add_specific_parameters
sBouzols Nov 18, 2025
54135e7
refactor from review add ShortCircuitParametersConstants.DEFAULT_PROV…
sBouzols Nov 20, 2025
fb95434
docs(): add author where needed
sBouzols Nov 20, 2025
35c9749
missing >
sBouzols Nov 20, 2025
d353d06
use builder to be clearer
sBouzols Nov 20, 2025
9571657
manage provider following review remark
sBouzols Nov 20, 2025
9dd7904
remove getDefaultParametersValues not used
sBouzols Nov 20, 2025
49f2c9d
remove `lombok.experimental.Accessors` annotation usage
sBouzols Nov 20, 2025
1982e0b
add extension management in `buildParameters`
sBouzols Nov 20, 2025
42cad1b
feat: add default provider management
sBouzols Nov 25, 2025
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 @@ -20,7 +20,7 @@ public class RestResponseEntityExceptionHandler {
@ExceptionHandler(ShortCircuitException.class)
protected ResponseEntity<Object> handleShortCircuitException(ShortCircuitException exception) {
return switch (exception.getType()) {
case RESULT_NOT_FOUND -> ResponseEntity.status(HttpStatus.NOT_FOUND).body(exception.getMessage());
case RESULT_NOT_FOUND, PARAMETERS_NOT_FOUND -> ResponseEntity.status(HttpStatus.NOT_FOUND).body(exception.getMessage());
case INVALID_EXPORT_PARAMS -> ResponseEntity.status(HttpStatus.BAD_REQUEST).body(exception.getMessage());
case BUS_OUT_OF_VOLTAGE, FILE_EXPORT_ERROR, MISSING_EXTENSION_DATA, INCONSISTENT_VOLTAGE_LEVELS ->
ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(exception.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,19 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.powsybl.iidm.network.ThreeSides;
import com.powsybl.security.LimitViolationType;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
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 lombok.AllArgsConstructor;
import org.gridsuite.computation.dto.GlobalFilter;
import org.gridsuite.computation.dto.ReportInfos;
import org.gridsuite.computation.service.UuidGeneratorService;
import org.gridsuite.computation.utils.FilterUtils;
import org.gridsuite.shortcircuit.server.dto.*;
import org.gridsuite.shortcircuit.server.service.ShortCircuitRunContext;
import org.gridsuite.shortcircuit.server.service.ShortCircuitService;
import org.springframework.core.io.Resource;
import org.springframework.data.domain.Page;
Expand All @@ -29,7 +33,6 @@
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

import static com.powsybl.shortcircuit.Fault.FaultType;
Expand All @@ -46,6 +49,7 @@
public class ShortCircuitController {

private final ShortCircuitService shortCircuitService;
private final UuidGeneratorService uuidGeneratorService;
private final ObjectMapper objectMapper;

@PostMapping(value = "/networks/{networkUuid}/run-and-save", produces = APPLICATION_JSON_VALUE)
Expand All @@ -59,9 +63,22 @@ public ResponseEntity<UUID> runAndSave(@Parameter(description = "Network UUID")
@Parameter(description = "The type name for the report") @RequestParam(name = "reportType", required = false) String reportType,
@Parameter(description = "Bus Id - Used for analysis targeting one bus") @RequestParam(name = "busId", required = false) String busId,
@Parameter(description = "Debug") @RequestParam(name = "debug", required = false, defaultValue = "false") boolean debug,
@Parameter(description = "ID of parameters to use, fallback on default ones if none") @RequestParam(name = "parametersUuid") Optional<UUID> parametersUuid,
@Parameter(description = "ID of parameters to use, fallback on default ones if none") @RequestParam(name = "parametersUuid", required = false) UUID parametersUuid,
@Parameter(description = "resultUuid") @RequestParam(name = "resultUuid", required = false) UUID resultUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
return ResponseEntity.ok().contentType(APPLICATION_JSON).body(shortCircuitService.runAndSaveResult(networkUuid, variantId, receiver, reportUuid, reporterId, reportType, userId, busId, debug, parametersUuid));
UUID resultUuidToRun = resultUuid != null ? resultUuid : uuidGeneratorService.generate();
ShortCircuitRunContext shortCircuitRunContext = ShortCircuitRunContext.builder()
.resultUuid(resultUuidToRun)
.networkUuid(networkUuid)
.variantId(variantId)
.receiver(receiver)
.reportInfos(ReportInfos.builder().reportUuid(reportUuid).reporterId(reporterId).computationType(reportType).build())
.userId(userId)
.parametersUuid(parametersUuid)
.busId(busId)
.debug(debug)
.build();
return ResponseEntity.ok().contentType(APPLICATION_JSON).body(shortCircuitService.runAndSaveResult(shortCircuitRunContext));
}

@GetMapping(value = "/results/{resultUuid}", produces = APPLICATION_JSON_VALUE)
Expand Down Expand Up @@ -196,4 +213,11 @@ public ResponseEntity<Resource> downloadDebugFile(@Parameter(description = "Resu
return shortCircuitService.downloadDebugFile(resultUuid);
}

@GetMapping(value = "/default-provider", produces = TEXT_PLAIN_VALUE)
@Operation(summary = "Get shortcircuit default provider")
@ApiResponses(@ApiResponse(responseCode = "200", description = "The short circuit default provider has been found"))
public ResponseEntity<String> getDefaultShortCircuitProvider() {
return ResponseEntity.ok().body(shortCircuitService.getDefaultProvider());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public enum Type {
INVALID_EXPORT_PARAMS,
FILE_EXPORT_ERROR,
MISSING_EXTENSION_DATA,
INCONSISTENT_VOLTAGE_LEVELS
INCONSISTENT_VOLTAGE_LEVELS,
PARAMETERS_NOT_FOUND
}

private final Type type;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,15 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.gridsuite.shortcircuit.server.dto.ShortCircuitParametersInfos;
import org.gridsuite.shortcircuit.server.service.ShortCircuitService;
import org.gridsuite.shortcircuit.server.dto.ShortCircuitParametersValues;
import org.gridsuite.shortcircuit.server.service.ShortCircuitParametersService;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.UUID;

import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
Expand All @@ -26,57 +31,89 @@
public class ShortCircuitParametersController {
public static final String DUPLICATE_FROM = "duplicateFrom";

private final ShortCircuitService shortCircuitService;
private final ShortCircuitParametersService shortCircuitParametersService;

public ShortCircuitParametersController(ShortCircuitService shortCircuitService) {
this.shortCircuitService = shortCircuitService;
public ShortCircuitParametersController(ShortCircuitParametersService shortCircuitParametersService) {
this.shortCircuitParametersService = shortCircuitParametersService;
}

@GetMapping(path = "/{parametersUuid}")
@Operation(summary = "Get the parameters for an analysis")
@ApiResponse(responseCode = "200", description = "The parameters asked")
@ApiResponse(responseCode = "404", description = "The parameters don't exists")
public ResponseEntity<ShortCircuitParametersInfos> getParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid) {
return ResponseEntity.of(shortCircuitService.getParameters(parametersUuid));
return ResponseEntity.of(shortCircuitParametersService.getParameters(parametersUuid));
}

@GetMapping(value = "/{parametersUuid}/values", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Get parameters values")
@ApiResponse(responseCode = "200", description = "parameters values were returned")
@ApiResponse(responseCode = "404", description = "parameters were not found")
public ResponseEntity<ShortCircuitParametersValues> getParametersValues(
@Parameter(description = "parameters UUID") @PathVariable("parametersUuid") UUID parametersUuid,
@Parameter(description = "provider name") @RequestParam("provider") String provider) {
return ResponseEntity.of(shortCircuitParametersService.getParametersValues(parametersUuid, provider));
}

@GetMapping(value = "/specific-parameters")
@Operation(summary = "Get all existing shortcircuit specific parameters for a given provider, or for all of them")
@ApiResponse(responseCode = "200", description = "The shortcircuit model-specific parameters")
public ResponseEntity<Map<String, List<com.powsybl.commons.parameters.Parameter>>> getSpecificShortCircuitParameters(
@Parameter(description = "The model provider") @RequestParam(name = "provider", required = false) String provider) {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON)
.body(ShortCircuitParametersService.getSpecificShortCircuitParameters(provider));
}

@PostMapping(consumes = APPLICATION_JSON_VALUE)
@Operation(summary = "Create a new set of parameters for an analysis using given parameters")
@ApiResponse(responseCode = "200", description = "The new parameters entity ID")
public ResponseEntity<UUID> createParameters(@Parameter(description = "Parameters to save") @RequestBody ShortCircuitParametersInfos parameters) {
return ResponseEntity.ok(shortCircuitService.createParameters(parameters));
return ResponseEntity.ok(shortCircuitParametersService.createParameters(parameters));
}

@PostMapping(path = "/default")
@Operation(summary = "Create a new set of parameters for an analysis using default parameters")
@ApiResponse(responseCode = "200", description = "The new parameters entity ID")
public ResponseEntity<UUID> createDefaultParameters() {
return ResponseEntity.ok(shortCircuitService.createParameters(null));
return ResponseEntity.ok(shortCircuitParametersService.createDefaultParameters());
}

@PostMapping(params = { DUPLICATE_FROM })
@Operation(summary = "Duplicate the parameters of an analysis")
@ApiResponse(responseCode = "200", description = "The new parameters ID")
@ApiResponse(responseCode = "404", description = "The parameters don't exist")
public ResponseEntity<UUID> duplicateParameters(@Parameter(description = "UUID of parameters to duplicate") @RequestParam(name = DUPLICATE_FROM) UUID sourceParametersUuid) {
return ResponseEntity.of(shortCircuitService.duplicateParameters(sourceParametersUuid));
return ResponseEntity.of(shortCircuitParametersService.duplicateParameters(sourceParametersUuid));
}

@DeleteMapping(path = "/{parametersUuid}")
@Operation(summary = "Delete a set of parameters")
@ApiResponse(responseCode = "204", description = "The parameters are successfully deleted")
@ApiResponse(responseCode = "200", description = "The parameters are successfully deleted")
@ApiResponse(responseCode = "404", description = "The parameters don't exists")
public ResponseEntity<Void> deleteParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid) {
return (shortCircuitService.deleteParameters(parametersUuid) ? ResponseEntity.noContent() : ResponseEntity.notFound()).build();
return (shortCircuitParametersService.deleteParameters(parametersUuid) ? ResponseEntity.ok() : ResponseEntity.notFound()).build();
}

@PutMapping(path = "/{parametersUuid}", consumes = APPLICATION_JSON_VALUE)
@Operation(summary = "Update parameters for an analysis or reset them to default ones")
@ApiResponse(responseCode = "204", description = "The parameters are successfully updated")
@ApiResponse(responseCode = "200", description = "The parameters are successfully updated")
@ApiResponse(responseCode = "404", description = "The parameters don't exists")
public ResponseEntity<Void> updateOrResetParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid,
@Parameter(description = "Parameters to save instead of default ones", schema = @Schema(implementation = ShortCircuitParametersInfos.class))
@RequestBody(required = false) ShortCircuitParametersInfos parameters) {
return (shortCircuitService.updateOrResetParameters(parametersUuid, parameters) ? ResponseEntity.noContent() : ResponseEntity.notFound()).build();
try {
shortCircuitParametersService.updateParameters(parametersUuid, parameters);
return ResponseEntity.ok().build();
} catch (NoSuchElementException e) {
return ResponseEntity.notFound().build();
}
}

@GetMapping(value = "/{uuid}/provider")
@Operation(summary = "Get the provider")
@ApiResponse(responseCode = "200", description = "provider were returned")
public ResponseEntity<String> getProvider(
@Parameter(description = "parameters UUID") @PathVariable("uuid") UUID parametersUuid) {
return ResponseEntity.ok().body(shortCircuitParametersService.getProvider(parametersUuid));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

/**
* Specify if the faults are present in the result DTO and if so what they contain
* @author Sylvain Bouzols <sylvain.bouzols at rte-france.com
* @author Sylvain Bouzols <sylvain.bouzols at rte-france.com>
*/
public enum FaultResultsMode {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,30 @@
import com.powsybl.shortcircuit.VoltageRange;
import lombok.Builder;
import lombok.extern.jackson.Jacksonized;
import org.gridsuite.shortcircuit.server.service.ShortCircuitService;

import org.gridsuite.shortcircuit.server.entities.parameters.ShortCircuitParametersConstants;
import org.gridsuite.shortcircuit.server.entities.parameters.ShortCircuitParametersEntity;

import java.util.List;
import java.util.Map;

/**
* @since 1.7.0
* @author Sylvain Bouzols <sylvain.bouzols at rte-france.com>
*/
@Builder
@Jacksonized
public record ShortCircuitParametersInfos(
String provider,
ShortCircuitPredefinedConfiguration predefinedParameters,
ShortCircuitParameters parameters
ShortCircuitParameters commonParameters,
Map<String, Map<String, String>> specificParametersPerProvider
) {
@JsonProperty(access = Access.READ_ONLY)
public List<VoltageRange> cei909VoltageRanges() {
return ShortCircuitService.CEI909_VOLTAGE_PROFILE;
return ShortCircuitParametersConstants.CEI909_VOLTAGE_PROFILE;
}

public ShortCircuitParametersEntity toEntity() {
return new ShortCircuitParametersEntity(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Copyright (c) 2025, 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.shortcircuit.server.dto;

import com.powsybl.shortcircuit.ShortCircuitParameters;
import lombok.Builder;
import java.util.Map;

/**
* @author Sylvain Bouzols <sylvain.bouzols at rte-france.com>
*/
@Builder
public record ShortCircuitParametersValues(
String provider,
ShortCircuitPredefinedConfiguration predefinedParameters,
ShortCircuitParameters commonParameters,
Map<String, String> specificParameters
) {
}
Loading