From e204dc3c466cc6207532a4c4c67ee67e2c8a76b5 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Fri, 24 Feb 2017 19:03:53 +0100 Subject: [PATCH] java parser for prc controls added --- .../appointment/parse/PrcControlParser.java | 156 ++++++++++++++++++ .../appointment/parse/PrcFlyingParser.java | 9 +- .../appointment/parse/PrcSubjectsParser.java | 6 +- .../appointment/parse/SubjectParser.java | 12 ++ .../parse/PrcControlParserTest.java | 59 +++++++ .../testFiles/prcControlesExample.xlsx | Bin 0 -> 9506 bytes 6 files changed, 229 insertions(+), 13 deletions(-) create mode 100644 appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java create mode 100644 appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java create mode 100644 appointment-import/testFiles/prcControlesExample.xlsx diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java new file mode 100644 index 00000000..44496a88 --- /dev/null +++ b/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java @@ -0,0 +1,156 @@ +package smash.appointment.parse; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; + +public class PrcControlParser extends SubjectParser { + + @Override + protected String parseScreeningNumber(Row row) { + String number = getString(row.getCell(16)); + if (number.isEmpty()) { + return ""; + } else { + return "P-" + number; + } + } + + @Override + protected String parseName(Row row) { + return getString(row.getCell(1)); + } + + @Override + protected String parseSurname(Row row) { + return getString(row.getCell(0)); + } + + @Override + protected String parseNdNumber(Row row) { + return getString(row.getCell(14)); + } + + @Override + protected String getSheetName() { + return "Contrôles"; + } + + @Override + protected int getInitRow() { + return 1; + } + + @Override + protected String parseBirthDate(Row row) { + return ""; + } + + @Override + protected String parsemPowerId(Row row) { + return ""; + } + + @Override + protected String parseAddDate(Row row) { + return getDate(row.getCell(8)); + } + + @Override + protected String parseReferal(Row row) { + return ""; + } + + @Override + protected String parseDiagnosisYear(Row row) { + return ""; + } + + @Override + protected String parseMail(Row row) { + return getString(row.getCell(5)); + } + + @Override + protected String parsePhone3(Row row) { + String phones[] = getPhones(row); + if (phones.length > 2) { + return phones[2].trim(); + } + return ""; + } + + private String[] getPhones(Row row) { + return getString(row.getCell(4)).split("/"); + } + + @Override + protected String parsePhone2(Row row) { + String phones[] = getPhones(row); + if (phones.length > 1) { + return phones[1].trim(); + } + return ""; + } + + @Override + protected String parsePhone1(Row row) { + String phones[] = getPhones(row); + return phones[0].trim(); + } + + @Override + protected String parseCity(Row row) { + String string = getString(row.getCell(3)); + int spaceIndex = string.indexOf(" "); + if (spaceIndex > 0) { + return string.substring(spaceIndex).trim(); + } + return string; + } + + @Override + protected String parseCountry(Row row) { + return ""; + } + + @Override + protected String parseZipCode(Row row) { + String string = getString(row.getCell(3)); + int spaceIndex = string.indexOf(" "); + if (spaceIndex > 0) { + return string.substring(0,spaceIndex); + } + return ""; + } + + @Override + protected String parseAddress(Row row) { + return getString(row.getCell(2)); + } + + @Override + protected String parseRemarks(Row row) { + String remark1 = getString(row.getCell(9)); + String remark2 = ""; + + String result = ""; + if (!remark1.trim().isEmpty()) { + result = result + remark1 + "\n"; + } + if (!remark2.trim().isEmpty()) { + result = result + remark2 + "\n"; + } + return result; + } + + @Override + protected String parseDiagnosis(Row row) { + return ""; + } + + @Override + protected SubjectType parseType(Row row) { + return SubjectType.CONTROL; + } + +} diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java index f96a40bf..5e27552d 100644 --- a/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java +++ b/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java @@ -42,14 +42,7 @@ public class PrcFlyingParser extends SubjectParser { @Override protected String parseBirthDate(Row row) { - String date = getString(row.getCell(27)).replaceAll(" ", ""); - if (date.length() < 8) { - return ""; - } - String year = date.substring(0, 4); - String month = date.substring(4, 6); - String day = date.substring(6, 8); - return year + "-" + month + "-" + day; + return parseDateOfBirth(row.getCell(27)); } @Override diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java index 21a38c19..7b76573f 100644 --- a/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java +++ b/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java @@ -37,11 +37,7 @@ public class PrcSubjectsParser extends SubjectParser { @Override protected String parseBirthDate(Row row) { - String date = getString(row.getCell(27)).replaceAll(" ", ""); - String year = date.substring(0, 4); - String month = date.substring(4, 6); - String day = date.substring(6, 8); - return year + "-" + month + "-" + day; + return parseDateOfBirth(row.getCell(27)); } @Override diff --git a/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java b/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java index bb69f0bf..d3fe996c 100644 --- a/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java +++ b/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java @@ -153,4 +153,16 @@ public abstract class SubjectParser { return result; } + protected String parseDateOfBirth(Cell cell) { + String date = getString(cell).replaceAll(" ", ""); + if (date.length() < 8) { + return ""; + } + String year = date.substring(0, 4); + String month = date.substring(4, 6); + String day = date.substring(6, 8); + String result = year + "-" + month + "-" + day; + return result; + } + } diff --git a/appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java b/appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java new file mode 100644 index 00000000..9558de7c --- /dev/null +++ b/appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java @@ -0,0 +1,59 @@ +package smash.appointment.parse; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.apache.log4j.Logger; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; + +public class PrcControlParserTest extends TestBase { + Logger logger = Logger.getLogger(PrcSubjectsParserTest.class); + + PrcControlParser processor = new PrcControlParser(); + + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() { + super.setUp(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() throws Exception { + List<Subject> entries = processor.processExcel("testFiles/prcControlesExample.xlsx"); + assertTrue(entries.size() > 0); + + Subject subject = entries.get(0); + assertEquals("P-333", subject.getScreeningNumber()); + assertEquals("CCC", subject.getName()); + assertEquals("BBB", subject.getSurname()); + assertTrue(subject.getRemarks().contains("note")); + assertEquals("DDD", subject.getAddress()); + assertEquals("L-2423", subject.getZipCode()); + assertEquals("Luxembourg", subject.getCity()); + assertEquals("", subject.getCountry()); + assertEquals("123", subject.getPhone1()); + assertEquals("456", subject.getPhone2()); + assertEquals("789", subject.getPhone3()); + assertEquals("mail@mail.lu", subject.getMail()); + assertEquals("", subject.getDiagnosisYear()); + assertEquals("", subject.getDiagnosis()); + assertEquals("", subject.getReferal()); + assertEquals("2016-03-29", subject.getAddDate()); + assertEquals("ND3333", subject.getNdNumber()); + assertEquals("", subject.getBirthDate()); + } + + +} diff --git a/appointment-import/testFiles/prcControlesExample.xlsx b/appointment-import/testFiles/prcControlesExample.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2277978b4984e2871171b48d30d06cc32d9ee31e GIT binary patch literal 9506 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 E2i!DcCjbBd literal 0 HcmV?d00001 -- GitLab