package ch.elexis.laborimport.eurolyser;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import ch.elexis.core.importer.div.importers.TransientLabResult;
import ch.elexis.core.ui.importer.div.importers.DefaultLabImportUiHandler;
import ch.elexis.core.ui.importer.div.importers.LabImportUtil;
import ch.elexis.data.Labor;
import ch.elexis.data.Patient;
public class EurolyserImporter {
public final static String CONFIG_IMPORT_MANDANTONLY = "eurolyser/import/mandantonly";
private File file;
private Labor labor;
private HashMap<String, Patient> filePatientMap = new HashMap<String, Patient>();
public EurolyserImporter(Labor labor, File file){
this.file = file;
this.labor = labor;
}
public boolean createResults(){
List<TransientLabResult> results = new ArrayList<TransientLabResult>();
List<String> lines = readFile();
try {
for (String line : lines) {
// skip empty lines
if (line != null && !line.isEmpty()) {
EurolyserLine eurolyserLine = new EurolyserLine(labor, line);
if (eurolyserLine.isRelevant()) {
TransientLabResult result = eurolyserLine.createResult(filePatientMap);
if (result != null) {
results.add(result);
}
}
}
}
// import grouped by patient, creates nice orders
HashMap<Patient, List<TransientLabResult>> resultsMap = getGroupedResults(results);
Set<Patient> keys = resultsMap.keySet();
for (Patient patient : keys) {
List<TransientLabResult> patResults = resultsMap.get(patient);
new LabImportUtil().importLabResults(patResults, new DefaultLabImportUiHandler());
}
return !resultsMap.isEmpty();
} catch (RuntimeException e) {
return false;
}
}
private HashMap<Patient, List<TransientLabResult>> getGroupedResults(
List<TransientLabResult> results){
HashMap<Patient, List<TransientLabResult>> ret = new HashMap<Patient, List<TransientLabResult>>();
for (TransientLabResult transientLabResult : results) {
List<TransientLabResult> patResults = ret.get(transientLabResult.getPatient());
if (patResults == null) {
patResults = new ArrayList<TransientLabResult>();
patResults.add(transientLabResult);
Patient pat = Patient.load(transientLabResult.getPatient().getId());
ret.put(pat, patResults);
} else {
patResults.add(transientLabResult);
}
}
return ret;
}
private List<String> readFile(){
ArrayList<String> ret = new ArrayList<String>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
ret.add(line);
}
} catch (IOException e) {
throw new IllegalStateException("File [" + file.getAbsolutePath() + "] is not valid.");
}
return ret;
}
}