diff --git a/pom.xml b/pom.xml index 349c9b001d..ba9dfd2195 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ 44.0.0 1.12.0 + 1.33.0-SNAPSHOT org.gridsuite.study.server 5.0.0-alpha.14 1.0.5 @@ -83,6 +84,11 @@ + + com.powsybl + powsybl-ws-commons + 1.33.0-SNAPSHOT + com.squareup.okhttp3 diff --git a/src/main/java/org/gridsuite/study/server/PropertyServerNameProvider.java b/src/main/java/org/gridsuite/study/server/PropertyServerNameProvider.java new file mode 100644 index 0000000000..6073b6779b --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/PropertyServerNameProvider.java @@ -0,0 +1,29 @@ +/** + * 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.study.server; + +import com.powsybl.ws.commons.error.ServerNameProvider; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @author Mancini Joris {@literal } + */ +@Component +public class PropertyServerNameProvider implements ServerNameProvider { + + private final String name; + + public PropertyServerNameProvider(@Value("${spring.application.name:explore-server}") String name) { + this.name = name; + } + + @Override + public String serverName() { + return name; + } +} diff --git a/src/main/java/org/gridsuite/study/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/study/server/RestResponseEntityExceptionHandler.java deleted file mode 100644 index e65372ff70..0000000000 --- a/src/main/java/org/gridsuite/study/server/RestResponseEntityExceptionHandler.java +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Copyright (c) 2020, 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.study.server; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.TypeMismatchException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.server.ServerWebInputException; - -import static org.gridsuite.study.server.StudyException.Type.NOT_ALLOWED; - -/** - * @author Abdelsalem Hedhili - */ -@ControllerAdvice -public class RestResponseEntityExceptionHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(RestResponseEntityExceptionHandler.class); - private static final String MESSAGE = "Caught in handler"; - - @ExceptionHandler(StudyException.class) - protected ResponseEntity handleStudyException(StudyException exception) { - if (LOGGER.isErrorEnabled()) { - LOGGER.error(MESSAGE, exception); - } - StudyException.Type type = exception.getType(); - return switch (type) { - case ELEMENT_NOT_FOUND, - STUDY_NOT_FOUND, - NODE_NOT_FOUND, - ROOT_NETWORK_NOT_FOUND, - LOADFLOW_NOT_FOUND, - SECURITY_ANALYSIS_NOT_FOUND, - SENSITIVITY_ANALYSIS_NOT_FOUND, - SHORT_CIRCUIT_ANALYSIS_NOT_FOUND, - DYNAMIC_SIMULATION_NOT_FOUND, - DYNAMIC_MAPPING_NOT_FOUND, - EQUIPMENT_NOT_FOUND, - VOLTAGE_INIT_PARAMETERS_NOT_FOUND, - SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND, - LOADFLOW_PARAMETERS_NOT_FOUND, - SENSITIVITY_ANALYSIS_PARAMETERS_NOT_FOUND, - STATE_ESTIMATION_NOT_FOUND, - PCC_MIN_NOT_FOUND, - STATE_ESTIMATION_PARAMETERS_NOT_FOUND, - DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PROVIDER_NOT_FOUND, - DYNAMIC_SECURITY_ANALYSIS_PROVIDER_NOT_FOUND, - DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND, - DYNAMIC_SECURITY_ANALYSIS_NOT_FOUND - -> ResponseEntity.status(HttpStatus.NOT_FOUND).body(exception.getType()); - case CASE_NOT_FOUND -> ResponseEntity.status(HttpStatus.FAILED_DEPENDENCY).body(exception.getMessage()); - case STUDY_ALREADY_EXISTS -> ResponseEntity.status(HttpStatus.CONFLICT).body(type); - case LOADFLOW_NOT_RUNNABLE, - LOADFLOW_RUNNING, - SECURITY_ANALYSIS_RUNNING, - SENSITIVITY_ANALYSIS_RUNNING, - DYNAMIC_SIMULATION_RUNNING, - SHORT_CIRCUIT_ANALYSIS_RUNNING, - VOLTAGE_INIT_RUNNING, - STATE_ESTIMATION_RUNNING, - PCC_MIN_RUNNING - -> ResponseEntity.status(HttpStatus.FORBIDDEN).body(type); - case NOT_ALLOWED, - BAD_NODE_TYPE, - NODE_NAME_ALREADY_EXIST, - ROOT_NETWORK_DELETE_FORBIDDEN, - MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED, - MAXIMUM_TAG_LENGTH_EXCEEDED, - TOO_MANY_NAD_CONFIGS, - TOO_MANY_MAP_CARDS, - MOVE_NETWORK_MODIFICATION_FORBIDDEN - -> ResponseEntity.status(HttpStatus.FORBIDDEN).body(exception.getMessage()); - case CANT_DELETE_ROOT_NODE -> ResponseEntity.status(HttpStatus.FORBIDDEN).body(NOT_ALLOWED); - case CREATE_NETWORK_MODIFICATION_FAILED, - UPDATE_NETWORK_MODIFICATION_FAILED, - DELETE_NETWORK_MODIFICATION_FAILED, - BAD_MODIFICATION_TYPE, - BAD_JSON_FORMAT, - TIME_SERIES_BAD_TYPE, - TIMELINE_BAD_TYPE, - BAD_PARAMETER - -> ResponseEntity.status(HttpStatus.BAD_REQUEST).body(exception.getMessage()); - case NETWORK_NOT_FOUND, - NETWORK_INDEXATION_FAILED, - NODE_NOT_BUILT, - DELETE_EQUIPMENT_FAILED, - DELETE_NODE_FAILED, - DELETE_STUDY_FAILED, - GET_MODIFICATIONS_FAILED, - GET_NETWORK_ELEMENT_FAILED, - SENSITIVITY_ANALYSIS_ERROR, - SHORT_CIRCUIT_ANALYSIS_ERROR, - NODE_BUILD_ERROR, URI_SYNTAX, - CREATE_VOLTAGE_INIT_PARAMETERS_FAILED, - UPDATE_VOLTAGE_INIT_PARAMETERS_FAILED, - STUDY_INDEXATION_FAILED, - STUDY_CHECK_INDEXATION_FAILED, - UPDATE_SECURITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_SECURITY_ANALYSIS_PARAMETERS_FAILED, - LOADFLOW_ERROR, - GET_SECURITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_LOADFLOW_PARAMETERS_FAILED, - UPDATE_LOADFLOW_PARAMETERS_FAILED, - GET_LOADFLOW_PARAMETERS_FAILED, - DELETE_LOADFLOW_PARAMETERS_FAILED, - GET_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - UPDATE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - DELETE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - ROOT_NETWORK_CREATION_FAILED, - CREATE_STATE_ESTIMATION_PARAMETERS_FAILED, - UPDATE_STATE_ESTIMATION_PARAMETERS_FAILED, - DELETE_STATE_ESTIMATION_PARAMETERS_FAILED, - GET_STATE_ESTIMATION_PARAMETERS_FAILED, - PCC_MIN_ERROR, - GET_DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED, - GET_DYNAMIC_SECURITY_ANALYSIS_PROVIDER_FAILED, - UPDATE_DYNAMIC_SECURITY_ANALYSIS_PROVIDER_FAILED, - GET_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PARAMETERS_FAILED, - RUN_DYNAMIC_SECURITY_ANALYSIS_FAILED, - INVALIDATE_DYNAMIC_SECURITY_ANALYSIS_FAILED, - UPDATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - DUPLICATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - UPDATE_SPREADSHEET_CONFIG_FAILED - -> ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(exception.getMessage()); - case SVG_NOT_FOUND, - NO_VOLTAGE_INIT_RESULTS_FOR_NODE, - NO_VOLTAGE_INIT_MODIFICATIONS_GROUP_FOR_NODE - -> ResponseEntity.status(HttpStatus.NOT_FOUND).body(exception.getMessage()); - case UNKNOWN_NOTIFICATION_TYPE, - UNKNOWN_ACTION_TYPE, - MISSING_PARAMETER - -> ResponseEntity.status(HttpStatus.BAD_REQUEST).body(exception.getType()); - case NOT_IMPLEMENTED -> ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(exception.getMessage()); - case MAX_NODE_BUILDS_EXCEEDED -> ResponseEntity.status(HttpStatus.FORBIDDEN).body(StudyException.Type.MAX_NODE_BUILDS_EXCEEDED + " " + exception.getMessage()); - case DIAGRAM_GRID_LAYOUT_NOT_FOUND -> ResponseEntity.noContent().build(); - default -> ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - }; - } - - @ExceptionHandler(ServerWebInputException.class) - protected ResponseEntity handleServerWebInputException(ServerWebInputException exception) { - if (LOGGER.isErrorEnabled()) { - LOGGER.error(MESSAGE, exception); - } - Throwable cause = exception.getCause(); - if (cause instanceof TypeMismatchException && cause.getCause() != null && cause.getCause() != cause) { - cause = cause.getCause(); - } - return ResponseEntity.status(exception.getStatusCode()).body(cause.getMessage()); - } - - @ExceptionHandler(TypeMismatchException.class) - protected ResponseEntity handleTypeMismatchException(TypeMismatchException exception) { - if (LOGGER.isErrorEnabled()) { - LOGGER.error(MESSAGE, exception); - } - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(exception.getCause().getMessage()); - } -} diff --git a/src/main/java/org/gridsuite/study/server/StudyException.java b/src/main/java/org/gridsuite/study/server/StudyException.java deleted file mode 100644 index fe26845011..0000000000 --- a/src/main/java/org/gridsuite/study/server/StudyException.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Copyright (c) 2019, 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.study.server; - -import java.util.Objects; - -/** - * @author Abdelsalem Hedhili - */ -public class StudyException extends RuntimeException { - - public enum Type { - STUDY_ALREADY_EXISTS, - ELEMENT_NOT_FOUND, - STUDY_NOT_FOUND, - DIAGRAM_GRID_LAYOUT_NOT_FOUND, - CASE_NOT_FOUND, - LOADFLOW_NOT_RUNNABLE, - LOADFLOW_RUNNING, - LOADFLOW_ERROR, - SECURITY_ANALYSIS_RUNNING, - SECURITY_ANALYSIS_NOT_FOUND, - SENSITIVITY_ANALYSIS_RUNNING, - SENSITIVITY_ANALYSIS_NOT_FOUND, - SENSITIVITY_ANALYSIS_ERROR, - SHORT_CIRCUIT_ANALYSIS_NOT_FOUND, - SHORT_CIRCUIT_ANALYSIS_ERROR, - LOADFLOW_NOT_FOUND, - SHORT_CIRCUIT_ANALYSIS_RUNNING, - VOLTAGE_INIT_NOT_FOUND, - VOLTAGE_INIT_RUNNING, - DYNAMIC_SIMULATION_RUNNING, - DYNAMIC_SIMULATION_NOT_FOUND, - DYNAMIC_MAPPING_NOT_FOUND, - DYNAMIC_SECURITY_ANALYSIS_RUNNING, - DYNAMIC_SECURITY_ANALYSIS_NOT_FOUND, - DYNAMIC_SECURITY_ANALYSIS_ERROR, - NOT_ALLOWED, - STUDY_CREATION_FAILED, - CANT_DELETE_ROOT_NODE, - DELETE_EQUIPMENT_FAILED, - DELETE_NODE_FAILED, - DELETE_STUDY_FAILED, - DELETE_ROOT_NETWORK_FAILED, - CREATE_NETWORK_MODIFICATION_FAILED, - UPDATE_NETWORK_MODIFICATION_FAILED, - DELETE_NETWORK_MODIFICATION_FAILED, - MOVE_NETWORK_MODIFICATION_FORBIDDEN, - UNKNOWN_EQUIPMENT_TYPE, - BAD_NODE_TYPE, - NETWORK_NOT_FOUND, - EQUIPMENT_NOT_FOUND, - NETWORK_INDEXATION_FAILED, - NODE_NOT_FOUND, - NODE_NOT_BUILT, - SVG_NOT_FOUND, - NODE_NAME_ALREADY_EXIST, - NODE_BUILD_ERROR, - INVALIDATE_BUILD_FAILED, - UNKNOWN_NOTIFICATION_TYPE, - BAD_MODIFICATION_TYPE, - GET_MODIFICATIONS_FAILED, - GET_MODIFICATIONS_COUNT_FAILED, - GET_NETWORK_ELEMENT_FAILED, - GET_NETWORK_COUNTRY_FAILED, - GET_NETWORK_NOMINAL_VOLTAGES_FAILED, - BAD_JSON_FORMAT, - UNKNOWN_ACTION_TYPE, - BAD_PARAMETER, - MISSING_PARAMETER, - LOAD_SCALING_FAILED, - DELETE_VOLTAGE_LEVEL_ON_LINE, - DELETE_ATTACHING_LINE, - GENERATOR_SCALING_FAILED, - URI_SYNTAX, - TIME_SERIES_BAD_TYPE, - TIMELINE_BAD_TYPE, - FILTERS_NOT_FOUND, - NO_VOLTAGE_INIT_RESULTS_FOR_NODE, - NO_VOLTAGE_INIT_MODIFICATIONS_GROUP_FOR_NODE, - VOLTAGE_INIT_PARAMETERS_NOT_FOUND, - CREATE_VOLTAGE_INIT_PARAMETERS_FAILED, - UPDATE_VOLTAGE_INIT_PARAMETERS_FAILED, - CREATE_SECURITY_ANALYSIS_PARAMETERS_FAILED, - UPDATE_SECURITY_ANALYSIS_PARAMETERS_FAILED, - GET_SECURITY_ANALYSIS_PARAMETERS_FAILED, - SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND, - GET_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED, - UPDATE_SECURITY_ANALYSIS_PROVIDER_FAILED, - CREATE_LOADFLOW_PARAMETERS_FAILED, - UPDATE_LOADFLOW_PARAMETERS_FAILED, - GET_LOADFLOW_PARAMETERS_FAILED, - DELETE_LOADFLOW_PARAMETERS_FAILED, - LOADFLOW_PARAMETERS_NOT_FOUND, - GET_LOADFLOW_DEFAULT_PROVIDER_FAILED, - UPDATE_LOADFLOW_PROVIDER_FAILED, - UPDATE_SHORTCIRCUIT_PARAMETERS_FAILED, - CREATE_SHORTCIRCUIT_PARAMETERS_FAILED, - GET_SHORTCIRCUIT_PARAMETERS_FAILED, - SENSITIVITY_ANALYSIS_PARAMETERS_NOT_FOUND, - GET_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - UPDATE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - DELETE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED, - GET_SENSITIVITY_ANALYSIS_DEFAULT_PROVIDER_FAILED, - UPDATE_SENSITIVITY_ANALYSIS_PROVIDER_FAILED, - GET_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - CREATE_DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PARAMETERS_FAILED, - RUN_DYNAMIC_SECURITY_ANALYSIS_FAILED, - RUN_DYNAMIC_SIMULATION_FAILED, - INVALIDATE_DYNAMIC_SECURITY_ANALYSIS_FAILED, - DUPLICATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - UPDATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED, - DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND, - DYNAMIC_SECURITY_ANALYSIS_PROVIDER_NOT_FOUND, - GET_DYNAMIC_SECURITY_ANALYSIS_PROVIDER_FAILED, - DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PROVIDER_NOT_FOUND, - GET_DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED, - UPDATE_DYNAMIC_SECURITY_ANALYSIS_PROVIDER_FAILED, - DELETE_COMPUTATION_RESULTS_FAILED, - STUDY_INDEXATION_FAILED, - STUDY_CHECK_INDEXATION_FAILED, - NOT_IMPLEMENTED, - EVALUATE_FILTER_FAILED, - GET_USER_PROFILE_FAILED, - STATE_ESTIMATION_RUNNING, - STATE_ESTIMATION_NOT_FOUND, - STATE_ESTIMATION_ERROR, - CREATE_STATE_ESTIMATION_PARAMETERS_FAILED, - UPDATE_STATE_ESTIMATION_PARAMETERS_FAILED, - DELETE_STATE_ESTIMATION_PARAMETERS_FAILED, - GET_STATE_ESTIMATION_PARAMETERS_FAILED, - STATE_ESTIMATION_PARAMETERS_NOT_FOUND, - PCC_MIN_RUNNING, - PCC_MIN_NOT_FOUND, - PCC_MIN_ERROR, - MAX_NODE_BUILDS_EXCEEDED, - CREATE_NETWORK_VISUALIZATION_PARAMETERS_FAILED, - UPDATE_NETWORK_VISUALIZATION_PARAMETERS_FAILED, - NETWORK_VISUALIZATION_PARAMETERS_NOT_FOUND, - GET_NETWORK_VISUALIZATION_PARAMETERS_FAILED, - ROOT_NETWORK_NOT_FOUND, - ROOT_NETWORK_DELETE_FORBIDDEN, - ROOT_NETWORK_CREATION_FAILED, - ROOT_NETWORK_MODIFICATION_FAILED, - MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED, - MAXIMUM_TAG_LENGTH_EXCEEDED, - DUPLICATE_SPREADSHEET_CONFIG_COLLECTION_FAILED, - SPREADSHEET_CONFIG_COLLECTION_NOT_FOUND, - GET_SPREADSHEET_CONFIG_COLLECTION_FAILED, - CREATE_SPREADSHEET_CONFIG_COLLECTION_FAILED, - UPDATE_SPREADSHEET_CONFIG_COLLECTION_FAILED, - UPDATE_SPREADSHEET_CONFIG_FAILED, - NETWORK_EXPORT_FAILED, - GET_LOADFLOW_PROVIDER_FAILED, - CREATE_DIAGRAM_GRID_LAYOUT_FAILED, - DUPLICATE_DIAGRAM_GRID_LAYOUT_FAILED, - TOO_MANY_NAD_CONFIGS, - TOO_MANY_MAP_CARDS - } - - private final Type type; - - public StudyException(Type type) { - super(Objects.requireNonNull(type.name())); - this.type = type; - } - - public StudyException(Type type, String message) { - super(message); - this.type = type; - } - - Type getType() { - return type; - } -} diff --git a/src/main/java/org/gridsuite/study/server/controller/StudyController.java b/src/main/java/org/gridsuite/study/server/controller/StudyController.java index 19648a4261..f2e1525767 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -20,8 +20,7 @@ import org.gridsuite.study.server.StudyApi; import org.gridsuite.study.server.StudyConstants.ModificationsActionType; import org.gridsuite.study.server.StudyConstants.SldDisplayMode; -import org.gridsuite.study.server.StudyException; -import org.gridsuite.study.server.StudyException.Type; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.computation.LoadFlowComputationInfos; import org.gridsuite.study.server.dto.diagramgridlayout.DiagramGridLayout; @@ -65,6 +64,8 @@ import java.beans.PropertyEditorSupport; import java.util.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.MOVE_NETWORK_MODIFICATION_FORBIDDEN; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.UNKNOWN_ACTION_TYPE; import static org.gridsuite.study.server.StudyConstants.*; import static org.gridsuite.study.server.dto.ComputationType.LOAD_FLOW; @@ -683,12 +684,12 @@ public ResponseEntity moveOrCopyModifications(@PathVariable("studyUuid") U case MOVE: // we don't cut - paste modifications from different studies if (!studyUuid.equals(originStudyUuid)) { - throw new StudyException(Type.MOVE_NETWORK_MODIFICATION_FORBIDDEN); + throw new StudyException(MOVE_NETWORK_MODIFICATION_FORBIDDEN); } handleMoveNetworkModifications(studyUuid, nodeUuid, originNodeUuid, modificationsToCopyUuidList, userId); break; default: - throw new StudyException(Type.UNKNOWN_ACTION_TYPE); + throw new StudyException(UNKNOWN_ACTION_TYPE); } return ResponseEntity.ok().build(); } diff --git a/src/main/java/org/gridsuite/study/server/error/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/study/server/error/RestResponseEntityExceptionHandler.java new file mode 100644 index 0000000000..a727e4b4e9 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/error/RestResponseEntityExceptionHandler.java @@ -0,0 +1,97 @@ +/** + * Copyright (c) 2020, 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.study.server.error; + +import com.powsybl.ws.commons.error.AbstractBaseRestExceptionHandler; +import com.powsybl.ws.commons.error.ServerNameProvider; +import lombok.NonNull; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; + +/** + * @author Abdelsalem Hedhili + */ +@ControllerAdvice +public class RestResponseEntityExceptionHandler extends AbstractBaseRestExceptionHandler { + + protected RestResponseEntityExceptionHandler(ServerNameProvider serverNameProvider) { + super(serverNameProvider); + } + + @Override + protected @NonNull StudyBusinessErrorCode getBusinessCode(StudyException e) { + return (StudyBusinessErrorCode) e.getBusinessErrorCode(); + } + + @Override + protected HttpStatus mapStatus(StudyBusinessErrorCode studyBusinessErrorCode) { + return switch (studyBusinessErrorCode) { + case ELEMENT_NOT_FOUND, + STUDY_NOT_FOUND, + NODE_NOT_FOUND, + ROOT_NETWORK_NOT_FOUND, + LOADFLOW_NOT_FOUND, + SECURITY_ANALYSIS_NOT_FOUND, + SENSITIVITY_ANALYSIS_NOT_FOUND, + SHORT_CIRCUIT_ANALYSIS_NOT_FOUND, + DYNAMIC_SIMULATION_NOT_FOUND, + DYNAMIC_MAPPING_NOT_FOUND, + EQUIPMENT_NOT_FOUND, + VOLTAGE_INIT_PARAMETERS_NOT_FOUND, + SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND, + LOADFLOW_PARAMETERS_NOT_FOUND, + SENSITIVITY_ANALYSIS_PARAMETERS_NOT_FOUND, + STATE_ESTIMATION_NOT_FOUND, + PCC_MIN_NOT_FOUND, + STATE_ESTIMATION_PARAMETERS_NOT_FOUND, + DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PROVIDER_NOT_FOUND, + DYNAMIC_SECURITY_ANALYSIS_PROVIDER_NOT_FOUND, + DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND, + DYNAMIC_SECURITY_ANALYSIS_NOT_FOUND, + SVG_NOT_FOUND, + NO_VOLTAGE_INIT_RESULTS_FOR_NODE, + NO_VOLTAGE_INIT_MODIFICATIONS_GROUP_FOR_NODE + -> HttpStatus.NOT_FOUND; + case CASE_NOT_FOUND -> HttpStatus.FAILED_DEPENDENCY; + case STUDY_ALREADY_EXISTS -> HttpStatus.CONFLICT; + case LOADFLOW_NOT_RUNNABLE, + LOADFLOW_RUNNING, + SECURITY_ANALYSIS_RUNNING, + SENSITIVITY_ANALYSIS_RUNNING, + DYNAMIC_SIMULATION_RUNNING, + SHORT_CIRCUIT_ANALYSIS_RUNNING, + VOLTAGE_INIT_RUNNING, + STATE_ESTIMATION_RUNNING, + PCC_MIN_RUNNING, + NOT_ALLOWED, + BAD_NODE_TYPE, + NODE_NAME_ALREADY_EXIST, + ROOT_NETWORK_DELETE_FORBIDDEN, + MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED, + MAXIMUM_TAG_LENGTH_EXCEEDED, + TOO_MANY_NAD_CONFIGS, + TOO_MANY_MAP_CARDS, + MOVE_NETWORK_MODIFICATION_FORBIDDEN, + CANT_DELETE_ROOT_NODE, + MAX_NODE_BUILDS_EXCEEDED + -> HttpStatus.FORBIDDEN; + case CREATE_NETWORK_MODIFICATION_FAILED, + UPDATE_NETWORK_MODIFICATION_FAILED, + DELETE_NETWORK_MODIFICATION_FAILED, + BAD_MODIFICATION_TYPE, + BAD_JSON_FORMAT, + TIME_SERIES_BAD_TYPE, + TIMELINE_BAD_TYPE, + BAD_PARAMETER, + UNKNOWN_NOTIFICATION_TYPE, + UNKNOWN_ACTION_TYPE, + MISSING_PARAMETER + -> HttpStatus.BAD_REQUEST; + case NOT_IMPLEMENTED -> HttpStatus.NOT_IMPLEMENTED; + case DIAGRAM_GRID_LAYOUT_NOT_FOUND -> HttpStatus.NO_CONTENT; + default -> HttpStatus.INTERNAL_SERVER_ERROR; + }; + } +} diff --git a/src/main/java/org/gridsuite/study/server/error/StudyBusinessErrorCode.java b/src/main/java/org/gridsuite/study/server/error/StudyBusinessErrorCode.java new file mode 100644 index 0000000000..5cbc014c55 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/error/StudyBusinessErrorCode.java @@ -0,0 +1,174 @@ +/** + * 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.study.server.error; + +import com.powsybl.ws.commons.error.BusinessErrorCode; + +/** + * @author Joris Mancini + */ +public enum StudyBusinessErrorCode implements BusinessErrorCode { + STUDY_ALREADY_EXISTS("study.alreadyExists"), + ELEMENT_NOT_FOUND("study.elementNotFound"), + STUDY_NOT_FOUND("study.studyNotFound"), + DIAGRAM_GRID_LAYOUT_NOT_FOUND("study.diagramGridLayoutNotFound"), + CASE_NOT_FOUND("study.caseNotFound"), + LOADFLOW_NOT_RUNNABLE("study.loadflowNotRunning"), + LOADFLOW_RUNNING("study.loadflowRunning"), + LOADFLOW_ERROR("study.loadflowError"), + SECURITY_ANALYSIS_RUNNING("study.securityAnalysisRunning"), + SECURITY_ANALYSIS_NOT_FOUND("study.securityAnalysisNotFound"), + SENSITIVITY_ANALYSIS_RUNNING("study.sensitivityAnalysisRunning"), + SENSITIVITY_ANALYSIS_NOT_FOUND("study.sensitivityAnalysisNotFound"), + SENSITIVITY_ANALYSIS_ERROR("study.sensitivityAnalysisError"), + SHORT_CIRCUIT_ANALYSIS_NOT_FOUND("study.shortCircuitAnalysisNotFound"), + SHORT_CIRCUIT_ANALYSIS_ERROR("study.shortCircuitAnalysisError"), + LOADFLOW_NOT_FOUND("study.loadflowNotFound"), + SHORT_CIRCUIT_ANALYSIS_RUNNING("study.shortCircuitAnalysisRunning"), + VOLTAGE_INIT_NOT_FOUND("study.voltageInitNotFound"), + VOLTAGE_INIT_RUNNING("study.voltageInitRunning"), + DYNAMIC_SIMULATION_RUNNING("study.dynamicSimulationRunning"), + DYNAMIC_SIMULATION_NOT_FOUND("study.dynamicSimulationNotFound"), + DYNAMIC_MAPPING_NOT_FOUND("study.dynamicMappingNotFound"), + DYNAMIC_SECURITY_ANALYSIS_RUNNING("study.dynamicSecurityAnalysisRunning"), + DYNAMIC_SECURITY_ANALYSIS_NOT_FOUND("study.dynamicSecurityAnalysisNotFound"), + DYNAMIC_SECURITY_ANALYSIS_ERROR("study.dynamicSecurityAnalysisError"), + NOT_ALLOWED("study.notAllowed"), + STUDY_CREATION_FAILED("study.studyCreationFailed"), + CANT_DELETE_ROOT_NODE("study.cantDeleteRootNode"), + DELETE_EQUIPMENT_FAILED("study.deleteEquipmentFailed"), + DELETE_NODE_FAILED("study.deleteNodeFailed"), + DELETE_STUDY_FAILED("study.deleteStudyFailed"), + DELETE_ROOT_NETWORK_FAILED("study.deleteRootNetworkFailed"), + CREATE_NETWORK_MODIFICATION_FAILED("study.createNetworkModificationFailed"), + UPDATE_NETWORK_MODIFICATION_FAILED("study.updateNetworkModificationFailed"), + DELETE_NETWORK_MODIFICATION_FAILED("study.deleteNetworkModificationFailed"), + MOVE_NETWORK_MODIFICATION_FORBIDDEN("study.moveNetworkModificationForbidden"), + UNKNOWN_EQUIPMENT_TYPE("study.unknownEquipmentType"), + BAD_NODE_TYPE("study.badNodeType"), + NETWORK_NOT_FOUND("study.networkNotFound"), + EQUIPMENT_NOT_FOUND("study.equipmentNotFound"), + NETWORK_INDEXATION_FAILED("study.networkIndexationFailed"), + NODE_NOT_FOUND("study.nodeNotFound"), + NODE_NOT_BUILT("study.nodeNotBuilt"), + SVG_NOT_FOUND("study.svgNotFound"), + NODE_NAME_ALREADY_EXIST("study.nodeNameAlreadyExist"), + NODE_BUILD_ERROR("study.nodeBuildError"), + INVALIDATE_BUILD_FAILED("study.invalidateBuildFailed"), + UNKNOWN_NOTIFICATION_TYPE("study.unknownNotificationType"), + BAD_MODIFICATION_TYPE("study.badModificationType"), + GET_MODIFICATIONS_FAILED("study.getModificationsFailed"), + GET_MODIFICATIONS_COUNT_FAILED("study.getModificationsCountFailed"), + GET_NETWORK_ELEMENT_FAILED("study.getNetworkElementFailed"), + GET_NETWORK_COUNTRY_FAILED("study.getNetworkCountryFailed"), + GET_NETWORK_NOMINAL_VOLTAGES_FAILED("study.getNetworkNominalVoltagesFailed"), + BAD_JSON_FORMAT("study.badJsonFormat"), + UNKNOWN_ACTION_TYPE("study.unknownActionType"), + BAD_PARAMETER("study.badParameter"), + MISSING_PARAMETER("study.missingParameter"), + LOAD_SCALING_FAILED("study.loadScalingFailed"), + DELETE_VOLTAGE_LEVEL_ON_LINE("study.deleteVoltageLevelOnLine"), + DELETE_ATTACHING_LINE("study.deleteAttachingLine"), + GENERATOR_SCALING_FAILED("study.generatorScalingFailed"), + URI_SYNTAX("study.uriSyntax"), + TIME_SERIES_BAD_TYPE("study.timeSeriesBadType"), + TIMELINE_BAD_TYPE("study.timelineBadType"), + FILTERS_NOT_FOUND("study.filtersNotFound"), + NO_VOLTAGE_INIT_RESULTS_FOR_NODE("study.noVoltageInitResultsForNode"), + NO_VOLTAGE_INIT_MODIFICATIONS_GROUP_FOR_NODE("study.noVoltageInitModificationsGroupForNode"), + VOLTAGE_INIT_PARAMETERS_NOT_FOUND("study.voltageInitParametersNotFound"), + CREATE_VOLTAGE_INIT_PARAMETERS_FAILED("study.createVoltageInitParametersFailed"), + UPDATE_VOLTAGE_INIT_PARAMETERS_FAILED("study.updateVoltageInitParametersFailed"), + CREATE_SECURITY_ANALYSIS_PARAMETERS_FAILED("study.createSecurityAnalysisParametersFailed"), + UPDATE_SECURITY_ANALYSIS_PARAMETERS_FAILED("study.updateSecurityAnalysisParametersFailed"), + GET_SECURITY_ANALYSIS_PARAMETERS_FAILED("study.getSecurityAnalysisParametersFailed"), + SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND("study.securityAnalysisParametersNotFound"), + GET_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED("study.getSecurityAnalysisDefaultProviderFailed"), + UPDATE_SECURITY_ANALYSIS_PROVIDER_FAILED("study.updateSecurityAnalysisProviderFailed"), + CREATE_LOADFLOW_PARAMETERS_FAILED("study.createLoadflowParametersFailed"), + UPDATE_LOADFLOW_PARAMETERS_FAILED("study.updateLoadflowParametersFailed"), + GET_LOADFLOW_PARAMETERS_FAILED("study.getLoadflowParametersFailed"), + DELETE_LOADFLOW_PARAMETERS_FAILED("study.deleteLoadflowParametersFailed"), + LOADFLOW_PARAMETERS_NOT_FOUND("study.loadflowParametersNotFound"), + GET_LOADFLOW_DEFAULT_PROVIDER_FAILED("study.getLoadflowDefaultProviderFailed"), + UPDATE_LOADFLOW_PROVIDER_FAILED("study.updateLoadflowProviderFailed"), + UPDATE_SHORTCIRCUIT_PARAMETERS_FAILED("study.updateShortcircuitParametersFailed"), + CREATE_SHORTCIRCUIT_PARAMETERS_FAILED("study.createShortcircuitParametersFailed"), + GET_SHORTCIRCUIT_PARAMETERS_FAILED("study.getShortcircuitParametersFailed"), + SENSITIVITY_ANALYSIS_PARAMETERS_NOT_FOUND("study.sensitivityAnalysisParametersNotFound"), + GET_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED("study.getSensitivityAnalysisParametersFailed"), + CREATE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED("study.createSensitivityAnalysisParametersFailed"), + UPDATE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED("study.updateSensitivityAnalysisParametersFailed"), + DELETE_SENSITIVITY_ANALYSIS_PARAMETERS_FAILED("study.deleteSensitivityAnalysisParametersFailed"), + GET_SENSITIVITY_ANALYSIS_DEFAULT_PROVIDER_FAILED("study.getSensitivityAnalysisDefaultProviderFailed"), + UPDATE_SENSITIVITY_ANALYSIS_PROVIDER_FAILED("study.updateSensitivityAnalysisProviderFailed"), + GET_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED("study.getDynamicSecurityAnalysisParametersFailed"), + CREATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED("study.createDynamicSecurityAnalysisParametersFailed"), + CREATE_DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PARAMETERS_FAILED("study.createDynamicSecurityAnalysisDefaultParametersFailed"), + RUN_DYNAMIC_SECURITY_ANALYSIS_FAILED("study.runDynamicSecurityAnalysisFailed"), + RUN_DYNAMIC_SIMULATION_FAILED("study.runDynamicSimulationFailed"), + INVALIDATE_DYNAMIC_SECURITY_ANALYSIS_FAILED("study.invalidateDynamicSecurityAnalysisFailed"), + DUPLICATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED("study.duplicateDynamicSecurityAnalysisParametersFailed"), + UPDATE_DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_FAILED("study.updateDynamicSecurityAnalysisParametersFailed"), + DYNAMIC_SECURITY_ANALYSIS_PARAMETERS_NOT_FOUND("study.dynamicSecurityAnalysisParametersNotFound"), + DYNAMIC_SECURITY_ANALYSIS_PROVIDER_NOT_FOUND("study.dynamicSecurityAnalysisProviderNotFound"), + GET_DYNAMIC_SECURITY_ANALYSIS_PROVIDER_FAILED("study.getDynamicSecurityAnalysisProviderFailed"), + DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PROVIDER_NOT_FOUND("study.dynamicSecurityAnalysisDefaultProviderNotFound"), + GET_DYNAMIC_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED("study.getDynamicSecurityAnalysisDefaultProviderFailed"), + UPDATE_DYNAMIC_SECURITY_ANALYSIS_PROVIDER_FAILED("study.updateDynamicSecurityAnalysisProviderFailed"), + DELETE_COMPUTATION_RESULTS_FAILED("study.deleteComputationResultsFailed"), + STUDY_INDEXATION_FAILED("study.studyIndexationFailed"), + STUDY_CHECK_INDEXATION_FAILED("study.studyCheckIndexationFailed"), + NOT_IMPLEMENTED("study.notImplemented"), + EVALUATE_FILTER_FAILED("study.evaluateFilterFailed"), + GET_USER_PROFILE_FAILED("study.getUserProfileFailed"), + STATE_ESTIMATION_RUNNING("study.stateEstimationRunning"), + STATE_ESTIMATION_NOT_FOUND("study.stateEstimationNotFound"), + STATE_ESTIMATION_ERROR("study.stateEstimationError"), + CREATE_STATE_ESTIMATION_PARAMETERS_FAILED("study.createStateEstimationParametersFailed"), + UPDATE_STATE_ESTIMATION_PARAMETERS_FAILED("study.updateStateEstimationParametersFailed"), + DELETE_STATE_ESTIMATION_PARAMETERS_FAILED("study.deleteStateEstimationParametersFailed"), + GET_STATE_ESTIMATION_PARAMETERS_FAILED("study.getStateEstimationParametersFailed"), + STATE_ESTIMATION_PARAMETERS_NOT_FOUND("study.stateEstimationParametersNotFound"), + PCC_MIN_RUNNING("study.pccMinRunning"), + PCC_MIN_NOT_FOUND("study.pccMinNotFound"), + PCC_MIN_ERROR("study.pccMinError"), + MAX_NODE_BUILDS_EXCEEDED("study.maxNodeBuildsExceeded"), + CREATE_NETWORK_VISUALIZATION_PARAMETERS_FAILED("study.createNetworkVisualizationParametersFailed"), + UPDATE_NETWORK_VISUALIZATION_PARAMETERS_FAILED("study.updateNetworkVisualizationParametersFailed"), + NETWORK_VISUALIZATION_PARAMETERS_NOT_FOUND("study.networkVisualizationParametersNotFound"), + GET_NETWORK_VISUALIZATION_PARAMETERS_FAILED("study.getNetworkVisualizationParametersFailed"), + ROOT_NETWORK_NOT_FOUND("study.rootNetworkNotFound"), + ROOT_NETWORK_DELETE_FORBIDDEN("study.rootNetworkDeleteForbidden"), + ROOT_NETWORK_CREATION_FAILED("study.rootNetworkCreationFailed"), + ROOT_NETWORK_MODIFICATION_FAILED("study.rootNetworkModificationFailed"), + MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED("study.maximumRootNetworkByStudyReached"), + MAXIMUM_TAG_LENGTH_EXCEEDED("study.maximumTagLengthExceeded"), + DUPLICATE_SPREADSHEET_CONFIG_COLLECTION_FAILED("study.duplicateSpreadsheetConfigCollectionFailed"), + SPREADSHEET_CONFIG_COLLECTION_NOT_FOUND("study.spreadsheetConfigCollectionNotFound"), + GET_SPREADSHEET_CONFIG_COLLECTION_FAILED("study.getSpreadsheetConfigCollectionFailed"), + CREATE_SPREADSHEET_CONFIG_COLLECTION_FAILED("study.createSpreadsheetConfigCollectionFailed"), + UPDATE_SPREADSHEET_CONFIG_COLLECTION_FAILED("study.updateSpreadsheetConfigCollectionFailed"), + UPDATE_SPREADSHEET_CONFIG_FAILED("study.updateSpreadsheetConfigFailed"), + NETWORK_EXPORT_FAILED("study.networkExportFailed"), + GET_LOADFLOW_PROVIDER_FAILED("study.getLoadflowProviderFailed"), + CREATE_DIAGRAM_GRID_LAYOUT_FAILED("study.createDiagramGridLayoutFailed"), + DUPLICATE_DIAGRAM_GRID_LAYOUT_FAILED("study.duplicateDiagramGridLayoutFailed"), + TOO_MANY_NAD_CONFIGS("study.tooManyNadConfigs"), + TOO_MANY_MAP_CARDS("study.tooManyMapCards"); + + private final String value; + + StudyBusinessErrorCode(String value) { + this.value = value; + } + + @Override + public String value() { + return value; + } +} diff --git a/src/main/java/org/gridsuite/study/server/error/StudyException.java b/src/main/java/org/gridsuite/study/server/error/StudyException.java new file mode 100644 index 0000000000..f1227c33f3 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/error/StudyException.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2019, 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.study.server.error; + +import com.powsybl.ws.commons.error.AbstractBusinessException; +import com.powsybl.ws.commons.error.BusinessErrorCode; +import lombok.NonNull; + +import java.util.Objects; + +/** + * @author Abdelsalem Hedhili + */ +public class StudyException extends AbstractBusinessException { + + private final StudyBusinessErrorCode errorCode; + + public StudyException(StudyBusinessErrorCode errorCode) { + super(Objects.requireNonNull(errorCode.name())); + this.errorCode = errorCode; + } + + public StudyException(StudyBusinessErrorCode errorCode, String message) { + super(message); + this.errorCode = errorCode; + } + + @Override + public @NonNull BusinessErrorCode getBusinessErrorCode() { + return errorCode; + } +} diff --git a/src/main/java/org/gridsuite/study/server/service/CaseService.java b/src/main/java/org/gridsuite/study/server/service/CaseService.java index b1497a69a2..aeb6376539 100644 --- a/src/main/java/org/gridsuite/study/server/service/CaseService.java +++ b/src/main/java/org/gridsuite/study/server/service/CaseService.java @@ -11,7 +11,7 @@ * @author Kevin Le Saulnier */ -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -25,7 +25,7 @@ import static org.gridsuite.study.server.StudyConstants.CASE_API_VERSION; import static org.gridsuite.study.server.StudyConstants.DELIMITER; -import static org.gridsuite.study.server.StudyException.Type.CASE_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.CASE_NOT_FOUND; @Service public class CaseService { diff --git a/src/main/java/org/gridsuite/study/server/service/DiagramGridLayoutService.java b/src/main/java/org/gridsuite/study/server/service/DiagramGridLayoutService.java index df9e09935a..91de76a19f 100644 --- a/src/main/java/org/gridsuite/study/server/service/DiagramGridLayoutService.java +++ b/src/main/java/org/gridsuite/study/server/service/DiagramGridLayoutService.java @@ -7,7 +7,7 @@ package org.gridsuite.study.server.service; import lombok.RequiredArgsConstructor; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.diagramgridlayout.DiagramGridLayout; import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.AbstractDiagramLayout; import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.MapLayout; @@ -21,6 +21,9 @@ import java.util.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.TOO_MANY_MAP_CARDS; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.TOO_MANY_NAD_CONFIGS; + /** * Service responsible for managing diagram grid layout operations. * Handles the complete lifecycle of diagram configurations including creation, update, and deletion @@ -152,7 +155,7 @@ private void validateMapCardCount(DiagramGridLayout diagramGridLayout) { .count(); if (mapCardsCount > MAX_MAP_CARDS_ALLOWED) { - throw new StudyException(StudyException.Type.TOO_MANY_MAP_CARDS, + throw new StudyException(TOO_MANY_MAP_CARDS, "Maximum " + MAX_MAP_CARDS_ALLOWED + " map card allowed, but " + mapCardsCount + " provided"); } } @@ -169,7 +172,7 @@ private void validateNadConfigCount(DiagramGridLayout diagramGridLayout) { .count(); if (nadConfigCount > MAX_NAD_CONFIGS_ALLOWED) { - throw new StudyException(StudyException.Type.TOO_MANY_NAD_CONFIGS, + throw new StudyException(TOO_MANY_NAD_CONFIGS, "Maximum " + MAX_NAD_CONFIGS_ALLOWED + " NAD configurations allowed, but " + nadConfigCount + " provided"); } } diff --git a/src/main/java/org/gridsuite/study/server/service/FilterService.java b/src/main/java/org/gridsuite/study/server/service/FilterService.java index bb35a77d31..db02856b9c 100644 --- a/src/main/java/org/gridsuite/study/server/service/FilterService.java +++ b/src/main/java/org/gridsuite/study/server/service/FilterService.java @@ -13,7 +13,7 @@ import org.gridsuite.filter.globalfilter.GlobalFilter; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; @@ -33,8 +33,8 @@ import static org.gridsuite.study.server.StudyConstants.NETWORK_UUID; import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_EQUIPMENT_TYPES; import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_VARIANT_ID; -import static org.gridsuite.study.server.StudyException.Type.EVALUATE_FILTER_FAILED; -import static org.gridsuite.study.server.StudyException.Type.NETWORK_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.EVALUATE_FILTER_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.NETWORK_NOT_FOUND; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java index 1b127b5486..81d8c0ed31 100644 --- a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.repository.StudyEntity; import org.gridsuite.study.server.service.common.AbstractComputationService; @@ -33,7 +33,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkConversionService.java b/src/main/java/org/gridsuite/study/server/service/NetworkConversionService.java index d3a026ad3c..f4fd4a7a58 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkConversionService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkConversionService.java @@ -14,10 +14,10 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; -import org.gridsuite.study.server.StudyException; import org.gridsuite.study.server.dto.RootNetworkInfos; import org.gridsuite.study.server.dto.caseimport.CaseImportAction; import org.gridsuite.study.server.dto.caseimport.CaseImportReceiver; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.networkexport.NetworkExportReceiver; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.ParameterizedTypeReference; @@ -35,7 +35,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; @Service diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkMapService.java b/src/main/java/org/gridsuite/study/server/service/NetworkMapService.java index 2c41b66349..7b930dd704 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkMapService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkMapService.java @@ -14,7 +14,7 @@ import com.powsybl.iidm.network.ThreeSides; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.IdentifiableInfos; import org.gridsuite.study.server.dto.InfoTypeParameters; import org.springframework.core.ParameterizedTypeReference; @@ -29,7 +29,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; @Service @@ -94,7 +94,7 @@ public String getElementInfos(UUID networkUuid, throw new StudyException(EQUIPMENT_NOT_FOUND); } if (HttpStatus.NOT_IMPLEMENTED.equals(e.getStatusCode())) { - throw new StudyException(StudyException.Type.NOT_IMPLEMENTED, e.getMessage()); + throw new StudyException(NOT_IMPLEMENTED, e.getMessage()); } throw handleHttpError(e, GET_NETWORK_ELEMENT_FAILED); } diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index 6f8e6ba639..13824ee272 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -11,7 +11,7 @@ import lombok.NonNull; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.StudyConstants; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.BuildInfos; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.modification.ModificationApplicationContext; @@ -36,7 +36,7 @@ import java.util.*; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.JsonUtils.getModificationContextJsonString; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java index da77939930..1d453f5c65 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java @@ -10,7 +10,7 @@ import jakarta.persistence.EntityNotFoundException; import lombok.NonNull; import org.apache.commons.lang3.StringUtils; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.modification.ModificationsSearchResultByNode; import org.gridsuite.study.server.dto.sequence.NodeSequenceType; @@ -32,7 +32,7 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; /** * @author Jacques Borsenberger diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java index b0d3361375..19aed287cc 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java @@ -9,7 +9,7 @@ import com.powsybl.timeseries.DoubleTimeSeries; import lombok.NonNull; import org.apache.commons.lang3.StringUtils; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.computation.LoadFlowComputationInfos; import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; @@ -45,7 +45,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.dto.ComputationType.*; import static org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.ComputationsInvalidationMode; diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java index 519e9daced..672b91d390 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java @@ -10,7 +10,7 @@ import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.model.VariantInfos; import lombok.NonNull; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.CaseInfos; import org.gridsuite.study.server.dto.NetworkInfos; import org.gridsuite.study.server.dto.RootNetworkAction; @@ -30,7 +30,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; /** * @author Le Saulnier Kevin diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index 094e3b78db..658716b68c 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -11,7 +11,7 @@ import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.RunSecurityAnalysisParametersInfos; @@ -37,7 +37,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java index 15a508432e..11f0530a43 100644 --- a/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.SensitivityAnalysisStatus; import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos; @@ -33,7 +33,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/SingleLineDiagramService.java b/src/main/java/org/gridsuite/study/server/service/SingleLineDiagramService.java index 7eeea0cabe..2359f3695f 100644 --- a/src/main/java/org/gridsuite/study/server/service/SingleLineDiagramService.java +++ b/src/main/java/org/gridsuite/study/server/service/SingleLineDiagramService.java @@ -12,7 +12,7 @@ */ import org.apache.commons.lang3.StringUtils; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.DiagramParameters; import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayoutDetails; import org.gridsuite.study.server.dto.diagramgridlayout.nad.NadConfigInfos; @@ -34,7 +34,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; @Service diff --git a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java index 16f89c9555..e745e65c9b 100644 --- a/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java +++ b/src/main/java/org/gridsuite/study/server/service/StateEstimationService.java @@ -11,7 +11,7 @@ import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.StateEstimationStatus; @@ -37,13 +37,13 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.CREATE_STATE_ESTIMATION_PARAMETERS_FAILED; -import static org.gridsuite.study.server.StudyException.Type.DELETE_STATE_ESTIMATION_PARAMETERS_FAILED; -import static org.gridsuite.study.server.StudyException.Type.GET_STATE_ESTIMATION_PARAMETERS_FAILED; -import static org.gridsuite.study.server.StudyException.Type.STATE_ESTIMATION_NOT_FOUND; -import static org.gridsuite.study.server.StudyException.Type.STATE_ESTIMATION_PARAMETERS_NOT_FOUND; -import static org.gridsuite.study.server.StudyException.Type.STATE_ESTIMATION_RUNNING; -import static org.gridsuite.study.server.StudyException.Type.UPDATE_STATE_ESTIMATION_PARAMETERS_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.CREATE_STATE_ESTIMATION_PARAMETERS_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DELETE_STATE_ESTIMATION_PARAMETERS_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.GET_STATE_ESTIMATION_PARAMETERS_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.STATE_ESTIMATION_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.STATE_ESTIMATION_PARAMETERS_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.STATE_ESTIMATION_RUNNING; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.UPDATE_STATE_ESTIMATION_PARAMETERS_FAILED; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/StudyConfigService.java b/src/main/java/org/gridsuite/study/server/service/StudyConfigService.java index 9a6c1c343a..5f86d00d96 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyConfigService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyConfigService.java @@ -8,7 +8,7 @@ import lombok.Setter; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.diagramgridlayout.DiagramGridLayout; import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.DiagramPosition; import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayout; @@ -28,7 +28,7 @@ import static org.gridsuite.study.server.StudyConstants.DELIMITER; import static org.gridsuite.study.server.StudyConstants.STUDY_CONFIG_API_VERSION; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index e2a274b4f3..e89471010c 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -16,7 +16,7 @@ import org.gridsuite.filter.globalfilter.GlobalFilter; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.study.server.StudyConstants; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.ComputationsInvalidationMode; import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.InvalidationMode; @@ -83,7 +83,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.dto.ComputationType.*; import static org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.ALL_WITH_BLOCK_NODES; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; @@ -629,7 +629,7 @@ public CreatedStudyBasicInfos insertStudy(UUID studyUuid, String userId, Network @Transactional public CreatedStudyBasicInfos updateNetwork(UUID studyUuid, UUID rootNetworkUuid, NetworkInfos networkInfos, String userId) { StudyEntity studyEntity = studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)); - RootNetworkEntity rootNetworkEntity = rootNetworkService.getRootNetwork(rootNetworkUuid).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkEntity rootNetworkEntity = rootNetworkService.getRootNetwork(rootNetworkUuid).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkService.updateNetwork(rootNetworkEntity, networkInfos); diff --git a/src/main/java/org/gridsuite/study/server/service/SupervisionService.java b/src/main/java/org/gridsuite/study/server/service/SupervisionService.java index 87d327d63e..7d1fb962fa 100644 --- a/src/main/java/org/gridsuite/study/server/service/SupervisionService.java +++ b/src/main/java/org/gridsuite/study/server/service/SupervisionService.java @@ -6,7 +6,7 @@ */ package org.gridsuite.study.server.service; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos; import org.gridsuite.study.server.dto.elasticsearch.TombstonedEquipmentInfos; @@ -37,8 +37,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; -import static org.gridsuite.study.server.StudyException.Type.ELEMENT_NOT_FOUND; -import static org.gridsuite.study.server.dto.ComputationType.LOAD_FLOW; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.ELEMENT_NOT_FOUND; /** * @author Hugo Marcellin diff --git a/src/main/java/org/gridsuite/study/server/service/UserAdminService.java b/src/main/java/org/gridsuite/study/server/service/UserAdminService.java index 522f396c48..2782f7703f 100644 --- a/src/main/java/org/gridsuite/study/server/service/UserAdminService.java +++ b/src/main/java/org/gridsuite/study/server/service/UserAdminService.java @@ -17,7 +17,7 @@ import java.util.Optional; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.GET_USER_PROFILE_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.GET_USER_PROFILE_FAILED; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java index 5492d2f80b..fd27aa028a 100644 --- a/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java +++ b/src/main/java/org/gridsuite/study/server/service/VoltageInitService.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.VariantInfos; @@ -33,7 +33,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicmapping/impl/DynamicMappingClientImpl.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicmapping/impl/DynamicMappingClientImpl.java index 3f3c26be15..39ad248e85 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicmapping/impl/DynamicMappingClientImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicmapping/impl/DynamicMappingClientImpl.java @@ -9,7 +9,7 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.dynamicmapping.MappingInfos; import org.gridsuite.study.server.dto.dynamicmapping.ModelInfos; import org.gridsuite.study.server.service.client.AbstractRestClient; @@ -24,7 +24,7 @@ import java.util.List; -import static org.gridsuite.study.server.StudyException.Type.DYNAMIC_MAPPING_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DYNAMIC_MAPPING_NOT_FOUND; import static org.gridsuite.study.server.service.client.util.UrlUtil.buildEndPointUrl; /** diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java index fa13375720..d88e45e3c7 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClient.java @@ -10,7 +10,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; import org.gridsuite.study.server.service.StudyService; @@ -28,7 +28,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.notification.NotificationService.HEADER_USER_ID; import static org.gridsuite.study.server.service.client.util.UrlUtil.buildEndPointUrl; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; diff --git a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java index efd7b468a9..751bb7c963 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/client/dynamicsimulation/impl/DynamicSimulationClientImpl.java @@ -10,7 +10,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationParametersInfos; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus; @@ -29,8 +29,8 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.DYNAMIC_SIMULATION_NOT_FOUND; -import static org.gridsuite.study.server.StudyException.Type.RUN_DYNAMIC_SIMULATION_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DYNAMIC_SIMULATION_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.RUN_DYNAMIC_SIMULATION_FAILED; import static org.gridsuite.study.server.notification.NotificationService.HEADER_USER_ID; import static org.gridsuite.study.server.service.client.util.UrlUtil.buildEndPointUrl; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; diff --git a/src/main/java/org/gridsuite/study/server/service/client/util/UrlUtil.java b/src/main/java/org/gridsuite/study/server/service/client/util/UrlUtil.java index 58bda5ff51..42e75b3153 100644 --- a/src/main/java/org/gridsuite/study/server/service/client/util/UrlUtil.java +++ b/src/main/java/org/gridsuite/study/server/service/client/util/UrlUtil.java @@ -8,12 +8,12 @@ package org.gridsuite.study.server.service.client.util; import org.apache.logging.log4j.util.Strings; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import java.net.URI; import java.net.URISyntaxException; -import static org.gridsuite.study.server.StudyException.Type.URI_SYNTAX; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.URI_SYNTAX; import static org.gridsuite.study.server.service.client.RestClient.DELIMITER; /** diff --git a/src/main/java/org/gridsuite/study/server/service/common/AbstractComputationService.java b/src/main/java/org/gridsuite/study/server/service/common/AbstractComputationService.java index ff5cf8725c..ffab99f5d3 100644 --- a/src/main/java/org/gridsuite/study/server/service/common/AbstractComputationService.java +++ b/src/main/java/org/gridsuite/study/server/service/common/AbstractComputationService.java @@ -1,6 +1,7 @@ package org.gridsuite.study.server.service.common; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyBusinessErrorCode; +import org.gridsuite.study.server.error.StudyException; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; @@ -14,14 +15,14 @@ import static org.gridsuite.study.server.StudyConstants.DELIMITER; import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_RESULTS_UUIDS; -import static org.gridsuite.study.server.StudyException.Type.DELETE_COMPUTATION_RESULTS_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DELETE_COMPUTATION_RESULTS_FAILED; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; public abstract class AbstractComputationService { public abstract List getEnumValues(String enumName, UUID resultUuidOpt); - public List getEnumValues(String enumName, UUID resultUuid, String apiVersion, String computingTypeBaseUri, StudyException.Type type, RestTemplate restTemplate) { + public List getEnumValues(String enumName, UUID resultUuid, String apiVersion, String computingTypeBaseUri, StudyBusinessErrorCode type, RestTemplate restTemplate) { List result; UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + apiVersion + "/results/{resultUuid}/{enumName}"); String path = uriComponentsBuilder.buildAndExpand(resultUuid, enumName).toUriString(); diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java index 480653d6b3..dba2145aa8 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisService.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections4.CollectionUtils; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicsecurityanalysis.DynamicSecurityAnalysisStatus; @@ -24,7 +24,7 @@ import java.util.List; import java.util.UUID; -import static org.gridsuite.study.server.StudyException.Type.DYNAMIC_SECURITY_ANALYSIS_RUNNING; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DYNAMIC_SECURITY_ANALYSIS_RUNNING; /** * @author Thang PHAM diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java index fa193a0a8a..a6eb686e43 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationService.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.powsybl.timeseries.DoubleTimeSeries; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.dynamicmapping.MappingInfos; import org.gridsuite.study.server.dto.dynamicmapping.ModelInfos; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationParametersInfos; diff --git a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java index 22288a42e1..b10c8b1e5d 100644 --- a/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java +++ b/src/main/java/org/gridsuite/study/server/service/dynamicsimulation/impl/DynamicSimulationServiceImpl.java @@ -13,7 +13,7 @@ import com.powsybl.timeseries.StringTimeSeries; import com.powsybl.timeseries.TimeSeries; import org.apache.commons.collections4.CollectionUtils; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicmapping.MappingInfos; @@ -39,8 +39,7 @@ import java.util.UUID; import java.util.stream.Stream; -import static org.gridsuite.study.server.StudyException.Type.DELETE_COMPUTATION_RESULTS_FAILED; -import static org.gridsuite.study.server.StudyException.Type.DYNAMIC_SIMULATION_RUNNING; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; /** @@ -120,7 +119,7 @@ public List getTimeSeriesResult(UUID resultUuid, List // get first element to check type if (!CollectionUtils.isEmpty(timeSeries) && !(timeSeries.get(0) instanceof DoubleTimeSeries)) { - throw new StudyException(StudyException.Type.TIME_SERIES_BAD_TYPE, "Time series can not be a type: " + throw new StudyException(TIME_SERIES_BAD_TYPE, "Time series can not be a type: " + timeSeries.get(0).getClass().getSimpleName() + ", expected type: " + DoubleTimeSeries.class.getSimpleName()); } @@ -141,7 +140,7 @@ public List getTimelineResult(UUID resultUuid) { // get first element to check type if (!CollectionUtils.isEmpty(timelines) && !(timelines.get(0) instanceof StringTimeSeries)) { - throw new StudyException(StudyException.Type.TIME_SERIES_BAD_TYPE, "Timelines can not be a type: " + throw new StudyException(TIME_SERIES_BAD_TYPE, "Timelines can not be a type: " + timelines.get(0).getClass().getSimpleName() + ", expected type: " + StringTimeSeries.class.getSimpleName()); } @@ -154,7 +153,7 @@ public List getTimelineResult(UUID resultUuid) { try { return objectMapper.readValue(eventJson, TimelineEventInfos.class); } catch (JsonProcessingException e) { - throw new StudyException(StudyException.Type.TIMELINE_BAD_TYPE, "Error while deserializing timeline event: " + eventJson); + throw new StudyException(TIMELINE_BAD_TYPE, "Error while deserializing timeline event: " + eventJson); } }).toList(); } diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index 61ac481e04..36b6fcc5f8 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -13,7 +13,7 @@ import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.ShortCircuitStatus; @@ -39,7 +39,7 @@ import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.utils.StudyUtils.addPageableToQueryParams; import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError; diff --git a/src/main/java/org/gridsuite/study/server/utils/StudyUtils.java b/src/main/java/org/gridsuite/study/server/utils/StudyUtils.java index 6890fa514f..d89d041261 100644 --- a/src/main/java/org/gridsuite/study/server/utils/StudyUtils.java +++ b/src/main/java/org/gridsuite/study/server/utils/StudyUtils.java @@ -11,7 +11,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyBusinessErrorCode; +import org.gridsuite.study.server.error.StudyException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Pageable; @@ -31,7 +32,7 @@ private StudyUtils() { throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); } - public static StudyException handleHttpError(HttpStatusCodeException httpException, StudyException.Type type) { + public static StudyException handleHttpError(HttpStatusCodeException httpException, StudyBusinessErrorCode type) { String responseBody = httpException.getResponseBodyAsString(); String errorMessage = responseBody.isEmpty() ? httpException.getStatusCode().toString() : parseHttpError(responseBody); diff --git a/src/test/java/org/gridsuite/study/server/DiagramGridLayoutTest.java b/src/test/java/org/gridsuite/study/server/DiagramGridLayoutTest.java index 1ca43552d2..f1c01dd50b 100644 --- a/src/test/java/org/gridsuite/study/server/DiagramGridLayoutTest.java +++ b/src/test/java/org/gridsuite/study/server/DiagramGridLayoutTest.java @@ -4,6 +4,7 @@ import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.repository.StudyEntity; import org.gridsuite.study.server.repository.StudyRepository; import org.gridsuite.study.server.service.StudyConfigService; @@ -35,6 +36,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DIAGRAM_GRID_LAYOUT_NOT_FOUND; import static org.gridsuite.study.server.StudyConstants.DELIMITER; import static org.gridsuite.study.server.StudyConstants.STUDY_CONFIG_API_VERSION; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -191,7 +193,7 @@ void testDeleteDiagramGridLayoutWithError() { studyConfigService.deleteDiagramGridLayout(diagramGridLayoutUuid); }); - assertEquals(StudyException.Type.DIAGRAM_GRID_LAYOUT_NOT_FOUND, exception.getType()); + assertEquals(DIAGRAM_GRID_LAYOUT_NOT_FOUND, exception.getBusinessErrorCode()); wireMockServer.stubFor(WireMock.delete(DELIMITER + STUDY_CONFIG_API_VERSION + "/diagram-grid-layout/" + diagramGridLayoutUuid) .willReturn(WireMock.serverError())); @@ -212,7 +214,7 @@ void testSaveDiagramGridLayoutWithError() { studyConfigService.saveDiagramGridLayout(diagramGridLayout); }); - assertEquals(StudyException.Type.DIAGRAM_GRID_LAYOUT_NOT_FOUND, exception.getType()); + assertEquals(DIAGRAM_GRID_LAYOUT_NOT_FOUND, exception.getBusinessErrorCode()); wireMockServer.stubFor(WireMock.post(DELIMITER + STUDY_CONFIG_API_VERSION + "/diagram-grid-layout") .willReturn(WireMock.serverError())); @@ -234,7 +236,7 @@ void testUpdateDiagramGridLayoutWithError() { studyConfigService.updateDiagramGridLayout(diagramGridLayoutUuid, diagramGridLayout); }); - assertEquals(StudyException.Type.DIAGRAM_GRID_LAYOUT_NOT_FOUND, exception.getType()); + assertEquals(DIAGRAM_GRID_LAYOUT_NOT_FOUND, exception.getBusinessErrorCode()); wireMockServer.stubFor(WireMock.put(DELIMITER + STUDY_CONFIG_API_VERSION + "/diagram-grid-layout/" + diagramGridLayoutUuid) .willReturn(WireMock.serverError())); diff --git a/src/test/java/org/gridsuite/study/server/LoadFlowTest.java b/src/test/java/org/gridsuite/study/server/LoadFlowTest.java index 71286454c6..c2c4374687 100644 --- a/src/test/java/org/gridsuite/study/server/LoadFlowTest.java +++ b/src/test/java/org/gridsuite/study/server/LoadFlowTest.java @@ -23,6 +23,7 @@ import okhttp3.Headers; import okhttp3.HttpUrl; import org.gridsuite.study.server.dto.*; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.networkmodificationtree.dto.BuildStatus; import org.gridsuite.study.server.networkmodificationtree.dto.InsertMode; import org.gridsuite.study.server.networkmodificationtree.dto.NetworkModificationNode; @@ -68,7 +69,7 @@ import static org.gridsuite.study.server.StudyConstants.HEADER_RECEIVER; import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; -import static org.gridsuite.study.server.StudyException.Type.LOADFLOW_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.LOADFLOW_NOT_FOUND; import static org.gridsuite.study.server.dto.ComputationType.LOAD_FLOW; import static org.gridsuite.study.server.notification.NotificationService.*; import static org.gridsuite.study.server.utils.TestUtils.USER_DEFAULT_PROFILE_JSON; diff --git a/src/test/java/org/gridsuite/study/server/NetworkMapTest.java b/src/test/java/org/gridsuite/study/server/NetworkMapTest.java index e5702c723b..7221895304 100644 --- a/src/test/java/org/gridsuite/study/server/NetworkMapTest.java +++ b/src/test/java/org/gridsuite/study/server/NetworkMapTest.java @@ -13,6 +13,7 @@ import com.powsybl.commons.exceptions.UncheckedInterruptedException; import com.powsybl.iidm.network.TwoSides; import com.powsybl.loadflow.LoadFlowParameters; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import lombok.SneakyThrows; import mockwebserver3.Dispatcher; import mockwebserver3.MockResponse; @@ -763,12 +764,15 @@ private MvcResult getNetworkElementInfosNotFound(UUID studyUuid, UUID rootNetwor private void getNetworkElementInfosWithError(UUID studyUuid, UUID rootNetworkUuid, UUID rootNodeUuid, String elementType, String infoType, String elementId) throws Exception { UUID stubUuid = wireMockUtils.stubNetworkElementInfosGetWithError(NETWORK_UUID_STRING, elementType, infoType, elementId); - mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/elements/{elementId}", studyUuid, rootNetworkUuid, rootNodeUuid, elementId) + var result = mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/elements/{elementId}", studyUuid, rootNetworkUuid, rootNodeUuid, elementId) .queryParam(QUERY_PARAM_ELEMENT_TYPE, elementType) .queryParam(QUERY_PARAM_INFO_TYPE, infoType) .queryParam(String.format(QUERY_FORMAT_OPTIONAL_PARAMS, QUERY_PARAM_DC_POWERFACTOR), Double.toString(LoadFlowParameters.DEFAULT_DC_POWER_FACTOR)) ) - .andExpectAll(status().isInternalServerError(), content().string("Internal Server Error")); + .andExpect(status().isInternalServerError()) + .andReturn(); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals("Internal Server Error", problemDetail.getDetail()); wireMockUtils.verifyNetworkElementInfosGet(stubUuid, NETWORK_UUID_STRING, elementType, infoType, elementId); } diff --git a/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java b/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java index ab28785f94..9ee102dc9d 100644 --- a/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java +++ b/src/test/java/org/gridsuite/study/server/NetworkModificationTest.java @@ -21,6 +21,7 @@ import com.powsybl.iidm.serde.XMLImporter; import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import lombok.SneakyThrows; import mockwebserver3.Dispatcher; import mockwebserver3.MockResponse; @@ -34,6 +35,7 @@ import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus; import org.gridsuite.study.server.dto.impacts.SimpleElementImpact.SimpleImpactType; import org.gridsuite.study.server.dto.modification.*; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.networkmodificationtree.dto.*; import org.gridsuite.study.server.networkmodificationtree.entities.NetworkModificationNodeType; import org.gridsuite.study.server.networkmodificationtree.entities.NodeBuildStatusEmbeddable; @@ -77,6 +79,7 @@ import java.util.*; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.StudyConstants.HEADER_ERROR_MESSAGE; import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_RECEIVER; import static org.gridsuite.study.server.utils.ImpactUtils.createModificationResultWithElementImpact; @@ -478,7 +481,9 @@ void testBuildQuotaExceeded() throws Exception { .contentType(APPLICATION_JSON) ).andExpect(status().isForbidden()) .andReturn(); - assertTrue(result.getResponse().getContentAsString().equalsIgnoreCase("MAX_NODE_BUILDS_EXCEEDED max allowed built nodes : 1")); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(MAX_NODE_BUILDS_EXCEEDED.value(), problemDetail.getBusinessErrorCode()); + assertEquals("max allowed built nodes : 1", problemDetail.getDetail()); wireMockUtils.verifyGetRequest(userProfileQuotaExceededStubId, "/v1/users/" + userId + "/profile/max-builds", Map.of()); } @@ -555,7 +560,7 @@ void testBuild() throws Exception { assertEquals(List.of(modificationGroupUuid1, modificationGroupUuid2, modificationGroupUuid3, modificationGroupUuid4, modificationGroupUuid5), buildInfos.getModificationGroupUuids()); // Mark the node 3 status as built - RootNetworkNodeInfoEntity rootNetworkNodeInfo3Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo3Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo3Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo3Entity); @@ -566,17 +571,17 @@ void testBuild() throws Exception { assertEquals(List.of(modificationGroupUuid4), buildInfos.getModificationGroupUuids()); // Mark the node 2 status as not built - RootNetworkNodeInfoEntity rootNetworkNodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode2.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode2.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo2Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.NOT_BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo2Entity); // Mark the node 4 status as not built - RootNetworkNodeInfoEntity rootNetworkNodeInfo4Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode4.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo4Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode4.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo4Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.NOT_BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo4Entity); // Mark the node 5 status as built - RootNetworkNodeInfoEntity rootNetworkNodeInfo5Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode5.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo5Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode5.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo5Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo5Entity); @@ -588,7 +593,7 @@ void testBuild() throws Exception { assertEquals(BuildStatus.BUILT, networkModificationTreeService.getNodeBuildStatus(modificationNode5.getId(), rootNetworkUuid).getGlobalBuildStatus()); // Mark the node 3 status as built - rootNetworkNodeInfo3Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + rootNetworkNodeInfo3Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo3Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo3Entity); @@ -616,7 +621,7 @@ void testLocalBuildValue() throws Exception { wireMockUtils.stubNetworkModificationPost(mapper.writeValueAsString(new NetworkModificationsResult(List.of(UUID.randomUUID()), List.of(Optional.empty())))); // Mark the node status as built - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity); @@ -740,10 +745,10 @@ void testNetworkModificationSwitch(final MockWebServer server) throws Exception wireMockUtils.verifyNetworkModificationPostWithVariant(stubPostId, getModificationContextJsonString(mapper, modificationBody)); // test build status on switch modification - RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo1Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo1Entity); - RootNetworkNodeInfoEntity rootNetworkNodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode2.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode2.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo2Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo2Entity); @@ -1066,7 +1071,7 @@ void testCreateLine() throws Exception { + "\"voltageLevelId1\":\"idVL1\"," + "\"busOrBusbarSectionId1\":\"idBus1\"," + "\"voltageLevelId2\":\"idVL2\"," + "\"busOrBusbarSectionId2\":\"idBus2\"}"; // Mark the node 1 status as building - RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo1Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILDING)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo1Entity); // create line on building node @@ -1138,7 +1143,7 @@ void testCreateTwoWindingsTransformer() throws Exception { String createTwoWindingsTransformerAttributes2 = "{\"type\":\"" + ModificationType.TWO_WINDINGS_TRANSFORMER_CREATION + "\",\"equipmentId\":\"2wtId3\",\"equipmentName\":\"2wtName3\",\"seriesResistance\":\"10\",\"seriesReactance\":\"10\",\"magnetizingConductance\":\"100\",\"magnetizingSusceptance\":\"100\",\"ratedVoltage1\":\"480\",\"ratedVoltage2\":\"380\",\"voltageLevelId1\":\"CHOO5P6\",\"busOrBusbarSectionId1\":\"CHOO5P6_1\",\"voltageLevelId2\":\"CHOO5P6\",\"busOrBusbarSectionId2\":\"CHOO5P6_1\"}"; // Mark the node 1 status as building - RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo1Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILDING)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo1Entity); // create Two Windings Transformer on building node @@ -1413,7 +1418,7 @@ void testCreateLoad() throws Exception { String createLoadAttributes2 = "{\"type\":\"" + ModificationType.LOAD_CREATION + "\",\"loadId\":\"loadId3\",\"loadName\":\"loadName3\",\"loadType\":\"UNDEFINED\",\"activePower\":\"100.0\",\"reactivePower\":\"50.0\",\"voltageLevelId\":\"idVL1\",\"busId\":\"idBus1\"}"; // Mark the node 3 status as built - RootNetworkNodeInfoEntity rootNetworkNodeInfo3Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo3Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo3Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILDING)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo3Entity); @@ -1605,7 +1610,7 @@ void testCreateSubstation() throws Exception { String createSubstationAttributes2 = "{\"type\":\"" + ModificationType.SUBSTATION_CREATION + "\",\"substationId\":\"substationId2\",\"substationName\":\"substationName2\",\"country\":\"AD\"}"; // Mark the node 1 status as built - RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo1Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILDING)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo1Entity); // create substation on building node @@ -1679,7 +1684,7 @@ void testCreateVoltageLevel() throws Exception { String createVoltageLevelAttributes2 = "{\"type\":\"" + ModificationType.VOLTAGE_LEVEL_CREATION + "\",\"voltageLevelId\":\"voltageLevelId3\",\"voltageLevelName\":\"voltageLevelName3\"" + ",\"nominalVoltage\":\"379.1\", \"substationId\":\"s2\"}"; // Mark the node 1 status as building - RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo1Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILDING)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo1Entity); // create voltage level on building node @@ -1739,21 +1744,23 @@ void testLineSplitWithVoltageLevel() throws Exception { String modificationBodyJson = getModificationContextJsonString(mapper, Pair.of(badBody, List.of(rootNetworkNodeInfoService.getNetworkModificationApplicationContext(firstRootNetworkUuid, modificationNodeUuid, NETWORK_UUID)))); stubPostId = wireMockUtils.stubNetworkModificationPostWithBodyAndError(modificationBodyJson); stubPutId = wireMockUtils.stubNetworkModificationPutWithBodyAndError(MODIFICATION_UUID, badBody); - mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) + var result = mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) .content(badBody).contentType(MediaType.APPLICATION_JSON) .header(USER_ID_HEADER, userId)) - .andExpectAll( - status().isBadRequest(), - content().string("400 BAD_REQUEST")); + .andExpect(status().isBadRequest()) + .andReturn(); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(CREATE_NETWORK_MODIFICATION_FAILED.value(), problemDetail.getBusinessErrorCode()); checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentCreatingMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentUpdatingFinishedMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); - mockMvc.perform(put(URI_NETWORK_MODIF_WITH_ID, studyNameUserIdUuid, modificationNodeUuid, MODIFICATION_UUID) + result = mockMvc.perform(put(URI_NETWORK_MODIF_WITH_ID, studyNameUserIdUuid, modificationNodeUuid, MODIFICATION_UUID) .content(badBody).contentType(MediaType.APPLICATION_JSON) .header(USER_ID_HEADER, userId)) - .andExpectAll( - status().isBadRequest(), - content().string("400 BAD_REQUEST")); + .andExpect(status().isBadRequest()) + .andReturn(); + problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(UPDATE_NETWORK_MODIFICATION_FAILED.value(), problemDetail.getBusinessErrorCode()); checkEquipmentUpdatingMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentUpdatingFinishedMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); wireMockUtils.verifyNetworkModificationPost(stubPostId, modificationBodyJson); @@ -2142,7 +2149,7 @@ void testDuplicateModification() throws Exception { verify(rootNetworkNodeInfoService, times(1)).copyModificationsToExclude(any(), any(), any()); // now we do the same but on a built node - RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(nodeUuid1, studyTestUtils.getOneRootNetworkUuid(studyUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(nodeUuid1, studyTestUtils.getOneRootNetworkUuid(studyUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfo1Entity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfo1Entity); @@ -2435,7 +2442,7 @@ void testNodesInvalidation(final MockWebServer server) throws Exception { NetworkModificationNode modificationNode3 = createNetworkModificationNode(studyNameUserIdUuid, modificationNode2Uuid, UUID.randomUUID(), VARIANT_ID_3, "node 3", NetworkModificationNodeType.SECURITY, BuildStatus.BUILT, userId); UUID modificationNode3Uuid = modificationNode3.getId(); - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity.setSecurityAnalysisResultUuid(UUID.fromString(SECURITY_ANALYSIS_RESULT_UUID)); rootNetworkNodeInfoEntity.setSensitivityAnalysisResultUuid(UUID.fromString(SENSITIVITY_ANALYSIS_RESULT_UUID)); rootNetworkNodeInfoEntity.setShortCircuitAnalysisResultUuid(UUID.fromString(SHORTCIRCUIT_ANALYSIS_RESULT_UUID)); @@ -2479,10 +2486,10 @@ void testNodesInvalidation(final MockWebServer server) throws Exception { assertTrue(requests.stream().anyMatch(r -> r.getPath().matches("/v1/results\\?resultsUuids=" + STATE_ESTIMATION_RESULT_UUID))); // Mark nodes 2 and 3 status as built - rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode2Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode2Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity); - rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode3Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity); @@ -2519,7 +2526,7 @@ void testRemoveLoadFlowComputationReport(final MockWebServer server) throws Exce NetworkModificationNode modificationNode1 = createNetworkModificationNode(studyNameUserIdUuid, rootNodeUuid, UUID.randomUUID(), VARIANT_ID, "node 1", NetworkModificationNodeType.SECURITY, BuildStatus.BUILT, userId); UUID modificationNode1Uuid = modificationNode1.getId(); // In this node, let's say we have all computations results - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode1Uuid, studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity.setLoadFlowResultUuid(LOADFLOW_RESULT_UUID); rootNetworkNodeInfoEntity.setSecurityAnalysisResultUuid(UUID.fromString(SECURITY_ANALYSIS_RESULT_UUID)); rootNetworkNodeInfoEntity.setDynamicSimulationResultUuid(DYNAMIC_SIMULATION_RESULT_UUID); @@ -2616,7 +2623,7 @@ void testUpdateOfBuildStatus() throws Exception { wireMockUtils.verifyNetworkModificationPostWithVariant(stubPostId, getModificationContextJsonString(mapper, modificationBody)); // Mark the node status as built - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(modificationNode.getId(), studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid)).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity.setNodeBuildStatus(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT)); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity); @@ -3017,10 +3024,13 @@ void testCreateModificationWithErrors() throws Exception { // String message error String contentErrorMessage = "Internal Server Error"; UUID stubId = wireMockUtils.stubNetworkModificationPostWithError(modificationBodyJson); - mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) + var result = mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) .content(jsonCreateLoadInfos).contentType(MediaType.APPLICATION_JSON) .header(USER_ID_HEADER, userId)) - .andExpectAll(status().isBadRequest(), content().string(contentErrorMessage)); + .andExpect(status().isBadRequest()) + .andReturn(); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(CREATE_NETWORK_MODIFICATION_FAILED.value(), problemDetail.getBusinessErrorCode()); checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentCreatingMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentUpdatingFinishedMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); @@ -3028,10 +3038,13 @@ void testCreateModificationWithErrors() throws Exception { // Json message error stubId = wireMockUtils.stubNetworkModificationPostWithError(modificationBodyJson, String.format("{\"message\" : \"%s\"}", contentErrorMessage)); - mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) + result = mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) .content(jsonCreateLoadInfos).contentType(MediaType.APPLICATION_JSON) .header(USER_ID_HEADER, userId)) - .andExpectAll(status().isBadRequest(), content().string(contentErrorMessage)); + .andExpect(status().isBadRequest()) + .andReturn(); + problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(CREATE_NETWORK_MODIFICATION_FAILED.value(), problemDetail.getBusinessErrorCode()); checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentCreatingMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentUpdatingFinishedMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); @@ -3040,10 +3053,13 @@ void testCreateModificationWithErrors() throws Exception { // Bad json message error contentErrorMessage = String.format("{\"foo\" : \"%s\"}", contentErrorMessage); stubId = wireMockUtils.stubNetworkModificationPostWithError(modificationBodyJson, contentErrorMessage); - mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) + result = mockMvc.perform(post(URI_NETWORK_MODIF, studyNameUserIdUuid, modificationNodeUuid) .content(jsonCreateLoadInfos).contentType(MediaType.APPLICATION_JSON) .header(USER_ID_HEADER, userId)) - .andExpectAll(status().isBadRequest(), content().string(contentErrorMessage)); + .andExpect(status().isBadRequest()) + .andReturn(); + problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(CREATE_NETWORK_MODIFICATION_FAILED.value(), problemDetail.getBusinessErrorCode()); checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentCreatingMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); checkEquipmentUpdatingFinishedMessagesReceived(studyNameUserIdUuid, modificationNodeUuid); diff --git a/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java b/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java index 63149d28df..b6b8f956b4 100644 --- a/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java +++ b/src/test/java/org/gridsuite/study/server/NetworkModificationTreeTest.java @@ -20,6 +20,7 @@ import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.VariantManager; import com.powsybl.network.store.client.NetworkStoreService; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import lombok.SneakyThrows; import mockwebserver3.Dispatcher; import mockwebserver3.MockResponse; @@ -30,6 +31,7 @@ import okhttp3.HttpUrl; import org.gridsuite.study.server.dto.RootNetworkNodeInfo; import org.gridsuite.study.server.dto.modification.NetworkModificationResult; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.networkmodificationtree.dto.*; import org.gridsuite.study.server.networkmodificationtree.entities.*; import org.gridsuite.study.server.notification.NotificationService; @@ -77,6 +79,7 @@ import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.notification.NotificationService.*; import static org.gridsuite.study.server.service.NetworkModificationTreeService.ROOT_NODE_NAME; import static org.junit.jupiter.api.Assertions.*; @@ -588,14 +591,14 @@ void testNodeCreationRules() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(objectWriter.writeValueAsString(securityNode)) .header(USER_ID_HEADER, "userId")) - .andExpect(status().is4xxClientError()); + .andExpect(status().is5xxServerError()); // Argument type mismatch is handled as a server error by spring /* RULE: Security node CANNOT be inserted after a construction node */ mockMvc.perform(post("/v1/studies/{studyUuid}/tree/nodes/{id}?mode={insertMode}", root.getStudyId(), newConstructionNode, InsertMode.AFTER) .contentType(MediaType.APPLICATION_JSON) .content(objectWriter.writeValueAsString(securityNode)) .header(USER_ID_HEADER, "userId")) - .andExpect(status().is4xxClientError()); + .andExpect(status().is5xxServerError()); // Argument type mismatch is handled as a server error by spring } private static final String ROOT_NETWORK_UUID = "00000000-8cf0-11bd-b23e-10b96e4ef00d"; @@ -774,14 +777,14 @@ void testNodeModificationInfos() throws Exception { RootNode root = getRootNode(rootStudyId, firstRootNetworkUuid); UUID rootId = root.getId(); - RootNodeInfoEntity rootInfos = rootNodeInfoRepository.findById(rootId).orElseThrow(() -> new StudyException(StudyException.Type.NODE_NOT_FOUND)); + RootNodeInfoEntity rootInfos = rootNodeInfoRepository.findById(rootId).orElseThrow(() -> new StudyException(NODE_NOT_FOUND)); assertEquals(rootId, rootInfos.getId()); List children = root.getChildren(); assertEquals(2, children.size()); NetworkModificationNode n1 = (NetworkModificationNode) (children.stream().filter(c -> c.getName().equals("n1")).findFirst().orElseThrow()); NetworkModificationNodeInfoEntity n1Infos = networkModificationTreeService.getNetworkModificationNodeInfoEntity(n1.getId()); - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(n1.getId(), firstRootNetworkUuid).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(n1.getId(), firstRootNetworkUuid).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); assertEquals("n1", n1.getName()); assertEquals("zzz", n1.getDescription()); @@ -1501,7 +1504,7 @@ private void createNodeFail(UUID studyUuid, AbstractNode parentNode, AbstractNod .contentType(MediaType.APPLICATION_JSON) .content(objectWriter.writeValueAsString(newNode)) .header(USER_ID_HEADER, "userId")) - .andExpect(status().isBadRequest()); + .andExpect(status().isInternalServerError()); } private void createNodeForbidden(UUID studyUuid, AbstractNode parentNode, AbstractNode newNode) throws Exception { @@ -1529,11 +1532,12 @@ void testGetNetworkModificationsNode() throws Exception { UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), BuildStatus.BUILT); createNode(root.getStudyId(), root, node, userId); - String bodyError = mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), node.getId())) + var result = mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), node.getId())) .andExpect(status().isInternalServerError()) - .andReturn().getResponse().getContentAsString(); - - assertEquals(new StudyException(StudyException.Type.GET_MODIFICATIONS_FAILED, HttpStatus.NOT_FOUND.toString()).getMessage(), bodyError); + .andReturn(); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(GET_MODIFICATIONS_FAILED.value(), problemDetail.getBusinessErrorCode()); + assertEquals(HttpStatus.NOT_FOUND.toString(), problemDetail.getDetail()); // No network modification for a root node mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), root.getId())) @@ -1558,11 +1562,12 @@ void testGetNetworkModificationsToRestoreByNode() throws Exception { UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), BuildStatus.BUILT); createNode(root.getStudyId(), root, node, userId); - String bodyError = mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), node.getId(), true)) + var result = mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), node.getId(), true)) .andExpect(status().isInternalServerError()) - .andReturn().getResponse().getContentAsString(); - - assertEquals(new StudyException(StudyException.Type.GET_MODIFICATIONS_FAILED, HttpStatus.NOT_FOUND.toString()).getMessage(), bodyError); + .andReturn(); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(GET_MODIFICATIONS_FAILED.value(), problemDetail.getBusinessErrorCode()); + assertEquals(HttpStatus.NOT_FOUND.toString(), problemDetail.getDetail()); // No network modification for a root node mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), root.getId(), true)) @@ -1602,11 +1607,12 @@ void testGetNetworkModificationsToStashByNode() throws Exception { UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), BuildStatus.BUILT); createNode(root.getStudyId(), root, node, userId); - String bodyError = mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), node.getId(), false)) + var result = mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), node.getId(), false)) .andExpect(status().isInternalServerError()) - .andReturn().getResponse().getContentAsString(); - - assertEquals(new StudyException(StudyException.Type.GET_MODIFICATIONS_FAILED, HttpStatus.NOT_FOUND.toString()).getMessage(), bodyError); + .andReturn(); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(GET_MODIFICATIONS_FAILED.value(), problemDetail.getBusinessErrorCode()); + assertEquals(HttpStatus.NOT_FOUND.toString(), problemDetail.getDetail()); // No network modification for a root node mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications", root.getStudyId(), root.getId(), false)) diff --git a/src/test/java/org/gridsuite/study/server/NetworkModificationUnitTest.java b/src/test/java/org/gridsuite/study/server/NetworkModificationUnitTest.java index 135f4a8df9..20a75adcd6 100644 --- a/src/test/java/org/gridsuite/study/server/NetworkModificationUnitTest.java +++ b/src/test/java/org/gridsuite/study/server/NetworkModificationUnitTest.java @@ -12,6 +12,7 @@ import org.gridsuite.study.server.dto.BuildInfos; import org.gridsuite.study.server.dto.RootNetworkIndexationStatus; import org.gridsuite.study.server.dto.workflow.RerunLoadFlowInfos; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.networkmodificationtree.dto.BuildStatus; import org.gridsuite.study.server.networkmodificationtree.dto.NodeBuildStatus; import org.gridsuite.study.server.networkmodificationtree.entities.*; @@ -55,6 +56,7 @@ import java.util.UUID; import java.util.stream.Collectors; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.ROOT_NETWORK_NOT_FOUND; import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_WORKFLOW_INFOS; import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_WORKFLOW_TYPE; import static org.junit.jupiter.api.Assertions.*; @@ -220,7 +222,7 @@ void unbuildNode() { } private void assertNodeBuildStatus(UUID nodeUuid, BuildStatus buildStatus) { - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findAllByNodeInfoId(nodeUuid).stream().findFirst().orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findAllByNodeInfoId(nodeUuid).stream().findFirst().orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); assertEquals(buildStatus, rootNetworkNodeInfoEntity.getNodeBuildStatus().getLocalBuildStatus()); } diff --git a/src/test/java/org/gridsuite/study/server/NodeSequenceTest.java b/src/test/java/org/gridsuite/study/server/NodeSequenceTest.java index ce44392bbd..64543689e2 100644 --- a/src/test/java/org/gridsuite/study/server/NodeSequenceTest.java +++ b/src/test/java/org/gridsuite/study/server/NodeSequenceTest.java @@ -8,6 +8,7 @@ import org.gridsuite.study.server.dto.sequence.NodeSequenceType; import org.gridsuite.study.server.dto.sequence.SecuritySequence; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.networkmodificationtree.dto.AbstractNode; import org.gridsuite.study.server.networkmodificationtree.dto.InsertMode; import org.gridsuite.study.server.networkmodificationtree.dto.NetworkModificationNode; diff --git a/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java index 408c1505c1..3f1bdda9bc 100644 --- a/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java @@ -87,7 +87,7 @@ class SecurityAnalysisTest { private static final String SECURITY_ANALYSIS_RESULT_UUID = "f3a85c9b-9594-4e55-8ec7-07ea965d24eb"; private static final String SECURITY_ANALYSIS_OTHER_NODE_RESULT_UUID = "11111111-9594-4e55-8ec7-07ea965d24eb"; private static final String SECURITY_ANALYSIS_ERROR_NODE_RESULT_UUID = "22222222-9594-4e55-8ec7-07ea965d24eb"; - private static final String NOT_FOUND_SECURITY_ANALYSIS_UUID = "e3a85c9b-9594-4e55-8ec7-07ea965d24eb"; + private static final String NOT_FOUND_NODE_UUID = "e3a85c9b-9594-4e55-8ec7-07ea965d24eb"; private static final String CONTINGENCY_LIST_NAME = "ls"; private String limitTypeJson; private static final String SECURITY_ANALYSIS_N_RESULT_JSON = "{\"status\":\"CONVERGED\",\"limitViolationsResult\":{\"limitViolations\":[{\"subjectId\":\"l3\",\"limitType\":\"CURRENT\",\"acceptableDuration\":1200,\"limit\":10.0,\"limitReduction\":1.0,\"value\":11.0,\"side\":\"ONE\"}],\"actionsTaken\":[]},\"networkResult\":{\"branchResults\":[],\"busResults\":[],\"threeWindingsTransformerResults\":[]}}"; @@ -470,7 +470,14 @@ private void testSecurityAnalysisWithRootNetworkUuidAndNodeUuid(final MockWebSer String resultAsString; // security analysis not found - mockMvc.perform(get("/v1/security-analysis/results/{resultUuid}", NOT_FOUND_SECURITY_ANALYSIS_UUID)).andExpect(status().isNotFound()); + mockMvc.perform( + get( + "/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/result?resultType={resultType}", + studyUuid, + rootNetworkUuid, + NOT_FOUND_NODE_UUID, + SecurityAnalysisResultType.N)) + .andExpect(status().isNotFound()); // run security analysis MockHttpServletRequestBuilder requestBuilder = post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/security-analysis/run?contingencyListName={contingencyListName}", diff --git a/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java index 5b638ee1ef..6c3d2b2d99 100644 --- a/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java @@ -13,6 +13,7 @@ import com.github.tomakehurst.wiremock.client.WireMock; import com.powsybl.commons.exceptions.UncheckedInterruptedException; import com.powsybl.sensitivity.SensitivityFunctionType; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import lombok.SneakyThrows; import mockwebserver3.Dispatcher; import mockwebserver3.MockResponse; @@ -25,6 +26,7 @@ import org.gridsuite.study.server.dto.RootNetworkNodeInfo; import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos; import org.gridsuite.study.server.dto.sensianalysis.SensitivityFactorsIdsByGroup; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.networkmodificationtree.dto.InsertMode; import org.gridsuite.study.server.networkmodificationtree.dto.NetworkModificationNode; import org.gridsuite.study.server.networkmodificationtree.dto.RootNode; @@ -63,6 +65,8 @@ import java.util.*; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.ROOT_NETWORK_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.STUDY_NOT_FOUND; import static org.gridsuite.study.server.StudyConstants.HEADER_RECEIVER; import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; import static org.gridsuite.study.server.dto.ComputationType.SENSITIVITY_ANALYSIS; @@ -91,7 +95,7 @@ class SensitivityAnalysisTest { private static final String SENSITIVITY_ANALYSIS_RESULT_UUID = "b3a84c9b-9594-4e85-8ec7-07ea965d24eb"; private static final String SENSITIVITY_ANALYSIS_OTHER_NODE_RESULT_UUID = "11131111-8594-4e55-8ef7-07ea965d24eb"; private static final String SENSITIVITY_ANALYSIS_ERROR_NODE_RESULT_UUID = "25222222-9994-4e55-8ec7-07ea965d24eb"; - private static final String NOT_FOUND_SENSITIVITY_ANALYSIS_UUID = "a3a80c9b-9594-4e55-8ec7-07ea965d24eb"; + private static final String NOT_FOUND_NODE_UUID = "a3a80c9b-9594-4e55-8ec7-07ea965d24eb"; private static final String FAKE_RESULT_JSON = "fake result json"; private static final String SENSITIVITY_ANALYSIS_STATUS_JSON = "{\"status\":\"COMPLETED\"}"; @@ -316,7 +320,13 @@ public MockResponse dispatch(RecordedRequest request) { private void testSensitivityAnalysisWithRootNetworkUuidAndNodeUuid(final MockWebServer server, UUID studyUuid, UUID rootNetworkUuid, UUID nodeUuid, UUID resultUuid) throws Exception { // sensitivity analysis not found - mockMvc.perform(get("/v1/sensitivity-analysis/results/{resultUuid}", NOT_FOUND_SENSITIVITY_ANALYSIS_UUID)).andExpect(status().isNotFound()); + mockMvc.perform( + get( + "/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result?selector=subjectId", + studyUuid, + rootNetworkUuid, + NOT_FOUND_NODE_UUID)) + .andExpect(status().isNotFound()); // run sensitivity analysis mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/run", studyUuid, rootNetworkUuid, nodeUuid) @@ -362,11 +372,14 @@ private void testSensitivityAnalysisWithRootNetworkUuidAndNodeUuid(final MockWeb .build()); // error case - mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv?selector=fakeJsonSelector", studyUuid, rootNetworkUuid, UUID.randomUUID()) + var result = mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv?selector=fakeJsonSelector", studyUuid, rootNetworkUuid, UUID.randomUUID()) .contentType(MediaType.APPLICATION_JSON) .header("userId", "userId") .content(content)) - .andExpectAll(status().isNotFound(), content().string("\"ROOT_NETWORK_NOT_FOUND\"")); + .andExpect(status().isNotFound()) + .andReturn(); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(ROOT_NETWORK_NOT_FOUND.value(), problemDetail.getBusinessErrorCode()); // csv export with no filter mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv?selector=fakeJsonSelector", studyUuid, rootNetworkUuid, nodeUuid) @@ -704,7 +717,7 @@ void testSensitivityAnalysisParameters() throws Exception { wireMock.verify(WireMock.putRequestedFor(WireMock.urlPathEqualTo("/v1/parameters/" + SENSITIVITY_ANALYSIS_PARAMETERS_UUID))); // Get sensitivity analysis (not existing, so it will create default) - StudyEntity studyEntityToUpdate = studyRepository.findById(studyNameUserIdUuid).orElseThrow(() -> new StudyException(StudyException.Type.STUDY_NOT_FOUND)); + StudyEntity studyEntityToUpdate = studyRepository.findById(studyNameUserIdUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)); studyEntityToUpdate.setSensitivityAnalysisParametersUuid(null); studyRepository.save(studyEntityToUpdate); diff --git a/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java b/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java index e3aee0c697..e82c79bf56 100644 --- a/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java +++ b/src/test/java/org/gridsuite/study/server/SingleLineDiagramTest.java @@ -15,7 +15,6 @@ import com.powsybl.loadflow.LoadFlowParameters; import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.model.VariantInfos; -import jakarta.servlet.ServletException; import lombok.SneakyThrows; import mockwebserver3.Dispatcher; import mockwebserver3.MockResponse; @@ -467,16 +466,20 @@ void testDiagramsAndGraphics(final MockWebServer server) throws Exception { assertTrue(TestUtils.getRequestsDone(1, server).contains("/v1/substation-svg-and-metadata/%s/substationNotFoundId?useName=false¢erLabel=false&diagonalLabel=false&topologicalColoring=false&substationLayout=horizontal&language=en".formatted(NETWORK_UUID_STRING))); // Test other errors when getting voltage level or substation svg - assertThrows(ServletException.class, () -> mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/voltage-levels/{voltageLevelId}/svg?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "voltageLevelErrorId"))); + mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/voltage-levels/{voltageLevelId}/svg?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "voltageLevelErrorId")) + .andExpectAll(status().isInternalServerError()); assertTrue(TestUtils.getRequestsDone(1, server).contains("/v1/svg/%s/voltageLevelErrorId?useName=false¢erLabel=false&diagonalLabel=false&topologicalColoring=false&language=en".formatted(NETWORK_UUID_STRING))); - assertThrows(ServletException.class, () -> mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/voltage-levels/{voltageLevelId}/svg-and-metadata?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "voltageLevelErrorId"))); + mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/voltage-levels/{voltageLevelId}/svg-and-metadata?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "voltageLevelErrorId")) + .andExpectAll(status().is4xxClientError()); assertTrue(TestUtils.getRequestsDone(1, server).contains("/v1/svg-and-metadata/%s/voltageLevelErrorId?useName=false¢erLabel=false&diagonalLabel=false&topologicalColoring=false&sldDisplayMode=%s&language=en".formatted(NETWORK_UUID_STRING, StudyConstants.SldDisplayMode.STATE_VARIABLE))); - assertThrows(ServletException.class, () -> mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/substations/{substationId}/svg?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "substationErrorId"))); + mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/substations/{substationId}/svg?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "substationErrorId")) + .andExpectAll(status().is4xxClientError()); assertTrue(TestUtils.getRequestsDone(1, server).contains("/v1/substation-svg/%s/substationErrorId?useName=false¢erLabel=false&diagonalLabel=false&topologicalColoring=false&substationLayout=horizontal".formatted(NETWORK_UUID_STRING))); - assertThrows(ServletException.class, () -> mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/substations/{substationId}/svg-and-metadata?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "substationErrorId"))); + mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network/substations/{substationId}/svg-and-metadata?useName=false", studyNameUserIdUuid, firstRootNetworkUuid, rootNodeUuid, "substationErrorId")) + .andExpectAll(status().isInternalServerError()); assertTrue(TestUtils.getRequestsDone(1, server).contains("/v1/substation-svg-and-metadata/%s/substationErrorId?useName=false¢erLabel=false&diagonalLabel=false&topologicalColoring=false&substationLayout=horizontal&language=en".formatted(NETWORK_UUID_STRING))); } diff --git a/src/test/java/org/gridsuite/study/server/StudyTest.java b/src/test/java/org/gridsuite/study/server/StudyTest.java index 9b6901e08b..61a0ab28ee 100644 --- a/src/test/java/org/gridsuite/study/server/StudyTest.java +++ b/src/test/java/org/gridsuite/study/server/StudyTest.java @@ -24,6 +24,7 @@ import com.powsybl.network.store.client.PreloadingStrategy; import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl; import com.powsybl.network.store.model.VariantInfos; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import lombok.SneakyThrows; import mockwebserver3.Dispatcher; import mockwebserver3.MockResponse; @@ -104,7 +105,7 @@ import static org.gridsuite.study.server.StudyConstants.*; import static org.gridsuite.study.server.StudyConstants.HEADER_ERROR; import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; -import static org.gridsuite.study.server.StudyException.Type.STUDY_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.STUDY_NOT_FOUND; import static org.gridsuite.study.server.notification.NotificationService.*; import static org.gridsuite.study.server.utils.JsonUtils.getModificationContextJsonString; import static org.gridsuite.study.server.utils.MatcherBasicStudyInfos.createMatcherStudyBasicInfos; @@ -824,11 +825,13 @@ void testSearch(final MockWebServer mockWebServer) throws Exception { equipmentInfos = mapper.readValue(resultAsString, new TypeReference<>() { }); assertThat(equipmentInfos, new MatcherJson<>(mapper, linesInfos)); - mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/search?userInput={request}&fieldSelector=bogus", + var result = mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/search?userInput={request}&fieldSelector=bogus", studyUuid, firstRootNetworkUuid, rootNodeId, "B").header(USER_ID_HEADER, "userId")) - .andExpectAll(status().isBadRequest(), - content().string("Enum unknown entry 'bogus' should be among NAME, ID")) + .andExpect(status().isInternalServerError()) .andReturn(); + var problemDetail = mapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertNotNull(problemDetail.getDetail()); + assertTrue(problemDetail.getDetail().contains("Enum unknown entry 'bogus' should be among NAME, ID")); } @Test @@ -881,8 +884,9 @@ void test(final MockWebServer server) throws Exception { //insert a study with a non-existing case and except exception result = mockMvc.perform(post("/v1/studies/cases/{caseUuid}", NOT_EXISTING_CASE_UUID, "false").header(USER_ID_HEADER, "userId").param(CASE_FORMAT, "XIIDM")) - .andExpectAll(status().isFailedDependency(), content().contentType(MediaType.valueOf("text/plain;charset=UTF-8"))).andReturn(); - assertEquals("The case '" + NOT_EXISTING_CASE_UUID + "' does not exist", result.getResponse().getContentAsString()); + .andExpectAll(status().isFailedDependency(), content().contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE)).andReturn(); + var problemDetail = mapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals("The case '" + NOT_EXISTING_CASE_UUID + "' does not exist", problemDetail.getDetail()); assertTrue(TestUtils.getRequestsDone(1, server) .contains("/v1/cases/%s/exists".formatted(NOT_EXISTING_CASE_UUID))); @@ -909,10 +913,12 @@ void test(final MockWebServer server) throws Exception { UUID randomUuid = UUID.randomUUID(); //get a non-existing study -> 404 not found - mockMvc.perform(get("/v1/studies/{studyUuid}", randomUuid).header(USER_ID_HEADER, "userId")) + result = mockMvc.perform(get("/v1/studies/{studyUuid}", randomUuid).header(USER_ID_HEADER, "userId")) .andExpectAll(status().isNotFound(), - content().contentType(MediaType.APPLICATION_JSON), - jsonPath("$").value(STUDY_NOT_FOUND.name())); + content().contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE)) + .andReturn(); + problemDetail = mapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(STUDY_NOT_FOUND.name(), problemDetail.getDetail()); UUID studyNameUserIdUuid = studyRepository.findAll().get(0).getId(); diff --git a/src/test/java/org/gridsuite/study/server/rootnetworks/ModificationToExcludeTest.java b/src/test/java/org/gridsuite/study/server/rootnetworks/ModificationToExcludeTest.java index 3e350639c4..b795d4fd45 100644 --- a/src/test/java/org/gridsuite/study/server/rootnetworks/ModificationToExcludeTest.java +++ b/src/test/java/org/gridsuite/study/server/rootnetworks/ModificationToExcludeTest.java @@ -10,7 +10,7 @@ import com.google.common.collect.Sets; import org.gridsuite.study.server.ContextConfigurationWithTestChannel; import org.gridsuite.study.server.StudyConstants; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.modification.NetworkModificationResult; import org.gridsuite.study.server.dto.modification.NetworkModificationsResult; @@ -45,6 +45,7 @@ import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.ROOT_NETWORK_NOT_FOUND; import static org.gridsuite.study.server.utils.TestUtils.createModificationNodeInfo; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; @@ -177,11 +178,11 @@ void testDuplicateNodeWithModificationsToExclude() { NetworkModificationNode firstNode = networkModificationTreeService.createNode(studyEntity, rootNode.getIdNode(), createModificationNodeInfo(NODE_1_NAME), InsertMode.AFTER, null); // for each RootNetworkNodeInfoEntity, set some modifications to exclude - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity1.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity1); - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity2.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_2); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity2); @@ -192,8 +193,8 @@ void testDuplicateNodeWithModificationsToExclude() { UUID duplicateNodeUuid = networkModificationTreeService.duplicateStudyNode(firstNode.getId(), rootNode.getIdNode(), InsertMode.AFTER); // get RootNetworkNodeInfoEntity of duplicate node - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); // assert those values are actually defined from ORIGIN_TO_DUPLICATE_MODIFICATION_UUID_MAP assertEquals(MODIFICATIONS_TO_EXCLUDE_RN_1.stream().map(ORIGIN_TO_DUPLICATE_MODIFICATION_UUID_MAP::get).collect(Collectors.toSet()), duplicateRootNetworkNodeInfoEntity1.getModificationsUuidsToExclude()); @@ -213,11 +214,11 @@ void testDuplicateNodeBetweenStudiesWithModificationsToExclude() { NetworkModificationNode firstNode = networkModificationTreeService.createNode(studyEntity, rootNode.getIdNode(), createModificationNodeInfo(NODE_1_NAME), InsertMode.AFTER, null); // for each RootNetworkNodeInfoEntity, set some modifications to exclude - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity1.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity1); - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity2.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_2); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity2); @@ -237,8 +238,8 @@ void testDuplicateNodeBetweenStudiesWithModificationsToExclude() { UUID duplicateNodeUuid = networkModificationTreeService.duplicateStudyNode(firstNode.getId(), rootNode2.getIdNode(), InsertMode.AFTER); // get RootNetworkNodeInfoEntity of newly duplicated node - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos2.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos2.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos2.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(duplicateNodeUuid, rootNetworkBasicInfos2.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); // assert those values are empty, duplicating node between studies should empty modifications to exclude assertTrue(duplicateRootNetworkNodeInfoEntity1.getModificationsUuidsToExclude().isEmpty()); @@ -258,11 +259,11 @@ void testGetModificationsToExclude() throws Exception { NetworkModificationNode firstNode = networkModificationTreeService.createNode(studyEntity, rootNode.getIdNode(), createModificationNodeInfo(NODE_1_NAME), InsertMode.AFTER, null); // for each RootNetworkNodeInfoEntity, set some modifications to exclude - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity1.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity1); - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity2.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_2); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity2); @@ -297,11 +298,11 @@ void testDuplicateModificationWithModificationsToExclude() { NetworkModificationNode secondNode = networkModificationTreeService.createNode(studyEntity, rootNode.getIdNode(), createModificationNodeInfo(NODE_2_NAME), InsertMode.AFTER, null); // for each RootNetworkNodeInfoEntity, set some modifications to exclude - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity1.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity1); - RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetworkNodeInfoEntity2.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_2); rootNetworkNodeInfoRepository.save(rootNetworkNodeInfoEntity2); @@ -321,15 +322,15 @@ void testDuplicateModificationWithModificationsToExclude() { // test duplication on same node : node1 studyService.duplicateOrInsertNetworkModifications(studyEntity.getId(), firstNode.getId(), studyEntity.getId(), firstNode.getId(), modificationsToDuplicate, USER_ID, StudyConstants.ModificationsActionType.COPY); - RootNetworkNodeInfoEntity upToDateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); - RootNetworkNodeInfoEntity upToDateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity upToDateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity upToDateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); assertEquals(Sets.union(expectedExcludedModification1, MODIFICATIONS_TO_EXCLUDE_RN_1), upToDateRootNetworkNodeInfoEntity1.getModificationsUuidsToExclude()); assertEquals(Sets.union(expectedExcludedModification2, MODIFICATIONS_TO_EXCLUDE_RN_2), upToDateRootNetworkNodeInfoEntity2.getModificationsUuidsToExclude()); // test duplication on different nodes : node1 -> node2 studyService.duplicateOrInsertNetworkModifications(studyEntity.getId(), secondNode.getId(), studyEntity.getId(), firstNode.getId(), modificationsToDuplicate, USER_ID, StudyConstants.ModificationsActionType.COPY); - upToDateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); - upToDateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + upToDateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); + upToDateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); assertEquals(expectedExcludedModification1, upToDateRootNetworkNodeInfoEntity1.getModificationsUuidsToExclude()); assertEquals(expectedExcludedModification2, upToDateRootNetworkNodeInfoEntity2.getModificationsUuidsToExclude()); } @@ -350,12 +351,12 @@ void testDuplicateStudyTreeWithModificationsToExclude() { NetworkModificationNode secondNode = networkModificationTreeService.createNode(studyEntity, firstNode.getId(), createModificationNodeInfo(NODE_2_NAME), InsertMode.AFTER, null); // root network 0, first node, set some excluded modifications - RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork0NodeInfo1Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetwork0NodeInfo1Entity); // root network 1, second node, set some excluded modifications - RootNetworkNodeInfoEntity rootNetwork1NodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork1NodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork1NodeInfo2Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_2); rootNetworkNodeInfoRepository.save(rootNetwork1NodeInfo2Entity); @@ -371,8 +372,8 @@ void testDuplicateStudyTreeWithModificationsToExclude() { UUID secondNodeDuplicateUuid = networkModificationNodeInfoRepository.findAllByNodeStudyIdAndName(studyEntity.getId(), NODE_2_NAME + " (1)").getFirst().getId(); // get RootNetworkNodeInfoEntity of duplicate node - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeDuplicateUuid, rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeDuplicateUuid, rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeDuplicateUuid, rootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeDuplicateUuid, rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); // assert those values are actually defined from ORIGIN_TO_DUPLICATE_MODIFICATION_UUID_MAP assertEquals(MODIFICATIONS_TO_EXCLUDE_RN_1.stream().map(ORIGIN_TO_DUPLICATE_MODIFICATION_UUID_MAP::get).collect(Collectors.toSet()), duplicateRootNetworkNodeInfoEntity1.getModificationsUuidsToExclude()); @@ -395,12 +396,12 @@ void testDuplicateStudyWithModificationsToExclude() { NetworkModificationNode secondNode = networkModificationTreeService.createNode(studyEntity, firstNode.getId(), createModificationNodeInfo(NODE_2_NAME), InsertMode.AFTER, null); // root network 0, first node, set some excluded modifications - RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork0NodeInfo1Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetwork0NodeInfo1Entity); // root network 1, second node, set some excluded modifications - RootNetworkNodeInfoEntity rootNetwork1NodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork1NodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork1NodeInfo2Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_2); rootNetworkNodeInfoRepository.save(rootNetwork1NodeInfo2Entity); @@ -422,8 +423,8 @@ void testDuplicateStudyWithModificationsToExclude() { UUID secondNodeDuplicateUuid = networkModificationNodeInfoRepository.findAllByNodeStudyIdAndName(newStudyUuid, NODE_2_NAME).getFirst().getId(); // get RootNetworkNodeInfoEntity of duplicate node - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeDuplicateUuid, newStudyRootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); - RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeDuplicateUuid, newStudyRootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity1 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeDuplicateUuid, newStudyRootNetworkBasicInfos.get(0).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity duplicateRootNetworkNodeInfoEntity2 = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeDuplicateUuid, newStudyRootNetworkBasicInfos.get(1).rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); // assert those values are actually defined from ORIGIN_TO_DUPLICATE_MODIFICATION_UUID_MAP assertEquals(MODIFICATIONS_TO_EXCLUDE_RN_1.stream().map(ORIGIN_TO_DUPLICATE_MODIFICATION_UUID_MAP::get).collect(Collectors.toSet()), duplicateRootNetworkNodeInfoEntity1.getModificationsUuidsToExclude()); @@ -444,7 +445,7 @@ void testDeleteExcludedModification() { UUID firstNodeUuid = firstNode.getId(); // add some modifications to exclude - RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork0NodeInfo1Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetwork0NodeInfo1Entity); @@ -453,7 +454,7 @@ void testDeleteExcludedModification() { List modificationsToRemove = List.of(MODIFICATIONS_TO_EXCLUDE_RN_1.stream().findFirst().orElseThrow()); assertThrows(RuntimeException.class, () -> studyService.deleteNetworkModifications(studyUuid, firstNodeUuid, modificationsToRemove, USER_ID)); - Set excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); + Set excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); Set expectedExcludedModifications = MODIFICATIONS_TO_EXCLUDE_RN_1; assertThat(expectedExcludedModifications).usingRecursiveComparison().isEqualTo(excludedModifications); @@ -461,7 +462,7 @@ void testDeleteExcludedModification() { Mockito.doNothing().when(networkModificationService).deleteModifications(any(), any()); studyService.deleteNetworkModifications(studyUuid, firstNodeUuid, modificationsToRemove, USER_ID); - excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); + excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); expectedExcludedModifications = MODIFICATIONS_TO_EXCLUDE_RN_1.stream().filter(uuid -> uuid != modificationsToRemove.getFirst()).collect(Collectors.toSet()); assertThat(expectedExcludedModifications).usingRecursiveComparison().isEqualTo(excludedModifications); } @@ -482,7 +483,7 @@ void testMoveExcludedModification() { UUID secondNodeUuid = secondNode.getId(); // add some modifications to exclude to node 1 - RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork0NodeInfo1Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetwork0NodeInfo1Entity); @@ -492,12 +493,12 @@ void testMoveExcludedModification() { assertThrows(RuntimeException.class, () -> studyService.moveNetworkModifications(studyUuid, firstNodeUuid, firstNodeUuid, modificationsToMove, null, false, USER_ID)); // assert origin node still have all excluded modifications - Set excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); + Set excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); Set expectedExcludedModifications = MODIFICATIONS_TO_EXCLUDE_RN_1; assertThat(expectedExcludedModifications).usingRecursiveComparison().isEqualTo(excludedModifications); // assert target node still have no excluded modifications - excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); + excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); expectedExcludedModifications = Collections.emptySet(); assertThat(expectedExcludedModifications).usingRecursiveComparison().isEqualTo(excludedModifications); @@ -510,12 +511,12 @@ void testMoveExcludedModification() { studyService.moveNetworkModifications(studyUuid, secondNodeUuid, firstNodeUuid, modificationsToMove, null, true, USER_ID); // assert origin node still have all excluded modifications, except the moved one - excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); + excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(firstNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); expectedExcludedModifications = MODIFICATIONS_TO_EXCLUDE_RN_1.stream().filter(uuid -> uuid != modificationsToMove.getFirst()).collect(Collectors.toSet()); assertThat(expectedExcludedModifications).usingRecursiveComparison().isEqualTo(excludedModifications); // assert target node now have the moved modification as excluded one - excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); + excludedModifications = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(secondNodeUuid, rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)).getModificationsUuidsToExclude(); expectedExcludedModifications = new HashSet<>(modificationsToMove); assertThat(expectedExcludedModifications).usingRecursiveComparison().isEqualTo(excludedModifications); } @@ -533,11 +534,11 @@ void testBuildNodeWithExcludedModifications() { NetworkModificationNode secondNode = networkModificationTreeService.createNode(studyEntity, firstNode.getId(), createModificationNodeInfo(NODE_2_NAME), InsertMode.AFTER, null); // add some modifications to exclude - RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork0NodeInfo1Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(firstNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork0NodeInfo1Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_1); rootNetworkNodeInfoRepository.save(rootNetwork0NodeInfo1Entity); - RootNetworkNodeInfoEntity rootNetwork0NodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkNodeInfoEntity rootNetwork0NodeInfo2Entity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(secondNode.getId(), rootNetworkBasicInfos.getFirst().rootNetworkUuid()).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); rootNetwork0NodeInfo2Entity.setModificationsUuidsToExclude(MODIFICATIONS_TO_EXCLUDE_RN_2); rootNetworkNodeInfoRepository.save(rootNetwork0NodeInfo2Entity); diff --git a/src/test/java/org/gridsuite/study/server/rootnetworks/RootNetworkTest.java b/src/test/java/org/gridsuite/study/server/rootnetworks/RootNetworkTest.java index 937f799ffc..4f18dce64b 100644 --- a/src/test/java/org/gridsuite/study/server/rootnetworks/RootNetworkTest.java +++ b/src/test/java/org/gridsuite/study/server/rootnetworks/RootNetworkTest.java @@ -12,8 +12,9 @@ import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; import com.powsybl.network.store.client.NetworkStoreService; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import org.gridsuite.study.server.ContextConfigurationWithTestChannel; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.dto.caseimport.CaseImportAction; import org.gridsuite.study.server.dto.caseimport.CaseImportReceiver; @@ -55,8 +56,10 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.ROOT_NETWORK_NOT_FOUND; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.STUDY_NOT_FOUND; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED; import static org.gridsuite.study.server.utils.TestUtils.createModificationNodeInfo; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; @@ -297,9 +300,8 @@ void testCreateRootNetworkWithMaximumReached() throws Exception { .header("content-type", "application/json")) .andExpect(status().isForbidden()) .andReturn(); - - assertTrue(result.getResponse().getContentAsString().equalsIgnoreCase(MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED.name() - )); + var problemDetail = objectMapper.readValue(result.getResponse().getContentAsString(), PowsyblWsProblemDetail.class); + assertEquals(MAXIMUM_ROOT_NETWORK_BY_STUDY_REACHED.value(), problemDetail.getBusinessErrorCode()); assertEquals(1, rootNetworkRequestRepository.countAllByStudyUuid(studyEntity.getId())); assertEquals(3, rootNetworkRepository.countAllByStudyId(studyEntity.getId())); @@ -393,10 +395,10 @@ void testCreateRootNetworkConsumer() throws Exception { messageConsumer.accept(new GenericMessage<>("", headers)); // get study from database and check new root network has been created with correct values - StudyEntity updatedStudyEntity = studyRepository.findWithRootNetworksById(studyEntity.getId()).orElseThrow(() -> new StudyException(StudyException.Type.STUDY_NOT_FOUND)); + StudyEntity updatedStudyEntity = studyRepository.findWithRootNetworksById(studyEntity.getId()).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)); assertEquals(2, updatedStudyEntity.getRootNetworks().size()); - RootNetworkEntity rootNetworkEntity = updatedStudyEntity.getRootNetworks().stream().filter(rne -> rne.getId().equals(newRootNetworkUuid)).findFirst().orElseThrow(() -> new StudyException(StudyException.Type.ROOT_NETWORK_NOT_FOUND)); + RootNetworkEntity rootNetworkEntity = updatedStudyEntity.getRootNetworks().stream().filter(rne -> rne.getId().equals(newRootNetworkUuid)).findFirst().orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)); assertEquals(newRootNetworkUuid, rootNetworkEntity.getId()); assertEquals(NETWORK_UUID2, rootNetworkEntity.getNetworkUuid()); assertEquals(NETWORK_ID2, rootNetworkEntity.getNetworkId()); @@ -467,7 +469,7 @@ void testCreateRootNetworkConsumerWithoutRequest() throws Exception { createAndConsumeMessageCaseImport(studyEntity.getId(), rootNetworkInfos, CaseImportAction.ROOT_NETWORK_CREATION); // get study from database and check new root network has been created with correct values - StudyEntity updatedStudyEntity = studyRepository.findWithRootNetworksById(studyEntity.getId()).orElseThrow(() -> new StudyException(StudyException.Type.STUDY_NOT_FOUND)); + StudyEntity updatedStudyEntity = studyRepository.findWithRootNetworksById(studyEntity.getId()).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)); assertEquals(1, updatedStudyEntity.getRootNetworks().size()); // corresponding rootNetworkRequestRepository should be emptied when root network creation is done @@ -756,8 +758,7 @@ void testUpdateRootNetworkOnNonExistingRootNetwork() throws Exception { UUID newCaseUuid = UUID.randomUUID(); String newCaseFormat = "newCaseFormat"; StudyEntity studyEntity = TestUtils.createDummyStudy(NETWORK_UUID, CASE_UUID, CASE_NAME, CASE_FORMAT, REPORT_UUID); - - mockMvc.perform(put("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/?caseUuid={caseUuid}&caseFormat={newCaseFormat}", studyEntity.getId(), UUID.randomUUID(), newCaseUuid, newCaseFormat) + mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/network?caseFormat={newCaseFormat}", studyEntity.getId(), UUID.randomUUID(), newCaseUuid, newCaseFormat) .header("userId", "userId")) .andExpect(status().isNotFound()); diff --git a/src/test/java/org/gridsuite/study/server/service/ReportServiceTest.java b/src/test/java/org/gridsuite/study/server/service/ReportServiceTest.java index af4f771453..941ac4f3b2 100644 --- a/src/test/java/org/gridsuite/study/server/service/ReportServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/ReportServiceTest.java @@ -19,7 +19,7 @@ import okhttp3.Headers; import okhttp3.HttpUrl; import org.gridsuite.study.server.ContextConfigurationWithTestChannel; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.Report; import org.gridsuite.study.server.networkmodificationtree.dto.InsertMode; import org.gridsuite.study.server.networkmodificationtree.dto.NetworkModificationNode; @@ -53,6 +53,7 @@ import java.util.UUID; import java.util.stream.Stream; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.STUDY_NOT_FOUND; import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_REPORT_DEFAULT_NAME; import static org.gridsuite.study.server.utils.TestUtils.checkReports; import static org.gridsuite.study.server.utils.TestUtils.createModificationNodeInfo; @@ -168,7 +169,7 @@ private RootNode createRoot() { @Test void testReport(final MockWebServer server) throws Exception { RootNode rootNode = createRoot(); - StudyEntity studyEntity = studyRepository.findById(rootNode.getStudyId()).orElseThrow(() -> new StudyException(StudyException.Type.STUDY_NOT_FOUND)); + StudyEntity studyEntity = studyRepository.findById(rootNode.getStudyId()).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)); UUID firstRootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyEntity.getId()); List expectedRootReports = List.of(getNodeReport(ROOT_NODE_REPORT_UUID, rootNode.getId().toString())); @@ -203,7 +204,7 @@ void testReport(final MockWebServer server) throws Exception { @Test void testMultipleReport(final MockWebServer server) throws Exception { RootNode rootNode = createRoot(); - StudyEntity studyEntity = studyRepository.findById(rootNode.getStudyId()).orElseThrow(() -> new StudyException(StudyException.Type.STUDY_NOT_FOUND)); + StudyEntity studyEntity = studyRepository.findById(rootNode.getStudyId()).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)); UUID firstRootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyEntity.getId()); NetworkModificationNode node = studyService.createNode(studyEntity.getId(), rootNode.getId(), createModificationNodeInfo("Modification Node"), InsertMode.AFTER, null); NetworkModificationNode child1 = studyService.createNode(studyEntity.getId(), node.getId(), createModificationNodeInfo("Child 1"), InsertMode.AFTER, null); diff --git a/src/test/java/org/gridsuite/study/server/service/SingleLineDiagramServiceTest.java b/src/test/java/org/gridsuite/study/server/service/SingleLineDiagramServiceTest.java index e291093415..eb789043c2 100644 --- a/src/test/java/org/gridsuite/study/server/service/SingleLineDiagramServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/SingleLineDiagramServiceTest.java @@ -6,19 +6,19 @@ */ package org.gridsuite.study.server.service; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayoutDetails; import org.junit.jupiter.api.Test; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; import java.util.UUID; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DUPLICATE_DIAGRAM_GRID_LAYOUT_FAILED; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -59,8 +59,7 @@ void duplicateNadConfigError() { httpEntity, UUID.class)).thenThrow(new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR)); StudyException e = assertThrows(StudyException.class, () -> service.duplicateNadConfig(source)); - assertEquals(StudyException.Type.DUPLICATE_DIAGRAM_GRID_LAYOUT_FAILED, - ReflectionTestUtils.invokeMethod(e, "getType")); + assertEquals(DUPLICATE_DIAGRAM_GRID_LAYOUT_FAILED, e.getBusinessErrorCode()); } } diff --git a/src/test/java/org/gridsuite/study/server/service/StudyConfigServiceTest.java b/src/test/java/org/gridsuite/study/server/service/StudyConfigServiceTest.java index 58dbd39664..c4f2bf0307 100644 --- a/src/test/java/org/gridsuite/study/server/service/StudyConfigServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/StudyConfigServiceTest.java @@ -1,7 +1,7 @@ package org.gridsuite.study.server.service; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.diagramgridlayout.DiagramGridLayout; import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayout; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/gridsuite/study/server/service/client/dynamicmapping/DynamicMappingClientTest.java b/src/test/java/org/gridsuite/study/server/service/client/dynamicmapping/DynamicMappingClientTest.java index ef798b9959..938c12674e 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/dynamicmapping/DynamicMappingClientTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/dynamicmapping/DynamicMappingClientTest.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.dynamicmapping.MappingInfos; import org.gridsuite.study.server.dto.dynamicmapping.ModelInfos; import org.gridsuite.study.server.dto.dynamicmapping.ModelVariableDefinitionInfos; diff --git a/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java b/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java index 052d7cb61d..1dc9ae4cc5 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/dynamicsecurityanalysis/DynamicSecurityAnalysisClientTest.java @@ -29,7 +29,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.absent; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.*; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.*; import static org.gridsuite.study.server.notification.NotificationService.HEADER_USER_ID; import static org.gridsuite.study.server.service.client.RestClient.DELIMITER; import static org.gridsuite.study.server.service.client.dynamicsecurityanalysis.DynamicSecurityAnalysisClient.*; diff --git a/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java b/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java index 34e8ee7ad4..9380a5a988 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/dynamicsimulation/DynamicSimulationClientTest.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; import org.gridsuite.study.server.RemoteServicesProperties; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationParametersInfos; import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus; @@ -31,7 +31,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.study.server.StudyConstants.*; -import static org.gridsuite.study.server.StudyException.Type.RUN_DYNAMIC_SIMULATION_FAILED; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.RUN_DYNAMIC_SIMULATION_FAILED; import static org.gridsuite.study.server.notification.NotificationService.HEADER_USER_ID; import static org.gridsuite.study.server.service.client.RestClient.DELIMITER; import static org.gridsuite.study.server.service.client.dynamicsimulation.DynamicSimulationClient.*; diff --git a/src/test/java/org/gridsuite/study/server/service/client/util/UrlUtilTest.java b/src/test/java/org/gridsuite/study/server/service/client/util/UrlUtilTest.java index 5fa7cfbbda..39fd1a598b 100644 --- a/src/test/java/org/gridsuite/study/server/service/client/util/UrlUtilTest.java +++ b/src/test/java/org/gridsuite/study/server/service/client/util/UrlUtilTest.java @@ -6,7 +6,7 @@ */ package org.gridsuite.study.server.service.client.util; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java b/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java index 02ab18b534..d58dc7b10d 100644 --- a/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/dynamicsecurityanalysis/DynamicSecurityAnalysisServiceTest.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.study.server.StudyConstants.DYNAWO_PROVIDER; -import static org.gridsuite.study.server.StudyException.Type.DYNAMIC_SECURITY_ANALYSIS_RUNNING; +import static org.gridsuite.study.server.error.StudyBusinessErrorCode.DYNAMIC_SECURITY_ANALYSIS_RUNNING; import static org.gridsuite.study.server.utils.TestUtils.assertStudyException; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.ArgumentMatchers.any; diff --git a/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java b/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java index 74a156c164..85d906f904 100644 --- a/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/dynamicsimulation/DynamicSimulationServiceTest.java @@ -12,7 +12,7 @@ import com.powsybl.timeseries.*; import org.gridsuite.study.server.ContextConfigurationWithTestChannel; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.ComputationType; import org.gridsuite.study.server.dto.ReportInfos; import org.gridsuite.study.server.dto.dynamicmapping.MappingInfos; diff --git a/src/test/java/org/gridsuite/study/server/utils/TestUtils.java b/src/test/java/org/gridsuite/study/server/utils/TestUtils.java index c569e053cb..28ad40ae62 100644 --- a/src/test/java/org/gridsuite/study/server/utils/TestUtils.java +++ b/src/test/java/org/gridsuite/study/server/utils/TestUtils.java @@ -15,7 +15,8 @@ import okio.Buffer; import org.assertj.core.api.ThrowableAssert; import org.assertj.core.api.ThrowableAssertAlternative; -import org.gridsuite.study.server.StudyException; +import org.gridsuite.study.server.error.StudyBusinessErrorCode; +import org.gridsuite.study.server.error.StudyException; import org.gridsuite.study.server.dto.Report; import org.gridsuite.study.server.networkmodificationtree.dto.NetworkModificationNode; import org.gridsuite.study.server.repository.StudyEntity; @@ -234,10 +235,10 @@ public static void checkReports(List reports, List expectedRepor reports.forEach(r -> assertThat(r, new MatcherReport(expectedReports.get(reports.indexOf(r))))); } - public static void assertStudyException(ThrowableAssert.ThrowingCallable throwingCallable, StudyException.Type type, String message) { + public static void assertStudyException(ThrowableAssert.ThrowingCallable throwingCallable, StudyBusinessErrorCode type, String message) { ThrowableAssertAlternative throwableAssert = Assertions.assertThatExceptionOfType(StudyException.class) .isThrownBy(throwingCallable); - throwableAssert.extracting("type").isEqualTo(type); + throwableAssert.extracting("errorCode").isEqualTo(type); Optional.ofNullable(message).ifPresent(throwableAssert::withMessage); }