Skip to content

Commit 6dd82ad

Browse files
authored
Handle and get dynamically enum filter (#544)
Signed-off-by: Rehili Ghazwa <[email protected]>
1 parent e4e2c45 commit 6dd82ad

File tree

9 files changed

+142
-9
lines changed

9 files changed

+142
-9
lines changed

src/main/java/org/gridsuite/study/server/StudyController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,16 @@ public ResponseEntity<List<LimitViolationInfos>> getLimitViolations(@Parameter(d
850850
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.getLimitViolations(studyUuid, nodeUuid, filters, globalFilters, sort));
851851
}
852852

853+
@GetMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values")
854+
@Operation(summary = "Get Enum values")
855+
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The Enum values")})
856+
public ResponseEntity<List<String>> getResultEnumValues(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid,
857+
@Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid,
858+
@Parameter(description = "Computing Type") @RequestParam(name = "computingType") ComputationType computingType,
859+
@Parameter(description = "Enum name") @RequestParam(name = "enumName") String enumName) {
860+
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.getResultEnumValues(studyUuid, nodeUuid, computingType, enumName));
861+
}
862+
853863
@PostMapping(value = "/studies/{studyUuid}/loadflow/parameters")
854864
@Operation(summary = "set loadflow parameters on study, reset to default ones if empty body")
855865
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow parameters are set"),

src/main/java/org/gridsuite/study/server/service/LoadFlowService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.gridsuite.study.server.StudyException;
1515
import org.gridsuite.study.server.dto.*;
1616
import org.gridsuite.study.server.repository.StudyEntity;
17+
import org.gridsuite.study.server.service.common.AbstractComputationService;
1718
import org.springframework.beans.factory.annotation.Autowired;
1819
import org.springframework.core.ParameterizedTypeReference;
1920
import org.springframework.data.domain.Sort;
@@ -37,7 +38,7 @@
3738
* @author Kevin Le Saulnier <kevin.lesaulnier at rte-france.com>
3839
*/
3940
@Service
40-
public class LoadFlowService {
41+
public class LoadFlowService extends AbstractComputationService {
4142

4243
static final String RESULT_UUID = "resultUuid";
4344
private static final String PARAMETERS_URI = "/parameters/{parametersUuid}";
@@ -374,4 +375,8 @@ public UUID getLoadFlowParametersOrDefaultsUuid(StudyEntity studyEntity) {
374375
}
375376
return studyEntity.getLoadFlowParametersUuid();
376377
}
378+
379+
public List<String> getEnumValues(String enumName, UUID resultUuid) {
380+
return getEnumValues(enumName, resultUuid, LOADFLOW_API_VERSION, loadFlowServerBaseUri, LOADFLOW_NOT_FOUND, restTemplate);
381+
}
377382
}

src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.gridsuite.study.server.StudyException;
1515
import org.gridsuite.study.server.dto.*;
1616
import org.gridsuite.study.server.repository.StudyEntity;
17+
import org.gridsuite.study.server.service.common.AbstractComputationService;
1718
import org.gridsuite.study.server.service.securityanalysis.SecurityAnalysisResultType;
1819
import org.springframework.beans.factory.annotation.Autowired;
1920
import org.springframework.data.domain.Pageable;
@@ -40,7 +41,7 @@
4041
* @author Kevin Le Saulnier <kevin.lesaulnier at rte-france.com>
4142
*/
4243
@Service
43-
public class SecurityAnalysisService {
44+
public class SecurityAnalysisService extends AbstractComputationService {
4445

4546
static final String RESULT_UUID = "resultUuid";
4647

@@ -394,4 +395,8 @@ public String getSecurityAnalysisDefaultProvider() {
394395
throw handleHttpError(e, GET_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED);
395396
}
396397
}
398+
399+
public List<String> getEnumValues(String enumName, UUID resultUuid) {
400+
return getEnumValues(enumName, resultUuid, SECURITY_ANALYSIS_API_VERSION, securityAnalysisServerBaseUri, SECURITY_ANALYSIS_NOT_FOUND, restTemplate);
401+
}
397402
}

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,6 +1044,23 @@ void updateComputationResultUuid(UUID nodeUuid, UUID computationResultUuid, Comp
10441044
networkModificationTreeService.updateComputationResultUuid(nodeUuid, computationResultUuid, computationType);
10451045
}
10461046

