Skip to content
Snippets Groups Projects
RedcapParser.java 6.38 KiB
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);
		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;
	}
}