use of org.supercsv.io.CsvMapReader in project mots by motech-implementations.
the class InchargeService method processInchageCsv.
/**
*.
* Processes CSV file which contains Incharge list and returns list of errors
* @param inchargeCsvFile CSV file with Incharge list
* @return map with row numbers as keys and errors as values.
* @throws IOException in case of file issues
*/
@SuppressWarnings("PMD.CyclomaticComplexity")
@PreAuthorize(RoleNames.HAS_UPLOAD_CSV_ROLE)
public Map<Integer, String> processInchageCsv(MultipartFile inchargeCsvFile, Boolean selected) throws IOException {
ICsvMapReader csvMapReader;
csvMapReader = new CsvMapReader(new InputStreamReader(inchargeCsvFile.getInputStream()), CsvPreference.STANDARD_PREFERENCE);
final String[] header = csvMapReader.getHeader(true);
final CellProcessor[] processors = getProcessors();
Map<String, Object> csvRow;
Set<String> phoneNumberSet = new HashSet<>();
Map<Integer, String> errorMap = new HashMap<>();
while ((csvRow = csvMapReader.read(header, processors)) != null) {
LOGGER.debug(String.format("lineNo=%s, rowNo=%s, chw=%s", csvMapReader.getLineNumber(), csvMapReader.getRowNumber(), csvRow));
String facilityId = Objects.toString(csvRow.get("FACILITY_ID"), null);
Optional<Facility> existingFacility = facilityRepository.findByFacilityId(facilityId);
if (!existingFacility.isPresent()) {
errorMap.put(csvMapReader.getLineNumber(), "Facility with this Facility Id does not exist");
continue;
}
String phoneNumber = Objects.toString(csvRow.get("PHU in-charge number"), null);
if (phoneNumberSet.contains(phoneNumber)) {
errorMap.put(csvMapReader.getLineNumber(), "Phone number is duplicated in CSV");
continue;
}
if (phoneNumber != null) {
phoneNumberSet.add(phoneNumber);
}
String name = Objects.toString(csvRow.get("PHU in-charge name"), null);
if (StringUtils.isBlank(name)) {
errorMap.put(csvMapReader.getLineNumber(), "Incharge name is empty");
continue;
}
String[] nameParts = name.split("([. ])");
List<String> names = Arrays.stream(nameParts).map(part -> part.length() == 1 ? part + "." : part).collect(Collectors.toList());
if (names.size() < MIN_NAME_PARTS_NUMBER) {
errorMap.put(csvMapReader.getLineNumber(), "Incharge second name is empty");
continue;
}
Facility facility = existingFacility.get();
Optional<Incharge> existingIncharge = inchargeRepository.findByFacilityId(facility.getId());
String otherName = null;
if (names.size() > MIN_NAME_PARTS_NUMBER) {
otherName = StringUtils.join(names.subList(1, names.size() - 1), " ");
}
String firstName = names.get(0);
String secondName = names.get(names.size() - 1);
if (existingIncharge.isPresent()) {
Incharge incharge = existingIncharge.get();
incharge.setFirstName(firstName);
incharge.setSecondName(secondName);
incharge.setOtherName(otherName);
incharge.setPhoneNumber(phoneNumber);
if (selected) {
incharge.setSelected(true);
}
inchargeRepository.save(incharge);
continue;
}
inchargeRepository.save(new Incharge(firstName, secondName, otherName, phoneNumber, null, facility, selected));
}
return errorMap;
}
use of org.supercsv.io.CsvMapReader in project motech by motech.
the class CsvImporterExporter method importCsv.
private CsvImportResults importCsv(final EntityInfo entityInfo, final Reader reader, CsvImportCustomizer importCustomizer, boolean continueOnError, boolean clearData) {
final MotechDataService dataService = DataServiceHelper.getDataService(getBundleContext(), entityInfo.getClassName());
Map<String, FieldDto> fieldCacheMap = new HashMap<>();
if (clearData) {
dataService.deleteAll();
}
try (CsvMapReader csvMapReader = new CsvMapReader(reader, CsvPreference.STANDARD_PREFERENCE)) {
List<Long> newInstanceIDs = new ArrayList<>();
List<Long> updatedInstanceIDs = new ArrayList<>();
Map<Integer, String> exceptions = new HashMap<>();
Map<String, String> row;
int rowNum = 0;
final String[] headers = csvMapReader.getHeader(true);
while ((row = csvMapReader.read(headers)) != null) {
rowNum++;
try {
// import a row
RowImportResult rowImportResult = importInstanceFromRow(entityInfo.getEntity(), row, headers, fieldCacheMap, entityInfo.getFieldDtos(), dataService, importCustomizer);
Long id = rowImportResult.getId();
// put its ID in the correct list
if (rowImportResult.isNewInstance()) {
newInstanceIDs.add(id);
} else {
updatedInstanceIDs.add(id);
}
} catch (RuntimeException e) {
if (continueOnError) {
exceptions.put(rowNum, e.getMessage());
} else {
throw e;
}
}
}
return new CsvImportResults(entityInfo.getEntity(), newInstanceIDs, updatedInstanceIDs, exceptions);
} catch (IOException e) {
throw new CsvImportException("IO Error when importing CSV", e);
}
}
Aggregations