/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.process;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import org.compiere.model.MPInstanceLog;
import org.compiere.model.X_AD_PInstance_Log;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.Util;
/**
* Process Info related Utilities methods
*
* @author Jorg Janke
* @version $Id: ProcessInfoUtil.java,v 1.2 2006/07/30 00:54:44 jjanke Exp $
*/
public class ProcessInfoUtil
{
/** Logger */
private static CLogger s_log = CLogger.getCLogger (ProcessInfoUtil.class);
/**
* Query AD_PInstance for result.
* Fill Summary and success field in ProcessInfo.
* @param pi process info
*/
public static void setSummaryFromDB (ProcessInfo pi)
{
//
int sleepTime = 2000; // 2 secomds
int noRetry = 5; // 10 seconds total
//
String sql = "SELECT Result, ErrorMsg FROM AD_PInstance "
+ "WHERE AD_PInstance_ID=?"
+ " AND Result IS NOT NULL";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql,
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, null);
for (int noTry = 0; noTry < noRetry; noTry++)
{
pstmt.setInt(1, pi.getAD_PInstance_ID());
rs = pstmt.executeQuery();
if (rs.next())
{
// we have a result
int i = rs.getInt(1);
if (i == 1)
{
pi.setSummary(Msg.getMsg(Env.getCtx(), "Success"));
}
else
{
pi.setSummary(Msg.getMsg(Env.getCtx(), "Failure"), true);
}
String Message = rs.getString(2);
//
if (Message != null)
pi.addSummary (" (" + Msg.parseTranslation(Env.getCtx(), Message) + ")");
return;
}
DB.close(rs);
rs = null;
// sleep
try
{
if (s_log.isLoggable(Level.FINE)) s_log.fine("sleeping");
Thread.sleep(sleepTime);
}
catch (InterruptedException ie)
{
s_log.log(Level.SEVERE, "Sleep Thread", ie);
}
}
}
catch (SQLException e)
{
s_log.log(Level.SEVERE, sql, e);
pi.setSummary (e.getLocalizedMessage(), true);
return;
}
finally
{
DB.close(rs,pstmt);
rs = null;pstmt = null;
}
pi.setSummary (Msg.getMsg(Env.getCtx(), "Timeout"), true);
} // setSummaryFromDB
/**
* Set Log of Process from Database (if pi.getLogs is empty)
* @param pi process info
*/
public static void setLogFromDB (ProcessInfo pi)
{
ProcessInfoLog m_logs[] = pi.getLogs();
if (m_logs != null && m_logs.length > 0)
return;
String sql = "SELECT Log_ID, P_ID, P_Date, P_Number, P_Msg, AD_Table_ID,Record_ID "
+ "FROM AD_PInstance_Log "
+ "WHERE AD_PInstance_ID=? "
+ "ORDER BY Log_ID";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, pi.getAD_PInstance_ID());
rs = pstmt.executeQuery();
while (rs.next()){
// int Log_ID, int P_ID, Timestamp P_Date, BigDecimal P_Number, String P_Msg, AD_Table_ID, Record_ID
pi.addLog (rs.getInt(1), rs.getInt(2), rs.getTimestamp(3), rs.getBigDecimal(4), rs.getString(5), rs.getInt(6), rs.getInt(7));
}
}
catch (SQLException e)
{
s_log.log(Level.SEVERE, "setLogFromDB", e);
}
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
} // getLogFromDB
/**
* Save process info logs to DB (AD_PInstance_Log)
* @param pi process info
*/
public static void saveLogToDB (ProcessInfo pi)
{
ProcessInfoLog[] logs = pi.getLogs();
if (logs == null || logs.length == 0)
{
return;
}
if (pi.getAD_PInstance_ID() == 0)
{
return;
}
for (int i = 0; i < logs.length; i++)
{
MPInstanceLog il = new MPInstanceLog(pi.getAD_PInstance_ID(), logs[i].getLog_ID(), logs[i].getP_Date(),
logs[i].getP_ID(), logs[i].getP_Number(), logs[i].getP_Msg(),
logs[i].getAD_Table_ID(), logs[i].getRecord_ID(), logs[i].getJsonData(),
!Util.isEmpty(logs[i].getPInstanceLogType()) ? logs[i].getPInstanceLogType() : X_AD_PInstance_Log.PINSTANCELOGTYPE_Result);
il.save();
}
} // saveLogToDB
/**
* Read process parameters from DB (AD_PInstance_Para)
* @param pi Process Info
*/
public static void setParameterFromDB (ProcessInfo pi)
{
ArrayList list = new ArrayList();
final String sql = "SELECT p.ParameterName," // 1
+ " p.P_String,p.P_String_To, p.P_Number,p.P_Number_To," // 2/3 4/5
+ " p.P_Date,p.P_Date_To, p.Info,p.Info_To, " // 6/7 8/9
+ " i.AD_Client_ID, i.AD_Org_ID, i.AD_User_ID, " // 10..12
+ " p.IsNotClause, p.SeqNo " // 13..14
+ "FROM AD_PInstance_Para p"
+ " INNER JOIN AD_PInstance i ON (p.AD_PInstance_ID=i.AD_PInstance_ID) "
+ "WHERE p.AD_PInstance_ID=? "
+ " UNION " /* Add as null the parameters that were not passed */
+ " SELECT pp.ColumnName, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, i.AD_Client_ID, i.AD_Org_ID, i.AD_User_ID, 'N', pp.SeqNo "
+ " FROM AD_PInstance i "
+ " JOIN AD_Process_Para pp ON (pp.AD_Process_ID=i.AD_Process_ID AND pp.IsActive='Y') "
+ " WHERE i.AD_PInstance_ID=? "
+ " AND pp.ColumnName NOT IN (SELECT ParameterName FROM AD_PInstance_Para p WHERE p.AD_PInstance_ID=?) "
+ "ORDER BY SeqNo";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, pi.getAD_PInstance_ID());
pstmt.setInt(2, pi.getAD_PInstance_ID());
pstmt.setInt(3, pi.getAD_PInstance_ID());
rs = pstmt.executeQuery();
while (rs.next())
{
String ParameterName = rs.getString(1);
// String
Object Parameter = rs.getString(2);
Object Parameter_To = rs.getString(3);
// Big Decimal
if (Parameter == null && Parameter_To == null)
{
Parameter = rs.getBigDecimal(4);
Parameter_To = rs.getBigDecimal(5);
}
// Timestamp
if (Parameter == null && Parameter_To == null)
{
Parameter = rs.getTimestamp(6);
Parameter_To = rs.getTimestamp(7);
}
// Info
String Info = rs.getString(8);
String Info_To = rs.getString(9);
//
boolean isNotClause = "Y".equals(rs.getString(13));
list.add (new ProcessInfoParameter(ParameterName, Parameter, Parameter_To, Info, Info_To, isNotClause));
//
if (pi.getAD_Client_ID() == null)
pi.setAD_Client_ID (rs.getInt(10));
if (pi.getAD_User_ID() == null)
pi.setAD_User_ID(rs.getInt(12));
}
}
catch (SQLException e)
{
s_log.log(Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
//
ProcessInfoParameter[] pars = new ProcessInfoParameter[list.size()];
list.toArray(pars);
pi.setParameter(pars);
} // setParameterFromDB
} // ProcessInfoUtil