From ad462ea8ed0a338242819831ad8cffe46883ea16 Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Fri, 10 Oct 2025 10:48:02 +0200 Subject: [PATCH 1/9] simplify exception handling by delegating the work to powsybl-ws-commons --- pom.xml | 3 +- .../server/FilterBusinessErrorCode.java | 29 +++++++++ .../filter/server/FilterException.java | 49 +++++++++++++++ .../filter/server/FilterService.java | 39 ++++++------ .../server/PropertyServerNameProvider.java | 29 +++++++++ .../RestResponseEntityExceptionHandler.java | 59 +++++++++++++++++++ 6 files changed, 190 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java create mode 100644 src/main/java/org/gridsuite/filter/server/FilterException.java create mode 100644 src/main/java/org/gridsuite/filter/server/PropertyServerNameProvider.java create mode 100644 src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java diff --git a/pom.xml b/pom.xml index 8d2f647f..d8013882 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 43.1.0 - 1.9.0 + 1.10.0 4.3.1 org.gridsuite.filter.server **/migrations/**/* @@ -123,6 +123,7 @@ com.powsybl powsybl-ws-commons + 1.29.0-SNAPSHOT org.projectlombok diff --git a/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java b/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java new file mode 100644 index 00000000..87812e8c --- /dev/null +++ b/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.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.filter.server; + +import com.powsybl.ws.commons.error.BusinessErrorCode; + +/** + * @author Mohamed Ben-rejeb {@literal } + * + * Business error codes emitted by the filter service. + */ +public enum FilterBusinessErrorCode implements BusinessErrorCode { + FILTER_CYCLE_DETECTED("filter.filterCycleDetected"), + FILTER_REMOTE_ERROR("filter.remoteError"); + + private final String code; + + FilterBusinessErrorCode(String code) { + this.code = code; + } + + public String value() { + return code; + } +} diff --git a/src/main/java/org/gridsuite/filter/server/FilterException.java b/src/main/java/org/gridsuite/filter/server/FilterException.java new file mode 100644 index 00000000..a2ab9381 --- /dev/null +++ b/src/main/java/org/gridsuite/filter/server/FilterException.java @@ -0,0 +1,49 @@ +/** + * 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.filter.server; + +import com.powsybl.ws.commons.error.AbstractPowsyblWsException; +import com.powsybl.ws.commons.error.BusinessErrorCode; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; + +import java.util.Objects; +import java.util.Optional; + +/** + * /** + * @author Mohamed Ben-rejeb {@literal } + * + * Filter server specific runtime exception enriched with a business error code. + */ +public class FilterException extends AbstractPowsyblWsException { + + private final FilterBusinessErrorCode errorCode; + private final PowsyblWsProblemDetail remoteError; + + public FilterException(FilterBusinessErrorCode errorCode, String message) { + this(errorCode, message, null); + } + + public FilterException(FilterBusinessErrorCode errorCode, String message, PowsyblWsProblemDetail remoteError) { + super(Objects.requireNonNull(message, "message must not be null")); + this.errorCode = Objects.requireNonNull(errorCode, "errorCode must not be null"); + this.remoteError = remoteError; + } + + public Optional getErrorCode() { + return Optional.of(errorCode); + } + + @Override + public Optional getBusinessErrorCode() { + return Optional.ofNullable(errorCode); + } + + public Optional getRemoteError() { + return Optional.ofNullable(remoteError); + } +} diff --git a/src/main/java/org/gridsuite/filter/server/FilterService.java b/src/main/java/org/gridsuite/filter/server/FilterService.java index a945c99c..7e355c2c 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterService.java +++ b/src/main/java/org/gridsuite/filter/server/FilterService.java @@ -14,6 +14,7 @@ import org.gridsuite.filter.AbstractFilter; import org.gridsuite.filter.FilterLoader; import org.gridsuite.filter.IFilterAttributes; +import org.gridsuite.filter.exceptions.FilterCycleException; import org.gridsuite.filter.identifierlistfilter.FilterEquipments; import org.gridsuite.filter.identifierlistfilter.IdentifiableAttributes; import org.gridsuite.filter.identifierlistfilter.FilteredIdentifiables; @@ -74,8 +75,8 @@ public FilterService(final IdentifierListFilterRepository identifierListFilterRe public List getFilters() { return filterRepositories.entrySet().stream() - .flatMap(entry -> entry.getValue().getFiltersAttributes()) - .collect(Collectors.toList()); + .flatMap(entry -> entry.getValue().getFiltersAttributes()) + .collect(Collectors.toList()); } public List getFiltersAttributes(List filterUuids, String userId) { @@ -122,10 +123,10 @@ public List getFilters(List ids) { private List getFiltersFromRepositories(List ids) { Objects.requireNonNull(ids); return filterRepositories.values() - .stream() - .flatMap(repository -> repository.getFilters(ids) - .stream()) - .toList(); + .stream() + .flatMap(repository -> repository.getFilters(ids) + .stream()) + .toList(); } @Transactional @@ -144,7 +145,7 @@ public List createFilters(List filters) { } Map, List> repositoryFiltersMap = filters.stream() - .collect(Collectors.groupingBy(this::getRepository)); + .collect(Collectors.groupingBy(this::getRepository)); List createdFilters = new ArrayList<>(); repositoryFiltersMap.forEach((repository, subFilters) -> createdFilters.addAll(repository.insertAll(subFilters))); @@ -185,7 +186,7 @@ public Map duplicateFilters(List filterUuids) { }); Map, List> repositoryFiltersMap = sourceFilters.stream() - .collect(Collectors.groupingBy(this::getRepository)); + .collect(Collectors.groupingBy(this::getRepository)); repositoryFiltersMap.forEach(AbstractFilterRepositoryProxy::insertAll); @@ -193,7 +194,7 @@ public Map duplicateFilters(List filterUuids) { } private AbstractFilterRepositoryProxy> getRepository(AbstractFilter filter) { + ? extends FilterRepository> getRepository(AbstractFilter filter) { return filterRepositories.get(filter.getType().name()); } @@ -211,7 +212,11 @@ private AbstractFilter doUpdateFilter(UUID id, F newF FilterLoader filterLoader = uuids -> uuids.stream() .map(uuid -> uuid.equals(id) ? newFilter : getFilterFromRepository(uuid).orElse(null)) .toList(); - FilterCycleDetector.checkNoCycle(newFilter, filterLoader); + try { + FilterCycleDetector.checkNoCycle(newFilter, filterLoader); + } catch (FilterCycleException exception) { + throw new FilterException(FilterBusinessErrorCode.FILTER_CYCLE_DETECTED, exception.getMessage()); + } if (getRepository(filterOpt.get()) == getRepository(newFilter)) { // filter type has not changed modifiedOrCreatedFilter = getRepository(newFilter).modify(id, newFilter); @@ -317,13 +322,13 @@ public Map getIdentifiablesCountByGroup(IdsByGroup idsByGroup, UUI Objects.requireNonNull(idsByGroup); FilterLoader filterLoader = new FilterLoaderImpl(filterRepositories); return idsByGroup.getIds().entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> getFiltersFromRepositories(entry.getValue()).stream() - .mapToLong(f -> getIdentifiableAttributes(f, networkUuid, variantId, filterLoader).size()) - .sum() - ) - ); + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> getFiltersFromRepositories(entry.getValue()).stream() + .mapToLong(f -> getIdentifiableAttributes(f, networkUuid, variantId, filterLoader).size()) + .sum() + ) + ); } @Transactional(readOnly = true) diff --git a/src/main/java/org/gridsuite/filter/server/PropertyServerNameProvider.java b/src/main/java/org/gridsuite/filter/server/PropertyServerNameProvider.java new file mode 100644 index 00000000..34bb5ffc --- /dev/null +++ b/src/main/java/org/gridsuite/filter/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.filter.server; + +import com.powsybl.ws.commons.error.ServerNameProvider; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @author Mohamed Ben-rejeb {@literal } + */ +@Component +public class PropertyServerNameProvider implements ServerNameProvider { + + private final String name; + + public PropertyServerNameProvider(@Value("${server.name:filter-server}") String name) { + this.name = name; + } + + @Override + public String serverName() { + return name; + } +} diff --git a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java new file mode 100644 index 00000000..a9db7bdb --- /dev/null +++ b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java @@ -0,0 +1,59 @@ +/** + * 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.filter.server; + +import com.powsybl.ws.commons.error.AbstractBaseRestExceptionHandler; +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; +import com.powsybl.ws.commons.error.ServerNameProvider; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; + +import java.util.Optional; + +/** + * @author Mohamed Ben-rejeb {@literal } + */ +@ControllerAdvice +public class RestResponseEntityExceptionHandler + extends AbstractBaseRestExceptionHandler { + + public RestResponseEntityExceptionHandler(ServerNameProvider serverNameProvider) { + super(serverNameProvider); + } + + @Override + protected Optional getRemoteError(FilterException ex) { + return ex.getRemoteError(); + } + + @Override + protected Optional getBusinessCode(FilterException ex) { + return ex.getErrorCode(); + } + + @Override + protected HttpStatus mapStatus(FilterBusinessErrorCode code) { + return switch (code) { + case FILTER_CYCLE_DETECTED -> HttpStatus.BAD_REQUEST; + case FILTER_REMOTE_ERROR -> HttpStatus.INTERNAL_SERVER_ERROR; + }; + } + + @Override + protected FilterBusinessErrorCode defaultRemoteErrorCode() { + return FilterBusinessErrorCode.FILTER_REMOTE_ERROR; + } + + @Override + protected FilterException wrapRemote(PowsyblWsProblemDetail remoteError) { + return new FilterException( + FilterBusinessErrorCode.FILTER_REMOTE_ERROR, + remoteError.getDetail(), + remoteError + ); + } +} From 633042b3ad771fbd78bd1d495fc1a21c35ddb78b Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Mon, 13 Oct 2025 14:54:20 +0200 Subject: [PATCH 2/9] add unit tests --- .../server/FilterBusinessErrorCodeTest.java | 24 ++++ .../filter/server/FilterExceptionTest.java | 45 ++++++ .../PropertyServerNameProviderTest.java | 23 ++++ ...estResponseEntityExceptionHandlerTest.java | 128 ++++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java create mode 100644 src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java create mode 100644 src/test/java/org/gridsuite/filter/server/PropertyServerNameProviderTest.java create mode 100644 src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java diff --git a/src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java b/src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java new file mode 100644 index 00000000..1aa0f8a7 --- /dev/null +++ b/src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java @@ -0,0 +1,24 @@ +/** + * 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.filter.server; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Mohamed Ben-rejeb {@literal } + */ +class FilterBusinessErrorCodeTest { + + @ParameterizedTest + @EnumSource(FilterBusinessErrorCode.class) + void valueStartsWithFilter(FilterBusinessErrorCode code) { + assertThat(code.value()).startsWith("filter."); + } +} diff --git a/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java new file mode 100644 index 00000000..b27e8123 --- /dev/null +++ b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java @@ -0,0 +1,45 @@ +/** + * 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.filter.server; + +import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; + +import java.time.Instant; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Mohamed Ben-rejeb {@literal } + */ +class FilterExceptionTest { + + @Test + void exposesErrorCodeAndRemoteError() { + PowsyblWsProblemDetail remote = PowsyblWsProblemDetail.builder(HttpStatus.BAD_GATEWAY) + .server("downstream") + .detail("failure") + .timestamp(Instant.parse("2025-04-01T00:00:00Z")) + .path("/remote") + .build(); + + FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_REMOTE_ERROR, + "Wrapped", remote); + + assertThat(exception.getErrorCode()).contains(FilterBusinessErrorCode.FILTER_REMOTE_ERROR); + assertThat(exception.getBusinessErrorCode()).contains(FilterBusinessErrorCode.FILTER_REMOTE_ERROR); + assertThat(exception.getRemoteError()).contains(remote); + } + + @Test + void defaultConstructorStoresMessage() { + FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_CYCLE_DETECTED, "cycle"); + assertThat(exception.getMessage()).isEqualTo("cycle"); + assertThat(exception.getRemoteError()).isEmpty(); + } +} diff --git a/src/test/java/org/gridsuite/filter/server/PropertyServerNameProviderTest.java b/src/test/java/org/gridsuite/filter/server/PropertyServerNameProviderTest.java new file mode 100644 index 00000000..4b0d6997 --- /dev/null +++ b/src/test/java/org/gridsuite/filter/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.filter.server; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Mohamed Ben-rejeb {@literal } + */ +class PropertyServerNameProviderTest { + + @Test + void returnsConfiguredName() { + PropertyServerNameProvider provider = new PropertyServerNameProvider("filter-overridden"); + assertThat(provider.serverName()).isEqualTo("filter-overridden"); + } +} diff --git a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java new file mode 100644 index 00000000..c1814636 --- /dev/null +++ b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java @@ -0,0 +1,128 @@ +/** + * 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.filter.server; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +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 org.springframework.web.client.HttpClientErrorException; + +import java.nio.charset.StandardCharsets; +import java.time.Instant; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Mohamed Ben-rejeb {@literal } + */ +class RestResponseEntityExceptionHandlerTest { + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(new JavaTimeModule()); + + private TestRestResponseEntityExceptionHandler handler; + + @BeforeEach + void setUp() { + handler = new TestRestResponseEntityExceptionHandler(); + } + + @Test + void mapsBusinessErrorToStatus() { + MockHttpServletRequest request = new MockHttpServletRequest("POST", "/filters"); + FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_CYCLE_DETECTED, "cycle"); + + ResponseEntity response = handler.invokeHandleDomainException(exception, request); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); + assertThat(response.getBody()).isNotNull(); + assertThat(response.getBody().getBusinessErrorCode()) + .isEqualTo(new PowsyblWsProblemDetail.BusinessErrorCode("filter.filterCycleDetected")); + } + + @Test + void propagatesRemoteErrorDetails() { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/filters/remote"); + PowsyblWsProblemDetail remote = PowsyblWsProblemDetail.builder(HttpStatus.INTERNAL_SERVER_ERROR) + .server("directory") + .businessErrorCode("directory.remoteError") + .detail("Directory failure") + .timestamp(Instant.parse("2025-04-10T00:00:00Z")) + .path("/directory") + .build(); + + FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_REMOTE_ERROR, "wrap", remote); + + ResponseEntity response = handler.invokeHandleDomainException(exception, request); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + assertThat(response.getBody()).isNotNull(); + assertThat(response.getBody().getBusinessErrorCode()) + .isEqualTo(new PowsyblWsProblemDetail.BusinessErrorCode("directory.remoteError")); + assertThat(response.getBody().getChain()).hasSize(1); + } + + @Test + void wrapsInvalidRemotePayloadWithDefaultCode() { + MockHttpServletRequest request = new MockHttpServletRequest("DELETE", "/filters/remote"); + HttpClientErrorException exception = HttpClientErrorException.create( + HttpStatus.BAD_GATEWAY, + "bad gateway", + null, + "oops".getBytes(StandardCharsets.UTF_8), + StandardCharsets.UTF_8 + ); + + ResponseEntity response = handler.invokeHandleRemoteException(exception, request); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + assertThat(response.getBody()).isNotNull(); + assertThat(response.getBody().getBusinessErrorCode()) + .isEqualTo(new PowsyblWsProblemDetail.BusinessErrorCode("filter.remoteError")); + } + + @Test + void keepsRemoteStatusWhenPayloadValid() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/filters/remote"); + PowsyblWsProblemDetail remote = PowsyblWsProblemDetail.builder(HttpStatus.BAD_GATEWAY) + .server("directory") + .businessErrorCode("directory.remoteError") + .detail("bad gateway") + .timestamp(Instant.parse("2025-04-11T00:00:00Z")) + .path("/directory") + .build(); + + byte[] payload = OBJECT_MAPPER.writeValueAsBytes(remote); + HttpClientErrorException exception = HttpClientErrorException.create(HttpStatus.BAD_GATEWAY, "bad gateway", + null, payload, StandardCharsets.UTF_8); + + ResponseEntity response = handler.invokeHandleRemoteException(exception, request); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_GATEWAY); + assertThat(response.getBody()).isNotNull(); + assertThat(response.getBody().getChain()).hasSize(1); + } + + private static final class TestRestResponseEntityExceptionHandler extends RestResponseEntityExceptionHandler { + + private TestRestResponseEntityExceptionHandler() { + super(() -> "filter-server"); + } + + ResponseEntity invokeHandleDomainException(FilterException exception, MockHttpServletRequest request) { + return super.handleDomainException(exception, request); + } + + ResponseEntity invokeHandleRemoteException(HttpClientErrorException exception, MockHttpServletRequest request) { + return super.handleRemoteException(exception, request); + } + } +} From 5a2115287d1c7b6bf54c42e5f2a49ed5ec7fce5f Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Wed, 15 Oct 2025 10:53:44 +0200 Subject: [PATCH 3/9] adapt to the replacement in powsybl-ws-commons of unnecessary Records by Strings --- .../server/RestResponseEntityExceptionHandlerTest.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java index c1814636..de9f78b3 100644 --- a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java @@ -20,6 +20,7 @@ import java.time.Instant; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Mohamed Ben-rejeb {@literal } @@ -44,8 +45,7 @@ void mapsBusinessErrorToStatus() { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); assertThat(response.getBody()).isNotNull(); - assertThat(response.getBody().getBusinessErrorCode()) - .isEqualTo(new PowsyblWsProblemDetail.BusinessErrorCode("filter.filterCycleDetected")); + assertEquals("filter.filterCycleDetected", response.getBody().getBusinessErrorCode()); } @Test @@ -65,8 +65,7 @@ void propagatesRemoteErrorDetails() { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); assertThat(response.getBody()).isNotNull(); - assertThat(response.getBody().getBusinessErrorCode()) - .isEqualTo(new PowsyblWsProblemDetail.BusinessErrorCode("directory.remoteError")); + assertEquals("directory.remoteError", response.getBody().getBusinessErrorCode()); assertThat(response.getBody().getChain()).hasSize(1); } @@ -85,8 +84,7 @@ void wrapsInvalidRemotePayloadWithDefaultCode() { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); assertThat(response.getBody()).isNotNull(); - assertThat(response.getBody().getBusinessErrorCode()) - .isEqualTo(new PowsyblWsProblemDetail.BusinessErrorCode("filter.remoteError")); + assertEquals("filter.remoteError", response.getBody().getBusinessErrorCode()); } @Test From 769d31a055629e0a963526ddb418ea06659d1ffc Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Thu, 16 Oct 2025 11:08:53 +0200 Subject: [PATCH 4/9] adapt unit tests after changes in powsybl-ws-commons --- .../org/gridsuite/filter/server/FilterEntityControllerTest.java | 2 +- .../filter/server/RestResponseEntityExceptionHandlerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/gridsuite/filter/server/FilterEntityControllerTest.java b/src/test/java/org/gridsuite/filter/server/FilterEntityControllerTest.java index bfce4f8b..70bb1f9e 100644 --- a/src/test/java/org/gridsuite/filter/server/FilterEntityControllerTest.java +++ b/src/test/java/org/gridsuite/filter/server/FilterEntityControllerTest.java @@ -819,7 +819,7 @@ private void updateFiltersWithNoneExistingId(Map filtersTo mvc.perform(put(URL_TEMPLATE + "/batch") .content(objectMapper.writeValueAsString(filtersToUpdateMap)) .contentType(APPLICATION_JSON)) - .andExpect(status().isNotFound()); + .andExpect(status().isInternalServerError()); } private void deleteFilter(UUID filterId) throws Exception { diff --git a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java index de9f78b3..b69c4e06 100644 --- a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java @@ -82,7 +82,7 @@ void wrapsInvalidRemotePayloadWithDefaultCode() { ResponseEntity response = handler.invokeHandleRemoteException(exception, request); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_GATEWAY); assertThat(response.getBody()).isNotNull(); assertEquals("filter.remoteError", response.getBody().getBusinessErrorCode()); } From 1ad1baff7157d823709770f0c983caed48a26912 Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Mon, 20 Oct 2025 17:19:59 +0200 Subject: [PATCH 5/9] remove optional from business code Signed-off-by: benrejebmoh --- .../gridsuite/filter/server/FilterException.java | 13 ++++--------- .../server/RestResponseEntityExceptionHandler.java | 4 ++-- .../filter/server/FilterExceptionTest.java | 4 ++-- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/gridsuite/filter/server/FilterException.java b/src/main/java/org/gridsuite/filter/server/FilterException.java index a2ab9381..8648b110 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterException.java +++ b/src/main/java/org/gridsuite/filter/server/FilterException.java @@ -6,8 +6,7 @@ */ package org.gridsuite.filter.server; -import com.powsybl.ws.commons.error.AbstractPowsyblWsException; -import com.powsybl.ws.commons.error.BusinessErrorCode; +import com.powsybl.ws.commons.error.AbstractBusinessException; import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import java.util.Objects; @@ -19,7 +18,7 @@ * * Filter server specific runtime exception enriched with a business error code. */ -public class FilterException extends AbstractPowsyblWsException { +public class FilterException extends AbstractBusinessException { private final FilterBusinessErrorCode errorCode; private final PowsyblWsProblemDetail remoteError; @@ -34,13 +33,9 @@ public FilterException(FilterBusinessErrorCode errorCode, String message, Powsyb this.remoteError = remoteError; } - public Optional getErrorCode() { - return Optional.of(errorCode); - } - @Override - public Optional getBusinessErrorCode() { - return Optional.ofNullable(errorCode); + public FilterBusinessErrorCode getBusinessErrorCode() { + return errorCode; } public Optional getRemoteError() { diff --git a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java index a9db7bdb..47fb9274 100644 --- a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java +++ b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java @@ -31,8 +31,8 @@ protected Optional getRemoteError(FilterException ex) { } @Override - protected Optional getBusinessCode(FilterException ex) { - return ex.getErrorCode(); + protected FilterBusinessErrorCode getBusinessCode(FilterException ex) { + return ex.getBusinessErrorCode(); } @Override diff --git a/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java index b27e8123..04018c02 100644 --- a/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java +++ b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java @@ -13,6 +13,7 @@ import java.time.Instant; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Mohamed Ben-rejeb {@literal } @@ -31,8 +32,7 @@ void exposesErrorCodeAndRemoteError() { FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_REMOTE_ERROR, "Wrapped", remote); - assertThat(exception.getErrorCode()).contains(FilterBusinessErrorCode.FILTER_REMOTE_ERROR); - assertThat(exception.getBusinessErrorCode()).contains(FilterBusinessErrorCode.FILTER_REMOTE_ERROR); + assertEquals(FilterBusinessErrorCode.FILTER_REMOTE_ERROR, exception.getBusinessErrorCode()); assertThat(exception.getRemoteError()).contains(remote); } From f2e2550280b863812b595fbed1eed7abf33b7f86 Mon Sep 17 00:00:00 2001 From: Joris Mancini Date: Tue, 21 Oct 2025 11:13:02 +0200 Subject: [PATCH 6/9] refactor: adapt to shorter ws-commons Signed-off-by: Joris Mancini --- .../filter/server/FilterException.java | 13 ++-------- .../RestResponseEntityExceptionHandler.java | 24 ++----------------- .../filter/server/FilterExceptionTest.java | 22 ----------------- ...estResponseEntityExceptionHandlerTest.java | 24 ++++++++++++------- 4 files changed, 19 insertions(+), 64 deletions(-) diff --git a/src/main/java/org/gridsuite/filter/server/FilterException.java b/src/main/java/org/gridsuite/filter/server/FilterException.java index 8648b110..159027be 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterException.java +++ b/src/main/java/org/gridsuite/filter/server/FilterException.java @@ -7,7 +7,7 @@ package org.gridsuite.filter.server; import com.powsybl.ws.commons.error.AbstractBusinessException; -import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; +import org.jetbrains.annotations.NotNull; import java.util.Objects; import java.util.Optional; @@ -21,24 +21,15 @@ public class FilterException extends AbstractBusinessException { private final FilterBusinessErrorCode errorCode; - private final PowsyblWsProblemDetail remoteError; public FilterException(FilterBusinessErrorCode errorCode, String message) { - this(errorCode, message, null); - } - - public FilterException(FilterBusinessErrorCode errorCode, String message, PowsyblWsProblemDetail remoteError) { super(Objects.requireNonNull(message, "message must not be null")); this.errorCode = Objects.requireNonNull(errorCode, "errorCode must not be null"); - this.remoteError = remoteError; } + @NotNull @Override public FilterBusinessErrorCode getBusinessErrorCode() { return errorCode; } - - public Optional getRemoteError() { - return Optional.ofNullable(remoteError); - } } diff --git a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java index 47fb9274..6521e512 100644 --- a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java +++ b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java @@ -7,13 +7,11 @@ package org.gridsuite.filter.server; import com.powsybl.ws.commons.error.AbstractBaseRestExceptionHandler; -import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import com.powsybl.ws.commons.error.ServerNameProvider; +import org.jetbrains.annotations.NotNull; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; -import java.util.Optional; - /** * @author Mohamed Ben-rejeb {@literal } */ @@ -25,11 +23,7 @@ public RestResponseEntityExceptionHandler(ServerNameProvider serverNameProvider) super(serverNameProvider); } - @Override - protected Optional getRemoteError(FilterException ex) { - return ex.getRemoteError(); - } - + @NotNull @Override protected FilterBusinessErrorCode getBusinessCode(FilterException ex) { return ex.getBusinessErrorCode(); @@ -42,18 +36,4 @@ protected HttpStatus mapStatus(FilterBusinessErrorCode code) { case FILTER_REMOTE_ERROR -> HttpStatus.INTERNAL_SERVER_ERROR; }; } - - @Override - protected FilterBusinessErrorCode defaultRemoteErrorCode() { - return FilterBusinessErrorCode.FILTER_REMOTE_ERROR; - } - - @Override - protected FilterException wrapRemote(PowsyblWsProblemDetail remoteError) { - return new FilterException( - FilterBusinessErrorCode.FILTER_REMOTE_ERROR, - remoteError.getDetail(), - remoteError - ); - } } diff --git a/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java index 04018c02..54dd9892 100644 --- a/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java +++ b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java @@ -6,40 +6,18 @@ */ package org.gridsuite.filter.server; -import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import org.junit.jupiter.api.Test; -import org.springframework.http.HttpStatus; - -import java.time.Instant; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Mohamed Ben-rejeb {@literal } */ class FilterExceptionTest { - @Test - void exposesErrorCodeAndRemoteError() { - PowsyblWsProblemDetail remote = PowsyblWsProblemDetail.builder(HttpStatus.BAD_GATEWAY) - .server("downstream") - .detail("failure") - .timestamp(Instant.parse("2025-04-01T00:00:00Z")) - .path("/remote") - .build(); - - FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_REMOTE_ERROR, - "Wrapped", remote); - - assertEquals(FilterBusinessErrorCode.FILTER_REMOTE_ERROR, exception.getBusinessErrorCode()); - assertThat(exception.getRemoteError()).contains(remote); - } - @Test void defaultConstructorStoresMessage() { FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_CYCLE_DETECTED, "cycle"); assertThat(exception.getMessage()).isEqualTo("cycle"); - assertThat(exception.getRemoteError()).isEmpty(); } } diff --git a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java index b69c4e06..188477a8 100644 --- a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java @@ -6,21 +6,23 @@ */ package org.gridsuite.filter.server; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.web.client.HttpClientErrorException; import java.nio.charset.StandardCharsets; -import java.time.Instant; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; /** * @author Mohamed Ben-rejeb {@literal } @@ -49,19 +51,24 @@ void mapsBusinessErrorToStatus() { } @Test - void propagatesRemoteErrorDetails() { + void propagatesRemoteErrorDetails() throws JsonProcessingException { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/filters/remote"); PowsyblWsProblemDetail remote = PowsyblWsProblemDetail.builder(HttpStatus.INTERNAL_SERVER_ERROR) .server("directory") .businessErrorCode("directory.remoteError") .detail("Directory failure") - .timestamp(Instant.parse("2025-04-10T00:00:00Z")) .path("/directory") .build(); - FilterException exception = new FilterException(FilterBusinessErrorCode.FILTER_REMOTE_ERROR, "wrap", remote); + HttpClientErrorException exception = HttpClientErrorException.create( + HttpStatus.INTERNAL_SERVER_ERROR, + "coucou", + HttpHeaders.EMPTY, + OBJECT_MAPPER.writeValueAsBytes(remote), + null + ); - ResponseEntity response = handler.invokeHandleDomainException(exception, request); + ResponseEntity response = handler.invokeHandleRemoteException(exception, request); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); assertThat(response.getBody()).isNotNull(); @@ -70,11 +77,11 @@ void propagatesRemoteErrorDetails() { } @Test - void wrapsInvalidRemotePayloadWithDefaultCode() { + void wrapsInvalidRemotePayload() { MockHttpServletRequest request = new MockHttpServletRequest("DELETE", "/filters/remote"); HttpClientErrorException exception = HttpClientErrorException.create( HttpStatus.BAD_GATEWAY, - "bad gateway", + "coucou", null, "oops".getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8 @@ -84,7 +91,7 @@ void wrapsInvalidRemotePayloadWithDefaultCode() { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_GATEWAY); assertThat(response.getBody()).isNotNull(); - assertEquals("filter.remoteError", response.getBody().getBusinessErrorCode()); + assertNull(response.getBody().getBusinessErrorCode()); } @Test @@ -94,7 +101,6 @@ void keepsRemoteStatusWhenPayloadValid() throws Exception { .server("directory") .businessErrorCode("directory.remoteError") .detail("bad gateway") - .timestamp(Instant.parse("2025-04-11T00:00:00Z")) .path("/directory") .build(); From ef0da21a4f6006d90af55374a3114fd3322d2ce4 Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Tue, 21 Oct 2025 14:27:07 +0200 Subject: [PATCH 7/9] remove remote error from business exceptions Signed-off-by: benrejebmoh --- .../org/gridsuite/filter/server/FilterBusinessErrorCode.java | 4 +--- .../java/org/gridsuite/filter/server/FilterException.java | 1 - .../filter/server/RestResponseEntityExceptionHandler.java | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java b/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java index 87812e8c..43193171 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java +++ b/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java @@ -14,9 +14,7 @@ * Business error codes emitted by the filter service. */ public enum FilterBusinessErrorCode implements BusinessErrorCode { - FILTER_CYCLE_DETECTED("filter.filterCycleDetected"), - FILTER_REMOTE_ERROR("filter.remoteError"); - + FILTER_CYCLE_DETECTED("filter.filterCycleDetected"); private final String code; FilterBusinessErrorCode(String code) { diff --git a/src/main/java/org/gridsuite/filter/server/FilterException.java b/src/main/java/org/gridsuite/filter/server/FilterException.java index 159027be..90be61e2 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterException.java +++ b/src/main/java/org/gridsuite/filter/server/FilterException.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import java.util.Objects; -import java.util.Optional; /** * /** diff --git a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java index 6521e512..3390eb7d 100644 --- a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java +++ b/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java @@ -33,7 +33,6 @@ protected FilterBusinessErrorCode getBusinessCode(FilterException ex) { protected HttpStatus mapStatus(FilterBusinessErrorCode code) { return switch (code) { case FILTER_CYCLE_DETECTED -> HttpStatus.BAD_REQUEST; - case FILTER_REMOTE_ERROR -> HttpStatus.INTERNAL_SERVER_ERROR; }; } } From 135507735df054a50d19172532087708b43bc52e Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Tue, 21 Oct 2025 17:10:10 +0200 Subject: [PATCH 8/9] regroup error handling classes into a separate package use released version of powsybl-ws-commons Signed-off-by: benrejebmoh --- pom.xml | 8 ++++++-- .../java/org/gridsuite/filter/server/FilterService.java | 2 ++ .../server/{ => error}/FilterBusinessErrorCode.java | 2 +- .../filter/server/{ => error}/FilterException.java | 2 +- .../{ => error}/RestResponseEntityExceptionHandler.java | 2 +- .../filter/server/FilterBusinessErrorCodeTest.java | 1 + .../org/gridsuite/filter/server/FilterExceptionTest.java | 2 ++ .../server/RestResponseEntityExceptionHandlerTest.java | 3 +++ 8 files changed, 17 insertions(+), 5 deletions(-) rename src/main/java/org/gridsuite/filter/server/{ => error}/FilterBusinessErrorCode.java (94%) rename src/main/java/org/gridsuite/filter/server/{ => error}/FilterException.java (96%) rename src/main/java/org/gridsuite/filter/server/{ => error}/RestResponseEntityExceptionHandler.java (96%) diff --git a/pom.xml b/pom.xml index d8013882..fa57c512 100644 --- a/pom.xml +++ b/pom.xml @@ -88,7 +88,12 @@ - + + + com.powsybl + powsybl-ws-commons + 1.29.0 + @@ -123,7 +128,6 @@ com.powsybl powsybl-ws-commons - 1.29.0-SNAPSHOT org.projectlombok diff --git a/src/main/java/org/gridsuite/filter/server/FilterService.java b/src/main/java/org/gridsuite/filter/server/FilterService.java index 7e355c2c..74be887b 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterService.java +++ b/src/main/java/org/gridsuite/filter/server/FilterService.java @@ -21,6 +21,8 @@ import org.gridsuite.filter.server.dto.FilterAttributes; import org.gridsuite.filter.server.dto.IdsByGroup; import org.gridsuite.filter.server.entities.AbstractFilterEntity; +import org.gridsuite.filter.server.error.FilterBusinessErrorCode; +import org.gridsuite.filter.server.error.FilterException; import org.gridsuite.filter.server.repositories.FilterRepository; import org.gridsuite.filter.server.repositories.expertfilter.ExpertFilterRepository; import org.gridsuite.filter.server.repositories.identifierlistfilter.IdentifierListFilterRepository; diff --git a/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java b/src/main/java/org/gridsuite/filter/server/error/FilterBusinessErrorCode.java similarity index 94% rename from src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java rename to src/main/java/org/gridsuite/filter/server/error/FilterBusinessErrorCode.java index 43193171..c8501e43 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterBusinessErrorCode.java +++ b/src/main/java/org/gridsuite/filter/server/error/FilterBusinessErrorCode.java @@ -4,7 +4,7 @@ * 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.filter.server; +package org.gridsuite.filter.server.error; import com.powsybl.ws.commons.error.BusinessErrorCode; diff --git a/src/main/java/org/gridsuite/filter/server/FilterException.java b/src/main/java/org/gridsuite/filter/server/error/FilterException.java similarity index 96% rename from src/main/java/org/gridsuite/filter/server/FilterException.java rename to src/main/java/org/gridsuite/filter/server/error/FilterException.java index 90be61e2..c4e8ae17 100644 --- a/src/main/java/org/gridsuite/filter/server/FilterException.java +++ b/src/main/java/org/gridsuite/filter/server/error/FilterException.java @@ -4,7 +4,7 @@ * 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.filter.server; +package org.gridsuite.filter.server.error; import com.powsybl.ws.commons.error.AbstractBusinessException; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/filter/server/error/RestResponseEntityExceptionHandler.java similarity index 96% rename from src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java rename to src/main/java/org/gridsuite/filter/server/error/RestResponseEntityExceptionHandler.java index 3390eb7d..83c1a719 100644 --- a/src/main/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandler.java +++ b/src/main/java/org/gridsuite/filter/server/error/RestResponseEntityExceptionHandler.java @@ -4,7 +4,7 @@ * 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.filter.server; +package org.gridsuite.filter.server.error; import com.powsybl.ws.commons.error.AbstractBaseRestExceptionHandler; import com.powsybl.ws.commons.error.ServerNameProvider; diff --git a/src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java b/src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java index 1aa0f8a7..f2b2b50c 100644 --- a/src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java +++ b/src/test/java/org/gridsuite/filter/server/FilterBusinessErrorCodeTest.java @@ -6,6 +6,7 @@ */ package org.gridsuite.filter.server; +import org.gridsuite.filter.server.error.FilterBusinessErrorCode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; diff --git a/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java index 54dd9892..ee26e53b 100644 --- a/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java +++ b/src/test/java/org/gridsuite/filter/server/FilterExceptionTest.java @@ -6,6 +6,8 @@ */ package org.gridsuite.filter.server; +import org.gridsuite.filter.server.error.FilterBusinessErrorCode; +import org.gridsuite.filter.server.error.FilterException; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java index 188477a8..a4c52989 100644 --- a/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java +++ b/src/test/java/org/gridsuite/filter/server/RestResponseEntityExceptionHandlerTest.java @@ -10,6 +10,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.powsybl.ws.commons.error.PowsyblWsProblemDetail; +import org.gridsuite.filter.server.error.FilterBusinessErrorCode; +import org.gridsuite.filter.server.error.FilterException; +import org.gridsuite.filter.server.error.RestResponseEntityExceptionHandler; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; From e1d92c3d731a230a53d839136e0cffbe2dcdb428 Mon Sep 17 00:00:00 2001 From: benrejebmoh Date: Thu, 23 Oct 2025 15:24:27 +0200 Subject: [PATCH 9/9] upgrade powsybl-ws-commons to 1.30.0 and use spring.application.name instead of server.name Signed-off-by: benrejebmoh --- pom.xml | 2 +- .../org/gridsuite/filter/server/PropertyServerNameProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index fa57c512..cb909db0 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ com.powsybl powsybl-ws-commons - 1.29.0 + 1.30.0 diff --git a/src/main/java/org/gridsuite/filter/server/PropertyServerNameProvider.java b/src/main/java/org/gridsuite/filter/server/PropertyServerNameProvider.java index 34bb5ffc..9dbb5540 100644 --- a/src/main/java/org/gridsuite/filter/server/PropertyServerNameProvider.java +++ b/src/main/java/org/gridsuite/filter/server/PropertyServerNameProvider.java @@ -18,7 +18,7 @@ public class PropertyServerNameProvider implements ServerNameProvider { private final String name; - public PropertyServerNameProvider(@Value("${server.name:filter-server}") String name) { + public PropertyServerNameProvider(@Value("${spring.application.name:filter-server}") String name) { this.name = name; }