Java tutorial
/******************************************************************************* * Copyright (c) 2005-2009, 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 * *******************************************************************************/ package ch.elexis.core.ui.stock.dialogs; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Optional; import org.apache.commons.io.FileUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.slf4j.LoggerFactory; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.importer.div.importers.ExcelWrapper; import ch.elexis.core.model.IStockEntry; import ch.elexis.core.model.article.IArticle; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.stock.service.ArticleServiceHolder; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Artikel; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; import ch.elexis.data.Stock; import ch.elexis.data.StockEntry; import ch.rgw.tools.StringTool; import ch.rgw.tools.TimeTool; public class ImportArticleDialog extends TitleAreaDialog { private ComboViewer comboStockType; private Text tFilePath; private StringBuffer reportBuilder = null; private Link reportLink; public ImportArticleDialog(Shell parentShell) { super(parentShell); } @Override protected Control createDialogArea(Composite parent) { reportBuilder = null; Composite ret = new Composite(parent, SWT.NONE); ret.setLayout(new GridLayout(3, false)); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); new Label(ret, SWT.NONE).setText("Import in Lager"); comboStockType = new ComboViewer(ret, SWT.BORDER | SWT.READ_ONLY); comboStockType.setContentProvider(ArrayContentProvider.getInstance()); comboStockType.setInput(new Query<Stock>(Stock.class).execute()); comboStockType.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (selection instanceof StructuredSelection) { if (!selection.isEmpty()) { Object o = ((StructuredSelection) selection).getFirstElement(); } } } }); comboStockType.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof Stock) { Stock stock = (Stock) element; return stock.getLabel(); } return super.getText(element); } }); comboStockType.getCombo().setLayoutData(SWTHelper.getFillGridData(2, false, 1, false)); comboStockType.setSelection(new StructuredSelection(Stock.load(Stock.DEFAULT_STOCK_ID))); new Label(ret, SWT.NONE).setText("Quelldatei auswhlen"); tFilePath = new Text(ret, SWT.BORDER); tFilePath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); tFilePath.setText(""); Button btnBrowse = new Button(ret, SWT.NONE); btnBrowse.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FileDialog fd = new FileDialog(getShell(), SWT.OPEN); fd.setFilterExtensions(new String[] { "*.xls" }); String selected = fd.open(); tFilePath.setText(selected); } }); btnBrowse.setText("auswhlen.."); reportLink = new Link(ret, SWT.NONE); reportLink.setText(""); reportLink.setVisible(false); reportLink.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, true, 3, 1)); // Event handling when users click on links. reportLink.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FileDialog fd = new FileDialog(getShell(), SWT.SAVE); fd.setFilterExtensions(new String[] { "*.csv" }); fd.setFileName("report.csv"); String path = fd.open(); if (path != null) { try { FileUtils.writeStringToFile(new File(path), reportBuilder.toString(), "UTF-8"); } catch (IOException e1) { MessageDialog.openError(getShell(), "Report Error", "Report konnte nicht gespeichert werden.\n\n" + e1.getMessage()); LoggerFactory.getLogger(ImportArticleDialog.class).error("report save error", e1); } } } }); return ret; } @Override public void create() { super.create(); setTitle("Artikel Importieren"); //$NON-NLS-1$ setMessage("Bitte whlen Sie die Quelle aus, aus dem Sie die Artikel importieren mchten."); //$NON-NLS-1$ getShell().setText("Artikel Import"); //$NON-NLS-1$ getShell().setImage(Images.IMG_PILL.getImage()); } @Override protected void okPressed() { reportLink.setVisible(false); reportBuilder = new StringBuffer(); doImport(); if (reportBuilder.length() > 0) { reportLink.setText( " <a href=\"\">Import Report vom " + new TimeTool().toString(TimeTool.FULL_GER) + "</a>"); reportLink.setVisible(true); } } private void doImport() { StringBuffer buf = new StringBuffer(); // check for store availability final List<String> storeIds = ArticleServiceHolder.getStoreIds(); if (storeIds.isEmpty()) { buf.append( "Es ist kein Artikelservice registriert. Vergewissern Sie sich, dass zumindest ein Artikel Plugin installiert ist."); } else { // check for stock availability StructuredSelection iSelection = (StructuredSelection) comboStockType.getSelection(); if (iSelection.isEmpty()) { buf.append("Bitte whlen Sie ein Lager aus."); } else { final Stock stock = (Stock) iSelection.getFirstElement(); // check src file String path = tFilePath.getText(); if (path != null && !path.isEmpty() && path.toLowerCase().endsWith("xls")) { try (FileInputStream is = new FileInputStream(tFilePath.getText())) { ExcelWrapper xl = new ExcelWrapper(); if (xl.load(is, 0)) { xl.setFieldTypes(new Class[] { Integer.class, String.class, String.class, String.class, String.class, String.class, Integer.class, String.class, String.class }); MessageDialog dialog = new MessageDialog(getShell(), "Datenimport", null, "Wie sollen die Datenbestnde importiert werden ?", MessageDialog.QUESTION, 0, "Datenbestand 'exakt' importieren", "Datenbestand 'aufaddieren'"); int ret = dialog.open(); if (ret >= 0) { runImport(buf, storeIds, stock, xl, ret == 0); } return; } } catch (IOException e) { MessageDialog.openError(getShell(), "Import error", "Import fehlgeschlagen.\nDatei nicht importierbar: " + path); LoggerFactory.getLogger(ImportArticleDialog.class).error("cannot import file at " + path, e); } } else { buf.append("Die Quelldatei ist ungltig. Bitte berprfen Sie diese Datei.\n" + path); } } } if (buf.length() > 0) { MessageDialog.openInformation(getShell(), "Import Ergebnis", buf.toString()); } else { MessageDialog.openWarning(getShell(), "Import Ergebnis", "Import nicht mglich.\nberprfen Sie das Log-File."); } } private void runImport(StringBuffer buf, final List<String> storeIds, final Stock stock, ExcelWrapper xl, boolean overrideStockEntries) { ProgressMonitorDialog progress = new ProgressMonitorDialog(getShell()); try { progress.run(true, true, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { int importCount = 0; int articleNotFoundByGtin = 0; int articleNotFoundInStock = 0; int unexpectedErrors = 0; int lastRow = xl.getLastRow(); int firstRow = xl.getFirstRow() + 1; //header offset monitor.beginTask("Artikel in Lager Import", 100); for (int i = firstRow; i <= lastRow; i++) { Optional<? extends IArticle> opArticle = Optional.empty(); List<String> row = xl.getRow(i); String stockCount = row.get(0); String articleName = row.get(1); String gtin = row.get(6); String stockMin = null; String stockMax = null; if (row.size() > 8) { stockMin = row.get(8); } if (row.size() > 9) { stockMax = row.get(9); } // search for article for (String storeId : storeIds) { opArticle = ArticleServiceHolder.getService(storeId).get().findAnyByGTIN(gtin); } if (opArticle.isPresent()) { // check if article is present in stock IStockEntry stockEntry = CoreHub.getStockService().findStockEntryForArticleInStock( stock, ((Artikel) opArticle.get()).storeToString()); String result = "MODIFY"; if (stockEntry == null) { PersistentObject article = (PersistentObject) opArticle.get(); stockEntry = CoreHub.getStockService().storeArticleInStock(stock, article.storeToString()); result = "ADDITION"; } if (stockEntry instanceof StockEntry) { StockEntry poStockEntry = (StockEntry) stockEntry; if (CoreHub.getLocalLockService().acquireLock(poStockEntry).isOk()) { // do import stockEntry.setCurrentStock(overrideStockEntries ? StringTool.parseSafeInt(stockCount) : (StringTool.parseSafeInt(stockCount) + stockEntry.getCurrentStock())); if (stockMin != null) { stockEntry.setMinimumStock(StringTool.parseSafeInt(stockMin)); } if (stockMax != null) { stockEntry.setMaximumStock(StringTool.parseSafeInt(stockMax)); } importCount++; addToReport("OK " + result + " '" + stock.getLabel() + "'", articleName, gtin); CoreHub.getLocalLockService().releaseLock(poStockEntry); } else { addToReport("NO LOCK", articleName, gtin); unexpectedErrors++; } } else { addToReport("Not in Stock '" + stock.getLabel() + "'", articleName, gtin); articleNotFoundInStock++; } } else { articleNotFoundByGtin++; addToReport("Not found by GTIN", articleName, gtin); } monitor.worked(1); if (monitor.isCanceled()) { buf.append("Der Import wurde durch den Benutzer abgebrochen."); break; } } buf.append(lastRow); buf.append(" Artikel gelesen."); buf.append("\n"); buf.append("\n"); buf.append(importCount); buf.append(" Artikel erfolgreich nach Lager '"); buf.append(stock.getLabel()); buf.append("' importiert."); buf.append("\n"); if (articleNotFoundInStock > 0) { buf.append("\n"); buf.append(articleNotFoundInStock); buf.append(" Artikel nicht im Lager '"); buf.append(stock.getLabel()); buf.append("' vorhanden."); } if (articleNotFoundByGtin > 0) { buf.append("\n"); buf.append(articleNotFoundByGtin); buf.append(" Artikel nicht in der Datenbank gefunden."); } if (unexpectedErrors > 0) { buf.append("\n"); buf.append(unexpectedErrors); buf.append(" Artikel konnten nicht verarbeitet werden."); } } }); } catch (InvocationTargetException | InterruptedException e) { LoggerFactory.getLogger(ImportArticleDialog.class).warn("Exception during article to lager import.", e); } } private void addToReport(String col1, String col2, String col3) { if (reportBuilder != null) { reportBuilder.append(col1); reportBuilder.append(";"); reportBuilder.append(col2); reportBuilder.append(";"); reportBuilder.append(col3); reportBuilder.append("\n"); } } @Override protected void createButtonsForButtonBar(Composite parent) { super.createButtonsForButtonBar(parent); Button okBtn = super.getButton(IDialogConstants.OK_ID); if (okBtn != null) { okBtn.setText("Import"); } Button closeBtn = super.getButton(IDialogConstants.CANCEL_ID); if (closeBtn != null) { closeBtn.setText("Schlieen"); } } }