org.compiere.wf - Workflow Engine :

* Remove SQL code and Replace for Query
https://sourceforge.net/tracker/?func=detail&atid=879335&aid=2214883&group_id=176962
* use DB.getSQLValue*Ex methods
* add WorkflowTest JUnit Test Case
This commit is contained in:
teo_sarca 2009-04-27 10:07:47 +00:00
parent db6295a9ad
commit c1f7b16c08
10 changed files with 179 additions and 211 deletions

View File

@ -18,7 +18,6 @@ package org.compiere.wf;
import java.io.File;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
@ -26,10 +25,12 @@ import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.logging.Level;
import org.adempiere.exceptions.AdempiereException;
import org.compiere.db.CConnection;
import org.compiere.interfaces.Server;
import org.compiere.model.MAttachment;
@ -49,13 +50,13 @@ import org.compiere.model.MTable;
import org.compiere.model.MUser;
import org.compiere.model.MUserRoles;
import org.compiere.model.PO;
import org.compiere.model.Query;
import org.compiere.model.X_AD_WF_Activity;
import org.compiere.print.ReportEngine;
import org.compiere.process.DocAction;
import org.compiere.process.ProcessInfo;
import org.compiere.process.StateEngine;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Msg;
@ -89,31 +90,19 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
*/
public static MWFActivity[] get (Properties ctx, int AD_Table_ID, int Record_ID, boolean activeOnly)
{
ArrayList<MWFActivity> list = new ArrayList<MWFActivity>();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM AD_WF_Activity WHERE AD_Table_ID=? AND Record_ID=?";
ArrayList<Object> params = new ArrayList<Object>();
StringBuffer whereClause = new StringBuffer("AD_Table_ID=? AND Record_ID=?");
params.add(AD_Table_ID);
params.add(Record_ID);
if (activeOnly)
sql += " AND Processed<>'Y'";
sql += " ORDER BY AD_WF_Activity_ID";
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt (1, AD_Table_ID);
pstmt.setInt (2, Record_ID);
rs = pstmt.executeQuery ();
while (rs.next ())
list.add(new MWFActivity (ctx, rs, null));
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
whereClause.append(" AND Processed<>?");
params.add(true);
}
List<MWFActivity> list = new Query(ctx, Table_Name, whereClause.toString(), null)
.setParameters(params)
.setOrderBy(COLUMNNAME_AD_WF_Activity_ID)
.list();
MWFActivity[] retValue = new MWFActivity[list.size ()];
list.toArray (retValue);
@ -144,9 +133,6 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
return sb.toString();
} // getActivityInfo
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MWFActivity.class);
/**************************************************************************
* Standard Constructor
@ -262,9 +248,12 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
} // getState
/**
* Set Activity State
* @param WFState
* Set Activity State.
* It also validates the new state and if is valid,
* then create event audit and call {@link MWFProcess#checkActivities(String, PO)}
* @param WFState
*/
@Override
public void setWFState (String WFState)
{
if (m_state == null)
@ -297,6 +286,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
Trace.printStack();
setTextMsg(msg);
save();
// TODO: teo_sarca: throw exception ? please analyze the call hierarchy first
}
} // setWFState
@ -446,6 +436,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
* (Re)Set to Not Started
* @param AD_WF_Node_ID now node
*/
@Override
public void setAD_WF_Node_ID (int AD_WF_Node_ID)
{
if (AD_WF_Node_ID == 0)
@ -1088,6 +1079,14 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
}
}
}
else if(resp.isOrganization())
{
throw new AdempiereException("Support not implemented for "+resp);
}
else
{
throw new AdempiereException("@NotSupported@ "+resp);
}
// end MZ
}
if (autoApproval
@ -1216,7 +1215,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
DocAction doc = (DocAction)m_po;
try
{
// Not pproved
// Not approved
if (!"Y".equals(value))
{
newState = StateEngine.STATE_Aborted;

View File

@ -16,15 +16,13 @@
*****************************************************************************/
package org.compiere.wf;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import org.compiere.model.Query;
import org.compiere.model.X_AD_WF_EventAudit;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
/**
@ -68,32 +66,18 @@ public class MWFEventAudit extends X_AD_WF_EventAudit
*/
public static MWFEventAudit[] get (Properties ctx, int AD_WF_Process_ID, int AD_WF_Node_ID, String trxName)
{
ArrayList<MWFEventAudit> list = new ArrayList<MWFEventAudit>();
String sql = "SELECT * FROM AD_WF_EventAudit "
+ "WHERE AD_WF_Process_ID=?";
ArrayList<Object> params = new ArrayList<Object>();
StringBuffer whereClause = new StringBuffer("AD_WF_Process_ID=?");
params.add(AD_WF_Process_ID);
if (AD_WF_Node_ID > 0)
sql += " AND AD_WF_Node_ID=?";
sql += " ORDER BY AD_WF_EventAudit_ID";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, trxName);
pstmt.setInt (1, AD_WF_Process_ID);
if (AD_WF_Node_ID > 0)
pstmt.setInt (2, AD_WF_Node_ID);
rs = pstmt.executeQuery ();
while (rs.next ())
list.add (new MWFEventAudit (ctx, rs, trxName));
}
catch (Exception e)
{
s_log.log(Level.SEVERE, "get", e);
}
finally {
DB.close(rs, pstmt);
rs = null; pstmt = null;
whereClause.append(" AND AD_WF_Node_ID=?");
params.add(AD_WF_Node_ID);
}
List<MWFEventAudit> list = new Query(ctx, Table_Name, whereClause.toString(), trxName)
.setParameters(params)
.setOrderBy(COLUMNNAME_AD_WF_EventAudit_ID)
.list();
//
MWFEventAudit[] retValue = new MWFEventAudit[list.size()];
list.toArray (retValue);
@ -125,10 +109,6 @@ public class MWFEventAudit extends X_AD_WF_EventAudit
} // get
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MWFEventAudit.class);
/**************************************************************************
* Standard Constructor
* @param ctx context

View File

@ -49,7 +49,7 @@ public class MWFNode extends X_AD_WF_Node
/**
*
*/
private static final long serialVersionUID = -7541139807980623316L;
private static final long serialVersionUID = 4330589837679937718L;
/**
@ -533,6 +533,7 @@ public class MWFNode extends X_AD_WF_Node
* @param newRecord new
* @return true if can be saved
*/
@Override
protected boolean beforeSave (boolean newRecord)
{
if(MWorkflow.WORKFLOWTYPE_Manufacturing.equals(getWorkflow().getWorkflowType()))
@ -632,6 +633,7 @@ public class MWFNode extends X_AD_WF_Node
* @param success success
* @return saved
*/
@Override
protected boolean afterSave (boolean newRecord, boolean success)
{
if (!success)
@ -644,6 +646,7 @@ public class MWFNode extends X_AD_WF_Node
* @param success success
* @return deleted
*/
@Override
protected boolean afterDelete (boolean success)
{
return success;

View File

@ -16,16 +16,15 @@
*****************************************************************************/
package org.compiere.wf;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import org.compiere.model.MRefList;
import org.compiere.model.PO;
import org.compiere.model.Query;
import org.compiere.model.X_AD_WF_NodeNext;
import org.compiere.process.DocAction;
import org.compiere.util.DB;
/**
* Workflow Node Next - Transition
@ -128,34 +127,12 @@ public class MWFNodeNext extends X_AD_WF_NodeNext
if (!requery && m_conditions != null)
return m_conditions;
//
ArrayList<MWFNextCondition> list = new ArrayList<MWFNextCondition>();
String sql = "SELECT * FROM AD_WF_NextCondition WHERE AD_WF_NodeNext_ID=? AND IsActive='Y' ORDER BY SeqNo";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, get_TrxName());
pstmt.setInt (1, getAD_WF_NodeNext_ID());
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
list.add(new MWFNextCondition(getCtx(), rs, get_TrxName()));
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
final String whereClause = MWFNextCondition.COLUMNNAME_AD_WF_NodeNext_ID+"=?";
List<MWFNextCondition> list = new Query(getCtx(), MWFNextCondition.Table_Name, whereClause, get_TrxName())
.setParameters(new Object[]{getAD_WF_NodeNext_ID()})
.setOnlyActiveRecords(true)
.setOrderBy(MWFNextCondition.COLUMNNAME_SeqNo)
.list();
m_conditions = new MWFNextCondition[list.size()];
list.toArray (m_conditions);
return m_conditions;

View File

@ -16,16 +16,13 @@
*****************************************************************************/
package org.compiere.wf;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import org.compiere.model.MProcessPara;
import org.compiere.model.Query;
import org.compiere.model.X_AD_WF_Node_Para;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
/**
@ -50,43 +47,15 @@ public class MWFNodePara extends X_AD_WF_Node_Para
*/
public static MWFNodePara[] getParameters (Properties ctx, int AD_WF_Node_ID)
{
ArrayList<MWFNodePara> list = new ArrayList<MWFNodePara>();
String sql = "SELECT * FROM AD_WF_Node_Para "
+ "WHERE AD_WF_Node_ID=?";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt (1, AD_WF_Node_ID);
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
list.add(new MWFNodePara (ctx, rs, null));
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log(Level.SEVERE, "getParameters", e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
List<MWFNodePara> list = new Query(ctx, Table_Name, "AD_WF_Node_ID=?", null)
.setParameters(new Object[]{AD_WF_Node_ID})
.list();
MWFNodePara[] retValue = new MWFNodePara[list.size ()];
list.toArray (retValue);
return retValue;
} // getParameters
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MWFNodePara.class);
/**************************************************************************
* Standard Constructor

View File

@ -16,15 +16,16 @@
*****************************************************************************/
package org.compiere.wf;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import org.compiere.model.MRole;
import org.compiere.model.MTable;
import org.compiere.model.PO;
import org.compiere.model.Query;
import org.compiere.model.X_AD_WF_Process;
import org.compiere.process.DocAction;
import org.compiere.process.ProcessInfo;
@ -167,30 +168,17 @@ public class MWFProcess extends X_AD_WF_Process
if (!requery && m_activities != null)
return m_activities;
//
ArrayList<MWFActivity> list = new ArrayList<MWFActivity>();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM AD_WF_Activity WHERE AD_WF_Process_ID=?";
ArrayList<Object> params = new ArrayList<Object>();
StringBuffer whereClause = new StringBuffer("AD_WF_Process_ID=?");
params.add(getAD_WF_Process_ID());
if (onlyActive)
sql += " AND Processed='N'";
try
{
pstmt = DB.prepareStatement (sql, trxName);
pstmt.setInt (1, getAD_WF_Process_ID());
rs = pstmt.executeQuery ();
while (rs.next ())
list.add (new MWFActivity(getCtx(), rs, trxName));
}
catch (Exception e)
{
log.log(Level.SEVERE, sql, e);
whereClause.append(" AND Processed=?");
params.add(false);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
List<MWFActivity> list = new Query(getCtx(), MWFActivity.Table_Name, whereClause.toString(), trxName)
.setParameters(params)
.list();
m_activities = new MWFActivity[list.size ()];
list.toArray (m_activities);
return m_activities;
@ -392,7 +380,7 @@ public class MWFProcess extends X_AD_WF_Process
*/
public void setAD_WF_Responsible_ID ()
{
int AD_WF_Responsible_ID = DB.getSQLValue(null,
int AD_WF_Responsible_ID = DB.getSQLValueEx(null,
MRole.getDefault(getCtx(), false).addAccessSQL(
"SELECT AD_WF_Responsible_ID FROM AD_WF_Responsible "
+ "WHERE ResponsibleType='H' AND COALESCE(AD_User_ID,0)=0 "

View File

@ -482,7 +482,7 @@ public class MWorkflow extends X_AD_Workflow
}
return null;
} // getNext
/**
* Get (first) Previous Node of ID
* @param AD_WF_Node_ID id
@ -936,7 +936,7 @@ public class MWorkflow extends X_AD_Workflow
int AD_Client_ID = Env.getAD_Client_ID(product.getCtx());
String sql = "SELECT AD_Workflow_ID FROM AD_Workflow "
+" WHERE Value = ? AND AD_Client_ID = ?";
return DB.getSQLValue(null, sql, product.getValue(), AD_Client_ID);
return DB.getSQLValueEx(null, sql, product.getValue(), AD_Client_ID);
}
/**

View File

@ -16,17 +16,15 @@
*****************************************************************************/
package org.compiere.wf;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import org.compiere.model.AdempiereProcessor;
import org.compiere.model.AdempiereProcessorLog;
import org.compiere.model.Query;
import org.compiere.model.X_AD_WorkflowProcessor;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
@ -52,37 +50,15 @@ public class MWorkflowProcessor extends X_AD_WorkflowProcessor
*/
public static MWorkflowProcessor[] getActive (Properties ctx)
{
ArrayList<MWorkflowProcessor> list = new ArrayList<MWorkflowProcessor>();
String sql = "SELECT * FROM AD_WorkflowProcessor WHERE IsActive='Y'";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, null);
rs = pstmt.executeQuery ();
while (rs.next ())
list.add (new MWorkflowProcessor (ctx, rs, null));
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
List<MWorkflowProcessor> list = new Query(ctx, Table_Name, null, null)
.setOnlyActiveRecords(true)
.list();
MWorkflowProcessor[] retValue = new MWorkflowProcessor[list.size ()];
list.toArray (retValue);
return retValue;
} // getActive
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MWorkflowProcessor.class);
/**************************************************************************
* Standard Constructor
* @param ctx context
@ -132,31 +108,10 @@ public class MWorkflowProcessor extends X_AD_WorkflowProcessor
*/
public AdempiereProcessorLog[] getLogs ()
{
ArrayList<MWorkflowProcessorLog> list = new ArrayList<MWorkflowProcessorLog>();
String sql = "SELECT * "
+ "FROM AD_WorkflowProcessorLog "
+ "WHERE AD_WorkflowProcessor_ID=? "
+ "ORDER BY Created DESC";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql, get_TrxName());
pstmt.setInt (1, getAD_WorkflowProcessor_ID());
rs = pstmt.executeQuery ();
while (rs.next ())
list.add (new MWorkflowProcessorLog (getCtx(), rs, get_TrxName()));
}
catch (Exception e)
{
log.log(Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
List<MWorkflowProcessorLog> list = new Query(getCtx(), MWorkflowProcessorLog.Table_Name, "AD_WorkflowProcessor_ID=?", get_TrxName())
.setParameters(new Object[]{getAD_WorkflowProcessor_ID()})
.setOrderBy("Created DESC")
.list();
MWorkflowProcessorLog[] retValue = new MWorkflowProcessorLog[list.size ()];
list.toArray (retValue);
return retValue;

View File

@ -107,7 +107,7 @@ public class WFProcessManage extends SvrProcess
msg += " - " + msg1;
}
//
process.save();
process.saveEx();
return "OK";
} // doIt

View File

@ -0,0 +1,97 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 2008 SC ARHIPAC SERVICE SRL. 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. *
*****************************************************************************/
package test.functional;
import org.compiere.model.MRequisition;
import org.compiere.model.Query;
import org.compiere.util.Env;
import org.compiere.wf.MWFActivity;
import org.compiere.wf.MWFEventAudit;
import org.compiere.wf.MWFNode;
import org.compiere.wf.MWFNodeNext;
import org.compiere.wf.MWFNodePara;
import org.compiere.wf.MWFProcess;
import org.compiere.wf.MWorkflow;
import org.compiere.wf.MWorkflowProcessor;
import test.AdempiereTestCase;
/**
* Test Workflow related classes
* @author Teo Sarca, www.arhipac.ro
*/
public class WorkflowTest extends AdempiereTestCase
{
@Override
protected void setUp() throws Exception
{
super.setUp();
assertEquals("Client is not GardenWorld", 11, Env.getAD_Client_ID(getCtx()));
}
public void testQuery() throws Exception
{
//
// Check MWFActivity
int AD_Table_ID = MRequisition.Table_ID;
int Record_ID = 1; // dummy;
MWFActivity.get(getCtx(), AD_Table_ID, Record_ID, false);
MWFActivity.get(getCtx(), AD_Table_ID, Record_ID, true);
//
// Check MWFEventAudit
int AD_WF_Process_ID = 1; // dummy
int AD_WF_Node_ID = 1; // dummy
MWFEventAudit.get(getCtx(), AD_WF_Process_ID, AD_WF_Node_ID, getTrxName());
MWFEventAudit.get(getCtx(), AD_WF_Process_ID, getTrxName());
//
// Check MWFProcess
MWFProcess proc = new Query(getCtx(), MWFProcess.Table_Name, null, getTrxName())
.setClient_ID()
.setOrderBy(MWFProcess.COLUMNNAME_AD_WF_Process_ID)
.first();
if (proc != null)
{
proc.getActivities(true, false, getTrxName());
proc.getActivities(true, true, getTrxName());
}
else
{
// TODO: check MWFProcess - need better test
}
//
// Check MWorkflow, MWFNode, MWFNodeNext etc
int AD_Client_ID = getAD_Client_ID();
int AD_Workflow_ID = 115; // Process_Requisition
MWorkflow wf = MWorkflow.get(getCtx(), AD_Workflow_ID);
for (MWFNode node : wf.getNodes(false, AD_Client_ID))
{
MWFNodePara.getParameters(node.getCtx(), node.getAD_WF_Node_ID());
for (MWFNodeNext next : node.getTransitions(AD_Client_ID))
{
next.getConditions(true);
next.getConditions(false);
}
}
//
// Check MWorkflowProcessor
for (MWorkflowProcessor processor : MWorkflowProcessor.getActive(getCtx()))
{
processor.getLogs();
}
//
//
}
}