From 064c14edd3f8e21e3ddc4b5a694a48aa17fad6ce Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Wed, 3 Dec 2025 11:15:29 +0100 Subject: [PATCH 1/9] Harmonize exceptions handling --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index c3c3620..4f1b567 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,8 @@ org.gridsuite.mapping.server gridsuite org.gridsuite:dynamic-mapping-server + + 1.34.0 @@ -68,6 +70,11 @@ + + com.powsybl + powsybl-ws-commons + ${powsybl-ws-commons.version} + From 1a917177d3ab1829a7a53db1e78b91f65c4edfec Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Wed, 3 Dec 2025 11:48:58 +0100 Subject: [PATCH 2/9] Switch to new error architecture --- .../server/DynamicMappingException.java | 34 ------------ .../server/PropertyServerNameProvider.java | 28 ++++++++++ .../RestResponseEntityExceptionHandler.java | 52 ------------------- .../DynamicMappingErrorBusinessCode.java | 34 ++++++++++++ .../server/error/DynamicMappingException.java | 30 +++++++++++ .../error/DynamicMappingExceptionHandler.java | 52 +++++++++++++++++++ .../client/filter/impl/FilterClientImpl.java | 4 +- .../service/client/utils/ExceptionUtils.java | 5 +- .../server/service/client/utils/UrlUtils.java | 4 +- .../implementation/MappingServiceImpl.java | 4 +- .../PropertyServerNameProviderTest.java | 23 ++++++++ .../DynamicMappingExceptionHandlerTest.java | 31 +++++++++++ .../client/filter/FilterClientTest.java | 14 ++--- 13 files changed, 214 insertions(+), 101 deletions(-) delete mode 100644 src/main/java/org/gridsuite/mapping/server/DynamicMappingException.java create mode 100644 src/main/java/org/gridsuite/mapping/server/PropertyServerNameProvider.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java create mode 100644 src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java create mode 100644 src/main/java/org/gridsuite/mapping/server/error/DynamicMappingException.java create mode 100644 src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java create mode 100644 src/test/java/org/gridsuite/mapping/server/PropertyServerNameProviderTest.java create mode 100644 src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java diff --git a/src/main/java/org/gridsuite/mapping/server/DynamicMappingException.java b/src/main/java/org/gridsuite/mapping/server/DynamicMappingException.java deleted file mode 100644 index 9c5ca03..0000000 --- a/src/main/java/org/gridsuite/mapping/server/DynamicMappingException.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2024, 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.mapping.server; - -import lombok.Getter; - -/** - * @author Thang PHAM - */ -@Getter -public class DynamicMappingException extends RuntimeException { - - public enum Type { - URI_SYNTAX, - MAPPING_NAME_NOT_PROVIDED, - GET_FILTER_ERROR, - CREATE_FILTER_ERROR, - UPDATE_FILTER_ERROR, - DUPLICATE_FILTER_ERROR, - DELETE_FILTER_ERROR, - FILTER_NOT_FOUND - } - - private final Type type; - - public DynamicMappingException(Type type, String message) { - super(message); - this.type = type; - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/PropertyServerNameProvider.java b/src/main/java/org/gridsuite/mapping/server/PropertyServerNameProvider.java new file mode 100644 index 0000000..317787b --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/PropertyServerNameProvider.java @@ -0,0 +1,28 @@ +/** + * 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.mapping.server; + +import com.powsybl.ws.commons.error.ServerNameProvider; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @author Hugo Marcellin + */ +@Component +public class PropertyServerNameProvider implements ServerNameProvider { + private final String name; + + public PropertyServerNameProvider(@Value("${spring.application.name:dynamic-mapping-server}") String name) { + this.name = name; + } + + @Override + public String serverName() { + return name; + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java deleted file mode 100644 index f1d98a6..0000000 --- a/src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2024, 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.mapping.server; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.client.HttpClientErrorException; - -/** - * @author Thang PHAM - */ -@ControllerAdvice -public class RestResponseEntityExceptionHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(RestResponseEntityExceptionHandler.class); - - @ExceptionHandler(HttpClientErrorException.class) - protected ResponseEntity handleHttpClientErrorException(HttpClientErrorException exception) { - return ResponseEntity.status(exception.getStatusCode()).body(exception.getStatusText()); - } - - @ExceptionHandler(DynamicMappingException.class) - protected ResponseEntity handleDynamicSimulationException(DynamicMappingException exception) { - if (LOGGER.isErrorEnabled()) { - LOGGER.error(exception.getMessage(), exception); - } - - DynamicMappingException.Type type = exception.getType(); - return switch (type) { - case MAPPING_NAME_NOT_PROVIDED - -> ResponseEntity.status(HttpStatus.BAD_REQUEST).body(exception.getMessage()); - case FILTER_NOT_FOUND - -> ResponseEntity.status(HttpStatus.NOT_FOUND).body(exception.getMessage()); - case URI_SYNTAX, - GET_FILTER_ERROR, - CREATE_FILTER_ERROR, - UPDATE_FILTER_ERROR, - DUPLICATE_FILTER_ERROR, - DELETE_FILTER_ERROR - -> ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(exception.getMessage()); - }; - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java new file mode 100644 index 0000000..86e1de3 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java @@ -0,0 +1,34 @@ +/** + * 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package org.gridsuite.mapping.server.error; + +import com.powsybl.ws.commons.error.BusinessErrorCode; + +/** + * @author Hugo Marcellin + */ +public enum DynamicMappingErrorBusinessCode implements BusinessErrorCode { + URI_SYNTAX(""), + MAPPING_NAME_NOT_PROVIDED(""), + GET_FILTER_ERROR(""), + CREATE_FILTER_ERROR(""), + UPDATE_FILTER_ERROR(""), + DUPLICATE_FILTER_ERROR(""), + DELETE_FILTER_ERROR(""), + FILTER_NOT_FOUND(""); + + private final String code; + + DynamicMappingErrorBusinessCode(String code) { + this.code = code; + } + + public String value() { + return code; + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingException.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingException.java new file mode 100644 index 0000000..0733e49 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingException.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2024, 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.mapping.server.error; + +import com.powsybl.ws.commons.error.AbstractBusinessException; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; + +/** + * @author Thang PHAM + */ +@Getter +public class DynamicMappingException extends AbstractBusinessException { + private final DynamicMappingErrorBusinessCode errorCode; + + public DynamicMappingException(DynamicMappingErrorBusinessCode errorCode, String message) { + super(message); + this.errorCode = errorCode; + } + + @NotNull + @Override + public DynamicMappingErrorBusinessCode getBusinessErrorCode() { + return errorCode; + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java new file mode 100644 index 0000000..9613d81 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024, 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.mapping.server.error; + +import com.powsybl.ws.commons.error.AbstractBusinessExceptionHandler; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; +import com.powsybl.ws.commons.error.ServerNameProvider; +import jakarta.servlet.http.HttpServletRequest; +import lombok.NonNull; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +/** + * @author Thang PHAM + */ +@ControllerAdvice +public class DynamicMappingExceptionHandler extends AbstractBusinessExceptionHandler { + protected DynamicMappingExceptionHandler(ServerNameProvider serverNameProvider) { + super(serverNameProvider); + } + + @Override + protected @NonNull DynamicMappingErrorBusinessCode getBusinessCode(DynamicMappingException e) { + return e.getBusinessErrorCode(); + } + + protected HttpStatus mapStatus(DynamicMappingErrorBusinessCode businessErrorCode) { + return switch (businessErrorCode) { + case MAPPING_NAME_NOT_PROVIDED -> HttpStatus.BAD_REQUEST; + case FILTER_NOT_FOUND -> HttpStatus.NOT_FOUND; + case URI_SYNTAX, + GET_FILTER_ERROR, + CREATE_FILTER_ERROR, + UPDATE_FILTER_ERROR, + DUPLICATE_FILTER_ERROR, + DELETE_FILTER_ERROR -> HttpStatus.INTERNAL_SERVER_ERROR; + }; + } + + @ExceptionHandler(DynamicMappingException.class) + protected ResponseEntity handleShortcircuitException( + DynamicMappingException exception, HttpServletRequest request) { + return super.handleDomainException(exception, request); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java b/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java index 709ee0a..c1f45f7 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.filter.expertfilter.ExpertFilter; -import org.gridsuite.mapping.server.DynamicMappingException; +import org.gridsuite.mapping.server.error.DynamicMappingException; import org.gridsuite.mapping.server.service.client.AbstractRestClient; import org.gridsuite.mapping.server.service.client.filter.FilterClient; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +26,7 @@ import java.util.Map; import java.util.UUID; -import static org.gridsuite.mapping.server.DynamicMappingException.Type.*; +import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.*; import static org.gridsuite.mapping.server.service.client.utils.ExceptionUtils.handleHttpError; import static org.gridsuite.mapping.server.service.client.utils.UrlUtils.buildEndPointUrl; diff --git a/src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java b/src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java index 2864ace..80f4fcd 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java +++ b/src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java @@ -10,7 +10,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.mapping.server.DynamicMappingException; +import org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode; +import org.gridsuite.mapping.server.error.DynamicMappingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.client.HttpStatusCodeException; @@ -27,7 +28,7 @@ private ExceptionUtils() { throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); } - public static DynamicMappingException handleHttpError(HttpStatusCodeException httpException, DynamicMappingException.Type type, ObjectMapper objectMapper) { + public static DynamicMappingException handleHttpError(HttpStatusCodeException httpException, DynamicMappingErrorBusinessCode type, ObjectMapper objectMapper) { String responseBody = httpException.getResponseBodyAsString(); String errorMessage = responseBody.isEmpty() ? httpException.getStatusCode().toString() : parseHttpError(responseBody, objectMapper); diff --git a/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java b/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java index 665b153..055f388 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java +++ b/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java @@ -8,12 +8,12 @@ package org.gridsuite.mapping.server.service.client.utils; import org.apache.logging.log4j.util.Strings; -import org.gridsuite.mapping.server.DynamicMappingException; +import org.gridsuite.mapping.server.error.DynamicMappingException; import java.net.URI; import java.net.URISyntaxException; -import static org.gridsuite.mapping.server.DynamicMappingException.Type.URI_SYNTAX; +import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.URI_SYNTAX; import static org.gridsuite.mapping.server.service.client.RestClient.URL_DELIMITER; /** diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java index 11d2397..300f0e6 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java @@ -9,7 +9,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.gridsuite.filter.expertfilter.ExpertFilter; -import org.gridsuite.mapping.server.DynamicMappingException; +import org.gridsuite.mapping.server.error.DynamicMappingException; import org.gridsuite.mapping.server.dto.InputMapping; import org.gridsuite.mapping.server.dto.RenameObject; import org.gridsuite.mapping.server.dto.Rule; @@ -34,8 +34,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.gridsuite.mapping.server.DynamicMappingException.Type.MAPPING_NAME_NOT_PROVIDED; import static org.gridsuite.mapping.server.MappingConstants.DEFAULT_MAPPING_NAME; +import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.MAPPING_NAME_NOT_PROVIDED; /** * @author Mathieu Scalbert diff --git a/src/test/java/org/gridsuite/mapping/server/PropertyServerNameProviderTest.java b/src/test/java/org/gridsuite/mapping/server/PropertyServerNameProviderTest.java new file mode 100644 index 0000000..6367fd2 --- /dev/null +++ b/src/test/java/org/gridsuite/mapping/server/PropertyServerNameProviderTest.java @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.mapping.server; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Mohamed Ben-rejeb {@literal } + */ +class PropertyServerNameProviderTest { + + @Test + void returnsProvidedName() { + PropertyServerNameProvider provider = new PropertyServerNameProvider("custom-server"); + assertThat(provider.serverName()).isEqualTo("custom-server"); + } +} diff --git a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java new file mode 100644 index 0000000..73ea69e --- /dev/null +++ b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java @@ -0,0 +1,31 @@ +package org.gridsuite.mapping.server.error; + +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.mock.web.MockHttpServletRequest; +import static org.assertj.core.api.Assertions.assertThat; +import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.DELETE_FILTER_ERROR; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DynamicMappingExceptionHandlerTest { + private DynamicMappingExceptionHandler handler; + + @BeforeEach + void setUp() { + handler = new DynamicMappingExceptionHandler(() -> "dynamic-mapping"); + } + + @Test + void mapsInteralErrorBusinessErrorToStatus() { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/results-endpoint/uuid"); + DynamicMappingException exception = new DynamicMappingException(DELETE_FILTER_ERROR, "filter deleted"); + ResponseEntity response = handler.handleShortcircuitException(exception, request); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + assertThat(response.getBody()).isNotNull(); + assertEquals("", response.getBody().getBusinessErrorCode()); + } +} diff --git a/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java b/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java index 198616d..af9a089 100644 --- a/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java +++ b/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java @@ -19,7 +19,7 @@ import org.gridsuite.filter.utils.expertfilter.CombinatorType; import org.gridsuite.filter.utils.expertfilter.FieldType; import org.gridsuite.filter.utils.expertfilter.OperatorType; -import org.gridsuite.mapping.server.DynamicMappingException; +import org.gridsuite.mapping.server.error.DynamicMappingException; import org.gridsuite.mapping.server.service.client.AbstractWireMockRestClientTest; import org.gridsuite.mapping.server.service.client.filter.impl.FilterClientImpl; import org.junit.Test; @@ -34,7 +34,7 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.assertj.core.api.Assertions.catchThrowableOfType; -import static org.gridsuite.mapping.server.DynamicMappingException.Type.*; +import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.*; import static org.gridsuite.mapping.server.service.client.filter.FilterClient.*; import static org.gridsuite.mapping.server.service.client.utils.UrlUtils.buildEndPointUrl; import static org.gridsuite.mapping.server.utils.assertions.Assertions.assertThat; @@ -138,7 +138,7 @@ public void testCreateFiltersGivenException() throws JsonProcessingException { DynamicMappingException.class); // check result - assertThat(exception.getType()) + assertThat(exception.getBusinessErrorCode()) .isEqualTo(CREATE_FILTER_ERROR); assertThat(exception.getMessage()) .isEqualTo(ERROR_MESSAGE); @@ -187,7 +187,7 @@ public void testUpdateFiltersGivenException() throws JsonProcessingException { DynamicMappingException.class); // check result - assertThat(exception.getType()) + assertThat(exception.getBusinessErrorCode()) .isEqualTo(UPDATE_FILTER_ERROR); assertThat(exception.getMessage()) .isEqualTo(ERROR_MESSAGE); @@ -235,7 +235,7 @@ public void testDuplicateFiltersGivenException() throws JsonProcessingException DynamicMappingException.class); // check result - assertThat(exception.getType()) + assertThat(exception.getBusinessErrorCode()) .isEqualTo(DUPLICATE_FILTER_ERROR); assertThat(exception.getMessage()) .isEqualTo(ERROR_MESSAGE); @@ -274,7 +274,7 @@ public void testDeleteFiltersGivenException() throws JsonProcessingException { DynamicMappingException.class); // check result - assertThat(exception.getType()) + assertThat(exception.getBusinessErrorCode()) .isEqualTo(DELETE_FILTER_ERROR); assertThat(exception.getMessage()) .isEqualTo(ERROR_MESSAGE); @@ -323,7 +323,7 @@ public void testGetFiltersGivenException() { DynamicMappingException.class); // check result - assertThat(exception.getType()) + assertThat(exception.getBusinessErrorCode()) .isEqualTo(GET_FILTER_ERROR); assertThat(exception.getMessage()) .isEqualTo(ERROR_MESSAGE); From 10f7efcc259f83b2579848b6f8c8bd898de83f5f Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Wed, 3 Dec 2025 11:49:57 +0100 Subject: [PATCH 3/9] licence --- .../error/DynamicMappingExceptionHandlerTest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java index 73ea69e..5f4ea8d 100644 --- a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java @@ -1,3 +1,9 @@ +/** + * 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.mapping.server.error; import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; @@ -10,7 +16,10 @@ import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.DELETE_FILTER_ERROR; import static org.junit.jupiter.api.Assertions.assertEquals; -public class DynamicMappingExceptionHandlerTest { +/** + * @author Hugo Marcellin + */ +class DynamicMappingExceptionHandlerTest { private DynamicMappingExceptionHandler handler; @BeforeEach From 02ba841efcbb2526319332c6cd01bd49d17876e3 Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Wed, 3 Dec 2025 11:59:11 +0100 Subject: [PATCH 4/9] Add error keys --- .../error/DynamicMappingErrorBusinessCode.java | 16 ++++++++-------- .../DynamicMappingExceptionHandlerTest.java | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java index 86e1de3..6579e89 100644 --- a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java @@ -13,14 +13,14 @@ * @author Hugo Marcellin */ public enum DynamicMappingErrorBusinessCode implements BusinessErrorCode { - URI_SYNTAX(""), - MAPPING_NAME_NOT_PROVIDED(""), - GET_FILTER_ERROR(""), - CREATE_FILTER_ERROR(""), - UPDATE_FILTER_ERROR(""), - DUPLICATE_FILTER_ERROR(""), - DELETE_FILTER_ERROR(""), - FILTER_NOT_FOUND(""); + URI_SYNTAX("dynamicMapping.uriSyntax"), + MAPPING_NAME_NOT_PROVIDED("dynamicMapping.mappingNameNotProvided"), + GET_FILTER_ERROR("dynamicMapping.getFilterError"), + CREATE_FILTER_ERROR("dynamicMapping.createFilterError"), + UPDATE_FILTER_ERROR("dynamicMapping.updateFilterError"), + DUPLICATE_FILTER_ERROR("dynamicMapping.duplicateFilterError"), + DELETE_FILTER_ERROR("dynamicMapping.deleteFilterError"), + FILTER_NOT_FOUND("dynamicMapping.filterNotFound"); private final String code; diff --git a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java index 5f4ea8d..5118f23 100644 --- a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java @@ -35,6 +35,6 @@ void mapsInteralErrorBusinessErrorToStatus() { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); assertThat(response.getBody()).isNotNull(); - assertEquals("", response.getBody().getBusinessErrorCode()); + assertEquals("dynamicMapping.deleteFilterError", response.getBody().getBusinessErrorCode()); } } From a8d8eb646211f256fef0f289d110d05408981b99 Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Wed, 3 Dec 2025 15:20:00 +0100 Subject: [PATCH 5/9] Remove URI_SYNTAX error --- .../mapping/server/error/DynamicMappingErrorBusinessCode.java | 1 - .../mapping/server/error/DynamicMappingExceptionHandler.java | 3 +-- .../mapping/server/service/client/utils/UrlUtils.java | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java index 6579e89..ad6e73a 100644 --- a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java @@ -13,7 +13,6 @@ * @author Hugo Marcellin */ public enum DynamicMappingErrorBusinessCode implements BusinessErrorCode { - URI_SYNTAX("dynamicMapping.uriSyntax"), MAPPING_NAME_NOT_PROVIDED("dynamicMapping.mappingNameNotProvided"), GET_FILTER_ERROR("dynamicMapping.getFilterError"), CREATE_FILTER_ERROR("dynamicMapping.createFilterError"), diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java index 9613d81..8297218 100644 --- a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java @@ -35,8 +35,7 @@ protected HttpStatus mapStatus(DynamicMappingErrorBusinessCode businessErrorCode return switch (businessErrorCode) { case MAPPING_NAME_NOT_PROVIDED -> HttpStatus.BAD_REQUEST; case FILTER_NOT_FOUND -> HttpStatus.NOT_FOUND; - case URI_SYNTAX, - GET_FILTER_ERROR, + case GET_FILTER_ERROR, CREATE_FILTER_ERROR, UPDATE_FILTER_ERROR, DUPLICATE_FILTER_ERROR, diff --git a/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java b/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java index 055f388..507446a 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java +++ b/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java @@ -7,13 +7,13 @@ package org.gridsuite.mapping.server.service.client.utils; +import com.powsybl.commons.exceptions.UncheckedUriSyntaxException; import org.apache.logging.log4j.util.Strings; import org.gridsuite.mapping.server.error.DynamicMappingException; import java.net.URI; import java.net.URISyntaxException; -import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.URI_SYNTAX; import static org.gridsuite.mapping.server.service.client.RestClient.URL_DELIMITER; /** @@ -45,7 +45,7 @@ public static String buildEndPointUrl(String baseUri, String apiVersion, String // normalize before return return new URI(url).normalize().toString(); } catch (URISyntaxException e) { - throw new DynamicMappingException(URI_SYNTAX, e.getMessage()); + throw new UncheckedUriSyntaxException(e); } } } From d31719477dcfc63eacb2e596fe3e33f3c363bd08 Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Wed, 3 Dec 2025 16:15:25 +0100 Subject: [PATCH 6/9] Checkstyle --- .../gridsuite/mapping/server/service/client/utils/UrlUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java b/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java index 507446a..c092366 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java +++ b/src/main/java/org/gridsuite/mapping/server/service/client/utils/UrlUtils.java @@ -9,7 +9,6 @@ import com.powsybl.commons.exceptions.UncheckedUriSyntaxException; import org.apache.logging.log4j.util.Strings; -import org.gridsuite.mapping.server.error.DynamicMappingException; import java.net.URI; import java.net.URISyntaxException; From fd8a435f42470cdc12d34a0490f135c63cf5764d Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Thu, 4 Dec 2025 14:17:30 +0100 Subject: [PATCH 7/9] Clean up rest calls --- .../DynamicMappingErrorBusinessCode.java | 8 +- .../error/DynamicMappingExceptionHandler.java | 6 -- .../client/filter/impl/FilterClientImpl.java | 92 ++++++++----------- .../service/client/utils/ExceptionUtils.java | 53 ----------- .../DynamicMappingExceptionHandlerTest.java | 9 +- .../client/filter/FilterClientTest.java | 56 +++-------- 6 files changed, 56 insertions(+), 168 deletions(-) delete mode 100644 src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java index ad6e73a..2023c58 100644 --- a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingErrorBusinessCode.java @@ -13,13 +13,7 @@ * @author Hugo Marcellin */ public enum DynamicMappingErrorBusinessCode implements BusinessErrorCode { - MAPPING_NAME_NOT_PROVIDED("dynamicMapping.mappingNameNotProvided"), - GET_FILTER_ERROR("dynamicMapping.getFilterError"), - CREATE_FILTER_ERROR("dynamicMapping.createFilterError"), - UPDATE_FILTER_ERROR("dynamicMapping.updateFilterError"), - DUPLICATE_FILTER_ERROR("dynamicMapping.duplicateFilterError"), - DELETE_FILTER_ERROR("dynamicMapping.deleteFilterError"), - FILTER_NOT_FOUND("dynamicMapping.filterNotFound"); + MAPPING_NAME_NOT_PROVIDED("dynamicMapping.mappingNameNotProvided"); private final String code; diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java index 8297218..0410007 100644 --- a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java @@ -34,12 +34,6 @@ protected DynamicMappingExceptionHandler(ServerNameProvider serverNameProvider) protected HttpStatus mapStatus(DynamicMappingErrorBusinessCode businessErrorCode) { return switch (businessErrorCode) { case MAPPING_NAME_NOT_PROVIDED -> HttpStatus.BAD_REQUEST; - case FILTER_NOT_FOUND -> HttpStatus.NOT_FOUND; - case GET_FILTER_ERROR, - CREATE_FILTER_ERROR, - UPDATE_FILTER_ERROR, - DUPLICATE_FILTER_ERROR, - DELETE_FILTER_ERROR -> HttpStatus.INTERNAL_SERVER_ERROR; }; } diff --git a/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java b/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java index c1f45f7..a4e9242 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/client/filter/impl/FilterClientImpl.java @@ -9,15 +9,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.filter.expertfilter.ExpertFilter; -import org.gridsuite.mapping.server.error.DynamicMappingException; import org.gridsuite.mapping.server.service.client.AbstractRestClient; import org.gridsuite.mapping.server.service.client.filter.FilterClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -26,8 +27,6 @@ import java.util.Map; import java.util.UUID; -import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.*; -import static org.gridsuite.mapping.server.service.client.utils.ExceptionUtils.handleHttpError; import static org.gridsuite.mapping.server.service.client.utils.UrlUtils.buildEndPointUrl; /** @@ -57,20 +56,12 @@ public List getFilters(List filterUuids) { uriComponentsBuilder.queryParam("ids", filterUuids); // call filter server Rest API - try { - return getRestTemplate().exchange( - uriComponentsBuilder.build().toUriString(), - HttpMethod.GET, - null, - new ParameterizedTypeReference>() { }).getBody(); - - } catch (HttpStatusCodeException e) { - if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) { - throw new DynamicMappingException(FILTER_NOT_FOUND, "Some filters have not been found"); - } else { - throw handleHttpError(e, GET_FILTER_ERROR, getObjectMapper()); - } - } + return getRestTemplate().exchange( + uriComponentsBuilder.build().toUriString(), + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + }).getBody(); } @Override @@ -89,15 +80,13 @@ public List createFilters(Map filtersToCreateM HttpEntity> httpEntity = new HttpEntity<>(filtersToCreateMap, headers); // call filter server Rest API - try { - return getRestTemplate().exchange( - uriComponentsBuilder.build().toUriString(), - HttpMethod.POST, - httpEntity, - new ParameterizedTypeReference>() { }).getBody(); - } catch (HttpStatusCodeException e) { - throw handleHttpError(e, CREATE_FILTER_ERROR, getObjectMapper()); - } + return getRestTemplate().exchange( + uriComponentsBuilder.build().toUriString(), + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + }).getBody(); + } @Override @@ -116,15 +105,13 @@ public List updateFilters(Map filtersToUpdateM HttpEntity> httpEntity = new HttpEntity<>(filtersToUpdateMap, headers); // call filter server Rest API - try { - return getRestTemplate().exchange( - uriComponentsBuilder.build().toUriString(), - HttpMethod.PUT, - httpEntity, - new ParameterizedTypeReference>() { }).getBody(); - } catch (HttpStatusCodeException e) { - throw handleHttpError(e, UPDATE_FILTER_ERROR, getObjectMapper()); - } + return getRestTemplate().exchange( + uriComponentsBuilder.build().toUriString(), + HttpMethod.PUT, + httpEntity, + new ParameterizedTypeReference>() { + }).getBody(); + } @Override @@ -143,15 +130,13 @@ public Map duplicateFilters(List filterUuids) { HttpEntity> httpEntity = new HttpEntity<>(filterUuids, headers); // call filter server Rest API - try { - return getRestTemplate().exchange( - uriComponentsBuilder.build().toUriString(), - HttpMethod.POST, - httpEntity, - new ParameterizedTypeReference>() { }).getBody(); - } catch (HttpStatusCodeException e) { - throw handleHttpError(e, DUPLICATE_FILTER_ERROR, getObjectMapper()); - } + return getRestTemplate().exchange( + uriComponentsBuilder.build().toUriString(), + HttpMethod.POST, + httpEntity, + new ParameterizedTypeReference>() { + }).getBody(); + } @Override @@ -170,14 +155,11 @@ public void deleteFilters(List filterUuids) { HttpEntity> httpEntity = new HttpEntity<>(filterUuids, headers); // call filter server Rest API - try { - getRestTemplate().exchange( - uriComponentsBuilder.build().toUriString(), - HttpMethod.DELETE, - httpEntity, - Void.class); - } catch (HttpStatusCodeException e) { - throw handleHttpError(e, DELETE_FILTER_ERROR, getObjectMapper()); - } + getRestTemplate().exchange( + uriComponentsBuilder.build().toUriString(), + HttpMethod.DELETE, + httpEntity, + Void.class); + } } diff --git a/src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java b/src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java deleted file mode 100644 index 80f4fcd..0000000 --- a/src/main/java/org/gridsuite/mapping/server/service/client/utils/ExceptionUtils.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2024, 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.mapping.server.service.client.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode; -import org.gridsuite.mapping.server.error.DynamicMappingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.client.HttpStatusCodeException; - -/** - * The implementation of class {@link ExceptionUtils} is taken from class {@code StudyUtils} in study-server - * - * @author Thang PHAM - */ -public final class ExceptionUtils { - private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionUtils.class); - - private ExceptionUtils() { - throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); - } - - public static DynamicMappingException handleHttpError(HttpStatusCodeException httpException, DynamicMappingErrorBusinessCode type, ObjectMapper objectMapper) { - String responseBody = httpException.getResponseBodyAsString(); - - String errorMessage = responseBody.isEmpty() ? httpException.getStatusCode().toString() : parseHttpError(responseBody, objectMapper); - - LOGGER.error(errorMessage, httpException); - - return new DynamicMappingException(type, errorMessage); - } - - private static String parseHttpError(String responseBody, ObjectMapper objectMapper) { - try { - JsonNode node = objectMapper.readTree(responseBody).path("message"); - if (!node.isMissingNode()) { - return node.asText(); - } - } catch (JsonProcessingException e) { - // status code or responseBody by default - } - - return responseBody; - } -} diff --git a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java index 5118f23..fab8abe 100644 --- a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java @@ -12,8 +12,9 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockHttpServletRequest; + import static org.assertj.core.api.Assertions.assertThat; -import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.DELETE_FILTER_ERROR; +import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.MAPPING_NAME_NOT_PROVIDED; import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -30,11 +31,11 @@ void setUp() { @Test void mapsInteralErrorBusinessErrorToStatus() { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/results-endpoint/uuid"); - DynamicMappingException exception = new DynamicMappingException(DELETE_FILTER_ERROR, "filter deleted"); + DynamicMappingException exception = new DynamicMappingException(MAPPING_NAME_NOT_PROVIDED, "filter deleted"); ResponseEntity response = handler.handleShortcircuitException(exception, request); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); assertThat(response.getBody()).isNotNull(); - assertEquals("dynamicMapping.deleteFilterError", response.getBody().getBusinessErrorCode()); + assertEquals("dynamicMapping.mappingNameNotProvided", response.getBody().getBusinessErrorCode()); } } diff --git a/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java b/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java index af9a089..6b21f80 100644 --- a/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java +++ b/src/test/java/org/gridsuite/mapping/server/service/client/filter/FilterClientTest.java @@ -19,11 +19,11 @@ import org.gridsuite.filter.utils.expertfilter.CombinatorType; import org.gridsuite.filter.utils.expertfilter.FieldType; import org.gridsuite.filter.utils.expertfilter.OperatorType; -import org.gridsuite.mapping.server.error.DynamicMappingException; import org.gridsuite.mapping.server.service.client.AbstractWireMockRestClientTest; import org.gridsuite.mapping.server.service.client.filter.impl.FilterClientImpl; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; @@ -34,7 +34,6 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.assertj.core.api.Assertions.catchThrowableOfType; -import static org.gridsuite.mapping.server.error.DynamicMappingErrorBusinessCode.*; import static org.gridsuite.mapping.server.service.client.filter.FilterClient.*; import static org.gridsuite.mapping.server.service.client.utils.UrlUtils.buildEndPointUrl; import static org.gridsuite.mapping.server.utils.assertions.Assertions.assertThat; @@ -61,7 +60,7 @@ private List createFilterList() { loadRules.add(loadRule); CombinatorExpertRule loadRootCombinator = CombinatorExpertRule.builder() - .combinator(CombinatorType.AND).rules(loadRules).build(); + .combinator(CombinatorType.AND).rules(loadRules).build(); ExpertFilter loadExpertFilter = new ExpertFilter(UUID.randomUUID(), null, EquipmentType.LOAD, loadRootCombinator); @@ -72,7 +71,7 @@ private List createFilterList() { generatorRules.add(generatorRule); CombinatorExpertRule generatorRootCombinator = CombinatorExpertRule.builder() - .combinator(CombinatorType.AND).rules(generatorRules).build(); + .combinator(CombinatorType.AND).rules(generatorRules).build(); ExpertFilter generatorExpertFilter = new ExpertFilter(UUID.randomUUID(), null, EquipmentType.GENERATOR, generatorRootCombinator); @@ -133,15 +132,9 @@ public void testCreateFiltersGivenException() throws JsonProcessingException { .withBody(ERROR_MESSAGE_JSON) )); - DynamicMappingException exception = catchThrowableOfType( - () -> filterClient.createFilters(filtersToCreate), - DynamicMappingException.class); - + HttpServerErrorException exception = catchThrowableOfType(HttpServerErrorException.class, () -> filterClient.createFilters(filtersToCreate)); // check result - assertThat(exception.getBusinessErrorCode()) - .isEqualTo(CREATE_FILTER_ERROR); - assertThat(exception.getMessage()) - .isEqualTo(ERROR_MESSAGE); + assertThat(exception.getMessage()).contains(ERROR_MESSAGE); } public void testUpdateFilters() throws JsonProcessingException { @@ -182,15 +175,10 @@ public void testUpdateFiltersGivenException() throws JsonProcessingException { .withBody(ERROR_MESSAGE_JSON) )); - DynamicMappingException exception = catchThrowableOfType( - () -> filterClient.updateFilters(filtersToUpdate), - DynamicMappingException.class); - + HttpServerErrorException exception = catchThrowableOfType(HttpServerErrorException.class, () -> filterClient.updateFilters(filtersToUpdate)); // check result - assertThat(exception.getBusinessErrorCode()) - .isEqualTo(UPDATE_FILTER_ERROR); assertThat(exception.getMessage()) - .isEqualTo(ERROR_MESSAGE); + .contains(ERROR_MESSAGE); } @Test @@ -230,15 +218,9 @@ public void testDuplicateFiltersGivenException() throws JsonProcessingException .withBody(ERROR_MESSAGE_JSON) )); - DynamicMappingException exception = catchThrowableOfType( - () -> filterClient.duplicateFilters(sourceUuids), - DynamicMappingException.class); - + HttpServerErrorException exception = catchThrowableOfType(HttpServerErrorException.class, () -> filterClient.duplicateFilters(sourceUuids)); // check result - assertThat(exception.getBusinessErrorCode()) - .isEqualTo(DUPLICATE_FILTER_ERROR); - assertThat(exception.getMessage()) - .isEqualTo(ERROR_MESSAGE); + assertThat(exception.getMessage()).contains(ERROR_MESSAGE); } @Test @@ -269,15 +251,9 @@ public void testDeleteFiltersGivenException() throws JsonProcessingException { .willReturn(WireMock.serverError() .withBody(ERROR_MESSAGE_JSON))); - DynamicMappingException exception = catchThrowableOfType( - () -> filterClient.deleteFilters(sourceUuids), - DynamicMappingException.class); - + HttpServerErrorException exception = catchThrowableOfType(HttpServerErrorException.class, () -> filterClient.deleteFilters(sourceUuids)); // check result - assertThat(exception.getBusinessErrorCode()) - .isEqualTo(DELETE_FILTER_ERROR); - assertThat(exception.getMessage()) - .isEqualTo(ERROR_MESSAGE); + assertThat(exception.getMessage()).contains(ERROR_MESSAGE); } @Test @@ -318,14 +294,8 @@ public void testGetFiltersGivenException() { .withBody(ERROR_MESSAGE_JSON) )); - DynamicMappingException exception = catchThrowableOfType( - () -> filterClient.getFilters(uuids), - DynamicMappingException.class); - + HttpServerErrorException exception = catchThrowableOfType(HttpServerErrorException.class, () -> filterClient.getFilters(uuids)); // check result - assertThat(exception.getBusinessErrorCode()) - .isEqualTo(GET_FILTER_ERROR); - assertThat(exception.getMessage()) - .isEqualTo(ERROR_MESSAGE); + assertThat(exception.getMessage()).contains(ERROR_MESSAGE); } } From 5da6795923f39c2a801a1e18cef5ee59ff001165 Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Thu, 4 Dec 2025 15:01:10 +0100 Subject: [PATCH 8/9] Fix handlers names --- .../mapping/server/error/DynamicMappingExceptionHandler.java | 2 +- .../server/error/DynamicMappingExceptionHandlerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java index 0410007..3c3ce33 100644 --- a/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java +++ b/src/main/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandler.java @@ -38,7 +38,7 @@ protected HttpStatus mapStatus(DynamicMappingErrorBusinessCode businessErrorCode } @ExceptionHandler(DynamicMappingException.class) - protected ResponseEntity handleShortcircuitException( + protected ResponseEntity handleDynamicMappingException( DynamicMappingException exception, HttpServletRequest request) { return super.handleDomainException(exception, request); } diff --git a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java index fab8abe..414d47f 100644 --- a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java @@ -32,7 +32,7 @@ void setUp() { void mapsInteralErrorBusinessErrorToStatus() { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/results-endpoint/uuid"); DynamicMappingException exception = new DynamicMappingException(MAPPING_NAME_NOT_PROVIDED, "filter deleted"); - ResponseEntity response = handler.handleShortcircuitException(exception, request); + ResponseEntity response = handler.handleDynamicMappingException(exception, request); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); assertThat(response.getBody()).isNotNull(); From 1273d2844ae800c3ece5e56a30028c2464c0233c Mon Sep 17 00:00:00 2001 From: Hugo Marcellin Date: Thu, 4 Dec 2025 15:03:21 +0100 Subject: [PATCH 9/9] Test --- .../server/error/DynamicMappingExceptionHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java index 414d47f..7401262 100644 --- a/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/error/DynamicMappingExceptionHandlerTest.java @@ -31,7 +31,7 @@ void setUp() { @Test void mapsInteralErrorBusinessErrorToStatus() { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/results-endpoint/uuid"); - DynamicMappingException exception = new DynamicMappingException(MAPPING_NAME_NOT_PROVIDED, "filter deleted"); + DynamicMappingException exception = new DynamicMappingException(MAPPING_NAME_NOT_PROVIDED, "mapping name not provided"); ResponseEntity response = handler.handleDynamicMappingException(exception, request); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);