Java tutorial
/******************************************************************************* * Copyright (c) 2009, SGAM Informatics 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.icpc.fire.handlers; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.math.BigInteger; import java.util.List; import java.util.Optional; import javax.xml.datatype.DatatypeConfigurationException; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.ui.handlers.HandlerUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.Hub; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.Mandant; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.elexis.data.Sticker; import ch.elexis.icpc.fire.model.Report; import ch.elexis.icpc.fire.model.ReportBuilder; import ch.elexis.icpc.fire.model.XmlUtil; import ch.rgw.tools.TimeTool; /** * Our sample handler extends AbstractHandler, an IHandler base class. * * @see org.eclipse.core.commands.IHandler * @see org.eclipse.core.commands.AbstractHandler */ public class ExportFireHandler extends AbstractHandler { private static Logger logger = LoggerFactory.getLogger(ExportFireHandler.class); public static final String FIRESTICKERNAME = "Fire (ICPC)"; private static final String CFGPARAM = "ICPC_FIRE_LAST_UPLOAD"; private Sticker fireSticker; public ExportFireHandler() { String id = new Query<Sticker>(Sticker.class).findSingle(Sticker.FLD_NAME, Query.EQUALS, FIRESTICKERNAME); if (id == null) { fireSticker = new Sticker(FIRESTICKERNAME, "0066CC", "C0C0C0"); } else { fireSticker = Sticker.load(id); } } /** * the command has been executed, so extract extract the needed information from the application * context. */ public Object execute(ExecutionEvent event) throws ExecutionException { String lastupdate = CoreHub.globalCfg.get(CFGPARAM, null); if (lastupdate == null) { lastupdate = "20090101"; } Query<Konsultation> qbe = new Query<Konsultation>(Konsultation.class); TimeTool ttFrom = new TimeTool(lastupdate); ttFrom.addHours(Report.EXPORT_DELAY * -1); qbe.add(Konsultation.DATE, Query.GREATER, ttFrom.toString(TimeTool.DATE_COMPACT)); TimeTool ttTo = new TimeTool(); ttTo.addHours(Report.EXPORT_DELAY * -1); qbe.add(Konsultation.DATE, Query.LESS_OR_EQUAL, ttTo.toString(TimeTool.DATE_COMPACT)); List<Konsultation> konsen = qbe.execute(); if (konsen.size() > 0) { FileDialog fd = new FileDialog(Hub.getActiveShell(), SWT.SAVE); fd.setFileName("elexis-fire" + new TimeTool().toString(TimeTool.DATE_COMPACT) + ".xml"); fd.setFilterExtensions(new String[] { "xml" }); fd.setFilterNames(new String[] { "XML-Dateien" }); String expath = fd.open(); if (expath != null) { ProgressMonitorDialog progress = new ProgressMonitorDialog(HandlerUtil.getActiveShell(event)); try { progress.run(true, true, new ReportExportRunnable(konsen, expath)); } catch (InvocationTargetException | InterruptedException e) { logger.warn("Exception during FIRE export", e); } } } return null; } private class ReportExportRunnable implements IRunnableWithProgress { private List<Konsultation> consultations; private String exportPath; public ReportExportRunnable(List<Konsultation> konsen, String expath) { this.consultations = konsen; this.exportPath = expath; } @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { monitor.beginTask("FIRE Export ", consultations.size()); int counter = 0; ReportBuilder reportBuilder = new ReportBuilder(); if (reportBuilder.isValidConfig()) { for (Konsultation konsultation : consultations) { if (monitor.isCanceled()) { return; } monitor.setTaskName("FIRE exporting (" + ++counter + "/" + consultations.size() + ")"); // validate Fall fall = konsultation.getFall(); if (fall == null) { continue; } Patient pat = fall.getPatient(); if (pat == null) { continue; } Mandant mandant = konsultation.getMandant(); if (mandant == null) { continue; } // konsultation.removeSticker(fireSticker); if (!konsultation.getStickers().contains(fireSticker)) { try { // add to report BigInteger patId = reportBuilder.addPatient(pat); BigInteger docId = reportBuilder.addMandant(mandant); reportBuilder.addKonsultation(patId, docId, konsultation); konsultation.addSticker(fireSticker); } catch (IllegalStateException e) { logger.warn("Could not add consultation.", e); } } monitor.worked(1); } Optional<Report> report = reportBuilder.build(); if (report.isPresent()) { try (FileOutputStream fout = new FileOutputStream(new File(exportPath))) { XmlUtil.marshallFireReport(report.get(), fout); // update last export date CoreHub.globalCfg.set(CFGPARAM, new TimeTool().toString(TimeTool.DATE_COMPACT)); } catch (IOException e) { openError("Error", "Error writing report, see logs for details."); logger.error("Error writing report.", e); } } } else { openError("ICPC/Fire", "Bitte konfigurieren Sie das Fire Plugin (Datei-Einstellungen)"); } } catch (DatatypeConfigurationException | NumberFormatException e) { openError("Error", "Error creating report, see logs for details."); logger.error("Could not create XML output", e); } } private void openError(String title, String description) { Display display = Display.getDefault(); if (display != null) { display.syncExec(new Runnable() { @Override public void run() { MessageDialog.openError(display.getActiveShell(), title, description); } }); } } } }