Skip to content

Commit b22412d

Browse files
Use provided language in results csv export (#194)
* Use provided language in results csv export Signed-off-by: Franck LECUYER <[email protected]>
1 parent f09d9c9 commit b22412d

14 files changed

+146
-132
lines changed

src/main/java/org/gridsuite/securityanalysis/server/dto/ContingencyResultDTO.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ public static ContingencyResultDTO toDto(ContingencyEntity contingency) {
4141
}
4242

4343
// each contingencyResultDto will return multiple line (one for each limitViolation)
44-
public List<List<String>> toCsvRows(Map<String, String> translations) {
44+
public List<List<String>> toCsvRows(Map<String, String> translations, String language) {
4545
return this.getSubjectLimitViolations().stream().map(lm -> {
4646
List<String> csvRow = new ArrayList<>();
4747
csvRow.add(this.getContingency().getContingencyId());
4848
csvRow.add(CsvExportUtils.translate(this.getContingency().getStatus(), translations));
4949
csvRow.add(lm.getSubjectId());
5050

51-
csvRow.addAll(lm.getLimitViolation().toCsvRow(translations));
51+
csvRow.addAll(lm.getLimitViolation().toCsvRow(translations, language));
5252

5353
return csvRow;
5454
}).toList();

src/main/java/org/gridsuite/securityanalysis/server/dto/CsvTranslationDTO.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
@Builder
99
public record CsvTranslationDTO(
1010
List<String> headers,
11-
Map<String, String> enumValueTranslations
11+
Map<String, String> enumValueTranslations,
12+
String language
1213
) { }

src/main/java/org/gridsuite/securityanalysis/server/dto/LimitViolationDTO.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
import org.gridsuite.securityanalysis.server.entities.AbstractLimitViolationEntity;
1010
import org.gridsuite.securityanalysis.server.util.CsvExportUtils;
1111

12+
import java.text.NumberFormat;
1213
import java.util.ArrayList;
1314
import java.util.List;
15+
import java.util.Locale;
1416
import java.util.Map;
1517

1618
@AllArgsConstructor
@@ -42,14 +44,18 @@ public static LimitViolationDTO toDto(AbstractLimitViolationEntity limitViolatio
4244
.build();
4345
}
4446

45-
public List<String> toCsvRow(Map<String, String> translations) {
47+
private static String convertDoubleToLocale(Double value, String language) {
48+
return NumberFormat.getInstance(language != null && language.equals("fr") ? Locale.FRENCH : Locale.US).format(value);
49+
}
50+
51+
public List<String> toCsvRow(Map<String, String> translations, String language) {
4652
List<String> csvRow = new ArrayList<>();
4753
csvRow.add(this.getLocationId());
4854
csvRow.add(this.getLimitType() != null ? CsvExportUtils.translate(this.getLimitType().name(), translations) : "");
4955
csvRow.add(CsvExportUtils.replaceNullWithEmptyString(CsvExportUtils.translate(this.getLimitName(), translations)));
50-
csvRow.add(Double.toString(this.getLimit()));
51-
csvRow.add(Double.toString(this.getValue()));
52-
csvRow.add(CsvExportUtils.replaceNullWithEmptyString(this.getLoading()));
56+
csvRow.add(convertDoubleToLocale(this.getLimit(), language));
57+
csvRow.add(convertDoubleToLocale(this.getValue(), language));
58+
csvRow.add(this.getLoading() == null ? "" : convertDoubleToLocale(this.getLoading(), language));
5359
csvRow.add(this.getAcceptableDuration() == Integer.MAX_VALUE ? null : Integer.toString(this.getAcceptableDuration()));
5460
csvRow.add(this.getSide() != null ? CsvExportUtils.translate(this.getSide().name(), translations) : "");
5561
return csvRow;

src/main/java/org/gridsuite/securityanalysis/server/dto/PreContingencyLimitViolationResultDTO.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ public static PreContingencyLimitViolationResultDTO toDto(PreContingencyLimitVio
4040
.build();
4141
}
4242

43-
public List<String> toCsvRow(Map<String, String> translations) {
43+
public List<String> toCsvRow(Map<String, String> translations, String language) {
4444
List<String> csvRow = List.of();
4545

4646
if (this.getLimitViolation() != null) {
47-
return Stream.concat(csvRow.stream(), this.getLimitViolation().toCsvRow(translations).stream()).toList();
47+
return Stream.concat(csvRow.stream(), this.getLimitViolation().toCsvRow(translations, language).stream()).toList();
4848
}
4949

5050
return csvRow;

src/main/java/org/gridsuite/securityanalysis/server/dto/SubjectLimitViolationResultDTO.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ public static SubjectLimitViolationResultDTO toDto(SubjectLimitViolationEntity s
4141
}
4242

4343
// each SubjectLimitViolationResultDTO will return multiple line (one for each contingency)
44-
public List<List<String>> toCsvRows(Map<String, String> translations) {
44+
public List<List<String>> toCsvRows(Map<String, String> translations, String language) {
4545
return this.getContingencies().stream().map(contingency -> {
4646
List<String> csvRow = new ArrayList<>();
4747
csvRow.add(this.getSubjectId());
4848
csvRow.add(contingency.getContingency().getContingencyId());
4949
csvRow.add(CsvExportUtils.translate(contingency.getContingency().getStatus(), translations));
5050

51-
csvRow.addAll(contingency.getLimitViolation().toCsvRow(translations));
51+
csvRow.addAll(contingency.getLimitViolation().toCsvRow(translations, language));
5252
return csvRow;
5353
}).toList();
5454
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public List<PreContingencyLimitViolationResultDTO> findNResult(UUID resultUuid,
148148
public byte[] findNResultZippedCsv(UUID resultUuid, CsvTranslationDTO csvTranslations) {
149149
List<PreContingencyLimitViolationResultDTO> result = self.findNResult(resultUuid, null, null, List.of(), null, Sort.by(Sort.Direction.ASC, AbstractLimitViolationEntity.Fields.subjectLimitViolation + SpecificationUtils.FIELD_SEPARATOR + SubjectLimitViolationEntity.Fields.subjectId));
150150

151-
return CsvExportUtils.csvRowsToZippedCsv(csvTranslations.headers(), result.stream().map(r -> r.toCsvRow(csvTranslations.enumValueTranslations())).toList());
151+
return CsvExportUtils.csvRowsToZippedCsv(csvTranslations.headers(), csvTranslations.language(), result.stream().map(r -> r.toCsvRow(csvTranslations.enumValueTranslations(), csvTranslations.language())).toList());
152152
}
153153

154154
@Transactional(readOnly = true)
@@ -177,7 +177,7 @@ public List<ContingencyResultDTO> findNmKContingenciesResult(UUID resultUuid) {
177177
public byte[] findNmKContingenciesResultZippedCsv(UUID resultUuid, CsvTranslationDTO csvTranslations) {
178178
List<ContingencyResultDTO> result = self.findNmKContingenciesResult(resultUuid);
179179

180-
return CsvExportUtils.csvRowsToZippedCsv(csvTranslations.headers(), result.stream().map(r -> r.toCsvRows(csvTranslations.enumValueTranslations())).flatMap(List::stream).toList());
180+
return CsvExportUtils.csvRowsToZippedCsv(csvTranslations.headers(), csvTranslations.language(), result.stream().map(r -> r.toCsvRows(csvTranslations.enumValueTranslations(), csvTranslations.language())).flatMap(List::stream).toList());
181181
}
182182

183183
@Transactional(readOnly = true)
@@ -208,7 +208,7 @@ public List<SubjectLimitViolationResultDTO> findNmKConstraintsResult(UUID result
208208
public byte[] findNmKConstraintsResultZippedCsv(UUID resultUuid, CsvTranslationDTO csvTranslations) {
209209
List<SubjectLimitViolationResultDTO> result = self.findNmKConstraintsResult(resultUuid);
210210

211-
return CsvExportUtils.csvRowsToZippedCsv(csvTranslations.headers(), result.stream().map(r -> r.toCsvRows(csvTranslations.enumValueTranslations())).flatMap(List::stream).toList());
211+
return CsvExportUtils.csvRowsToZippedCsv(csvTranslations.headers(), csvTranslations.language(), result.stream().map(r -> r.toCsvRows(csvTranslations.enumValueTranslations(), csvTranslations.language())).flatMap(List::stream).toList());
212212
}
213213

214214
private void assertNmKContingenciesSortAllowed(Sort sort) {

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
import java.util.zip.ZipOutputStream;
1616

1717
public final class CsvExportUtils {
18-
public static final char CSV_DELIMITER = ',';
18+
public static final char CSV_DELIMITER_FR = ';';
19+
public static final char CSV_DELIMITER_EN = ',';
1920
public static final char CSV_QUOTE_ESCAPE = '"';
2021

2122
public static final String CSV_RESULT_FILE_NAME = "result.csv";
@@ -24,7 +25,7 @@ private CsvExportUtils() {
2425
throw new UnsupportedOperationException("CsvExportUtils Utility class and cannot be instantiated");
2526
}
2627

27-
public static byte[] csvRowsToZippedCsv(List<String> headers, List<List<String>> csvRows) {
28+
public static byte[] csvRowsToZippedCsv(List<String> headers, String language, List<List<String>> csvRows) {
2829
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
2930
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
3031
zipOutputStream.putNextEntry(new ZipEntry(CSV_RESULT_FILE_NAME));
@@ -33,7 +34,7 @@ public static byte[] csvRowsToZippedCsv(List<String> headers, List<List<String>>
3334
writeUTF8Bom(zipOutputStream);
3435

3536
CsvWriterSettings settings = new CsvWriterSettings();
36-
setFormat(settings.getFormat());
37+
setFormat(settings.getFormat(), language);
3738
CsvWriter csvWriter = new CsvWriter(zipOutputStream, StandardCharsets.UTF_8, settings);
3839
csvWriter.writeRow(headers);
3940
csvWriter.writeRows(csvRows);
@@ -51,9 +52,9 @@ private static void writeUTF8Bom(OutputStream outputStream) throws IOException {
5152
outputStream.write(0xbf);
5253
}
5354

54-
private static void setFormat(CsvFormat format) {
55+
private static void setFormat(CsvFormat format, String language) {
5556
format.setLineSeparator(System.lineSeparator());
56-
format.setDelimiter(CSV_DELIMITER);
57+
format.setDelimiter(language != null && language.equals("fr") ? CSV_DELIMITER_FR : CSV_DELIMITER_EN);
5758
format.setQuoteEscape(CSV_QUOTE_ESCAPE);
5859
}
5960

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,7 @@ private void checkAllZippedCsvResults() throws Exception {
862862
CsvTranslationDTO.builder()
863863
.headers(List.of("Equipment", "Violation type", "Limit name", "Limit value (A or kV)", "Calculated value (A or kV)", "Load (%)", "Overload", "Side"))
864864
.enumValueTranslations(ENUM_TRANSLATIONS_EN)
865+
.language("en")
865866
.build());
866867
/*
867868
* SELECT
@@ -875,13 +876,15 @@ private void checkAllZippedCsvResults() throws Exception {
875876
CsvTranslationDTO.builder()
876877
.headers(List.of("Ouvrage", "Type de contrainte", "Nom du seuil", "Valeur du seuil (A ou kV)", "Valeur calculée (A ou kV)", "Charge (%)", "Surcharge", "Côté"))
877878
.enumValueTranslations(ENUM_TRANSLATIONS_FR)
879+
.language("fr")
878880
.build());
879881

880882
SQLStatementCountValidator.reset();
881883
checkZippedCsvResult("nmk-contingencies-result", "/results/nmk-contingencies-result-en.csv",
882884
CsvTranslationDTO.builder()
883885
.headers(List.of("Contingency ID", "Status", "Constraint", "Bus", "Violation type", "Limit name", "Limit value (A or kV)", "Calculated value (A or kV)", "Load (%)", "Overload", "Side"))
884886
.enumValueTranslations(ENUM_TRANSLATIONS_EN)
887+
.language("en")
885888
.build());
886889
/*
887890
* SELECT
@@ -897,6 +900,7 @@ private void checkAllZippedCsvResults() throws Exception {
897900
CsvTranslationDTO.builder()
898901
.headers(List.of("Id aléa", "Statut", "Contrainte", "Noeud électrique", "Type de contrainte", "Nom du seuil", "Valeur du seuil (A ou kV)", "Charge (%)", "Surcharge", "Côté"))
899902
.enumValueTranslations(ENUM_TRANSLATIONS_FR)
903+
.language("fr")
900904
.build());
901905
assertRequestsCount(4, 0, 0, 0);
902906

@@ -905,6 +909,7 @@ private void checkAllZippedCsvResults() throws Exception {
905909
CsvTranslationDTO.builder()
906910
.headers(List.of("Constraint", "Contingency ID", "Status", "Bus", "Violation type", "Limit name", "Limit value (A or kV)", "Calculated value (A or kV)", "Load (%)", "Overload", "Side"))
907911
.enumValueTranslations(ENUM_TRANSLATIONS_EN)
912+
.language("en")
908913
.build());
909914
/*
910915
* SELECT
@@ -920,6 +925,7 @@ private void checkAllZippedCsvResults() throws Exception {
920925
CsvTranslationDTO.builder()
921926
.headers(List.of("Contrainte", "ID aléa", "Statut", "Noeud électrique", "Type de contrainte", "Nom du seuil", "Valeur du seuil (A ou kV)", "Valeur calculée (A ou kV)", "Charge (%)", "Surcharge", "Côté"))
922927
.enumValueTranslations(ENUM_TRANSLATIONS_FR)
928+
.language("fr")
923929
.build());
924930
assertRequestsCount(4, 0, 0, 0);
925931
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
Equipment,Violation type,Limit name,Limit value (A or kV),Calculated value (A or kV),Load (%),Overload,Side
2-
,Current,l3_name,10.0,11.0,110.0,,Side 1
3-
,Current,l6_name,10.0,11.0,110.0,1200,Side 1
4-
"vl1 (VLGEN_0, VLLOAD_0)",High voltage,IST,400.0,410.0,,0,
2+
,Current,l3_name,10,11,110,,Side 1
3+
,Current,l6_name,10,11,110,1200,Side 1
4+
"vl1 (VLGEN_0, VLLOAD_0)",High voltage,IST,400,410,,0,
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Ouvrage,Type de contrainte,Nom du seuil,Valeur du seuil (A ou kV),Valeur calculée (A ou kV),Charge (%),Surcharge,Côté
2-
,Intensité,l3_name,10.0,11.0,110.0,,Côté 1
3-
,Intensité,l6_name,10.0,11.0,110.0,1200,Côté 1
4-
"vl1 (VLGEN_0, VLLOAD_0)",Tension haute,IST,400.0,410.0,,0,
1+
Ouvrage;Type de contrainte;Nom du seuil;Valeur du seuil (A ou kV);Valeur calculée (A ou kV);Charge (%);Surcharge;Côté
2+
;Intensité;l3_name;10;11;110;;Côté 1
3+
;Intensité;l6_name;10;11;110;1200;Côté 1
4+
vl1 (VLGEN_0, VLLOAD_0);Tension haute;IST;400;410;;0;

0 commit comments

Comments
 (0)