package ch.elexis.laborimport.hl7.automatic;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.swt.widgets.Display;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.slf4j.LoggerFactory;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.util.ResultAdapter;
import ch.elexis.core.importer.div.importers.HL7Parser;
import ch.elexis.core.ui.importer.div.importers.DefaultHL7Parser;
import ch.elexis.laborimport.hl7.universal.LinkLabContactResolver;
import ch.elexis.laborimport.hl7.universal.Preferences;
import ch.rgw.tools.Result;
import ch.rgw.tools.Result.SEVERITY;
@Component
public class AutomaticImportService {
public static final String MY_LAB = "Eigenlabor";
private HL7Parser hlp = new DefaultHL7Parser(MY_LAB);
private Timer timer = new Timer(true);
@Activate
public void activate(){
timer.schedule(new AutomaticImportTask(), 5000, 5000);
}
private class AutomaticImportTask extends TimerTask {
private final ReentrantLock running = new ReentrantLock();
@Override
public void run(){
if (CoreHub.localCfg.get(Preferences.CFG_DIRECTORY_AUTOIMPORT, false)) {
File dir =
new File(CoreHub.localCfg.get(Preferences.CFG_DIRECTORY, File.separator));
if ((dir.exists()) && (dir.isDirectory()) && isElexisRunning()) {
if (shouldImport(dir)) {
if (running.tryLock()) {
runImport(dir);
running.unlock();
} else {
LoggerFactory.getLogger(AutomaticImportTask.class).warn(
"Import from [" + dir.getAbsolutePath() + "] already running");
}
}
}
}
}
private boolean isElexisRunning(){
return CoreHub.globalCfg != null && ElexisEventDispatcher.getSelectedMandator() != null;
}
private boolean shouldImport(File dir){
return !getImportFiles(dir).isEmpty();
}
private List<File> getImportFiles(File dir){
List<File> ret = new ArrayList<>();
String[] filenames = dir.list(new FilenameFilter() {
public boolean accept(File arg0, String arg1){
if (arg1.toLowerCase().endsWith(".hl7")) {
return true;
}
return false;
}
});
for (String string : filenames) {
File file = new File(dir, string);
long currentMillis = System.currentTimeMillis();
if (file.exists() && !file.isDirectory()
&& (file.lastModified() + 10000) < currentMillis) {
ret.add(file);
}
}
return ret;
}
private void runImport(File dir){
File archiveDir = new File(dir, "archive");
if (!archiveDir.exists()) {
archiveDir.mkdir();
}
File errorDir = new File(dir, "fehlerhaft");
if (!errorDir.exists()) {
errorDir.mkdir();
}
int err = 0;
int files = 0;
Result<?> r = null;
List<File> importFiles = getImportFiles(dir);
for (File importFile : importFiles) {
files++;
Display display = Display.getDefault();
if (display != null) {
ImportFileRunnable runnable = new ImportFileRunnable(importFile, archiveDir);
display.syncExec(runnable);
r = runnable.getResult();
if (!r.isOK()) {
try {
err++;
File errFile = new File(errorDir, importFile.getName());
Files.move(importFile.toPath(), errFile.toPath(),
StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
LoggerFactory.getLogger(AutomaticImportService.class)
.error("Error moving file", e);
}
}
}
}
if (err > 0) {
ResultAdapter.displayResult(r, Integer.toString(err) + " von "
+ Integer.toString(files) + " Dateien hatten Fehler\n");
}
}
}
private class ImportFileRunnable implements Runnable {
private File file;
private File archive;
private Result<?> result;
public ImportFileRunnable(File importFile, File archiveDir){
this.file = importFile;
this.archive = archiveDir;
}
public Result<?> getResult(){
return result;
}
@Override
public void run(){
try {
result = hlp.importFile(file, archive, null, new LinkLabContactResolver(), false);
} catch (IOException e) {
result = new Result<>();
result.add(SEVERITY.ERROR, 1, e.getMessage(), null, true);
}
}
}
}