From c5f45384b7b0de88c886d138a1504c3e44612a8c Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 27 Feb 2017 14:11:06 +0100
Subject: [PATCH] main parser process all the input prc files

---
 .../java/smash/appointment/parse/Main.java    | 40 +++++++++++++-
 .../java/smash/appointment/parse/Subject.java | 53 ++++++++++++++++++-
 .../smash/appointment/parse/SubjectDao.java   | 40 +++++++++++---
 .../smash/appointment/parse/TestBase.java     | 14 ++---
 4 files changed, 131 insertions(+), 16 deletions(-)

diff --git a/appointment-import/src/main/java/smash/appointment/parse/Main.java b/appointment-import/src/main/java/smash/appointment/parse/Main.java
index 18cbe74c..96965759 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/Main.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/Main.java
@@ -1,5 +1,6 @@
 package smash.appointment.parse;
 
+import java.io.IOException;
 import java.util.List;
 
 import org.apache.commons.cli.CommandLine;
@@ -10,6 +11,8 @@ import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.log4j.Logger;
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 
 public class Main {
 	private static Logger	logger				 = Logger.getLogger(Main.class);
@@ -22,30 +25,63 @@ public class Main {
 		Options options = new Options();
 		Option agenda = Option.builder().required().argName("file").hasArg().desc("PRC agenda").longOpt("agenda").build();
 		Option subjects = Option.builder().required().argName("file").hasArg().desc("PRC subjects").longOpt("subjects").build();
+		Option controls = Option.builder().required().argName("file").hasArg().desc("PRC controls").longOpt("controls").build();
+		Option flyingTeam = Option.builder().required().argName("file").hasArg().desc("PRC flying-team").longOpt("flying-team").build();
 		options.addOption(agenda);
 		options.addOption(subjects);
+		options.addOption(controls);
+		options.addOption(flyingTeam);
 
 		CommandLineParser parser = new DefaultParser();
 		try {
 			CommandLine line = parser.parse(options, args);
 
 			String subjectsFile = line.getOptionValue("subjects");
-			subjectDao.addSubjects(processPrcSubjects(subjectsFile));
+			for (Subject subject : processPrcSubjects(subjectsFile)) {
+				subjectDao.addSubject(subject, "[" + subjectsFile + ";" + subject.getScreeningNumber() + ";" + subject.getName() + " " + subject.getSurname() + "]");
+			}
+
+			String controlsFile = line.getOptionValue("controls");
+			for (Subject subject : processPrcControls(controlsFile)) {
+				subjectDao.addSubject(subject, "[" + controlsFile + ";" + subject.getScreeningNumber() + ";" + subject.getName() + " " + subject.getSurname() + "]");
+			}
+
+			String flyingTeamFile = line.getOptionValue("flying-team");
+			for (Subject subject : processFlyingTeamControls(flyingTeamFile)) {
+				subjectDao.addSubject(subject, "[" + flyingTeamFile + ";" + subject.getScreeningNumber() + ";" + subject.getName() + " " + subject.getSurname() + "]");
+			}
+
+			logger.debug("SUBJECTS: ");
+			for (Subject subject : subjectDao.getSubjects()) {
+				logger.debug(subject);
+			}
 
 			String agendaFile = line.getOptionValue("agenda");
 			appointmentDao.addAppointments(processPrcAppointments(agendaFile));
 
 		} catch (ParseException exp) {
+			System.out.println(exp.getMessage());
 			HelpFormatter formatter = new HelpFormatter();
-			formatter.printHelp( "java -jar file.jar", options );
+			formatter.printHelp("java -jar file.jar", options);
 		}
 	}
 
+	private List<Subject> processFlyingTeamControls(String flyingTeamFile) throws Exception {
+		PrcFlyingParser parser = new PrcFlyingParser();
+		return parser.processExcel(flyingTeamFile);
+	}
+
+	private List<Subject> processPrcControls(String controlsFile) throws Exception {
+		PrcControlParser parser = new PrcControlParser();
+		return parser.processExcel(controlsFile);
+	}
+
 	private List<AppointmentEntry> processPrcAppointments(String agendaFile) throws Exception {
 		XlsxCalendarProcessor processor = new XlsxCalendarProcessor();
 		processor.setSubjectDao(subjectDao);
 		List<AppointmentEntry> entries = processor.processExcel(agendaFile);
 
+		logger.debug("APPOINTMENTS: ");
 		for (AppointmentEntry appointmentEntry : entries) {
 			logger.debug(appointmentEntry);
 		}
diff --git a/appointment-import/src/main/java/smash/appointment/parse/Subject.java b/appointment-import/src/main/java/smash/appointment/parse/Subject.java
index d678b8d7..1cfb624d 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/Subject.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/Subject.java
@@ -416,11 +416,62 @@ public class Subject {
 	}
 
 	/**
-	 * @param type the type to set
+	 * @param type
+	 *          the type to set
 	 * @see #type
 	 */
 	public void setType(SubjectType type) {
 		this.type = type;
 	}
 
+	public void update(Subject subject, String errorPrefix) {
+		setName(getMergedValue("name", this.getName(), subject.getName(), errorPrefix));
+		setSurname(getMergedValue("surname", this.getSurname(), subject.getSurname(), errorPrefix));
+		setNdNumber(getMergedValue("ndNumber", this.getNdNumber(), subject.getNdNumber(), errorPrefix));
+		setScreeningNumber(getMergedValue("screeningNumber", this.getScreeningNumber(), subject.getScreeningNumber(), errorPrefix));
+		setSex(getMergedValue("sex", this.getSex(), subject.getSex(), errorPrefix));
+		setRemarks(getMergedValue("remarks", this.getRemarks(), subject.getRemarks(), errorPrefix));
+		setBirthDate(getMergedValue("birthDate", this.getBirthDate(), subject.getBirthDate(), errorPrefix));
+		setAddress(getMergedValue("address", this.getAddress(), subject.getAddress(), errorPrefix));
+		setZipCode(getMergedValue("zipCode", this.getZipCode(), subject.getZipCode(), errorPrefix));
+		setCountry(getMergedValue("country", this.getCountry(), subject.getCountry(), errorPrefix));
+		setCity(getMergedValue("city", this.getCity(), subject.getCity(), errorPrefix));
+		setPhone1(getMergedValue("phone1", this.getPhone1(), subject.getPhone1(), errorPrefix));
+		setPhone2(getMergedValue("phone2", this.getPhone2(), subject.getPhone2(), errorPrefix));
+		setPhone3(getMergedValue("phone3", this.getPhone3(), subject.getPhone3(), errorPrefix));
+		setMail(getMergedValue("mail", this.getMail(), subject.getMail(), errorPrefix));
+		setDiagnosisYear(getMergedValue("diagnosisYear", this.getDiagnosisYear(), subject.getDiagnosisYear(), errorPrefix));
+		setDiagnosis(getMergedValue("diagnosis", this.getDiagnosis(), subject.getDiagnosis(), errorPrefix));
+		setReferal(getMergedValue("referal", this.getReferal(), subject.getReferal(), errorPrefix));
+		setAddDate(getMergedValue("addDate", this.getAddDate(), subject.getAddDate(), errorPrefix));
+		setmPowerId(getMergedValue("mPowerId", this.getmPowerId(), subject.getmPowerId(), errorPrefix));
+		setType(getMergedValue("type", this.getType(), subject.getType(), errorPrefix));
+	}
+
+	private SubjectType getMergedValue(String string, SubjectType existingValue, SubjectType newValue, String errorPrefix) {
+		if (existingValue == null) {
+			return newValue;
+		} else if (newValue == null) {
+			return existingValue;
+		} else if (existingValue.equals(newValue)) {
+			return existingValue;
+		} else {
+			logger.warn(errorPrefix + "New " + string + " differs from old one. (new: " + newValue + ", " + existingValue + "). Skipping");
+			return existingValue;
+		}
+	}
+
+	private String getMergedValue(String string, String existingValue, String newValue, String errorPrefix) {
+		if (existingValue == null || existingValue.trim().isEmpty()) {
+			return newValue;
+		} else if (newValue == null || newValue.trim().isEmpty()) {
+			return existingValue;
+		} else if (existingValue.trim().equalsIgnoreCase(newValue.trim())) {
+			return existingValue;
+		} else {
+			logger.warn(errorPrefix + "New " + string + " differs from old one. (new: " + newValue + ", " + existingValue + "). Skipping");
+			return existingValue;
+		}
+	}
+
 }
diff --git a/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java b/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java
index 4aa696d6..26eca223 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java
@@ -6,19 +6,47 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.log4j.Logger;
+
 public class SubjectDao {
-	private List<Subject> subjects = new ArrayList<Subject>();
+	Logger								logger	 = Logger.getLogger(SubjectDao.class);
+	private List<Subject>	subjects = new ArrayList<>();
+
+	public void addSubject(Subject subject, String errorPrefix) {
+		if (subject.getNdNumber() != null && !subject.getNdNumber().trim().isEmpty()) {
+			Subject existing = getByNdNumber(subject.getNdNumber());
+			if (existing != null) {
+				if (!existing.getScreeningNumber().equals(subject.getScreeningNumber())) {
+					logger.error(errorPrefix + " Nd number taken by subject: " + existing.getScreeningNumber());
+					return;
+				}
+			}
+		}
+		Subject existing = getByScreeningNumber(subject.getScreeningNumber());
+		if (existing != null) {
+			existing.update(subject, errorPrefix);
+		} else {
+			subjects.add(subject);
+		}
+	}
 
-	public void addSubject(Subject subject) {
-		subjects.add(subject);
+	private Subject getByScreeningNumber(String screeningNumber) {
+		for (Subject s : subjects) {
+			if (screeningNumber.equals(s.getScreeningNumber())) {
+				return s;
+			}
+		}
+		return null;
 	}
 
 	public void readFile(String filename) throws IOException {
 		try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
 			String line;
+			int lineCount = 1;
 			while ((line = br.readLine()) != null) {
 				String tmp[] = line.split("\t");
-				addSubject(new Subject(tmp[0], tmp[1], tmp[2], tmp[3]));
+				addSubject(new Subject(tmp[0], tmp[1], tmp[2], tmp[3]), "[" + filename + ":" + lineCount + "]");
+				lineCount++;
 			}
 		}
 	}
@@ -49,9 +77,9 @@ public class SubjectDao {
 		return null;
 	}
 
-	public void addSubjects(List<Subject> processPrcSubjects) {
+	public void addSubjects(List<Subject> processPrcSubjects, String errorPrefix) {
 		for (Subject subject : processPrcSubjects) {
-			addSubject(subject);
+			addSubject(subject, errorPrefix);
 		}
 	}
 
diff --git a/appointment-import/src/test/java/smash/appointment/parse/TestBase.java b/appointment-import/src/test/java/smash/appointment/parse/TestBase.java
index 72704a8a..b9663f46 100644
--- a/appointment-import/src/test/java/smash/appointment/parse/TestBase.java
+++ b/appointment-import/src/test/java/smash/appointment/parse/TestBase.java
@@ -13,13 +13,13 @@ public class TestBase {
 	public void setUp() {
 		subjectDao = new SubjectDao();
 
-		subjectDao.addSubject(new Subject("Piotr Marcin", "Gawron", "ND1005", "1005"));
-		subjectDao.addSubject(piotrGawron);
-		subjectDao.addSubject(janKowalskiNowak);
-		subjectDao.addSubject(johnDoe);
-		subjectDao.addSubject(cateKowalsky);
-		subjectDao.addSubject(andrewDude);
-		subjectDao.addSubject(unknownDude);
+		subjectDao.addSubject(new Subject("Piotr Marcin", "Gawron", "ND1005", "1005"), null);
+		subjectDao.addSubject(piotrGawron, null);
+		subjectDao.addSubject(janKowalskiNowak, null);
+		subjectDao.addSubject(johnDoe, null);
+		subjectDao.addSubject(cateKowalsky, null);
+		subjectDao.addSubject(andrewDude, null);
+		subjectDao.addSubject(unknownDude, null);
 	}
 
 }
-- 
GitLab