1047+
public List<String> getResultEnumValues(UUID studyUuid, UUID nodeUuid, ComputationType computationType, String enumName) {
1048+
Objects.requireNonNull(studyUuid);
1049+
Objects.requireNonNull(nodeUuid);
1050+
Objects.requireNonNull(enumName);
1051+
Optional<UUID> resultUuidOpt = networkModificationTreeService.getComputationResultUuid(nodeUuid, computationType);
1052+
if (resultUuidOpt.isPresent()) {
1053+
return switch (computationType) {
1054+
case LOAD_FLOW -> loadflowService.getEnumValues(enumName, resultUuidOpt.get());
1055+
case SECURITY_ANALYSIS -> securityAnalysisService.getEnumValues(enumName, resultUuidOpt.get());
1056+
case SHORT_CIRCUIT -> shortCircuitService.getEnumValues(enumName, resultUuidOpt.get());
1057+
default -> throw new StudyException(NOT_ALLOWED);
1058+
};
1059+
} else {
1060+
return new ArrayList<>();
1061+
}
1062+
}
1063+
10471064
private StudyCreationRequestEntity insertStudyCreationRequestEntity(UUID studyUuid) {
10481065
StudyCreationRequestEntity studyCreationRequestEntity = new StudyCreationRequestEntity(
10491066
studyUuid == null ? UUID.randomUUID() : studyUuid);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.gridsuite.study.server.service.common;
2+
3+
import org.gridsuite.study.server.StudyException;
4+
import org.springframework.core.ParameterizedTypeReference;
5+
import org.springframework.http.HttpMethod;
6+
import org.springframework.http.HttpStatus;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.client.HttpStatusCodeException;
9+
import org.springframework.web.client.RestTemplate;
10+
import org.springframework.web.util.UriComponentsBuilder;
11+
12+
import java.util.List;
13+
import java.util.UUID;
14+
15+
import static org.gridsuite.study.server.StudyConstants.DELIMITER;
16+
17+
public abstract class AbstractComputationService {
18+
19+
public abstract List<String> getEnumValues(String enumName, UUID resultUuidOpt);
20+
21+
public List<String> getEnumValues(String enumName, UUID resultUuid, String apiVersion, String computingTypeBaseUri, StudyException.Type type, RestTemplate restTemplate) {
22+
List<String> result;
23+
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + apiVersion + "/results/{resultUuid}/{enumName}");
24+
String path = uriComponentsBuilder.buildAndExpand(resultUuid, enumName).toUriString();
25+
try {
26+
ResponseEntity<List<String>> responseEntity = restTemplate.exchange(computingTypeBaseUri + path, HttpMethod.GET, null, new ParameterizedTypeReference<>() { });
27+
result = responseEntity.getBody();
28+
} catch (HttpStatusCodeException e) {
29+
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
30+
throw new StudyException(type);
31+
}
32+
throw e;
33+
}
34+
return result;
35+
}
36+
}

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,12 @@
1616
import org.apache.commons.lang3.StringUtils;
1717
import org.gridsuite.study.server.RemoteServicesProperties;
1818
import org.gridsuite.study.server.StudyException;
19-
import org.gridsuite.study.server.dto.ComputationType;
20-
import org.gridsuite.study.server.dto.NodeReceiver;
21-
import org.gridsuite.study.server.dto.ShortCircuitParametersInfos;
22-
import org.gridsuite.study.server.dto.ShortCircuitPredefinedConfiguration;
23-
import org.gridsuite.study.server.dto.ShortCircuitStatus;
19+
import org.gridsuite.study.server.dto.*;
2420
import org.gridsuite.study.server.repository.ShortCircuitParametersEntity;
2521
import org.gridsuite.study.server.service.NetworkModificationTreeService;
2622
import org.gridsuite.study.server.service.NetworkService;
2723
import org.gridsuite.study.server.service.StudyService;
24+
import org.gridsuite.study.server.service.common.AbstractComputationService;
2825
import org.springframework.beans.factory.annotation.Autowired;
2926
import org.springframework.data.domain.Pageable;
3027
import org.springframework.http.*;
@@ -37,7 +34,10 @@
3734
import java.net.URI;
3835
import java.net.URLEncoder;
3936
import java.nio.charset.StandardCharsets;
40-
import java.util.*;
37+
import java.util.List;
38+
import java.util.Objects;
39+
import java.util.Optional;
40+
import java.util.UUID;
4141

