/******************************************************************************* * Copyright (c) 2006-2017, G. Weirich and Elexis * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * G. Weirich - initial implementation * T. Huster - copied from ch.elexis.base.ch.artikel * *******************************************************************************/ package ch.elexis.base.ch.migel.ui; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import au.com.bytecode.opencsv.CSVReader; import ch.elexis.artikel_ch.data.MiGelArtikel; import ch.elexis.base.ch.migel.Messages; import ch.elexis.core.ui.util.ImporterPage; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.PersistentObject; import ch.rgw.tools.ExHandler; import ch.rgw.tools.Money; public class MiGelImporter extends ImporterPage { private static final String SRC_ENCODING = "iso-8859-1"; //$NON-NLS-1$ boolean bDelete = false; Button bClear; String mode; public MiGelImporter(){} @Override public String getTitle(){ return MiGelArtikel.MIGEL_NAME; //$NON-NLS-1$ } @Override public String getDescription(){ return Messages.MiGelImporter_PleaseSelectFile; } @Override public IStatus doImport(final IProgressMonitor monitor) throws Exception{ mode = Messages.MiGelImporter_ModeUpdateAdd; if (bDelete == true) { PersistentObject.getConnection().exec("DELETE FROM ARTIKEL WHERE TYP='MiGeL'"); //$NON-NLS-1$ mode = Messages.MiGelImporter_ModeCreateNew; } final String line = "([0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9]\\.[0-9]) +L? +(.+) +(.+) +(.+) +.+"; //$NON-NLS-1$ try { File file = new File(results[0]); long l = file.length(); monitor.beginTask("MiGeL Import " + mode, (int) l / 100); //$NON-NLS-1$ if (file.getName().toLowerCase().endsWith("csv")) { //$NON-NLS-1$ return importCSV(file, monitor); } else { // long l=file.length(); InputStreamReader is = new InputStreamReader(new FileInputStream(file), "iso-8859-1"); //$NON-NLS-1$ BufferedReader br = new BufferedReader(is); String in; monitor.subTask("MiGel - Import"); //$NON-NLS-1$ Pattern pat = Pattern.compile(line); // Query qbe=new Query(MiGelArtikel.class); LineFeeder lf = new LineFeeder(br); while ((in = lf.nextLine()) != null) { Matcher match = pat.matcher(in); if (match.matches()) { String code = match.group(1); String text = match.group(2); String unit = match.group(3); Money price = new Money(match.group(4)); /* MiGelArtikel migel= */new MiGelArtikel(code, text, unit, price); } } return Status.OK_STATUS; } } catch (Exception ex) { ExHandler.handle(ex); } return Status.CANCEL_STATUS; } @Override public void collect(){ bDelete = bClear.getSelection(); } @Override public Composite createPage(final Composite parent){ Composite ret = new ImporterPage.FileBasedImporter(parent, this); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); bClear = new Button(parent, SWT.CHECK | SWT.WRAP); bClear.setText(Messages.MiGelImporter_ClearAllData); bClear.setSelection(true); bClear.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); return ret; } class LineFeeder { static final String codeline = "[0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9]\\.[0-9].+"; //$NON-NLS-1$ String prev; BufferedReader br; LineFeeder(final BufferedReader b) throws Exception{ br = b; prev = br.readLine(); } char peek(){ return prev.charAt(0); } String nextl() throws Exception{ String r; while ((r = br.readLine()) != null) { if (r.matches(codeline)) { break; } } return r; } String nextLine() throws Exception{ if (prev == null) { return null; } if (!prev.matches(codeline)) { prev = nextl(); } String ret = prev; prev = br.readLine(); if (prev == null) { br.close(); return ret; } while (!prev.matches(codeline) && !prev.startsWith(" ")) { //$NON-NLS-1$ if (ret.matches(".*- +[CHIM]?$")) { //$NON-NLS-1$ ret = ret.replaceFirst("- +[CHIM]?$", prev.trim()); //$NON-NLS-1$ } else if (ret.matches(".* +[CHIM]$")) { //$NON-NLS-1$ ret = ret.replaceFirst("[CHIM]$", prev.trim()); //$NON-NLS-1$ } else { ret += " " + prev.trim(); //$NON-NLS-1$ } prev = br.readLine(); if (prev == null) { br.close(); return ret; } } return ret; } boolean atEOF(){ return prev == null; } public void close() throws Exception{ br.close(); } } private IStatus importCSV(final File file, final IProgressMonitor monitor) throws FileNotFoundException, IOException{ InputStreamReader isr = new InputStreamReader(new FileInputStream(file), SRC_ENCODING); CSVReader reader = new CSVReader(isr); String[] line; monitor.subTask(Messages.MiGelImporter_ReadMigel); while ((line = reader.readNext()) != null) { if (line.length < 3) { continue; } // line=StringTool.convertEncoding(line, SRC_ENCODING); Money betrag; try { betrag = new Money(Double.parseDouble(line[3])); } catch (Exception ex) { betrag = new Money(); } new MiGelArtikel(line[0], line[1], line[2], betrag); monitor.worked(1); } monitor.done(); return Status.OK_STATUS; } }