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

Commit e5bb6ee

Browse files
authored
Merge pull request SORMAS-Foundation#3357 from hzi-braunschweig/3307-campaign-import-error-writer-issue
SORMAS-Foundation#3307 Add format error display in error report
2 parents 8f9c6d5 + 37ecc46 commit e5bb6ee

File tree

5 files changed

+27
-27
lines changed

5 files changed

+27
-27
lines changed

sormas-api/src/main/java/de/symeda/sormas/api/utils/DateHelper.java

+7
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,13 @@ public static Date parseDate(String date, SimpleDateFormat dateFormat) {
144144
public static Date parseDateWithException(String date) throws ParseException {
145145

146146
if (date != null) {
147+
try {
148+
SimpleDateFormat dateFormat = clone(SHORT_DATE_FORMAT);
149+
dateFormat.setLenient(false);
150+
return dateFormat.parse(date);
151+
} catch (ParseException e) {
152+
// Try next format
153+
}
147154
try {
148155
SimpleDateFormat dateFormat = clone(DATE_FORMAT);
149156
dateFormat.setLenient(false);

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignDataView.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public CampaignDataView() {
8686
List<CampaignReferenceDto> campaigns = FacadeProvider.getCampaignFacade().getAllActiveCampaignsAsReference();
8787
campaignCombo.setItems(campaigns);
8888
final CampaignReferenceDto lastStartedCampaign = FacadeProvider.getCampaignFacade().getLastStartedCampaign();
89-
if (lastStartedCampaign != null && campaigns.contains(lastStartedCampaign)) {
89+
if (lastStartedCampaign != null) {
9090
campaignCombo.setValue(lastStartedCampaign);
9191
}
9292
criteria.setCampaign((CampaignReferenceDto) campaignCombo.getValue());

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/importer/CampaignFormDataImporter.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.io.File;
66
import java.io.IOException;
77
import java.lang.reflect.InvocationTargetException;
8-
import java.text.ParseException;
98
import java.util.Arrays;
109
import java.util.LinkedHashMap;
1110
import java.util.LinkedList;
@@ -105,7 +104,7 @@ protected ImportLineResult importDataFromCsvLine(
105104
FacadeProvider.getCampaignFormDataFacade().saveCampaignFormData(campaignFormData);
106105
}
107106
} catch (ImportErrorException e) {
108-
writeImportError(values, e.getMessage());
107+
writeImportError(values, e.getLocalizedMessage());
109108
return ImportLineResult.ERROR;
110109
}
111110

@@ -220,8 +219,6 @@ private CampaignFormDataDto insertColumnEntryIntoData(CampaignFormDataDto campai
220219
e.printStackTrace();
221220
} catch (IllegalAccessException e) {
222221
e.printStackTrace();
223-
} catch (ParseException e) {
224-
e.printStackTrace();
225222
}
226223
} else {
227224
CampaignFormDataEntry formEntry = new CampaignFormDataEntry(entryHeaderPath[i], entry[i]);
@@ -241,15 +238,16 @@ private CampaignFormDataDto insertColumnEntryIntoData(CampaignFormDataDto campai
241238

242239
@Override
243240
protected boolean executeDefaultInvokings(PropertyDescriptor pd, Object element, String entry, String[] entryHeaderPath)
244-
throws InvocationTargetException, IllegalAccessException, ParseException, ImportErrorException {
241+
throws InvocationTargetException, IllegalAccessException, ImportErrorException {
245242
final boolean returnBoolean = super.executeDefaultInvokings(pd, element, entry, entryHeaderPath);
246243
final Class<?> propertyType = pd.getPropertyType();
247244
if (propertyType.isAssignableFrom(RegionReferenceDto.class)) {
248245
final UserDto currentUserDto = userFacade.getByUuid(currentUser.getUuid());
249246
final JurisdictionLevel jurisdictionLevel = UserRole.getJurisdictionLevel(currentUserDto.getUserRoles());
250247
if (jurisdictionLevel == JurisdictionLevel.REGION && !currentUserDto.getRegion().getCaption().equals(entry)) {
251248
throw new ImportErrorException(
252-
I18nProperties.getValidationError(Validations.importEntryRegionNotInUsersJurisdiction, entry, buildEntityProperty(entryHeaderPath)));
249+
I18nProperties
250+
.getValidationError(Validations.importEntryRegionNotInUsersJurisdiction, entry, buildEntityProperty(entryHeaderPath)));
253251
}
254252
}
255253
return returnBoolean;

sormas-ui/src/main/java/de/symeda/sormas/ui/contact/importer/ContactImporter.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
import java.io.File;
66
import java.io.IOException;
77
import java.lang.reflect.InvocationTargetException;
8-
import java.text.ParseException;
98
import java.util.List;
109
import java.util.function.Consumer;
1110
import java.util.function.Function;
1211

13-
import com.opencsv.exceptions.CsvValidationException;
1412
import org.apache.commons.lang3.StringUtils;
1513

14+
import com.opencsv.exceptions.CsvValidationException;
1615
import com.vaadin.server.Sizeable.Unit;
1716
import com.vaadin.server.StreamResource;
1817
import com.vaadin.ui.UI;
@@ -401,9 +400,6 @@ private void insertColumnEntryIntoData(ContactDto contact, PersonDto person, Str
401400
I18nProperties.getValidationError(Validations.importErrorInColumn, buildEntityProperty(entryHeaderPath)));
402401
} catch (IllegalArgumentException e) {
403402
throw new ImportErrorException(entry, buildEntityProperty(entryHeaderPath));
404-
} catch (ParseException e) {
405-
throw new ImportErrorException(
406-
I18nProperties.getValidationError(Validations.importInvalidDate, buildEntityProperty(entryHeaderPath)));
407403
} catch (ImportErrorException e) {
408404
throw e;
409405
} catch (Exception e) {

sormas-ui/src/main/java/de/symeda/sormas/ui/importer/DataImporter.java

+14-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package de.symeda.sormas.ui.importer;
22

3+
import static java.nio.charset.StandardCharsets.UTF_8;
4+
35
import java.beans.IntrospectionException;
46
import java.beans.PropertyDescriptor;
57
import java.io.File;
@@ -20,14 +22,13 @@
2022
import java.util.function.Consumer;
2123
import java.util.function.Function;
2224

23-
import com.opencsv.exceptions.CsvValidationException;
24-
import de.symeda.sormas.api.utils.CSVCommentLineValidator;
2525
import org.apache.commons.lang3.StringUtils;
2626
import org.slf4j.Logger;
2727
import org.slf4j.LoggerFactory;
2828

2929
import com.opencsv.CSVReader;
3030
import com.opencsv.CSVWriter;
31+
import com.opencsv.exceptions.CsvValidationException;
3132
import com.vaadin.server.Sizeable.Unit;
3233
import com.vaadin.server.StreamResource;
3334
import com.vaadin.ui.UI;
@@ -46,14 +47,13 @@
4647
import de.symeda.sormas.api.region.RegionReferenceDto;
4748
import de.symeda.sormas.api.user.UserDto;
4849
import de.symeda.sormas.api.user.UserReferenceDto;
50+
import de.symeda.sormas.api.utils.CSVCommentLineValidator;
4951
import de.symeda.sormas.api.utils.CSVUtils;
5052
import de.symeda.sormas.api.utils.DataHelper;
5153
import de.symeda.sormas.api.utils.DateHelper;
5254
import de.symeda.sormas.ui.utils.DownloadUtil;
5355
import de.symeda.sormas.ui.utils.VaadinUiUtil;
5456

55-
import static java.nio.charset.StandardCharsets.UTF_8;
56-
5757
/**
5858
* Base class for all importers that are used to get data from CSV files into SORMAS.
5959
*
@@ -220,7 +220,8 @@ public ImportResultStatus runImport() throws IOException, InvalidColumnException
220220

221221
CSVReader csvReader = null;
222222
try {
223-
csvReader = CSVUtils.createCSVReader(new InputStreamReader(new FileInputStream(inputFile), UTF_8),
223+
csvReader = CSVUtils.createCSVReader(
224+
new InputStreamReader(new FileInputStream(inputFile), UTF_8),
224225
FacadeProvider.getConfigFacade().getCsvSeparator(),
225226
new CSVCommentLineValidator());
226227
errorReportCsvWriter = CSVUtils.createCSVWriter(createErrorReportWriter(), FacadeProvider.getConfigFacade().getCsvSeparator());
@@ -318,9 +319,8 @@ protected StreamResource createErrorReportStreamResource() {
318319
*/
319320
protected int readImportFileLength(File inputFile) throws IOException, CsvValidationException {
320321
int importFileLength = 0;
321-
try (CSVReader caseCountReader = CSVUtils.createCSVReader(new FileReader(inputFile),
322-
FacadeProvider.getConfigFacade().getCsvSeparator(),
323-
new CSVCommentLineValidator())) {
322+
try (CSVReader caseCountReader =
323+
CSVUtils.createCSVReader(new FileReader(inputFile), FacadeProvider.getConfigFacade().getCsvSeparator(), new CSVCommentLineValidator())) {
324324

325325
while (readNextValidLine(caseCountReader) != null) {
326326
importFileLength++;
@@ -366,21 +366,19 @@ protected abstract ImportLineResult importDataFromCsvLine(
366366
"unchecked",
367367
"rawtypes" })
368368
protected boolean executeDefaultInvokings(PropertyDescriptor pd, Object element, String entry, String[] entryHeaderPath)
369-
throws InvocationTargetException, IllegalAccessException, ParseException, ImportErrorException {
369+
throws InvocationTargetException, IllegalAccessException, ImportErrorException {
370370
Class<?> propertyType = pd.getPropertyType();
371371

372372
if (propertyType.isEnum()) {
373373
pd.getWriteMethod().invoke(element, Enum.valueOf((Class<? extends Enum>) propertyType, entry.toUpperCase()));
374374
return true;
375375
}
376376
if (propertyType.isAssignableFrom(Date.class)) {
377-
// If the string is smaller than the length of the expected date format, throw an exception
378-
if (entry.length() < 10) {
379-
throw new ImportErrorException(
380-
I18nProperties.getValidationError(Validations.importInvalidDate, buildEntityProperty(entryHeaderPath)));
381-
} else {
377+
try {
382378
pd.getWriteMethod().invoke(element, DateHelper.parseDateWithException(entry));
383379
return true;
380+
} catch (ParseException e) {
381+
throw new ImportErrorException(I18nProperties.getValidationError(Validations.importInvalidDate, pd.getName()));
384382
}
385383
}
386384
if (propertyType.isAssignableFrom(Integer.class)) {
@@ -535,7 +533,8 @@ private String[] readNextValidLine(CSVReader csvReader) throws IOException, CsvV
535533
throw e;
536534
}
537535
}
538-
} while(isCommentLine);
536+
}
537+
while (isCommentLine);
539538
return nextValidLine;
540539
}
541540
}

0 commit comments

Comments
 (0)