Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 4adc400

Browse files
committed
Fix issue with comment line when first entry had separators in it
1 parent 8a64ab6 commit 4adc400

3 files changed

Lines changed: 78 additions & 50 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportColumn.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ public String getDataDescription() {
6868
return dataDescription;
6969
}
7070

71-
public static ImportColumn from(Class<?> entityType, String columnName, Class<?> fieldType) {
71+
public static ImportColumn from(Class<?> entityType, String columnName, Class<?> fieldType, char currentSeparator) {
7272
String entityName = DataHelper.getHumanClassName(entityType);
7373
String caption = computeCaption(entityName, columnName);
74-
String dataType = computeDataType(fieldType);
74+
String dataType = computeDataType(fieldType, currentSeparator);
7575
return new ImportColumn(entityName, columnName, caption, dataType);
7676
}
7777

@@ -104,9 +104,12 @@ private static String computeCaption(String entityName, String columnName) {
104104
* Computes the data type accepted for a certain field type. For values which cannot be determined at start a placeholder will be used (ex: {@link ImportFacade#ACTIVE_DISEASES_PLACEHOLDER}).
105105
*
106106
* @param fieldType type of a CSV field (column)
107+
* @param currentSeparator current CSV configured separator, used to identify a different one for joining lists
107108
* @return a data type description, example or placeholder
108109
*/
109-
private static String computeDataType(Class<?> fieldType) {
110+
private static String computeDataType(Class<?> fieldType, char currentSeparator) {
111+
char separator = ImportExportUtils.getCSVSeparatorDifferentFromCurrent(currentSeparator);
112+
110113
if (String.class.isAssignableFrom(fieldType)) {
111114
return I18nProperties.getString(Strings.text);
112115
} else if (Date.class.isAssignableFrom(fieldType)) {
@@ -120,7 +123,7 @@ private static String computeDataType(Class<?> fieldType) {
120123
for (Object enumConstant : fieldType.getEnumConstants()) {
121124
enumNames.add(((Enum<?>) enumConstant).name());
122125
}
123-
return StringUtils.join(enumNames, ",");
126+
return StringUtils.join(enumNames, separator);
124127
} else if (Number.class.isAssignableFrom(fieldType)) {
125128
return I18nProperties.getString(Strings.number);
126129
} else {

sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import de.symeda.sormas.api.caze.CaseExportDto;
3030
import de.symeda.sormas.api.utils.DataHelper.Pair;
3131
import de.symeda.sormas.api.utils.Order;
32+
import org.apache.commons.lang3.CharUtils;
3233

3334
public final class ImportExportUtils {
3435

@@ -84,4 +85,12 @@ private static int getOrderValue(Method method) {
8485
// XXX throw an exception ?
8586
return -1;
8687
}
88+
89+
public static char getCSVSeparatorDifferentFromCurrent(char currentSeparator) {
90+
char separator = ',';
91+
if (CharUtils.compare(',', currentSeparator) == 0) {
92+
separator = ';';
93+
}
94+
return separator;
95+
}
8796
}

sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java

Lines changed: 62 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@
9191
import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
9292
import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal;
9393

94+
import static de.symeda.sormas.api.caze.CaseDataDto.*;
95+
9496
@Stateless(name = "ImportFacade")
9597
public class ImportFacadeEjb implements ImportFacade {
9698

@@ -120,10 +122,12 @@ public void generateCaseImportTemplateFile() throws IOException {
120122

121123
createExportDirectoryIfNecessary();
122124

125+
char separator = configFacade.getCsvSeparator();
126+
123127
List<ImportColumn> importColumns = new ArrayList<>();
124-
appendListOfFields(importColumns, CaseDataDto.class, "");
125-
appendListOfFields(importColumns, SampleDto.class, "");
126-
appendListOfFields(importColumns, PathogenTestDto.class, "");
128+
appendListOfFields(importColumns, CaseDataDto.class, "", separator);
129+
appendListOfFields(importColumns, SampleDto.class, "", separator);
130+
appendListOfFields(importColumns, PathogenTestDto.class, "", separator);
127131

128132
writeTemplate(Paths.get(getCaseImportTemplateFilePath()), importColumns, true);
129133
}
@@ -133,8 +137,10 @@ public void generateCaseContactImportTemplateFile() throws IOException {
133137

134138
createExportDirectoryIfNecessary();
135139

140+
char separator = configFacade.getCsvSeparator();
141+
136142
List<ImportColumn> importColumns = new ArrayList<>();
137-
appendListOfFields(importColumns, ContactDto.class, "");
143+
appendListOfFields(importColumns, ContactDto.class, "", separator);
138144

139145
List<String> columnsToRemove = Arrays.asList(ContactDto.CAZE,
140146
ContactDto.DISEASE,
@@ -152,8 +158,10 @@ public void generateContactImportTemplateFile() throws IOException {
152158

153159
createExportDirectoryIfNecessary();
154160

161+
char separator = configFacade.getCsvSeparator();
162+
155163
List<ImportColumn> importColumns = new ArrayList<>();
156-
appendListOfFields(importColumns, ContactDto.class, "");
164+
appendListOfFields(importColumns, ContactDto.class, "", separator);
157165
List<String> columnsToRemove = Arrays.asList(ContactDto.CAZE, ContactDto.RESULTING_CASE);
158166
importColumns = importColumns.stream().filter(column -> !columnsToRemove.contains(column.getColumnName())).collect(Collectors.toList());
159167

@@ -165,30 +173,32 @@ public void generateCaseLineListingImportTemplateFile() throws IOException {
165173

166174
createExportDirectoryIfNecessary();
167175

176+
char separator = configFacade.getCsvSeparator();
177+
168178
List<ImportColumn> importColumns = new ArrayList<>();
169-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.DISEASE, Disease.class));
170-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.DISEASE_DETAILS, String.class));
171-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.PLAGUE_TYPE, PlagueType.class));
172-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.DENGUE_FEVER_TYPE, DengueFeverType.class));
173-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.RABIES_TYPE, RabiesType.class));
174-
importColumns.add(ImportColumn.from(PersonDto.class, CaseDataDto.PERSON + "." + PersonDto.FIRST_NAME, String.class));
175-
importColumns.add(ImportColumn.from(PersonDto.class, CaseDataDto.PERSON + "." + PersonDto.LAST_NAME, String.class));
176-
importColumns.add(ImportColumn.from(PersonDto.class, CaseDataDto.PERSON + "." + PersonDto.SEX, Sex.class));
177-
importColumns.add(ImportColumn.from(PersonDto.class, CaseDataDto.PERSON + "." + PersonDto.BIRTH_DATE_DD, Integer.class));
178-
importColumns.add(ImportColumn.from(PersonDto.class, CaseDataDto.PERSON + "." + PersonDto.BIRTH_DATE_MM, Integer.class));
179-
importColumns.add(ImportColumn.from(PersonDto.class, CaseDataDto.PERSON + "." + PersonDto.BIRTH_DATE_YYYY, Integer.class));
180-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.EPID_NUMBER, String.class));
181-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.REPORT_DATE, Date.class));
182-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.CASE_ORIGIN, CaseOrigin.class));
183-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.REGION, RegionReferenceDto.class));
184-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.DISTRICT, DistrictReferenceDto.class));
185-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.COMMUNITY, CommunityReferenceDto.class));
186-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.FACILITY_TYPE, FacilityType.class));
187-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.HEALTH_FACILITY, FacilityReferenceDto.class));
188-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.HEALTH_FACILITY_DETAILS, String.class));
189-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.POINT_OF_ENTRY, PointOfEntryReferenceDto.class));
190-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.POINT_OF_ENTRY_DETAILS, String.class));
191-
importColumns.add(ImportColumn.from(CaseDataDto.class, CaseDataDto.SYMPTOMS + "." + SymptomsDto.ONSET_DATE, Date.class));
179+
importColumns.add(ImportColumn.from(CaseDataDto.class, DISEASE, Disease.class, separator));
180+
importColumns.add(ImportColumn.from(CaseDataDto.class, DISEASE_DETAILS, String.class, separator));
181+
importColumns.add(ImportColumn.from(CaseDataDto.class, PLAGUE_TYPE, PlagueType.class, separator));
182+
importColumns.add(ImportColumn.from(CaseDataDto.class, DENGUE_FEVER_TYPE, DengueFeverType.class, separator));
183+
importColumns.add(ImportColumn.from(CaseDataDto.class, RABIES_TYPE, RabiesType.class, separator));
184+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.FIRST_NAME, String.class, separator));
185+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.LAST_NAME, String.class, separator));
186+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.SEX, Sex.class, separator));
187+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.BIRTH_DATE_DD, Integer.class, separator));
188+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.BIRTH_DATE_MM, Integer.class, separator));
189+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.BIRTH_DATE_YYYY, Integer.class, separator));
190+
importColumns.add(ImportColumn.from(CaseDataDto.class, EPID_NUMBER, String.class, separator));
191+
importColumns.add(ImportColumn.from(CaseDataDto.class, REPORT_DATE, Date.class, separator));
192+
importColumns.add(ImportColumn.from(CaseDataDto.class, CASE_ORIGIN, CaseOrigin.class, separator));
193+
importColumns.add(ImportColumn.from(CaseDataDto.class, REGION, RegionReferenceDto.class, separator));
194+
importColumns.add(ImportColumn.from(CaseDataDto.class, DISTRICT, DistrictReferenceDto.class, separator));
195+
importColumns.add(ImportColumn.from(CaseDataDto.class, COMMUNITY, CommunityReferenceDto.class, separator));
196+
importColumns.add(ImportColumn.from(CaseDataDto.class, FACILITY_TYPE, FacilityType.class, separator));
197+
importColumns.add(ImportColumn.from(CaseDataDto.class, HEALTH_FACILITY, FacilityReferenceDto.class, separator));
198+
importColumns.add(ImportColumn.from(CaseDataDto.class, HEALTH_FACILITY_DETAILS, String.class, separator));
199+
importColumns.add(ImportColumn.from(CaseDataDto.class, POINT_OF_ENTRY, PointOfEntryReferenceDto.class, separator));
200+
importColumns.add(ImportColumn.from(CaseDataDto.class, POINT_OF_ENTRY_DETAILS, String.class, separator));
201+
importColumns.add(ImportColumn.from(CaseDataDto.class, SYMPTOMS + "." + SymptomsDto.ONSET_DATE, Date.class, separator));
192202

