Skip to content

Commit 3ac7d11

Browse files
big fix
1 parent 8642a3a commit 3ac7d11

File tree

8 files changed

+147
-226
lines changed

8 files changed

+147
-226
lines changed

src/main/java/org/gridsuite/shortcircuit/server/ParametersController.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ public ResponseEntity<ShortCircuitParametersInfos> getParameters(@Parameter(desc
3434
}
3535

3636
@PostMapping(produces = TEXT_PLAIN_VALUE, consumes = APPLICATION_JSON_VALUE)
37-
@Operation(summary = "Create a new set of parameters for an analysis using default parameters as base")
37+
@Operation(summary = "Create a new set of parameters for an analysis using default parameters if none given")
3838
@ApiResponse(responseCode = "200", description = "The new parameters entity ID")
39-
public ResponseEntity<UUID> createParameters(@Parameter(description = "Modifications on top of the default parameters", schema = @Schema(implementation = ShortCircuitParametersInfos.class))
40-
@RequestBody(required = false) String parametersPatch) {
41-
return ResponseEntity.ok(shortCircuitService.createParameters(parametersPatch));
39+
public ResponseEntity<UUID> createParameters(@Parameter(description = "Parameters to save instead of default ones", schema = @Schema(implementation = ShortCircuitParametersInfos.class))
40+
@RequestBody(required = false) ShortCircuitParametersInfos parameters) {
41+
return ResponseEntity.ok(shortCircuitService.createParameters(parameters));
4242
}
4343

4444
@PostMapping(params = { "duplicateFrom" }, produces = TEXT_PLAIN_VALUE)
@@ -61,10 +61,10 @@ public ResponseEntity<Void> deleteParameters(@Parameter(description = "UUID of p
6161
@Operation(summary = "Update a set of parameters for an analysis or reset them to default ones")
6262
@ApiResponse(responseCode = "204", description = "The parameters are successfully updated")
6363
@ApiResponse(responseCode = "404", description = "The parameters don't exists")
64-
public ResponseEntity<Void> updateParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid,
65-
@Parameter(description = "Modifications on top of the parameters referenced by parametersUuid", schema = @Schema(implementation = ShortCircuitParametersInfos.class))
66-
@RequestBody(required = false) String parametersPatch) {
67-
if (shortCircuitService.updateParameters(parametersUuid, parametersPatch)) {
64+
public ResponseEntity<Void> updateOrResetParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid,
65+
@Parameter(description = "Parameters to save instead of default ones", schema = @Schema(implementation = ShortCircuitParametersInfos.class))
66+
@RequestBody(required = false) ShortCircuitParametersInfos parameters) {
67+
if (shortCircuitService.updateOrResetParameters(parametersUuid, parameters)) {
6868
return ResponseEntity.noContent().build();
6969
} else {
7070
return ResponseEntity.notFound().build();

src/main/java/org/gridsuite/shortcircuit/server/ShortCircuitController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.web.bind.annotation.*;
2525

2626
import java.util.List;
27+
import java.util.Optional;
2728
import java.util.UUID;
2829

2930
import static com.powsybl.shortcircuit.Fault.FaultType;
@@ -53,11 +54,11 @@ public ResponseEntity<UUID> runAndSave(@Parameter(description = "Network UUID")
5354
@Parameter(description = "reporterId") @RequestParam(name = "reporterId", required = false) String reporterId,
5455
@Parameter(description = "The type name for the report") @RequestParam(name = "reportType", required = false) String reportType,
5556
@Parameter(description = "Bus Id - Used for analysis targeting one bus") @RequestParam(name = "busId", required = false) String busId,
56-
@Parameter(description = "ID of parameters to use") @RequestParam(name = "parametersUuid", required = false) UUID parametersUuid,
57+
@Parameter(description = "ID of parameters to use") @RequestParam(name = "parametersUuid", required = false) Optional<UUID> parametersUuid,
5758
@Parameter(description = "Parameters (full or partial) to use on top of the ones designed by parametersUuid", schema = @Schema(implementation = ShortCircuitParameters.class))
58-
@RequestBody(required = false) String parametersPatch,
59+
@RequestBody(required = false) Optional<ShortCircuitParametersInfos> parameters,
5960
@RequestHeader(HEADER_USER_ID) String userId) {
60-
return ResponseEntity.ok().contentType(TEXT_PLAIN).body(shortCircuitService.runAndSaveResult(networkUuid, variantId, receiver, reportUuid, reporterId, reportType, userId, busId, parametersUuid, parametersPatch));
61+
return ResponseEntity.ok().contentType(TEXT_PLAIN).body(shortCircuitService.runAndSaveResult(networkUuid, variantId, receiver, reportUuid, reporterId, reportType, userId, busId, parametersUuid, parameters));
6162
}
6263

6364
@GetMapping(value = "/results/{resultUuid}", produces = APPLICATION_JSON_VALUE)

src/main/java/org/gridsuite/shortcircuit/server/dto/ShortCircuitParametersInfos.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
*/
77
package org.gridsuite.shortcircuit.server.dto;
88

9-
import com.fasterxml.jackson.annotation.JsonGetter;
9+
import com.fasterxml.jackson.annotation.JsonProperty;
10+
import com.fasterxml.jackson.annotation.JsonProperty.Access;
1011
import com.powsybl.shortcircuit.ShortCircuitParameters;
1112
import com.powsybl.shortcircuit.VoltageRange;
1213
import lombok.Builder;
@@ -25,7 +26,7 @@ public record ShortCircuitParametersInfos(
2526
ShortCircuitPredefinedConfiguration predefinedParameters,
2627
ShortCircuitParameters parameters
2728
) {
28-
@JsonGetter
29+
@JsonProperty(access = Access.READ_ONLY)
2930
public List<VoltageRange> cei909VoltageRanges() {
3031
return ShortCircuitService.CEI909_VOLTAGE_PROFILE;
3132
}

src/main/java/org/gridsuite/shortcircuit/server/entities/AnalysisParametersEntity.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.powsybl.shortcircuit.StudyType;
1111
import jakarta.persistence.*;
1212
import lombok.*;
13+
import lombok.experimental.Accessors;
1314
import org.gridsuite.shortcircuit.server.dto.ShortCircuitPredefinedConfiguration;
1415

1516
import java.util.UUID;
@@ -21,6 +22,7 @@
2122
@Builder
2223
@NoArgsConstructor
2324
@AllArgsConstructor
25+
@Accessors(chain = true)
2426
@Getter
2527
@Setter
2628
@Entity

src/main/java/org/gridsuite/shortcircuit/server/service/ShortCircuitService.java

Lines changed: 11 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import com.univocity.parsers.csv.CsvWriter;
1616
import com.univocity.parsers.csv.CsvWriterSettings;
1717
import jakarta.persistence.EntityManager;
18-
import lombok.SneakyThrows;
1918
import org.apache.commons.lang3.StringUtils;
2019
import org.gridsuite.shortcircuit.server.ShortCircuitException;
2120
import org.gridsuite.shortcircuit.server.computation.service.AbstractComputationService;
@@ -69,17 +68,12 @@ public ShortCircuitService(final NotificationService notificationService, final
6968
this.entityManager = entityManager;
7069
}
7170

72-
@SneakyThrows
7371
public UUID runAndSaveResult(UUID networkUuid, String variantId, String receiver, UUID reportUuid, String reporterId, String reportType,
74-
String userId, String busId, @Nullable final UUID parametersUuid, @Nullable final String parametersPatch) {
75-
ShortCircuitParameters parameters = Optional.ofNullable(parametersUuid)
76-
.flatMap(parametersRepository::findById)
77-
.map(ShortCircuitService::fromEntity)
78-
.map(ShortCircuitParametersInfos::parameters)
79-
.orElseGet(() -> getDefaultDtoParameters().parameters());
80-
if (parametersPatch != null) {
81-
parameters = updateDto(parameters, parametersPatch);
82-
}
72+
String userId, String busId, final Optional<UUID> parametersUuid, final Optional<ShortCircuitParametersInfos> givenParameters) {
73+
ShortCircuitParameters parameters = givenParameters.or(() -> parametersUuid.flatMap(parametersRepository::findById)
74+
.map(ShortCircuitService::fromEntity))
75+
.map(ShortCircuitParametersInfos::parameters)
76+
.orElseGet(() -> getDefaultDtoParameters().parameters());
8377
parameters.setWithFortescueResult(StringUtils.isBlank(busId));
8478
return runAndSaveResult(new ShortCircuitRunContext(networkUuid, variantId, receiver, parameters, reportUuid, reporterId, reportType, userId, null, busId));
8579
}
@@ -183,25 +177,6 @@ private static ShortCircuitParametersInfos getDefaultDtoParameters() {
183177
return fromEntity(new AnalysisParametersEntity());
184178
}
185179

186-
private static void updateEntity(AnalysisParametersEntity parametersEntity, final ShortCircuitParametersInfos parametersInfos) {
187-
parametersEntity.setPredefinedParameters(parametersInfos.predefinedParameters());
188-
final ShortCircuitParameters scParameters = parametersInfos.parameters();
189-
parametersEntity.setWithLimitViolations(scParameters.isWithLimitViolations());
190-
parametersEntity.setWithVoltageResult(scParameters.isWithVoltageResult());
191-
parametersEntity.setWithFortescueResult(scParameters.isWithFortescueResult());
192-
parametersEntity.setWithFeederResult(scParameters.isWithFeederResult());
193-
parametersEntity.setStudyType(scParameters.getStudyType());
194-
parametersEntity.setMinVoltageDropProportionalThreshold(scParameters.getMinVoltageDropProportionalThreshold());
195-
parametersEntity.setWithLoads(scParameters.isWithLoads());
196-
parametersEntity.setWithShuntCompensators(scParameters.isWithShuntCompensators());
197-
parametersEntity.setWithVscConverterStations(scParameters.isWithVSCConverterStations());
198-
parametersEntity.setWithNeutralPosition(scParameters.isWithNeutralPosition());
199-
parametersEntity.setInitialVoltageProfileMode(scParameters.getInitialVoltageProfileMode());
200-
//scParameters.isDetailedReport()
201-
//scParameters.getVoltageRanges()
202-
//scParameters.getSubTransientCoefficient()
203-
}
204-
205180
private static ShortCircuitAnalysisResultEntity sortByElementId(ShortCircuitAnalysisResultEntity result) {
206181
result.setFaultResults(result.getFaultResults().stream()
207182
.sorted(Comparator.comparing(fr -> fr.getFault().getElementId()))
@@ -421,35 +396,21 @@ public Optional<UUID> duplicateParameters(UUID sourceParametersUuid) {
421396
.map(AnalysisParametersEntity::getId);
422397
}
423398

424-
private <T> T updateDto(T parameters, final String parametersPatch) throws IllegalArgumentException, IOException {
425-
return objectMapper.readerForUpdating(parameters).readValue(parametersPatch);
426-
}
427-
428-
@SneakyThrows
429-
public UUID createParameters(@Nullable final String parametersPatch) {
430-
ShortCircuitParametersInfos parameters = getDefaultDtoParameters();
431-
if (parametersPatch != null) {
432-
parameters = updateDto(parameters, parametersPatch);
433-
}
434-
return parametersRepository.save(toEntity(parameters)).getId();
399+
public UUID createParameters(@Nullable final ShortCircuitParametersInfos parameters) {
400+
return parametersRepository.save(parameters != null ? toEntity(parameters) : new AnalysisParametersEntity()).getId();
435401
}
436402

437403
/**
438404
* Use the ability of Jackson to update an object with a partial Json.
439405
*/
440-
@SneakyThrows
441-
public boolean updateParameters(final UUID parametersUuid, @Nullable final String parametersPatch) {
406+
@Transactional
407+
public boolean updateOrResetParameters(final UUID parametersUuid, @Nullable final ShortCircuitParametersInfos givenParameters) {
442408
AnalysisParametersEntity parameters = parametersRepository.findById(parametersUuid).orElse(null);
443409
if (parameters == null) {
444410
return false;
445411
} else {
446-
if (parametersPatch == null) {
447-
// we simply reset
448-
updateEntity(parameters, getDefaultDtoParameters());
449-
} else {
450-
updateEntity(parameters, updateDto(fromEntity(parameters), parametersPatch));
451-
}
452-
parametersRepository.save(parameters);
412+
AnalysisParametersEntity newParameters = givenParameters != null ? toEntity(givenParameters) : new AnalysisParametersEntity();
413+
entityManager.merge(newParameters.setId(parameters.getId()));
453414
return true;
454415
}
455416
}

src/test/java/org/gridsuite/shortcircuit/server/ParametersControllerTest.java

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
import java.util.UUID;
2626
import java.util.stream.Stream;
2727

28-
import static org.mockito.ArgumentMatchers.any;
29-
import static org.mockito.ArgumentMatchers.anyString;
28+
import static org.mockito.ArgumentMatchers.*;
3029
import static org.mockito.Mockito.verify;
3130
import static org.mockito.Mockito.when;
3231
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@@ -75,14 +74,22 @@ void testGetNonExistingParameters() throws Exception {
7574

7675
@Test
7776
void testCreateParameters() throws Exception {
78-
final String arg = "{\"dummy\": \"json\"}";
7977
final UUID returned = UUID.randomUUID();
80-
when(shortCircuitService.createParameters(anyString())).thenReturn(returned);
81-
mockMvc.perform(post("/v1/parameters").content(arg).contentType(MediaType.APPLICATION_JSON))
78+
when(shortCircuitService.createParameters(any(ShortCircuitParametersInfos.class))).thenReturn(returned);
79+
mockMvc.perform(post("/v1/parameters").content(DEFAULT_PARAMETERS_JSON).contentType(MediaType.APPLICATION_JSON))
8280
.andExpectAll(status().isOk(), content().contentType(TEXT_PLAIN_UTF8), content().string(returned.toString()));
83-
final ArgumentCaptor<String> strCaptor = ArgumentCaptor.forClass(String.class);
84-
verify(shortCircuitService).createParameters(strCaptor.capture());
85-
assertThat(strCaptor.getValue()).isEqualTo(arg);
81+
final ArgumentCaptor<ShortCircuitParametersInfos> dtoCaptor = ArgumentCaptor.forClass(ShortCircuitParametersInfos.class);
82+
verify(shortCircuitService).createParameters(dtoCaptor.capture());
83+
assertThat(dtoCaptor.getValue()).isEqualTo(new ShortCircuitParametersInfos(null, null));
84+
}
85+
86+
@Test
87+
void testCreateDefaultParameters() throws Exception {
88+
final UUID returned = UUID.randomUUID();
89+
when(shortCircuitService.createParameters(nullable(ShortCircuitParametersInfos.class))).thenReturn(returned);
90+
mockMvc.perform(post("/v1/parameters"))
91+
.andExpectAll(status().isOk(), content().contentType(TEXT_PLAIN_UTF8), content().string(returned.toString()));
92+
verify(shortCircuitService).createParameters(null);
8693
}
8794

8895
@Test
@@ -108,14 +115,14 @@ void testDuplicateNonExistingParameters() throws Exception {
108115
assertThat(uuidCaptor.getValue()).isEqualTo(arg);
109116
}
110117

111-
static Stream<Arguments> testExistingParametersArgs() {
118+
static Stream<Arguments> testParametersArgs() {
112119
return Stream.of(
113120
Arguments.arguments(true, status().isNoContent()),
114121
Arguments.arguments(false, status().isNotFound())
115122
);
116123
}
117124

118-
@MethodSource("testExistingParametersArgs")
125+
@MethodSource("testParametersArgs")
119126
@ParameterizedTest
120127
void testDeleteParameters(final boolean existing, @NonNull final ResultMatcher statusMatcher) throws Exception {
121128
final UUID arg = UUID.randomUUID();
@@ -127,18 +134,29 @@ void testDeleteParameters(final boolean existing, @NonNull final ResultMatcher s
127134
assertThat(uuidCaptor.getValue()).isEqualTo(arg);
128135
}
129136

130-
@MethodSource("testExistingParametersArgs")
137+
@MethodSource("testParametersArgs")
138+
@ParameterizedTest
139+
void testUpdateParameters(final boolean existing, @NonNull final ResultMatcher statusMatcher) throws Exception {
140+
final UUID arg1 = UUID.randomUUID();
141+
when(shortCircuitService.updateOrResetParameters(any(UUID.class), any(ShortCircuitParametersInfos.class))).thenReturn(existing);
142+
mockMvc.perform(put("/v1/parameters/{pUuid}", arg1.toString()).content(DEFAULT_PARAMETERS_JSON).contentType(MediaType.APPLICATION_JSON))
143+
.andExpectAll(statusMatcher);
144+
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
145+
final ArgumentCaptor<ShortCircuitParametersInfos> dtoCaptor = ArgumentCaptor.forClass(ShortCircuitParametersInfos.class);
146+
verify(shortCircuitService).updateOrResetParameters(uuidCaptor.capture(), dtoCaptor.capture());
147+
assertThat(uuidCaptor.getValue()).isEqualTo(arg1);
148+
assertThat(dtoCaptor.getValue()).isEqualTo(new ShortCircuitParametersInfos(null, null));
149+
}
150+
151+
@MethodSource("testParametersArgs")
131152
@ParameterizedTest
132-
void testUpdateExistingParameters(final boolean existing, @NonNull final ResultMatcher statusMatcher) throws Exception {
153+
void testResetParameters(final boolean existing, @NonNull final ResultMatcher statusMatcher) throws Exception {
133154
final UUID arg1 = UUID.randomUUID();
134-
final String arg2 = "{\"dummy\": \"content\"}";
135-
when(shortCircuitService.updateParameters(any(UUID.class), anyString())).thenReturn(existing);
136-
mockMvc.perform(put("/v1/parameters/{pUuid}", arg1.toString()).content(arg2).contentType(MediaType.APPLICATION_JSON))
155+
when(shortCircuitService.updateOrResetParameters(any(UUID.class), nullable(ShortCircuitParametersInfos.class))).thenReturn(existing);
156+
mockMvc.perform(put("/v1/parameters/{pUuid}", arg1.toString()))
137157
.andExpectAll(statusMatcher);
138158
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
139-
final ArgumentCaptor<String> strCaptor = ArgumentCaptor.forClass(String.class);
140-
verify(shortCircuitService).updateParameters(uuidCaptor.capture(), strCaptor.capture());
159+
verify(shortCircuitService).updateOrResetParameters(uuidCaptor.capture(), isNull());
141160
assertThat(uuidCaptor.getValue()).isEqualTo(arg1);
142-
assertThat(strCaptor.getValue()).isEqualTo(arg2);
143161
}
144162
}

0 commit comments

Comments
 (0)