package ch.elexis.laborimport.eurolyser.ui; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.ui.importer.div.importers.LabImportUtil; import ch.elexis.core.ui.util.ImporterPage; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.LabItem; import ch.elexis.data.Labor; import ch.elexis.laborimport.eurolyser.EurolyserImporter; public class LabImportPage extends ImporterPage { private static Logger logger = LoggerFactory.getLogger(LabImportPage.class); private Labor eurolyserLabor; private Shell parentShell; private File archiveDir; public LabImportPage(){ eurolyserLabor = LabImportUtil.getOrCreateLabor("Eurolyser"); } @Override public String getTitle(){ return "Eurolyser"; } @Override public String getDescription(){ return "Bitte wählen Sie ein Verzeichnis mit Dateien im Eurolyser-Format für den Import aus"; } @Override public Composite createPage(Composite parent){ parentShell = parent.getShell(); Composite ret = new ImporterPage.DirectoryBasedImporter(parent, this); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); return ret; } @Override public IStatus doImport(IProgressMonitor monitor) throws Exception{ String dirname = results[0]; List<File> files = getEurolyserFiles(dirname); monitor.beginTask("Eurolyser import.", files.size()); for (File file : files) { try { EurolyserImporter importer = new EurolyserImporter(eurolyserLabor, file); if (importer.createResults()) { archiveFile(file); } monitor.worked(1); } catch (final IllegalStateException e) { parentShell.getDisplay().syncExec(new Runnable() { @Override public void run(){ MessageDialog.openError(parentShell, "Fehler", "Die Datei konnte nicht eingelesen werden.\n[" + e.getLocalizedMessage() + "]"); } }); } } ElexisEventDispatcher.reload(LabItem.class); return Status.OK_STATUS; } private List<File> getEurolyserFiles(String dirname){ ArrayList<File> ret = new ArrayList<File>(); File dir = new File(dirname); File[] list = dir.listFiles(); for (File file : list) { if (isEurolyserFile(file)) { ret.add(file); } } if (!ret.isEmpty()) { archiveDir = createArchiveDir(dir); } return ret; } private File createArchiveDir(File dir){ File ret = new File(dir, "archiv"); if (!ret.exists()) { ret.mkdir(); } return ret; } private void archiveFile(File file){ String prefix = ""; while (!file.renameTo(new File(archiveDir, prefix + file.getName()))) { prefix += "_"; } } private boolean isEurolyserFile(File file){ try(FileInputStream input = new FileInputStream(file)) { byte[] buffer = new byte[256]; int len = input.read(buffer); // a file should have more than 30 bytes and stat with a line with 5 parts separated by ; if (len > 30) { ByteArrayInputStream bis = new ByteArrayInputStream(buffer); BufferedReader reader = new BufferedReader(new InputStreamReader(bis)); String line = reader.readLine().trim(); if (line != null && !line.isEmpty()) { String[] parts = line.split(";"); if (parts.length == 5) { reader.close(); return true; } } reader.close(); } } catch (IOException e) { } logger.warn("File [" + file.getAbsolutePath() + "] is not in eurolyser format."); return false; } }