193203
writeTemplate(Paths.get(getCaseLineListingImportTemplateFilePath()), importColumns, false);
194204
}
@@ -203,19 +213,21 @@ public void generatePopulationDataImportTemplateFile() throws IOException {
203213

204214
createExportDirectoryIfNecessary();
205215

216+
char separator = configFacade.getCsvSeparator();
217+
206218
List<ImportColumn> importColumns = new ArrayList<>();
207-
importColumns.add(ImportColumn.from(PopulationDataDto.class, PopulationDataDto.REGION, RegionReferenceDto.class));
208-
importColumns.add(ImportColumn.from(PopulationDataDto.class, PopulationDataDto.DISTRICT, DistrictReferenceDto.class));
209-
importColumns.add(ImportColumn.from(RegionDto.class, RegionDto.GROWTH_RATE, Float.class));
210-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "TOTAL", Integer.class));
211-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "MALE_TOTAL", Integer.class));
212-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "FEMALE_TOTAL", Integer.class));
213-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "OTHER_TOTAL", Integer.class));
219+
importColumns.add(ImportColumn.from(PopulationDataDto.class, PopulationDataDto.REGION, RegionReferenceDto.class, separator));
220+
importColumns.add(ImportColumn.from(PopulationDataDto.class, PopulationDataDto.DISTRICT, DistrictReferenceDto.class, separator));
221+
importColumns.add(ImportColumn.from(RegionDto.class, RegionDto.GROWTH_RATE, Float.class, separator));
222+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "TOTAL", Integer.class, separator));
223+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "MALE_TOTAL", Integer.class, separator));
224+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "FEMALE_TOTAL", Integer.class, separator));
225+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "OTHER_TOTAL", Integer.class, separator));
214226
for (AgeGroup ageGroup : AgeGroup.values()) {
215-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "TOTAL_" + ageGroup.name(), Integer.class));
216-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "MALE_" + ageGroup.name(), Integer.class));
217-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "FEMALE_" + ageGroup.name(), Integer.class));
218-
importColumns.add(ImportColumn.from(PopulationDataDto.class, "OTHER_" + ageGroup.name(), Integer.class));
227+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "TOTAL_" + ageGroup.name(), Integer.class, separator));
228+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "MALE_" + ageGroup.name(), Integer.class, separator));
229+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "FEMALE_" + ageGroup.name(), Integer.class, separator));
230+
importColumns.add(ImportColumn.from(PopulationDataDto.class, "OTHER_" + ageGroup.name(), Integer.class, separator));
219231
}
220232

