/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cids.utils.jasperreports; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.util.JRLoader; import java.awt.Frame; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import de.cismet.cids.dynamics.CidsBean; import de.cismet.tools.BrowserLauncher; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ public class ReportSwingWorker extends SwingWorker<Boolean, Object> { //~ Static fields/initializers --------------------------------------------- private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ReportSwingWorker.class); private static final String FILE_EXTENSION = ".pdf"; //~ Instance fields -------------------------------------------------------- // private Collection<CidsBean> cidsBeans; // private String compiledReport; private final List<Collection<CidsBean>> cidsBeansList; private final List<String> compiledReportList; private final ReportSwingWorkerDialog dialog; private final boolean withDialog; private String directory; private HashMap parameters = new HashMap(); private String filename = "report"; //~ Constructors ----------------------------------------------------------- /** * Creates a new ReportSwingWorker object. * * @param cidsBeansList map DOCUMENT ME! * @param compiledReportList DOCUMENT ME! * @param directory DOCUMENT ME! */ public ReportSwingWorker(final List<Collection<CidsBean>> cidsBeansList, final List<String> compiledReportList, final String directory) { this(cidsBeansList, compiledReportList, false, null, directory); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeans DOCUMENT ME! * @param compiledReport DOCUMENT ME! * @param directory DOCUMENT ME! */ public ReportSwingWorker(final Collection<CidsBean> cidsBeans, final String compiledReport, final String directory) { this(cidsBeans, compiledReport, false, null, directory); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeansList DOCUMENT ME! * @param compiledReportList DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! */ public ReportSwingWorker(final List<Collection<CidsBean>> cidsBeansList, final List<String> compiledReportList, final Frame parent, final String directory) { this(cidsBeansList, compiledReportList, true, parent, directory); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeans DOCUMENT ME! * @param compiledReport DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! */ public ReportSwingWorker(final Collection<CidsBean> cidsBeans, final String compiledReport, final Frame parent, final String directory) { this(cidsBeans, compiledReport, true, parent, directory); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeansList DOCUMENT ME! * @param compiledReportList DOCUMENT ME! * @param withDialog DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! */ public ReportSwingWorker(final List<Collection<CidsBean>> cidsBeansList, final List<String> compiledReportList, final boolean withDialog, final Frame parent, final String directory) { this(cidsBeansList, compiledReportList, withDialog, parent, directory, new HashMap()); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeans DOCUMENT ME! * @param compiledReport DOCUMENT ME! * @param withDialog DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! */ public ReportSwingWorker(final Collection<CidsBean> cidsBeans, final String compiledReport, final boolean withDialog, final Frame parent, final String directory) { this(cidsBeans, compiledReport, withDialog, parent, directory, new HashMap()); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeansList DOCUMENT ME! * @param compiledReportList DOCUMENT ME! * @param withDialog DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! * @param parameters DOCUMENT ME! */ public ReportSwingWorker(final List<Collection<CidsBean>> cidsBeansList, final List<String> compiledReportList, final boolean withDialog, final Frame parent, final String directory, final HashMap parameters) { this(cidsBeansList, compiledReportList, withDialog, parent, directory, parameters, null); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeans DOCUMENT ME! * @param compiledReport DOCUMENT ME! * @param withDialog DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! * @param parameters DOCUMENT ME! */ public ReportSwingWorker(final Collection<CidsBean> cidsBeans, final String compiledReport, final boolean withDialog, final Frame parent, final String directory, final HashMap parameters) { this(cidsBeans, compiledReport, withDialog, parent, directory, parameters, null); } /** * Creates a new ReportSwingWorker object. * * @param cidsBeansList DOCUMENT ME! * @param compiledReportList DOCUMENT ME! * @param withDialog DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! * @param parameters DOCUMENT ME! * @param reportName The name of the report file without extension */ public ReportSwingWorker(final List<Collection<CidsBean>> cidsBeansList, final List<String> compiledReportList, final boolean withDialog, final Frame parent, final String directory, final HashMap parameters, final String reportName) { this.cidsBeansList = cidsBeansList; this.compiledReportList = compiledReportList; this.withDialog = withDialog; this.directory = directory; this.parameters = parameters; if (withDialog) { dialog = new ReportSwingWorkerDialog(parent, true); } else { dialog = null; } if (reportName != null) { this.filename = reportName; } } /** * Creates a new ReportSwingWorker object. * * @param cidsBeans DOCUMENT ME! * @param compiledReport DOCUMENT ME! * @param withDialog DOCUMENT ME! * @param parent DOCUMENT ME! * @param directory DOCUMENT ME! * @param parameters DOCUMENT ME! * @param reportName The name of the report file without extension */ public ReportSwingWorker(final Collection<CidsBean> cidsBeans, final String compiledReport, final boolean withDialog, final Frame parent, final String directory, final HashMap parameters, final String reportName) { this.cidsBeansList = new ArrayList<Collection<CidsBean>>(); this.cidsBeansList.add(cidsBeans); this.compiledReportList = new ArrayList<String>(); this.compiledReportList.add(compiledReport); this.withDialog = withDialog; this.directory = directory; this.parameters = parameters; if (withDialog) { dialog = new ReportSwingWorkerDialog(parent, true); } else { dialog = null; } if (reportName != null) { this.filename = reportName; } } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ @Override protected Boolean doInBackground() throws Exception { if (withDialog) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { StaticSwingTools.showDialog(dialog); } }); } final ByteArrayOutputStream out = new ByteArrayOutputStream(); FileOutputStream fos = null; try { final List<InputStream> ins = new ArrayList<InputStream>(); for (int index = 0; index < compiledReportList.size(); index++) { final String report = compiledReportList.get(index); final Collection<CidsBean> beans = cidsBeansList.get(index); // report holen final JasperReport jasperReport = (JasperReport)JRLoader.loadObject(ReportSwingWorker.class .getResourceAsStream(report)); // daten vorbereiten final JRDataSource dataSource = new CidsBeanDataSource(beans); // print aus report und daten erzeugen final JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource); // quer- bzw hochformat übernehmen jasperPrint.setOrientation(jasperReport.getOrientationValue()); // zum pdfStream exportieren und der streamliste hinzufügen final ByteArrayOutputStream outTmp = new ByteArrayOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, outTmp); ins.add(new ByteArrayInputStream(outTmp.toByteArray())); outTmp.close(); } // pdfStreams zu einem einzelnen pdfStream zusammenfügen ReportHelper.concatPDFs(ins, out, true); // zusammengefügten pdfStream in Datei schreiben File file = new File(directory, filename + FILE_EXTENSION); int index = 0; while (file.exists()) { file = new File(directory, filename + (++index) + FILE_EXTENSION); } file.getParentFile().mkdirs(); fos = new FileOutputStream(file); fos.write(out.toByteArray()); // Datei über Browser öffnen if (withDialog) { BrowserLauncher.openURL(file.toURI().toURL().toString()); } return true; } catch (IOException ex) { LOG.error("Export to PDF-Stream failed.", ex); } catch (JRException ex) { LOG.error("Export to PDF-Stream failed.", ex); } finally { try { if (out != null) { out.close(); } if (fos != null) { fos.close(); } } catch (IOException ex) { LOG.error("error while closing streams", ex); } } return false; } /** * DOCUMENT ME! */ @Override protected void done() { boolean error = false; try { error = !get(); } catch (InterruptedException ex) { // unterbrochen, nichts tun } catch (ExecutionException ex) { error = true; LOG.error("error while generating report", ex); } if (withDialog) { dialog.setVisible(false); } if (error && withDialog) { JOptionPane.showMessageDialog( dialog.getParent(), "Beim Generieren des Reports ist ein Fehler aufgetreten.", "Fehler!", JOptionPane.ERROR_MESSAGE); } } }