4242
import static org.gridsuite.study.server.StudyConstants.*;
4343
import static org.gridsuite.study.server.StudyException.Type.*;
@@ -49,7 +49,7 @@
4949
* @author Abdelsalem Hedhili <abdelsalem.hedhili at rte-france.com>
5050
*/
5151
@Service
52-
public class ShortCircuitService {
52+
public class ShortCircuitService extends AbstractComputationService {
5353

5454
static final String RESULT_UUID = "resultUuid";
5555

@@ -364,4 +364,7 @@ public void invalidateShortCircuitStatus(List<UUID> uuids) {
364364
}
365365
}
366366

367+
public List<String> getEnumValues(String enumName, UUID resultUuid) {
368+
return getEnumValues(enumName, resultUuid, SHORT_CIRCUIT_API_VERSION, shortCircuitServerBaseUri, SHORT_CIRCUIT_ANALYSIS_NOT_FOUND, restTemplate);
369+
}
367370
}

src/test/java/org/gridsuite/study/server/LoadFlowTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ public class LoadFlowTest {
128128

129129
private static String LIMIT_VIOLATIONS_JSON;
130130

131+
private static String COMPUTING_STATUS_JSON;
132+
131133
private static String LOADFLOW_DEFAULT_PARAMETERS_JSON;
132134

133135
//output destinations
@@ -214,6 +216,7 @@ public void setup() throws IOException {
214216
.limitType(LimitViolationType.HIGH_VOLTAGE)
215217
.build());
216218
LIMIT_VIOLATIONS_JSON = objectMapper.writeValueAsString(limitViolations);
219+
COMPUTING_STATUS_JSON = objectMapper.writeValueAsString(List.of("CONVERGED", "FAILED"));
217220

218221
LoadFlowParametersInfos loadFlowParametersInfos = LoadFlowParametersInfos.builder()
219222
.provider(PROVIDER)
@@ -260,6 +263,11 @@ public MockResponse dispatch(RecordedRequest request) {
260263
} else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/limit-violations\\?filters=.*globalFilters=.*networkUuid=.*variantId.*sort=.*")) {
261264
return new MockResponse().setResponseCode(200).setBody(LIMIT_VIOLATIONS_JSON)
262265
.addHeader("Content-Type", "application/json; charset=utf-8");
266+
} else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation-status")) {
267+
return new MockResponse().setResponseCode(200).setBody(COMPUTING_STATUS_JSON)
268+
.addHeader("Content-Type", "application/json; charset=utf-8");
269+
} else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation")) {
270+
return new MockResponse().setResponseCode(404);
263271
} else if (path.matches("/v1/results/invalidate-status\\?resultUuid=" + LOADFLOW_RESULT_UUID)) {
264272
return new MockResponse().setResponseCode(200)
265273
.addHeader("Content-Type", "application/json; charset=utf-8");
@@ -412,6 +420,19 @@ public void testGetLimitViolations() throws Exception {
412420
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
413421
assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2 + "&limitReduction=0.7")));
414422

423+
// get computing status
424+
mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}",
425+
studyNameUserIdUuid, modificationNode1Uuid, LOAD_FLOW, "computation-status"))
426+
.andExpectAll(status().isOk(),
427+
content().string(COMPUTING_STATUS_JSON));
428+
429+
assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation-status")));
430+
431+
mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}",
432+
studyNameUserIdUuid, modificationNode1Uuid, LOAD_FLOW, "computation")).andReturn();
433+
434+
assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation")));
435+
415436
// get limit violations
416437
mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/limit-violations", studyNameUserIdUuid, modificationNode1Uuid)).andExpectAll(
417438
status().isOk(),

0 commit comments

Comments
 (0)