Newer
Older
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);
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);
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);
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);
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);
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.addType(AppointmentType.LEVEL_A);
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
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;
}
}