Skip to content

Commit 2da7f47

Browse files
authored
Harmonize exceptions handling (#208)
Signed-off-by: Hugo Marcellin <[email protected]>
1 parent ca15ada commit 2da7f47

13 files changed

+115
-72
lines changed

pom.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
<mockwebserver3.version>5.0.0-alpha.14</mockwebserver3.version>
5050
<sonar.organization>gridsuite</sonar.organization>
5151
<sonar.projectKey>org.gridsuite:security-analysis-server</sonar.projectKey>
52+
<!-- To remove after when using gridsuite dependencies release and computation version containing merged PR: https://github.com/gridsuite/computation/pull/19 -->
53+
<gridsuite-computation.version>1.7.0</gridsuite-computation.version>
54+
<powsybl-ws-commons.version>1.34.0</powsybl-ws-commons.version>
55+
<gridsuite-filter.version>1.15.0</gridsuite-filter.version>
5256
</properties>
5357

5458
<build>
@@ -87,6 +91,24 @@
8791

8892
<dependencyManagement>
8993
<dependencies>
94+
<!-- overrides of imports -->
95+
<dependency>
96+
<groupId>com.powsybl</groupId>
97+
<artifactId>powsybl-ws-commons</artifactId>
98+
<version>${powsybl-ws-commons.version}</version>
99+
</dependency>
100+
101+
<dependency>
102+
<groupId>org.gridsuite</groupId>
103+
<artifactId>gridsuite-computation</artifactId>
104+
<version>${gridsuite-computation.version}</version>
105+
</dependency>
106+
107+
<dependency>
108+
<groupId>org.gridsuite</groupId>
109+
<artifactId>gridsuite-filter</artifactId>
110+
<version>${gridsuite-filter.version}</version>
111+
</dependency>
90112

91113
<dependency><!-- To remove when integrate in next release of gridsuite-dependencies or powsybl-ws-dependencies -->
92114
<groupId>com.squareup.okhttp3</groupId>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.securityanalysis.server;
8+
9+
import com.powsybl.ws.commons.error.ServerNameProvider;
10+
import org.springframework.beans.factory.annotation.Value;
11+
import org.springframework.stereotype.Component;
12+
13+
/**
14+
* @author Hugo Marcellin <hugo.marcelin at rte-france.com>
15+
*/
16+
@Component
17+
public class PropertyServerNameProvider implements ServerNameProvider {
18+
19+
private final String name;
20+
21+
public PropertyServerNameProvider(@Value("${spring.application.name:security-analysis-server}") String name) {
22+
this.name = name;
23+
}
24+
25+
@Override
26+
public String serverName() {
27+
return name;
28+
}
29+
}

src/main/java/org/gridsuite/securityanalysis/server/RestResponseEntityExceptionHandler.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/main/java/org/gridsuite/securityanalysis/server/SecurityAnalysisApplication.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.gridsuite.securityanalysis.server;
88

99
import com.powsybl.network.store.client.NetworkStoreService;
10+
import org.gridsuite.computation.error.ComputationExceptionHandler;
1011
import org.gridsuite.computation.service.NotificationService;
1112
import org.springframework.boot.SpringApplication;
1213
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -15,7 +16,7 @@
1516
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
1617
*/
1718
@SuppressWarnings("checkstyle:HideUtilityClassConstructor")
18-
@SpringBootApplication(scanBasePackageClasses = { SecurityAnalysisApplication.class, NetworkStoreService.class, NotificationService.class })
19+
@SpringBootApplication(scanBasePackageClasses = {SecurityAnalysisApplication.class, NetworkStoreService.class, NotificationService.class, ComputationExceptionHandler.class})
1920
public class SecurityAnalysisApplication {
2021
public static void main(String[] args) {
2122
SpringApplication.run(SecurityAnalysisApplication.class, args);

src/main/java/org/gridsuite/securityanalysis/server/service/FilterService.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.gridsuite.securityanalysis.server.entities.ContingencyEntity;
1616
import org.gridsuite.securityanalysis.server.entities.SubjectLimitViolationEntity;
1717
import org.springframework.beans.factory.annotation.Value;
18+
import org.springframework.boot.web.client.RestTemplateBuilder;
1819
import org.springframework.stereotype.Service;
1920

2021
import java.util.List;
@@ -27,10 +28,10 @@
2728
@Service
2829
public class FilterService extends AbstractFilterService {
2930

30-
public FilterService(
31-
NetworkStoreService networkStoreService,
32-
@Value("${gridsuite.services.filter-server.base-uri:http://filter-server/}") String filterServerBaseUri) {
33-
super(networkStoreService, filterServerBaseUri);
31+
public FilterService(RestTemplateBuilder restTemplateBuilder,
32+
NetworkStoreService networkStoreService,
33+
@Value("${gridsuite.services.filter-server.base-uri:http://filter-server/}") String filterServerBaseUri) {
34+
super(restTemplateBuilder, networkStoreService, filterServerBaseUri);
3435
}
3536

3637
public Optional<ResourceFilterDTO> getResourceFilterN(@NonNull UUID networkUuid, @NonNull String variantId, @NonNull GlobalFilter globalFilter) {

src/main/java/org/gridsuite/securityanalysis/server/service/LimitReductionService.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
package org.gridsuite.securityanalysis.server.service;
88

9-
import org.gridsuite.computation.ComputationException;
9+
import org.gridsuite.computation.error.ComputationException;
1010
import lombok.Getter;
1111
import lombok.Setter;
1212
import org.apache.commons.lang3.Range;
@@ -19,6 +19,8 @@
1919
import java.util.Set;
2020
import java.util.concurrent.atomic.AtomicInteger;
2121

22+
import static org.gridsuite.computation.error.ComputationBusinessErrorCode.LIMIT_REDUCTION_CONFIG_ERROR;
23+
2224
@Setter
2325
@Getter
2426
@Service
@@ -64,41 +66,41 @@ private List<LimitReductionsByVoltageLevel.LimitReduction> getLimitReductionsByD
6466

6567
private void assertValidConfig(List<List<Double>> values) {
6668
if (voltageLevels.isEmpty()) {
67-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "No configuration for voltage levels");
69+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "No configuration for voltage levels");
6870
}
6971

7072
if (limitDurations.isEmpty()) {
71-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "No configuration for limit durations");
73+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "No configuration for limit durations");
7274
}
7375

7476
if (values.isEmpty() || values.get(0).isEmpty()) {
75-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "No values provided");
77+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "No values provided");
7678
}
7779

7880
int nbValuesByVl = values.get(0).size();
7981
if (values.stream().anyMatch(valuesByVl -> valuesByVl.size() != nbValuesByVl)) {
80-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "Number of values for a voltage level is incorrect");
82+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "Number of values for a voltage level is incorrect");
8183
}
8284

