package smash.appointment.parse; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; public class RedcapParser { Logger logger = Logger.getLogger(RedcapParser.class); private SubjectDao subjectDao; public List<AppointmentEntry> parse(String filename) throws FileNotFoundException, IOException { List<AppointmentEntry> result = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(filename))) { int lineNumber = 0; String line; while ((line = br.readLine()) != null) { lineNumber++; if (lineNumber == 1) { continue; } String tmp[] = line.split("\t", -1); String ndNumber = tmp[0]; Subject subject = subjectDao.getByNdNumber(ndNumber); if (subject == null) { logger.warn("Cannot find subject with id: " + ndNumber); } else { if (tmp.length < 8) { logger.warn("Invalid row (not enough cells): " + line); } else { subject.addLanguage(tmp[4]); subject.addLanguage(tmp[5]); subject.addLanguage(tmp[6]); subject.addLanguage(tmp[7]); if (!tmp[3].trim().isEmpty()) { subject.setSex(tmp[3]); } if (!tmp[2].trim().isEmpty()) { subject.setBirthDate(tmp[2]); } List<AppointmentEntry> subjectAppointments = new ArrayList<>(); if (!tmp[9].isEmpty()) { subjectAppointments.add(createEntryLevelA(tmp[9], tmp[10], subject)); } if (!tmp[13].isEmpty()) { subjectAppointments.add(createEntryLevelB(tmp[13], tmp[14], subject)); } if (!tmp[17].isEmpty()) { subjectAppointments.add(createEntryLevelBG(tmp[17], tmp[18], subject)); } if (!tmp[21].isEmpty()) { subjectAppointments.add(createEntryLevelBV(tmp[21], tmp[22], subject)); } if (!tmp[41].isEmpty()) { subjectAppointments.add(createEntryLevelSB(tmp[41], subject)); } if (!tmp[45].isEmpty()) { subjectAppointments.add(createEntryLevelMPower(tmp[45], subject)); } result.addAll(subjectAppointments); } } } } return result; } private AppointmentEntry createEntryLevelMPower(String from, Subject subject) { AppointmentEntry entry = new AppointmentEntry(); String date = getDate(from); entry.setDay(date); entry.setSubject(subject); entry.setSource("Imported from RedCap"); entry.addType(AppointmentType.LEVEL_B_M_POWER); entry.setLocation(subject.getToBeSeenAt()); return entry; } private AppointmentEntry createEntryLevelSB(String from, Subject subject) { AppointmentEntry entry = new AppointmentEntry(); String date = getDate(from); entry.setDay(date); entry.setSubject(subject); entry.setSource("Imported from RedCap"); entry.addType(AppointmentType.LEVEL_SB); entry.setLocation(subject.getToBeSeenAt()); return entry; } private AppointmentEntry createEntryLevelBV(String from, String to, Subject subject) { AppointmentEntry entry = new AppointmentEntry(); String date = getDate(from); String date2 = getDate(to); if (!date.equals(date2)) { logger.warn("Different start and end date for level BV appointment. Subject: " + subject.getNdNumber()); } entry.setDay(date); entry.setSubject(subject); entry.setSource("Imported from RedCap"); entry.addType(AppointmentType.LEVEL_BV); entry.setLocation(subject.getToBeSeenAt()); return entry; } private AppointmentEntry createEntryLevelBG(String from, String to, Subject subject) { AppointmentEntry entry = new AppointmentEntry(); String date = getDate(from); String date2 = getDate(to); if (!date.equals(date2)) { logger.warn("Different start and end date for level BG appointment. Subject: " + subject.getNdNumber()); } entry.setDay(date); entry.setSubject(subject); entry.setSource("Imported from RedCap"); entry.addType(AppointmentType.LEVEL_BG); entry.setLocation(subject.getToBeSeenAt()); return entry; } private AppointmentEntry createEntryLevelB(String from, String to, Subject subject) { AppointmentEntry entry = new AppointmentEntry(); String date = getDate(from); String date2 = getDate(to); if (!date.equals(date2)) { logger.warn("Different start and end date for level B appointment. Subject: " + subject.getNdNumber()); } entry.setDay(date); entry.setSubject(subject); entry.setSource("Imported from RedCap"); entry.addType(AppointmentType.LEVEL_B); entry.setLocation(subject.getToBeSeenAt()); return entry; } private AppointmentEntry createEntryLevelA(String from, String to, Subject subject) { AppointmentEntry entry = new AppointmentEntry(); String date = getDate(from); String date2 = getDate(to); if (!date.equals(date2)) { logger.warn("Different start and end date for level A appointment. Subject: " + subject.getNdNumber() + "; " + date + ", " + date2); } String time = getTime(from); String duration = getDuration(from, to); entry.setDay(date); entry.setDuration(duration); entry.setSubject(subject); entry.setSource("Imported from RedCap"); entry.setTime(time); entry.addTypes(AppointmentTypeCollection.LEVEL_A.getTypes()); entry.setLocation(subject.getToBeSeenAt()); return entry; } private String getDuration(String string, String string2) { if (string2.isEmpty()) { return null; } String time1 = getTime(string); String time2 = getTime(string2); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime1 = LocalDateTime.parse("2014-11-25 " + time1 + ":00", formatter); LocalDateTime dateTime2 = LocalDateTime.parse("2014-11-25 " + time2 + ":00", formatter); long diffInMinutes = java.time.Duration.between(dateTime1, dateTime2).toMinutes(); return diffInMinutes + ""; } private String getTime(String string) { return string.split(" ")[1]; } private String getDate(String string) { return string.split(" ")[0]; } /** * @return the subjectDao * @see #subjectDao */ public SubjectDao getSubjectDao() { return subjectDao; } /** * @param subjectDao * the subjectDao to set * @see #subjectDao */ public void setSubjectDao(SubjectDao subjectDao) { this.subjectDao = subjectDao; } }