-
Piotr Gawron authoredPiotr Gawron authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
RedcapParser.java 6.67 KiB
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]);
}
// for now only PRC and flying team subjects
if (subject.getToBeSeenAt() == null || subject.getToBeSeenAt().startsWith("P") || subject.getToBeSeenAt().startsWith("F")) {
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;
}
}