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:
parent
db6295a9ad
commit
c1f7b16c08
|
@ -18,7 +18,6 @@ package org.compiere.wf;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Savepoint;
|
import java.sql.Savepoint;
|
||||||
|
@ -26,10 +25,12 @@ import java.sql.Timestamp;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.adempiere.exceptions.AdempiereException;
|
||||||
import org.compiere.db.CConnection;
|
import org.compiere.db.CConnection;
|
||||||
import org.compiere.interfaces.Server;
|
import org.compiere.interfaces.Server;
|
||||||
import org.compiere.model.MAttachment;
|
import org.compiere.model.MAttachment;
|
||||||
|
@ -49,13 +50,13 @@ import org.compiere.model.MTable;
|
||||||
import org.compiere.model.MUser;
|
import org.compiere.model.MUser;
|
||||||
import org.compiere.model.MUserRoles;
|
import org.compiere.model.MUserRoles;
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.Query;
|
||||||
import org.compiere.model.X_AD_WF_Activity;
|
import org.compiere.model.X_AD_WF_Activity;
|
||||||
import org.compiere.print.ReportEngine;
|
import org.compiere.print.ReportEngine;
|
||||||
import org.compiere.process.DocAction;
|
import org.compiere.process.DocAction;
|
||||||
import org.compiere.process.ProcessInfo;
|
import org.compiere.process.ProcessInfo;
|
||||||
import org.compiere.process.StateEngine;
|
import org.compiere.process.StateEngine;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.compiere.util.DB;
|
|
||||||
import org.compiere.util.DisplayType;
|
import org.compiere.util.DisplayType;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.compiere.util.Msg;
|
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)
|
public static MWFActivity[] get (Properties ctx, int AD_Table_ID, int Record_ID, boolean activeOnly)
|
||||||
{
|
{
|
||||||
ArrayList<MWFActivity> list = new ArrayList<MWFActivity>();
|
ArrayList<Object> params = new ArrayList<Object>();
|
||||||
PreparedStatement pstmt = null;
|
StringBuffer whereClause = new StringBuffer("AD_Table_ID=? AND Record_ID=?");
|
||||||
ResultSet rs = null;
|
params.add(AD_Table_ID);
|
||||||
String sql = "SELECT * FROM AD_WF_Activity WHERE AD_Table_ID=? AND Record_ID=?";
|
params.add(Record_ID);
|
||||||
if (activeOnly)
|
if (activeOnly)
|
||||||
sql += " AND Processed<>'Y'";
|
|
||||||
sql += " ORDER BY AD_WF_Activity_ID";
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
pstmt = DB.prepareStatement (sql, null);
|
whereClause.append(" AND Processed<>?");
|
||||||
pstmt.setInt (1, AD_Table_ID);
|
params.add(true);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
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 ()];
|
MWFActivity[] retValue = new MWFActivity[list.size ()];
|
||||||
list.toArray (retValue);
|
list.toArray (retValue);
|
||||||
|
@ -144,9 +133,6 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
} // getActivityInfo
|
} // getActivityInfo
|
||||||
|
|
||||||
/** Static Logger */
|
|
||||||
private static CLogger s_log = CLogger.getCLogger (MWFActivity.class);
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Standard Constructor
|
* Standard Constructor
|
||||||
|
@ -262,9 +248,12 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
|
||||||
} // getState
|
} // getState
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set Activity State
|
* Set Activity State.
|
||||||
* @param WFState
|
* 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)
|
public void setWFState (String WFState)
|
||||||
{
|
{
|
||||||
if (m_state == null)
|
if (m_state == null)
|
||||||
|
@ -297,6 +286,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
|
||||||
Trace.printStack();
|
Trace.printStack();
|
||||||
setTextMsg(msg);
|
setTextMsg(msg);
|
||||||
save();
|
save();
|
||||||
|
// TODO: teo_sarca: throw exception ? please analyze the call hierarchy first
|
||||||
}
|
}
|
||||||
} // setWFState
|
} // setWFState
|
||||||
|
|
||||||
|
@ -446,6 +436,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
|
||||||
* (Re)Set to Not Started
|
* (Re)Set to Not Started
|
||||||
* @param AD_WF_Node_ID now node
|
* @param AD_WF_Node_ID now node
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setAD_WF_Node_ID (int AD_WF_Node_ID)
|
public void setAD_WF_Node_ID (int AD_WF_Node_ID)
|
||||||
{
|
{
|
||||||
if (AD_WF_Node_ID == 0)
|
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
|
// end MZ
|
||||||
}
|
}
|
||||||
if (autoApproval
|
if (autoApproval
|
||||||
|
@ -1216,7 +1215,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
|
||||||
DocAction doc = (DocAction)m_po;
|
DocAction doc = (DocAction)m_po;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Not pproved
|
// Not approved
|
||||||
if (!"Y".equals(value))
|
if (!"Y".equals(value))
|
||||||
{
|
{
|
||||||
newState = StateEngine.STATE_Aborted;
|
newState = StateEngine.STATE_Aborted;
|
||||||
|
|
|
@ -16,15 +16,13 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.wf;
|
package org.compiere.wf;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
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.model.X_AD_WF_EventAudit;
|
||||||
import org.compiere.util.CLogger;
|
|
||||||
import org.compiere.util.DB;
|
|
||||||
import org.compiere.util.Env;
|
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)
|
public static MWFEventAudit[] get (Properties ctx, int AD_WF_Process_ID, int AD_WF_Node_ID, String trxName)
|
||||||
{
|
{
|
||||||
ArrayList<MWFEventAudit> list = new ArrayList<MWFEventAudit>();
|
ArrayList<Object> params = new ArrayList<Object>();
|
||||||
String sql = "SELECT * FROM AD_WF_EventAudit "
|
StringBuffer whereClause = new StringBuffer("AD_WF_Process_ID=?");
|
||||||
+ "WHERE AD_WF_Process_ID=?";
|
params.add(AD_WF_Process_ID);
|
||||||
if (AD_WF_Node_ID > 0)
|
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);
|
whereClause.append(" AND AD_WF_Node_ID=?");
|
||||||
pstmt.setInt (1, AD_WF_Process_ID);
|
params.add(AD_WF_Node_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;
|
|
||||||
}
|
}
|
||||||
|
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()];
|
MWFEventAudit[] retValue = new MWFEventAudit[list.size()];
|
||||||
list.toArray (retValue);
|
list.toArray (retValue);
|
||||||
|
@ -125,10 +109,6 @@ public class MWFEventAudit extends X_AD_WF_EventAudit
|
||||||
} // get
|
} // get
|
||||||
|
|
||||||
|
|
||||||
/** Static Logger */
|
|
||||||
private static CLogger s_log = CLogger.getCLogger (MWFEventAudit.class);
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Standard Constructor
|
* Standard Constructor
|
||||||
* @param ctx context
|
* @param ctx context
|
||||||
|
|
|
@ -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
|
* @param newRecord new
|
||||||
* @return true if can be saved
|
* @return true if can be saved
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
protected boolean beforeSave (boolean newRecord)
|
protected boolean beforeSave (boolean newRecord)
|
||||||
{
|
{
|
||||||
if(MWorkflow.WORKFLOWTYPE_Manufacturing.equals(getWorkflow().getWorkflowType()))
|
if(MWorkflow.WORKFLOWTYPE_Manufacturing.equals(getWorkflow().getWorkflowType()))
|
||||||
|
@ -632,6 +633,7 @@ public class MWFNode extends X_AD_WF_Node
|
||||||
* @param success success
|
* @param success success
|
||||||
* @return saved
|
* @return saved
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
protected boolean afterSave (boolean newRecord, boolean success)
|
protected boolean afterSave (boolean newRecord, boolean success)
|
||||||
{
|
{
|
||||||
if (!success)
|
if (!success)
|
||||||
|
@ -644,6 +646,7 @@ public class MWFNode extends X_AD_WF_Node
|
||||||
* @param success success
|
* @param success success
|
||||||
* @return deleted
|
* @return deleted
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
protected boolean afterDelete (boolean success)
|
protected boolean afterDelete (boolean success)
|
||||||
{
|
{
|
||||||
return success;
|
return success;
|
||||||
|
|
|
@ -16,16 +16,15 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.wf;
|
package org.compiere.wf;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.ArrayList;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
|
import org.compiere.model.MRefList;
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.Query;
|
||||||
import org.compiere.model.X_AD_WF_NodeNext;
|
import org.compiere.model.X_AD_WF_NodeNext;
|
||||||
import org.compiere.process.DocAction;
|
import org.compiere.process.DocAction;
|
||||||
import org.compiere.util.DB;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Workflow Node Next - Transition
|
* Workflow Node Next - Transition
|
||||||
|
@ -128,34 +127,12 @@ public class MWFNodeNext extends X_AD_WF_NodeNext
|
||||||
if (!requery && m_conditions != null)
|
if (!requery && m_conditions != null)
|
||||||
return m_conditions;
|
return m_conditions;
|
||||||
//
|
//
|
||||||
ArrayList<MWFNextCondition> list = new ArrayList<MWFNextCondition>();
|
final String whereClause = MWFNextCondition.COLUMNNAME_AD_WF_NodeNext_ID+"=?";
|
||||||
String sql = "SELECT * FROM AD_WF_NextCondition WHERE AD_WF_NodeNext_ID=? AND IsActive='Y' ORDER BY SeqNo";
|
List<MWFNextCondition> list = new Query(getCtx(), MWFNextCondition.Table_Name, whereClause, get_TrxName())
|
||||||
PreparedStatement pstmt = null;
|
.setParameters(new Object[]{getAD_WF_NodeNext_ID()})
|
||||||
try
|
.setOnlyActiveRecords(true)
|
||||||
{
|
.setOrderBy(MWFNextCondition.COLUMNNAME_SeqNo)
|
||||||
pstmt = DB.prepareStatement (sql, get_TrxName());
|
.list();
|
||||||
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;
|
|
||||||
}
|
|
||||||
m_conditions = new MWFNextCondition[list.size()];
|
m_conditions = new MWFNextCondition[list.size()];
|
||||||
list.toArray (m_conditions);
|
list.toArray (m_conditions);
|
||||||
return m_conditions;
|
return m_conditions;
|
||||||
|
|
|
@ -16,16 +16,13 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.wf;
|
package org.compiere.wf;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.ArrayList;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import org.compiere.model.MProcessPara;
|
import org.compiere.model.MProcessPara;
|
||||||
|
import org.compiere.model.Query;
|
||||||
import org.compiere.model.X_AD_WF_Node_Para;
|
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)
|
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 "
|
List<MWFNodePara> list = new Query(ctx, Table_Name, "AD_WF_Node_ID=?", null)
|
||||||
+ "WHERE AD_WF_Node_ID=?";
|
.setParameters(new Object[]{AD_WF_Node_ID})
|
||||||
PreparedStatement pstmt = null;
|
.list();
|
||||||
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;
|
|
||||||
}
|
|
||||||
MWFNodePara[] retValue = new MWFNodePara[list.size ()];
|
MWFNodePara[] retValue = new MWFNodePara[list.size ()];
|
||||||
list.toArray (retValue);
|
list.toArray (retValue);
|
||||||
return retValue;
|
return retValue;
|
||||||
} // getParameters
|
} // getParameters
|
||||||
|
|
||||||
/** Static Logger */
|
|
||||||
private static CLogger s_log = CLogger.getCLogger (MWFNodePara.class);
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Standard Constructor
|
* Standard Constructor
|
||||||
|
|
|
@ -16,15 +16,16 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.wf;
|
package org.compiere.wf;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.compiere.model.MRole;
|
import org.compiere.model.MRole;
|
||||||
import org.compiere.model.MTable;
|
import org.compiere.model.MTable;
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.Query;
|
||||||
import org.compiere.model.X_AD_WF_Process;
|
import org.compiere.model.X_AD_WF_Process;
|
||||||
import org.compiere.process.DocAction;
|
import org.compiere.process.DocAction;
|
||||||
import org.compiere.process.ProcessInfo;
|
import org.compiere.process.ProcessInfo;
|
||||||
|
@ -167,30 +168,17 @@ public class MWFProcess extends X_AD_WF_Process
|
||||||
if (!requery && m_activities != null)
|
if (!requery && m_activities != null)
|
||||||
return m_activities;
|
return m_activities;
|
||||||
//
|
//
|
||||||
ArrayList<MWFActivity> list = new ArrayList<MWFActivity>();
|
ArrayList<Object> params = new ArrayList<Object>();
|
||||||
PreparedStatement pstmt = null;
|
StringBuffer whereClause = new StringBuffer("AD_WF_Process_ID=?");
|
||||||
ResultSet rs = null;
|
params.add(getAD_WF_Process_ID());
|
||||||
String sql = "SELECT * FROM AD_WF_Activity WHERE AD_WF_Process_ID=?";
|
|
||||||
if (onlyActive)
|
if (onlyActive)
|
||||||
sql += " AND Processed='N'";
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
pstmt = DB.prepareStatement (sql, trxName);
|
whereClause.append(" AND Processed=?");
|
||||||
pstmt.setInt (1, getAD_WF_Process_ID());
|
params.add(false);
|
||||||
rs = pstmt.executeQuery ();
|
|
||||||
while (rs.next ())
|
|
||||||
list.add (new MWFActivity(getCtx(), rs, trxName));
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
log.log(Level.SEVERE, sql, e);
|
|
||||||
}
|
}
|
||||||
finally
|
List<MWFActivity> list = new Query(getCtx(), MWFActivity.Table_Name, whereClause.toString(), trxName)
|
||||||
{
|
.setParameters(params)
|
||||||
DB.close(rs, pstmt);
|
.list();
|
||||||
rs = null; pstmt = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_activities = new MWFActivity[list.size ()];
|
m_activities = new MWFActivity[list.size ()];
|
||||||
list.toArray (m_activities);
|
list.toArray (m_activities);
|
||||||
return m_activities;
|
return m_activities;
|
||||||
|
@ -392,7 +380,7 @@ public class MWFProcess extends X_AD_WF_Process
|
||||||
*/
|
*/
|
||||||
public void setAD_WF_Responsible_ID ()
|
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(
|
MRole.getDefault(getCtx(), false).addAccessSQL(
|
||||||
"SELECT AD_WF_Responsible_ID FROM AD_WF_Responsible "
|
"SELECT AD_WF_Responsible_ID FROM AD_WF_Responsible "
|
||||||
+ "WHERE ResponsibleType='H' AND COALESCE(AD_User_ID,0)=0 "
|
+ "WHERE ResponsibleType='H' AND COALESCE(AD_User_ID,0)=0 "
|
||||||
|
|
|
@ -482,7 +482,7 @@ public class MWorkflow extends X_AD_Workflow
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
} // getNext
|
} // getNext
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get (first) Previous Node of ID
|
* Get (first) Previous Node of ID
|
||||||
* @param AD_WF_Node_ID 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());
|
int AD_Client_ID = Env.getAD_Client_ID(product.getCtx());
|
||||||
String sql = "SELECT AD_Workflow_ID FROM AD_Workflow "
|
String sql = "SELECT AD_Workflow_ID FROM AD_Workflow "
|
||||||
+" WHERE Value = ? AND AD_Client_ID = ?";
|
+" 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -16,17 +16,15 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.wf;
|
package org.compiere.wf;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.ArrayList;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import org.compiere.model.AdempiereProcessor;
|
import org.compiere.model.AdempiereProcessor;
|
||||||
import org.compiere.model.AdempiereProcessorLog;
|
import org.compiere.model.AdempiereProcessorLog;
|
||||||
|
import org.compiere.model.Query;
|
||||||
import org.compiere.model.X_AD_WorkflowProcessor;
|
import org.compiere.model.X_AD_WorkflowProcessor;
|
||||||
import org.compiere.util.CLogger;
|
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,37 +50,15 @@ public class MWorkflowProcessor extends X_AD_WorkflowProcessor
|
||||||
*/
|
*/
|
||||||
public static MWorkflowProcessor[] getActive (Properties ctx)
|
public static MWorkflowProcessor[] getActive (Properties ctx)
|
||||||
{
|
{
|
||||||
ArrayList<MWorkflowProcessor> list = new ArrayList<MWorkflowProcessor>();
|
List<MWorkflowProcessor> list = new Query(ctx, Table_Name, null, null)
|
||||||
String sql = "SELECT * FROM AD_WorkflowProcessor WHERE IsActive='Y'";
|
.setOnlyActiveRecords(true)
|
||||||
PreparedStatement pstmt = null;
|
.list();
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
MWorkflowProcessor[] retValue = new MWorkflowProcessor[list.size ()];
|
MWorkflowProcessor[] retValue = new MWorkflowProcessor[list.size ()];
|
||||||
list.toArray (retValue);
|
list.toArray (retValue);
|
||||||
return retValue;
|
return retValue;
|
||||||
} // getActive
|
} // getActive
|
||||||
|
|
||||||
|
|
||||||
/** Static Logger */
|
|
||||||
private static CLogger s_log = CLogger.getCLogger (MWorkflowProcessor.class);
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Standard Constructor
|
* Standard Constructor
|
||||||
* @param ctx context
|
* @param ctx context
|
||||||
|
@ -132,31 +108,10 @@ public class MWorkflowProcessor extends X_AD_WorkflowProcessor
|
||||||
*/
|
*/
|
||||||
public AdempiereProcessorLog[] getLogs ()
|
public AdempiereProcessorLog[] getLogs ()
|
||||||
{
|
{
|
||||||
ArrayList<MWorkflowProcessorLog> list = new ArrayList<MWorkflowProcessorLog>();
|
List<MWorkflowProcessorLog> list = new Query(getCtx(), MWorkflowProcessorLog.Table_Name, "AD_WorkflowProcessor_ID=?", get_TrxName())
|
||||||
String sql = "SELECT * "
|
.setParameters(new Object[]{getAD_WorkflowProcessor_ID()})
|
||||||
+ "FROM AD_WorkflowProcessorLog "
|
.setOrderBy("Created DESC")
|
||||||
+ "WHERE AD_WorkflowProcessor_ID=? "
|
.list();
|
||||||
+ "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;
|
|
||||||
}
|
|
||||||
|
|
||||||
MWorkflowProcessorLog[] retValue = new MWorkflowProcessorLog[list.size ()];
|
MWorkflowProcessorLog[] retValue = new MWorkflowProcessorLog[list.size ()];
|
||||||
list.toArray (retValue);
|
list.toArray (retValue);
|
||||||
return retValue;
|
return retValue;
|
||||||
|
|
|
@ -107,7 +107,7 @@ public class WFProcessManage extends SvrProcess
|
||||||
msg += " - " + msg1;
|
msg += " - " + msg1;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
process.save();
|
process.saveEx();
|
||||||
|
|
||||||
return "OK";
|
return "OK";
|
||||||
} // doIt
|
} // doIt
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue