diff --git a/org.adempiere.report.jasper/src/org/adempiere/report/jasper/JRViewerProviderList.java b/org.adempiere.report.jasper/src/org/adempiere/report/jasper/JRViewerProviderList.java new file mode 100644 index 0000000000..5718a81331 --- /dev/null +++ b/org.adempiere.report.jasper/src/org/adempiere/report/jasper/JRViewerProviderList.java @@ -0,0 +1,11 @@ +package org.adempiere.report.jasper; + +import java.util.List; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperPrint; + +public interface JRViewerProviderList { + + public void openViewer(List jasperPrintList, String title) throws JRException; +} diff --git a/org.adempiere.report.jasper/src/org/adempiere/report/jasper/ReportStarter.java b/org.adempiere.report.jasper/src/org/adempiere/report/jasper/ReportStarter.java index 670166f218..4c4de4e595 100644 --- a/org.adempiere.report.jasper/src/org/adempiere/report/jasper/ReportStarter.java +++ b/org.adempiere.report.jasper/src/org/adempiere/report/jasper/ReportStarter.java @@ -35,6 +35,7 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Properties; @@ -46,6 +47,34 @@ import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.Copies; import javax.print.attribute.standard.JobName; +import org.adempiere.base.Service; +import org.adempiere.exceptions.AdempiereException; +import org.adempiere.exceptions.DBException; +import org.adempiere.util.IProcessUI; +import org.compiere.model.MAttachment; +import org.compiere.model.MAttachmentEntry; +import org.compiere.model.MProcess; +import org.compiere.model.MQuery; +import org.compiere.model.MSysConfig; +import org.compiere.model.MTable; +import org.compiere.model.PrintInfo; +import org.compiere.model.X_AD_PInstance_Para; +import org.compiere.print.MPrintFormat; +import org.compiere.print.PrintUtil; +import org.compiere.print.ServerReportCtl; +import org.compiere.process.ClientProcess; +import org.compiere.process.ProcessCall; +import org.compiere.process.ProcessInfo; +import org.compiere.process.ProcessInfoParameter; +import org.compiere.util.CLogger; +import org.compiere.util.DB; +import org.compiere.util.Env; +import org.compiere.util.Ini; +import org.compiere.util.Language; +import org.compiere.util.Trx; +import org.compiere.util.Util; +import org.compiere.utils.DigestOfFile; + import net.sf.jasperreports.engine.DefaultJasperReportsContext; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRParameter; @@ -87,34 +116,6 @@ import net.sf.jasperreports.export.SimpleWriterExporterOutput; import net.sf.jasperreports.export.SimpleXlsExporterConfiguration; import net.sf.jasperreports.export.SimpleXmlExporterOutput; -import org.adempiere.base.Service; -import org.adempiere.exceptions.AdempiereException; -import org.adempiere.exceptions.DBException; -import org.adempiere.util.IProcessUI; -import org.compiere.model.MAttachment; -import org.compiere.model.MAttachmentEntry; -import org.compiere.model.MProcess; -import org.compiere.model.MQuery; -import org.compiere.model.MSysConfig; -import org.compiere.model.MTable; -import org.compiere.model.PrintInfo; -import org.compiere.model.X_AD_PInstance_Para; -import org.compiere.print.MPrintFormat; -import org.compiere.print.PrintUtil; -import org.compiere.print.ServerReportCtl; -import org.compiere.process.ClientProcess; -import org.compiere.process.ProcessCall; -import org.compiere.process.ProcessInfo; -import org.compiere.process.ProcessInfoParameter; -import org.compiere.util.CLogger; -import org.compiere.util.DB; -import org.compiere.util.Env; -import org.compiere.util.Ini; -import org.compiere.util.Language; -import org.compiere.util.Trx; -import org.compiere.util.Util; -import org.compiere.utils.DigestOfFile; - /** * @author rlemeill * Originally coming from an application note from compiere.co.uk @@ -185,8 +186,7 @@ public class ReportStarter implements ProcessCall, ClientProcess log.warning("404 not found: Report cannot be found on server "+ e.getMessage()); return null; } catch (IOException e) { - log.severe("I/O error when trying to download (sub)report from server "+ e.getMessage()); - return null; + throw new AdempiereException("I/O error when trying to download (sub)report from server "+ e.getLocalizedMessage()); } } @@ -285,8 +285,7 @@ public class ReportStarter implements ProcessCall, ClientProcess } catch (Exception e) { - log.severe("Unknown exception: "+ e.getMessage()); - return null; + throw new AdempiereException("Unknown exception: "+ e.getLocalizedMessage()); } return reportFile; } @@ -311,8 +310,7 @@ public class ReportStarter implements ProcessCall, ClientProcess String hash = new String(baos.toByteArray()); return hash; } catch (IOException e) { - log.severe("I/O error when trying to download (sub)report from server "+ e.getMessage()); - return null; + throw new AdempiereException("I/O error when trying to download (sub)report from server "+ e.getLocalizedMessage()); } } @@ -379,7 +377,12 @@ public class ReportStarter implements ProcessCall, ClientProcess return false; } - String reportPath = reportData.getReportFilePath(); + List jasperPrintList = new ArrayList(); + String reportFilePath = reportData.getReportFilePath(); + String[] reportPathList = reportFilePath.split(";"); + for (int idx = 0; idx < reportPathList.length; idx++) { + + String reportPath = reportPathList[idx]; if (Util.isEmpty(reportPath, true)) { reportResult(AD_PInstance_ID, "Can not find report", trxName); @@ -702,9 +705,20 @@ public class ReportStarter implements ProcessCall, ClientProcess } } } else { - if (log.isLoggable(Level.INFO)) log.info( "ReportStarter.startProcess run report -"+jasperPrint.getName()); - JRViewerProvider viewerLauncher = Service.locator().locate(JRViewerProvider.class).getService(); - viewerLauncher.openViewer(jasperPrint, pi.getTitle()); + if (reportPathList.length == 1) { + if (log.isLoggable(Level.INFO)) log.info( "ReportStarter.startProcess run report -"+jasperPrint.getName()); + JRViewerProvider viewerLauncher = Service.locator().locate(JRViewerProvider.class).getService(); + viewerLauncher.openViewer(jasperPrint, pi.getTitle()); + } else { + jasperPrintList.add(jasperPrint); + if (idx+1 == reportPathList.length) { + JRViewerProviderList viewerLauncher = Service.locator().locate(JRViewerProviderList.class).getService(); + if (viewerLauncher == null) { + throw new AdempiereException("Can not find a viewer provider for multiple jaspers"); + } + viewerLauncher.openViewer(jasperPrintList, pi.getTitle()); + } + } } } else @@ -786,7 +800,7 @@ public class ReportStarter implements ProcessCall, ClientProcess } } } catch (JRException e) { - log.severe("ReportStarter.startProcess: Can not run report - "+ e.getMessage()); + throw new AdempiereException(e.getLocalizedMessage() + (e.getCause() != null ? " -> " + e.getCause().getLocalizedMessage() : "")); } finally { if (conn != null) { try { @@ -797,6 +811,8 @@ public class ReportStarter implements ProcessCall, ClientProcess } } + } // for reportPathList + if (onrows != null && onrows instanceof Integer) { nrows = (Integer) onrows; processInfo.setRowCount(nrows); @@ -1275,7 +1291,6 @@ public class ReportStarter implements ProcessCall, ClientProcess } catch (SQLException e) { -// log.severe("Execption; sql = "+sql+"; e.getMessage() = " +e.getMessage()); throw new DBException(e, sql); } finally @@ -1373,8 +1388,6 @@ public class ReportStarter implements ProcessCall, ClientProcess catch (SQLException e) { throw new DBException(e, sql); -// log.severe("sql = "+sql+"; e.getMessage() = "+ e.getMessage()); -// return null; } finally { diff --git a/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml b/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml index 802836a337..267f7c129a 100644 --- a/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml +++ b/org.adempiere.ui.zk/OSGI-INF/jrviewerprovider.xml @@ -3,5 +3,6 @@ + diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java index 5793692408..e7f6876717 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java @@ -139,7 +139,7 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl previewType.setMold("select"); attachment = null; // Added by Martin Augustine - Ntier software Services 09/10/2013 - if (isCanExport && !isList) { + if (isCanExport) { previewType.appendItem("PDF", "PDF"); previewType.appendItem("HTML", "HTML"); previewType.appendItem("Excel", "XLS"); @@ -318,7 +318,11 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl } else if ("HTML".equals(reportType)) { String path = System.getProperty("java.io.tmpdir"); - String prefix = makePrefix(jasperPrint.getName()); + String prefix = null; + if (isList) + prefix = makePrefix(jasperPrintList.get(0).getName())+"_List"; + else + prefix = makePrefix(jasperPrint.getName()); if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "Path="+path + " Prefix="+prefix); @@ -340,7 +344,11 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl media = new AMedia(m_title, "html", "text/html", file, false); } else if ("XLS".equals(reportType)) { String path = System.getProperty("java.io.tmpdir"); - String prefix = makePrefix(jasperPrint.getName()); + String prefix = null; + if (isList) + prefix = makePrefix(jasperPrintList.get(0).getName())+"_List"; + else + prefix = makePrefix(jasperPrint.getName()); if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "Path="+path + " Prefix="+prefix); @@ -365,7 +373,11 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl }else if ("CSV".equals(reportType)) { String path = System.getProperty("java.io.tmpdir"); - String prefix = makePrefix(jasperPrint.getName()); + String prefix = null; + if (isList) + prefix = makePrefix(jasperPrintList.get(0).getName())+"_List"; + else + prefix = makePrefix(jasperPrint.getName()); if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "Path="+path + " Prefix="+prefix); @@ -385,7 +397,11 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl }else if ("SSV".equals(reportType)) { String path = System.getProperty("java.io.tmpdir"); - String prefix = makePrefix(jasperPrint.getName()); + String prefix = null; + if (isList) + prefix = makePrefix(jasperPrintList.get(0).getName())+"_List"; + else + prefix = makePrefix(jasperPrint.getName()); if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "Path="+path + " Prefix="+prefix); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewerProvider.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewerProvider.java index cbc685323e..61d66795e2 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewerProvider.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewerProvider.java @@ -1,17 +1,18 @@ package org.adempiere.webui.window; -import net.sf.jasperreports.engine.JRException; -import net.sf.jasperreports.engine.JasperPrint; - import java.util.List; import org.adempiere.report.jasper.JRViewerProvider; +import org.adempiere.report.jasper.JRViewerProviderList; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Window; import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.session.SessionManager; -public class ZkJRViewerProvider implements JRViewerProvider { +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperPrint; + +public class ZkJRViewerProvider implements JRViewerProvider, JRViewerProviderList { public void openViewer(final JasperPrint jasperPrint, final String title) throws JRException {