221233
writeTemplate(Paths.get(getPopulationDataImportTemplateFilePath()), importColumns, false);
@@ -260,8 +272,10 @@ private <T extends EntityDto> void generateImportTemplateFile(Class<T> clazz, Pa
260272

261273
createExportDirectoryIfNecessary();
262274

275+
char separator = configFacade.getCsvSeparator();
276+
263277
List<ImportColumn> importColumns = new ArrayList<>();
264-
appendListOfFields(importColumns, clazz, "");
278+
appendListOfFields(importColumns, clazz, "", separator);
265279

266280
writeTemplate(filePath, importColumns, false);
267281
}
@@ -360,7 +374,7 @@ public String getContactImportTemplateFilePath() {
360374
* fields in the order of declaration (which is what we need here), but that could change
361375
* in the future.
362376
*/
363-
private void appendListOfFields(List<ImportColumn> importColumns, Class<?> clazz, String prefix) {
377+
private void appendListOfFields(List<ImportColumn> importColumns, Class<?> clazz, String prefix, char separator) {
364378

365379
for (Field field : clazz.getDeclaredFields()) {
366380
if (Modifier.isStatic(field.getModifiers())) {
@@ -406,13 +420,15 @@ private void appendListOfFields(List<ImportColumn> importColumns, Class<?> clazz
406420
if (EntityDto.class.isAssignableFrom(field.getType()) && !isInfrastructureClass(field.getType())) {
407421
appendListOfFields(importColumns,
408422
field.getType(),
409-
prefix == null || prefix.isEmpty() ? field.getName() + "." : prefix + field.getName() + ".");
423+
prefix == null || prefix.isEmpty() ? field.getName() + "." : prefix + field.getName() + ".",
424+
separator);
410425
} else if (PersonReferenceDto.class.isAssignableFrom(field.getType()) && !isInfrastructureClass(field.getType())) {
411426
appendListOfFields(importColumns,
412427
PersonDto.class,
413-
prefix == null || prefix.isEmpty() ? field.getName() + "." : prefix + field.getName() + ".");
428+
prefix == null || prefix.isEmpty() ? field.getName() + "." : prefix + field.getName() + ".",
429+
separator);
414430
} else {
415-
importColumns.add(ImportColumn.from(clazz, prefix + field.getName(), field.getType()));
431+
importColumns.add(ImportColumn.from(clazz, prefix + field.getName(), field.getType(), separator));
416432
}
417433
}
418434
}
@@ -430,7 +446,7 @@ private boolean isInfrastructureClass(Class<?> clazz) {
430446
private void writeCommentLine(CSVWriter csvWriter, String[] line) {
431447
String[] commentedLine = Arrays.copyOf(line, line.length);
432448
commentedLine[0] = CSVCommentLineValidator.DEFAULT_COMMENT_LINE_PREFIX + commentedLine[0];
433-
csvWriter.writeNext(commentedLine);
449+
csvWriter.writeNext(commentedLine, false);
434450
}
435451

436452
/**
@@ -476,7 +492,7 @@ private String resolvePlaceholders(String content) {
476492
Map<String, Provider<String>> placeholderResolvers = new HashMap<>();
477493
placeholderResolvers.put(ImportFacade.ACTIVE_DISEASES_PLACEHOLDER,
478494
() -> StringUtils.join(diseaseConfigurationFacade.getAllActiveDiseases().stream().map(Disease::getName).collect(Collectors.toList()),
479-
configFacade.getCsvSeparator()));
495+
ImportExportUtils.getCSVSeparatorDifferentFromCurrent(configFacade.getCsvSeparator())));
480496

481497
for (Map.Entry<String, Provider<String>> placeholderResolver : placeholderResolvers.entrySet()) {
482498
content = content.replace(placeholderResolver.getKey(), placeholderResolver.getValue().get());

0 commit comments

Comments
 (0)