8385
if (voltageLevels.size() < values.size()) {
84-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "Too many values provided for voltage levels");
86+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "Too many values provided for voltage levels");
8587
}
8688

8789
if (voltageLevels.size() > values.size()) {
88-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "Not enough values provided for voltage levels");
90+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "Not enough values provided for voltage levels");
8991
}
9092

9193
if (limitDurations.size() < nbValuesByVl - 1) {
92-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "Too many values provided for limit durations");
94+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "Too many values provided for limit durations");
9395
}
9496

9597
if (limitDurations.size() > nbValuesByVl - 1) {
96-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "Not enough values provided for limit durations");
98+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "Not enough values provided for limit durations");
9799
}
98100

99101
values.forEach(valuesByVl -> {
100102
if (valuesByVl.stream().anyMatch(v -> !Range.of(0.0, 1.0).contains(v))) {
101-
throw new ComputationException(ComputationException.Type.LIMIT_REDUCTION_CONFIG_ERROR, "Value not between 0 and 1");
103+
throw new ComputationException(LIMIT_REDUCTION_CONFIG_ERROR, "Value not between 0 and 1");
102104
}
103105
});
104106
}

src/main/java/org/gridsuite/securityanalysis/server/service/SecurityAnalysisParametersService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
package org.gridsuite.securityanalysis.server.service;
88

