diff --git a/JasperReports/src/org/compiere/report/ReportStarter.java b/JasperReports/src/org/compiere/report/ReportStarter.java index ea6e7e1b67..58b2216ad6 100644 --- a/JasperReports/src/org/compiere/report/ReportStarter.java +++ b/JasperReports/src/org/compiere/report/ReportStarter.java @@ -21,6 +21,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Serializable; import java.math.BigDecimal; import java.net.InetAddress; import java.net.MalformedURLException; @@ -32,7 +33,6 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; @@ -40,6 +40,7 @@ import java.util.Hashtable; import java.util.Map; import java.util.Properties; import java.util.PropertyResourceBundle; +import java.util.logging.Level; import javax.naming.InitialContext; import javax.naming.NamingException; @@ -53,11 +54,13 @@ import net.sf.jasperreports.engine.JasperPrintManager; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.util.JRLoader; +import org.adempiere.exceptions.DBException; import org.compiere.db.CConnection; import org.compiere.interfaces.MD5; import org.compiere.model.MAttachment; import org.compiere.model.MAttachmentEntry; import org.compiere.model.MProcess; +import org.compiere.model.X_AD_PInstance_Para; import org.compiere.process.ClientProcess; import org.compiere.process.ProcessCall; import org.compiere.process.ProcessInfo; @@ -68,7 +71,7 @@ import org.compiere.util.Env; import org.compiere.util.Ini; import org.compiere.util.Language; import org.compiere.util.Trx; -import org.compiere.utils.DBUtils; +import org.compiere.util.Util; import org.compiere.utils.DigestOfFile; /** @@ -80,9 +83,12 @@ import org.compiere.utils.DigestOfFile; * @author Ashley Ramdass * @author victor.perez@e-evolution.com * @see FR 1906632 http://sourceforge.net/tracker/?func=detail&atid=879335&aid=1906632&group_id=176962 + * @author Teo Sarca, SC ARHIPAC SERVICE SRL + *
  • FR [ 2581145 ] Jasper: Provide parameters info */ -public class ReportStarter implements ProcessCall, ClientProcess { -//logger +public class ReportStarter implements ProcessCall, ClientProcess +{ + /** Logger */ private static CLogger log = CLogger.getCLogger(ReportStarter.class); private static File REPORT_HOME = null; @@ -348,13 +354,13 @@ public class ReportStarter implements ProcessCall, ClientProcess { * It should only return false, if the function could not be performed * as this causes the process to abort. * @author rlemeill - * @param ctx context - * @param pi Compiere standard process info + * @param ctx context + * @param pi standard process info * @param trx * @return true if success */ - public boolean startProcess(Properties ctx, ProcessInfo pi, Trx trx) { - + public boolean startProcess(Properties ctx, ProcessInfo pi, Trx trx) + { processInfo = pi; String Name=pi.getTitle(); int AD_PInstance_ID=pi.getAD_PInstance_ID(); @@ -364,15 +370,16 @@ public class ReportStarter implements ProcessCall, ClientProcess { if (trx != null) { trxName = trx.getTrxName(); } - ReportData reportData = getReportData( pi, trxName); - if (reportData==null) { - reportResult( AD_PInstance_ID, "Can not find report data", trxName); + ReportData reportData = getReportData(pi, trxName); + if (reportData == null) { + reportResult(AD_PInstance_ID, "Can not find report data", trxName); return false; } String reportPath = reportData.getReportFilePath(); - if ((reportPath==null)||(reportPath.length()==0)) { - reportResult( AD_PInstance_ID, "Can not find report", trxName); + if (Util.isEmpty(reportPath, true)) + { + reportResult(AD_PInstance_ID, "Can not find report", trxName); return false; } @@ -381,19 +388,18 @@ public class ReportStarter implements ProcessCall, ClientProcess { String fileExtension = ""; HashMap params = new HashMap(); - addProcessParameters( AD_PInstance_ID, params, trxName); - + addProcessParameters(AD_PInstance_ID, params, trxName); addProcessInfoParameters(params, pi.getParameter()); reportFile = getReportFile(reportPath, (String)params.get("ReportType")); - if (reportFile == null || reportFile.exists() == false) { log.severe("No report file found for given type, falling back to " + reportPath); reportFile = getReportFile(reportPath); } - if (reportFile == null || reportFile.exists() == false) { + if (reportFile == null || reportFile.exists() == false) + { String tmp = "Can not find report file at path - " + reportPath; log.severe(tmp); reportResult(AD_PInstance_ID, tmp, trxName); @@ -658,7 +664,8 @@ public class ReportStarter implements ProcessCall, ClientProcess { * @param reportPath * @return the abstract file corresponding to report */ - protected File getReportFile(String reportPath) { + protected File getReportFile(String reportPath) + { File reportFile = null; // Reports deployment on web server Thanks to Alin Vaida @@ -688,7 +695,10 @@ public class ReportStarter implements ProcessCall, ClientProcess { } // Set org.compiere.report.path because it is used in reports which refer to subreports - System.setProperty("org.compiere.report.path", reportFile.getParentFile().getAbsolutePath()); + if (reportFile != null) + { + System.setProperty("org.compiere.report.path", reportFile.getParentFile().getAbsolutePath()); + } return reportFile; } @@ -779,25 +789,17 @@ public class ReportStarter implements ProcessCall, ClientProcess { } /** + * Update AD_PInstance result and error message * @author rlemeill * @param AD_PInstance_ID - * @param errMsg + * @param errMsg error message or null if there is no error */ - protected void reportResult( int AD_PInstance_ID, String errMsg, String trxName) { - int result = (errMsg==null)?1:0; - errMsg = (errMsg==null)?"":errMsg; - String sql = "UPDATE AD_PInstance SET result="+result+", errormsg='"+errMsg+"' "+ - "WHERE AD_PInstance_ID="+AD_PInstance_ID; - Statement pstmt = null; - try { - pstmt = DB.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE, trxName); - pstmt.executeUpdate(sql); - pstmt.close(); - } catch (SQLException e) { - log.severe(sql+e.getMessage()); - } finally { - DBUtils.close( pstmt); - } + protected void reportResult(int AD_PInstance_ID, String errMsg, String trxName) + { + int result = (errMsg == null ? 1 : 0); + String sql = "UPDATE AD_PInstance SET Result=?, ErrorMsg=?" + +" WHERE AD_PInstance_ID="+AD_PInstance_ID; + DB.executeUpdateEx(sql, new Object[]{result, errMsg}, trxName); } /** @@ -835,30 +837,38 @@ public class ReportStarter implements ProcessCall, ClientProcess { return new JasperData( jasperReport, reportDir, jasperName, jasperFile); } - - protected void addProcessParameters( int AD_PInstance_ID, Map params, String trxName) { - log.info(""); - String sql = "SELECT ParameterName, "+ - "P_String, "+ - "P_String_To, "+ - "P_Number, "+ - "P_Number_To, "+ - "P_Date, "+ - "P_Date_To "+ - "FROM AD_PInstance_Para "+ - "WHERE AD_PInstance_ID=?"; + /** + * Load Process Parameters into given params map + * @param AD_PInstance_ID + * @param params + * @param trxName + */ + private static void addProcessParameters(int AD_PInstance_ID, Map params, String trxName) + { + final String sql = "SELECT " + +" "+X_AD_PInstance_Para.COLUMNNAME_ParameterName + +","+X_AD_PInstance_Para.COLUMNNAME_P_String + +","+X_AD_PInstance_Para.COLUMNNAME_P_String_To + +","+X_AD_PInstance_Para.COLUMNNAME_P_Number + +","+X_AD_PInstance_Para.COLUMNNAME_P_Number_To + +","+X_AD_PInstance_Para.COLUMNNAME_P_Date + +","+X_AD_PInstance_Para.COLUMNNAME_P_Date_To + +","+X_AD_PInstance_Para.COLUMNNAME_Info + +","+X_AD_PInstance_Para.COLUMNNAME_Info_To + +" FROM "+X_AD_PInstance_Para.Table_Name + +" WHERE "+X_AD_PInstance_Para.COLUMNNAME_AD_PInstance_ID+"=?"; PreparedStatement pstmt = null; ResultSet rs = null; - try { + try + { pstmt = DB.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, trxName); pstmt.setInt(1, AD_PInstance_ID); rs = pstmt.executeQuery(); - while (rs.next()) { + while (rs.next()) + { String name = rs.getString(1); String pStr = rs.getString(2); String pStrTo = rs.getString(3); - //Double pNum = new Double( rs.getDouble(4)); - //Double pNumTo = new Double( rs.getDouble(5)); BigDecimal pNum = rs.getBigDecimal(4); BigDecimal pNumTo = rs.getBigDecimal(5); @@ -879,23 +889,35 @@ public class ReportStarter implements ProcessCall, ClientProcess { params.put( name, pDate); } } else if (pNum != null) { - if (rs.getBigDecimal(5)!=null) { + if (pNumTo!=null) { params.put( name+"1", pNum); params.put( name+"2", pNumTo); } else { params.put( name, pNum); } } + // + // Add parameter info - teo_sarca FR [ 2581145 ] + String info = rs.getString(8); + String infoTo = rs.getString(9); + params.put(name+"_Info1", (info != null ? info : "")); + params.put(name+"_Info2", (infoTo != null ? infoTo : "")); } - } catch (SQLException e) { - log.severe("Execption; sql = "+sql+"; e.getMessage() = " +e.getMessage()); - } finally { - DBUtils.close( rs); - DBUtils.close( pstmt); + } + catch (SQLException e) + { +// log.severe("Execption; sql = "+sql+"; e.getMessage() = " +e.getMessage()); + throw new DBException(e, sql); + } + finally + { + DB.close(rs, pstmt); + rs = null; pstmt = null; } } - private void addProcessInfoParameters(Map params, ProcessInfoParameter[] para) { + private void addProcessInfoParameters(Map params, ProcessInfoParameter[] para) + { if (para != null) { for (int i = 0; i < para.length; i++) { if (para[i].getParameter_To() == null) { @@ -981,7 +1003,8 @@ public class ReportStarter implements ProcessCall, ClientProcess { * @param jasperFile * @return compiled JasperReport */ - private JasperReport compileReport( File reportFile, File jasperFile) { + private JasperReport compileReport( File reportFile, File jasperFile) + { JWScorrectClassPath(); JasperReport compiledJasperReport = null; try { @@ -989,7 +1012,7 @@ public class ReportStarter implements ProcessCall, ClientProcess { jasperFile.setLastModified( reportFile.lastModified()); //Synchronize Dates compiledJasperReport = (JasperReport)JRLoader.loadObject(jasperFile); } catch (JRException e) { - log.severe("JRException; e.getMessage()= "+ e.getMessage()); + log.log(Level.SEVERE, "Error", e); } return compiledJasperReport; } @@ -997,9 +1020,10 @@ public class ReportStarter implements ProcessCall, ClientProcess { /** * @author rlemeill * @param ProcessInfo - * @return ReportData + * @return ReportData or null if no data found */ - public ReportData getReportData( ProcessInfo pi, String trxName) { + public ReportData getReportData (ProcessInfo pi, String trxName) + { log.info(""); String sql = "SELECT pr.JasperReport, pr.IsDirectPrint " + "FROM AD_Process pr, AD_PInstance pi " @@ -1007,7 +1031,8 @@ public class ReportStarter implements ProcessCall, ClientProcess { + " AND pi.AD_PInstance_ID=?"; PreparedStatement pstmt = null; ResultSet rs = null; - try { + try + { pstmt = DB.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, trxName); pstmt.setInt(1, pi.getAD_PInstance_ID()); rs = pstmt.executeQuery(); @@ -1026,12 +1051,17 @@ public class ReportStarter implements ProcessCall, ClientProcess { } return new ReportData( path, directPrint); - } catch (SQLException e) { - log.severe("sql = "+sql+"; e.getMessage() = "+ e.getMessage()); - return null; - } finally { - DBUtils.close( rs); - DBUtils.close( pstmt); + } + catch (SQLException e) + { + throw new DBException(e, sql); +// log.severe("sql = "+sql+"; e.getMessage() = "+ e.getMessage()); +// return null; + } + finally + { + DB.close(rs, pstmt); + rs = null; pstmt = null; } } @@ -1071,8 +1101,14 @@ public class ReportStarter implements ProcessCall, ClientProcess { } } - class JasperData { - private JasperReport jasperReport; + public static class JasperData + implements Serializable + { + /** + * + */ + private static final long serialVersionUID = 4375195020654531202L; + private JasperReport jasperReport; private File reportDir; private String jasperName; private File jasperFile; diff --git a/JasperReports/src/org/compiere/utils/DBUtils.java b/JasperReports/src/org/compiere/utils/DBUtils.java index 8f5f5bd317..cf433e492d 100644 --- a/JasperReports/src/org/compiere/utils/DBUtils.java +++ b/JasperReports/src/org/compiere/utils/DBUtils.java @@ -14,6 +14,10 @@ import java.sql.Types; import org.compiere.util.CLogger; import org.compiere.util.DB; +/** + * + * @deprecated please use {@link DB} class instead + */ public class DBUtils { static { try {