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
10 changes: 10 additions & 0 deletions src/main/java/org/gridsuite/study/server/StudyController.java
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,16 @@ public ResponseEntity<List<LimitViolationInfos>> getLimitViolations(@Parameter(d
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.getLimitViolations(studyUuid, nodeUuid, filters, globalFilters, sort));
}

@GetMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values")
@Operation(summary = "Get Enum values")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The Enum values")})
public ResponseEntity<List<String>> getResultEnumValues(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid,
@Parameter(description = "Computing Type") @RequestParam(name = "computingType") ComputationType computingType,
@Parameter(description = "Enum name") @RequestParam(name = "enumName") String enumName) {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.getResultEnumValues(studyUuid, nodeUuid, computingType, enumName));
}

@PostMapping(value = "/studies/{studyUuid}/loadflow/parameters")
@Operation(summary = "set loadflow parameters on study, reset to default ones if empty body")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow parameters are set"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.gridsuite.study.server.StudyException;
import org.gridsuite.study.server.dto.*;
import org.gridsuite.study.server.repository.StudyEntity;
import org.gridsuite.study.server.service.common.AbstractComputationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.data.domain.Sort;
Expand All @@ -37,7 +38,7 @@
* @author Kevin Le Saulnier <kevin.lesaulnier at rte-france.com>
*/
@Service
public class LoadFlowService {
public class LoadFlowService extends AbstractComputationService {

static final String RESULT_UUID = "resultUuid";
private static final String PARAMETERS_URI = "/parameters/{parametersUuid}";
Expand Down Expand Up @@ -374,4 +375,8 @@ public UUID getLoadFlowParametersOrDefaultsUuid(StudyEntity studyEntity) {
}
return studyEntity.getLoadFlowParametersUuid();
}

public List<String> getEnumValues(String enumName, UUID resultUuid) {
return getEnumValues(enumName, resultUuid, LOADFLOW_API_VERSION, loadFlowServerBaseUri, LOADFLOW_NOT_FOUND, restTemplate);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.gridsuite.study.server.StudyException;
import org.gridsuite.study.server.dto.*;
import org.gridsuite.study.server.repository.StudyEntity;
import org.gridsuite.study.server.service.common.AbstractComputationService;
import org.gridsuite.study.server.service.securityanalysis.SecurityAnalysisResultType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
Expand All @@ -40,7 +41,7 @@
* @author Kevin Le Saulnier <kevin.lesaulnier at rte-france.com>
*/
@Service
public class SecurityAnalysisService {
public class SecurityAnalysisService extends AbstractComputationService {

static final String RESULT_UUID = "resultUuid";

Expand Down Expand Up @@ -394,4 +395,8 @@ public String getSecurityAnalysisDefaultProvider() {
throw handleHttpError(e, GET_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED);
}
}

public List<String> getEnumValues(String enumName, UUID resultUuid) {
return getEnumValues(enumName, resultUuid, SECURITY_ANALYSIS_API_VERSION, securityAnalysisServerBaseUri, SECURITY_ANALYSIS_NOT_FOUND, restTemplate);
}
}
17 changes: 17 additions & 0 deletions src/main/java/org/gridsuite/study/server/service/StudyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -1044,6 +1044,23 @@ void updateComputationResultUuid(UUID nodeUuid, UUID computationResultUuid, Comp
networkModificationTreeService.updateComputationResultUuid(nodeUuid, computationResultUuid, computationType);
}

public List<String> getResultEnumValues(UUID studyUuid, UUID nodeUuid, ComputationType computationType, String enumName) {
Objects.requireNonNull(studyUuid);
Objects.requireNonNull(nodeUuid);
Objects.requireNonNull(enumName);
Optional<UUID> resultUuidOpt = networkModificationTreeService.getComputationResultUuid(nodeUuid, computationType);
if (resultUuidOpt.isPresent()) {
return switch (computationType) {
case LOAD_FLOW -> loadflowService.getEnumValues(enumName, resultUuidOpt.get());
case SECURITY_ANALYSIS -> securityAnalysisService.getEnumValues(enumName, resultUuidOpt.get());
case SHORT_CIRCUIT -> shortCircuitService.getEnumValues(enumName, resultUuidOpt.get());
default -> throw new StudyException(NOT_ALLOWED);
};
} else {
return new ArrayList<>();
}
}

private StudyCreationRequestEntity insertStudyCreationRequestEntity(UUID studyUuid) {
StudyCreationRequestEntity studyCreationRequestEntity = new StudyCreationRequestEntity(
studyUuid == null ? UUID.randomUUID() : studyUuid);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.gridsuite.study.server.service.common;

import org.gridsuite.study.server.StudyException;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

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

import static org.gridsuite.study.server.StudyConstants.DELIMITER;

public abstract class AbstractComputationService {

public abstract List<String> getEnumValues(String enumName, UUID resultUuidOpt);

public List<String> getEnumValues(String enumName, UUID resultUuid, String apiVersion, String computingTypeBaseUri, StudyException.Type type, RestTemplate restTemplate) {
List<String> result;
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + apiVersion + "/results/{resultUuid}/{enumName}");
String path = uriComponentsBuilder.buildAndExpand(resultUuid, enumName).toUriString();
try {
ResponseEntity<List<String>> responseEntity = restTemplate.exchange(computingTypeBaseUri + path, HttpMethod.GET, null, new ParameterizedTypeReference<>() { });
result = responseEntity.getBody();
} catch (HttpStatusCodeException e) {
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
throw new StudyException(type);
}
throw e;
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,12 @@
import org.apache.commons.lang3.StringUtils;
import org.gridsuite.study.server.RemoteServicesProperties;
import org.gridsuite.study.server.StudyException;
import org.gridsuite.study.server.dto.ComputationType;
import org.gridsuite.study.server.dto.NodeReceiver;
import org.gridsuite.study.server.dto.ShortCircuitParametersInfos;
import org.gridsuite.study.server.dto.ShortCircuitPredefinedConfiguration;
import org.gridsuite.study.server.dto.ShortCircuitStatus;
import org.gridsuite.study.server.dto.*;
import org.gridsuite.study.server.repository.ShortCircuitParametersEntity;
import org.gridsuite.study.server.service.NetworkModificationTreeService;
import org.gridsuite.study.server.service.NetworkService;
import org.gridsuite.study.server.service.StudyService;
import org.gridsuite.study.server.service.common.AbstractComputationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.*;
Expand All @@ -37,7 +34,10 @@
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;

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

static final String RESULT_UUID = "resultUuid";

Expand Down Expand Up @@ -364,4 +364,7 @@ public void invalidateShortCircuitStatus(List<UUID> uuids) {
}
}

public List<String> getEnumValues(String enumName, UUID resultUuid) {
return getEnumValues(enumName, resultUuid, SHORT_CIRCUIT_API_VERSION, shortCircuitServerBaseUri, SHORT_CIRCUIT_ANALYSIS_NOT_FOUND, restTemplate);
}
}
21 changes: 21 additions & 0 deletions src/test/java/org/gridsuite/study/server/LoadFlowTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ public class LoadFlowTest {

private static String LIMIT_VIOLATIONS_JSON;

private static String COMPUTING_STATUS_JSON;

private static String LOADFLOW_DEFAULT_PARAMETERS_JSON;

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

LoadFlowParametersInfos loadFlowParametersInfos = LoadFlowParametersInfos.builder()
.provider(PROVIDER)
Expand Down Expand Up @@ -260,6 +263,11 @@ public MockResponse dispatch(RecordedRequest request) {
} else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/limit-violations\\?filters=.*globalFilters=.*networkUuid=.*variantId.*sort=.*")) {
return new MockResponse().setResponseCode(200).setBody(LIMIT_VIOLATIONS_JSON)
.addHeader("Content-Type", "application/json; charset=utf-8");
} else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation-status")) {
return new MockResponse().setResponseCode(200).setBody(COMPUTING_STATUS_JSON)
.addHeader("Content-Type", "application/json; charset=utf-8");
} else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation")) {
return new MockResponse().setResponseCode(404);
} else if (path.matches("/v1/results/invalidate-status\\?resultUuid=" + LOADFLOW_RESULT_UUID)) {
return new MockResponse().setResponseCode(200)
.addHeader("Content-Type", "application/json; charset=utf-8");
Expand Down Expand Up @@ -412,6 +420,19 @@ public void testGetLimitViolations() throws Exception {
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
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")));

// get computing status
mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}",
studyNameUserIdUuid, modificationNode1Uuid, LOAD_FLOW, "computation-status"))
.andExpectAll(status().isOk(),
content().string(COMPUTING_STATUS_JSON));

assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation-status")));

mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}",
studyNameUserIdUuid, modificationNode1Uuid, LOAD_FLOW, "computation")).andReturn();

assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation")));

Comment on lines +423 to +435
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests are not about limit violations. They shouldn't be in a testGetLimitViolations function.

// get limit violations
mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/limit-violations", studyNameUserIdUuid, modificationNode1Uuid)).andExpectAll(
status().isOk(),
Expand Down
Loading