99
import com.powsybl.security.SecurityAnalysisParameters;
10-
import org.gridsuite.computation.ComputationException;
10+
import org.gridsuite.computation.error.ComputationException;
1111
import org.gridsuite.computation.dto.ReportInfos;
1212
import lombok.NonNull;
1313
import org.gridsuite.securityanalysis.server.dto.*;
@@ -19,7 +19,8 @@
1919

2020
import java.util.*;
2121

22-
import static org.gridsuite.computation.ComputationException.Type.PARAMETERS_NOT_FOUND;
22+
import static org.gridsuite.computation.error.ComputationBusinessErrorCode.PARAMETERS_NOT_FOUND;
23+
2324

2425
/**
2526
* @author Abdelsalem HEDHILI <[email protected]>
@@ -159,7 +160,7 @@ public Optional<UUID> duplicateParameters(UUID sourceParametersUuid) {
159160

160161
@Transactional
161162
public UUID updateParameters(UUID parametersUuid, SecurityAnalysisParametersValues parametersInfos) {
162-
SecurityAnalysisParametersEntity securityAnalysisParametersEntity = securityAnalysisParametersRepository.findById(parametersUuid).orElseThrow(() -> new ComputationException(PARAMETERS_NOT_FOUND));
163+
SecurityAnalysisParametersEntity securityAnalysisParametersEntity = securityAnalysisParametersRepository.findById(parametersUuid).orElseThrow(() -> new ComputationException(PARAMETERS_NOT_FOUND, "Could not find provided parameters"));
163164
//if the parameters is null it means it's a reset to defaultValues, but we need to keep the provider because it's updated separately
164165
if (parametersInfos == null) {
165166
securityAnalysisParametersEntity.update(getDefaultSecurityAnalysisParametersValues(securityAnalysisParametersEntity.getProvider()));

src/main/java/org/gridsuite/securityanalysis/server/service/SecurityAnalysisResultService.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import com.powsybl.security.LimitViolationType;
1313
import com.powsybl.security.SecurityAnalysisResult;
1414
import lombok.Getter;
15-
import org.gridsuite.computation.ComputationException;
15+
import org.gridsuite.computation.error.ComputationException;
1616
import org.gridsuite.computation.dto.GlobalFilter;
1717
import org.gridsuite.computation.dto.ResourceFilterDTO;
1818
import org.gridsuite.computation.service.AbstractComputationResultService;
@@ -36,6 +36,8 @@
3636
import java.util.concurrent.TimeUnit;
3737
import java.util.concurrent.atomic.AtomicReference;
3838

39+
import static org.gridsuite.computation.error.ComputationBusinessErrorCode.INVALID_SORT_FORMAT;
40+
import static org.gridsuite.computation.error.ComputationBusinessErrorCode.RESULT_NOT_FOUND;
3941
import static org.gridsuite.computation.utils.FilterUtils.fromStringFiltersToDTO;
4042
import static org.gridsuite.computation.utils.FilterUtils.fromStringGlobalFiltersToDTO;
4143

@@ -225,13 +227,13 @@ private void assertNmKSubjectLimitViolationsSortAllowed(Sort sort) {
225227

226228
private void assertSortAllowed(Sort sort, List<String> allowedSortProperties) {
227229
if (!sort.stream().allMatch(order -> allowedSortProperties.contains(order.getProperty()))) {
228-
throw new ComputationException(ComputationException.Type.INVALID_SORT_FORMAT);
230+
throw new ComputationException(INVALID_SORT_FORMAT, "Invalid sort format");
229231
}
230232
}
231233

232234
public void assertResultExists(UUID resultUuid) {
233235
if (securityAnalysisResultRepository.findById(resultUuid).isEmpty()) {
234-
throw new ComputationException(ComputationException.Type.RESULT_NOT_FOUND);
236+
throw new ComputationException(RESULT_NOT_FOUND, "Result not found");
235237
}
236238
}
237239

src/main/java/org/gridsuite/securityanalysis/server/util/CsvExportUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package org.gridsuite.securityanalysis.server.util;
22

3-
import org.gridsuite.computation.ComputationException;
43
import com.univocity.parsers.csv.CsvFormat;
54
import com.univocity.parsers.csv.CsvWriter;
65
import com.univocity.parsers.csv.CsvWriterSettings;
76

87
import java.io.ByteArrayOutputStream;
98
import java.io.IOException;
109
import java.io.OutputStream;
10+
import java.io.UncheckedIOException;
1111
import java.nio.charset.StandardCharsets;
1212
import java.util.List;
1313
import java.util.Map;
@@ -42,7 +42,7 @@ public static byte[] csvRowsToZippedCsv(List<String> headers, String language, L
4242
csvWriter.close();
4343
return outputStream.toByteArray();
4444
} catch (IOException e) {
45-
throw new ComputationException(ComputationException.Type.FILE_EXPORT_ERROR);
45+
throw new UncheckedIOException("Error occured during data csv export", e);
4646
}
4747
}
4848

src/test/java/org/gridsuite/securityanalysis/server/FindContingenciesTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl;
1313
import com.powsybl.security.LimitViolationType;
1414
import org.gridsuite.computation.dto.ResourceFilterDTO;
15-
import org.gridsuite.computation.ComputationException;
15+
import org.gridsuite.computation.error.ComputationException;
1616
import org.gridsuite.computation.utils.SpecificationUtils;
1717
import org.gridsuite.securityanalysis.server.dto.ContingencyResultDTO;
1818
import org.gridsuite.securityanalysis.server.dto.SecurityAnalysisStatus;
@@ -44,6 +44,7 @@
4444
import static com.vladmihalcea.sql.SQLStatementCountValidator.assertSelectCount;
4545
import static com.vladmihalcea.sql.SQLStatementCountValidator.reset;
4646
import static org.assertj.core.api.Assertions.assertThat;
47+
import static org.gridsuite.computation.error.ComputationBusinessErrorCode.INVALID_SORT_FORMAT;
4748
import static org.gridsuite.securityanalysis.server.SecurityAnalysisProviderMock.*;
4849
import static org.junit.jupiter.api.Assertions.assertEquals;
4950
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -253,8 +254,8 @@ private static Stream<Arguments> provideEdgeCasesFilters() {
253254

254255
private static Stream<Arguments> provideForbiddenSort() {
255256
return Stream.of(
256-
Arguments.of(List.of(), PageRequest.of(0, 30, Sort.by(Sort.Direction.ASC, "limitType")), new ComputationException(ComputationException.Type.INVALID_SORT_FORMAT)),
257-
Arguments.of(List.of(), PageRequest.of(0, 30, Sort.by(Sort.Direction.DESC, "side")), new ComputationException(ComputationException.Type.INVALID_SORT_FORMAT))
257+
Arguments.of(List.of(), PageRequest.of(0, 30, Sort.by(Sort.Direction.ASC, "limitType")), new ComputationException(INVALID_SORT_FORMAT, "Invalid sort format")),
258+
Arguments.of(List.of(), PageRequest.of(0, 30, Sort.by(Sort.Direction.DESC, "side")), new ComputationException(INVALID_SORT_FORMAT, "Invalid sort format"))
258259
);
259260
}
260261

0 commit comments

Comments
 (0)