//----------------------------BEGIN LICENSE----------------------------
/*
* Willow : the Open Source WorkFlow Project
* Distributable under GNU LGPL license by gun.org
*
* Copyright (C) 2004-2010 huihoo.org
* Copyright (C) 2004-2010 ZosaTapo <dertyang@hotmail.com>
*
* ====================================================================
* Project Homepage : http://www.huihoo.org/willow
* Source Forge : http://sourceforge.net/projects/huihoo
* Mailing list : willow@lists.sourceforge.net
*/
//----------------------------END LICENSE-----------------------------
package org.huihoo.workflow.impl.monitor;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.huihoo.workflow.WorkflowException;
import org.huihoo.workflow.store.SchemaContext;
import org.huihoo.workflow.store.persistent.TransactionException;
import org.huihoo.workflow.store.persistent.UserTransaction;
import org.huihoo.workflow.store.spi.SpiCaseDatabase;
import org.huihoo.workflow.usermodel.WorkflowParticipant;
import org.huihoo.workflow.runtime.WorkflowCase;
import org.huihoo.workflow.runtime.WorkflowService;
import org.huihoo.workflow.runtime.WorkflowWork;
import org.huihoo.workflow.xpdl.WorkflowActivity;
import org.huihoo.workflow.xpdl.WorkflowProcess;
import org.huihoo.workflow.xpdl.WorkflowTransition;
import org.huihoo.workflow.xpdl.activity.JoinType;
import org.huihoo.workflow.impl.store.CaseDatabaseImpl;
import com.zosatapo.commons.store.ConnUtils;
/**
* @author reic
*
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class EventMonitorThread extends Thread
{
private static Log log =LogFactory.getLog(LitterCleaner.class);
private EventQueue theQueue;
public EventMonitorThread()
{
theQueue = new EventQueue();
}
public EventMonitorThread(String name)
{
super(name);
theQueue = new EventQueue();
}
public void run()
{
while (true)
{
try
{
MonitorEvent theEvent = theQueue.getNextEvent();
theEvent.dispatch();
}
catch (InterruptedException e)
{
log.error("Exception invoking MonitorEvent dispatch operation: ", e);
break;
}
} //~end while(true)
}
public void sendEvent(MonitorEvent event)
{
theQueue.sendEvent(event);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public static MonitorEventResult dispatch(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
JoinType joinType = joinActivity.getJoinType();
if (joinType != null)
{
CaseDatabaseImpl caseDatabaseImpl = (CaseDatabaseImpl) workflowService.getCaseDatabase();
SpiCaseDatabase caseDatabase = caseDatabaseImpl.getWrappedObject();
UserTransaction userTransaction = null;
MonitorEventResult eventResult = null;
try
{
userTransaction = caseDatabase.getUserTransaction();
if (JoinType.JOIN_AND.equals(joinType))
{
eventResult =
dispatch_andJoin(
workflowService,
workflowProcess,
operator,
event_userTransaction,
caseDatabase,
userTransaction,
workflowWork,
workflowTransition);
}
if (JoinType.JOIN_XOR.equals(joinType))
{
eventResult =
dispatch_xorJoin(
workflowService,
workflowProcess,
operator,
event_userTransaction,
caseDatabase,
userTransaction,
workflowWork,
workflowTransition);
}
if (JoinType.JOIN_OR.equals(joinType))
{
eventResult =
dispatch_orJoin(
workflowService,
workflowProcess,
operator,
event_userTransaction,
caseDatabase,
userTransaction,
workflowWork,
workflowTransition);
}
if (JoinType.JOIN_WEIGHT.equals(joinType))
{
eventResult =
dispatch_weightJoin(
workflowService,
workflowProcess,
operator,
event_userTransaction,
caseDatabase,
userTransaction,
workflowWork,
workflowTransition);
}
userTransaction.commit();
}
catch (WorkflowException ex)
{
if (userTransaction != null)
{
try
{
userTransaction.rollback();
}
catch (TransactionException e)
{
;
}
}
eventResult = new MonitorEventResult();
eventResult.setException(ex);
}
finally
{
if (userTransaction != null)
{
try
{
userTransaction.release();
}
catch (TransactionException e)
{
;
}
}
}
return eventResult;
}
MonitorEventResult eventResult = new MonitorEventResult();
eventResult.setException(
new WorkflowException("JoinType " + joinType + " not supported by current realse"));
return eventResult;
}
private static MonitorEventResult dispatch_andJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
String disp_activity_id = dispActivity.getUUID();
String packageId = workflowProcess.getWorkflowPackage().getUUID();
String processId = workflowProcess.getUUID();
String caseId = workflowCase.getUUID();
WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
String join_activity_id = joinActivity.getUUID();
Connection conn = (Connection) userTransaction.getStoreConnection().get();
PreparedStatement pstmt = null;
ResultSet rs = null;
String strSQL = null;
MonitorEventResult eventResult = new MonitorEventResult();
try
{
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int join_monitor_counter = 0;
int join_activity_batchNo = 0;
int disp_activity_batchNo = 0;
//--------------------------------------------------------------------
// DISP ACTIVITY DISPATCH INFO
// 1. ȡ�ñ����ɷ��Ĺ������������Ļ�ڵ���Ϣ
//--------------------------------------------------------------------
strSQL =
"SELECT int_batchNo,int_join_monitor FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, disp_owner_process_id);
pstmt.setString(5, disp_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
disp_activity_batchNo = rs.getInt("int_batchNo");
eventResult.setBatchNo(disp_activity_batchNo);
}
else
{
eventResult.setBatchNo(disp_activity_batchNo);
}
//--------------------------------------------------------------------
// JOIN ACTIVITY DISPATCH INFO
// 2.ȡ�ù��������۵Ļ�ڵ���Ϣ
//--------------------------------------------------------------------
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
join_activity_batchNo = rs.getInt("int_batchNo");
join_monitor_counter = rs.getInt("int_join_monitor");
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
if ((disp_activity_batchNo + 1) < join_activity_batchNo)
{
eventResult.first(false);
eventResult.last(false);
return eventResult;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 3. ȡ�û�۵Ļ�ڵ㵱ǰ��ɵ�ǰ�̹�������Ϣ
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
String join_work_id = null;
strSQL =
"SELECT vc_uuid FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_WORK)
+ " "
+ "WHERE dat_acceptTime IS NULL "
+ "AND vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
eventResult.first(false);
eventResult.last(false);
join_work_id = rs.getString("vc_uuid");
}
else
{
eventResult.first(true);
eventResult.last(false);
join_monitor_counter = 0;
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
List inTrans = joinActivity.getIncomingTransitions();
int sizeTrans = inTrans.size();
// System.err.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
// System.err.println("joinActivity : "+joinActivity);
// System.err.println(inTrans);
// System.err.println("join_monitor_counter : "+join_monitor_counter);
// System.err.println("join_activity_batchNo : "+join_activity_batchNo);
if ((join_monitor_counter + 1) >= sizeTrans)
{
eventResult.last(true);
}
if (join_activity_batchNo == 0)
{
strSQL =
"INSERT INTO "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+"(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo,int_join_monitor) "
+ " VALUES(?,?,?,?,?,?,?)";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
pstmt.setInt(6, join_activity_batchNo + 1);
pstmt.setInt(7, join_monitor_counter + 1);
pstmt.execute();
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
}
else
{
if (eventResult.first())
{
join_activity_batchNo = +1;
}
strSQL =
"UPDATE "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "SET int_batchNo=?,int_join_monitor=?,vc_disp_flag=? "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setInt(1, join_activity_batchNo);
pstmt.setInt(2, join_monitor_counter + 1);
pstmt.setString(3, "TRUE");
pstmt.setString(4, packageId);
pstmt.setString(5, processId);
pstmt.setString(6, caseId);
pstmt.setString(7, join_owner_process_id);
pstmt.setString(8, join_activity_id);
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
}
if (eventResult.first())
{
join_work_id =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowWork.getWorkflowCase(),
joinActivity,
null,
workflowWork.getDispatchTime());
}
eventResult.setJoinWorkID(join_work_id);
}
catch (Exception ex)
{
ex.printStackTrace();
eventResult.setException(ex);
}
finally
{
ConnUtils.cleanupNoThrow(pstmt);
}
return eventResult;
}
private static MonitorEventResult dispatch_xorJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
String disp_activity_id = dispActivity.getUUID();
WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
String join_activity_id = joinActivity.getUUID();
String packageId = workflowProcess.getWorkflowPackage().getUUID();
String processId = workflowProcess.getUUID();
String caseId = workflowWork.getWorkflowCase().getUUID();
Connection conn = (Connection) userTransaction.getStoreConnection().get();
PreparedStatement pstmt = null;
ResultSet rs = null;
String strSQL = null;
MonitorEventResult eventResult = new MonitorEventResult();
try
{
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int join_activity_batchNo = 0;
int disp_activity_batchNo = 0;
//--------------------------------------------------------------------
// DISP ACTIVITY DISPATCH INFO
// 1. ȡ�ñ����ɷ��Ĺ������������Ļ�ڵ���Ϣ
//--------------------------------------------------------------------
strSQL =
"SELECT int_batchNo FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, disp_owner_process_id);
pstmt.setString(5, disp_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
disp_activity_batchNo = rs.getInt("int_batchNo");
eventResult.setBatchNo(disp_activity_batchNo);
}
//--------------------------------------------------------------------
// JOIN ACTIVITY DISPATCH INFO
// 2.ȡ�ù��������۵Ļ�ڵ���Ϣ
//--------------------------------------------------------------------
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
join_activity_batchNo = rs.getInt("int_batchNo");
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
if ((disp_activity_batchNo + 1) <= join_activity_batchNo)
{
eventResult.first(false);
eventResult.last(false);
return eventResult;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 3. ȡ�û�۵Ļ�ڵ㵱ǰ��ɵ�ǰ�̹�������Ϣ
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if (disp_activity_batchNo == join_activity_batchNo)
{
eventResult.first(true);
eventResult.last(true);
}
else
{
eventResult.first(false);
eventResult.last(false);
return eventResult;
}
if (join_activity_batchNo == 0)
{
strSQL =
"INSERT INTO "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+"(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo) "
+ " VALUES(?,?,?,?,?,?)";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
pstmt.setInt(6, join_activity_batchNo + 1);
pstmt.execute();
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
}
else
{
if (eventResult.first())
{
strSQL =
"UPDATE "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "SET int_batchNo=?,vc_disp_flag=? "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setInt(1, join_activity_batchNo + 1);
pstmt.setString(2, "TRUE");
pstmt.setString(3, packageId);
pstmt.setString(4, processId);
pstmt.setString(5, caseId);
pstmt.setString(6, join_owner_process_id);
pstmt.setString(7, join_activity_id);
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
}
}
if (eventResult.first())
{
String join_work_id = null;
join_work_id =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowWork.getWorkflowCase(),
joinActivity,
null,
workflowWork.getDispatchTime());
eventResult.setJoinWorkID(join_work_id);
}
}
catch (Exception ex)
{
eventResult.setException(ex);
}
finally
{
ConnUtils.cleanupNoThrow(pstmt);
}
return eventResult;
}
private static MonitorEventResult dispatch_orJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,//[VIP]
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
String disp_activity_id = dispActivity.getUUID();
WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
String join_activity_id = joinActivity.getUUID();
String packageId = workflowProcess.getWorkflowPackage().getUUID();
String processId = workflowProcess.getUUID();
String caseId = workflowWork.getWorkflowCase().getUUID();
Connection conn = (Connection) userTransaction.getStoreConnection().get();
PreparedStatement pstmt = null;
ResultSet rs = null;
String strSQL = null;
MonitorEventResult eventResult = new MonitorEventResult();
try
{
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int join_monitor_counter = 0;
int join_activity_batchNo = 0;
int disp_activity_batchNo = 0;
//--------------------------------------------------------------------
// DISP ACTIVITY DISPATCH INFO
// 1. ȡ�ñ����ɷ��Ĺ������������Ļ�ڵ���Ϣ
strSQL =
"SELECT int_batchNo,int_join_monitor FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, disp_owner_process_id);
pstmt.setString(5, disp_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
disp_activity_batchNo = rs.getInt("int_batchNo");
eventResult.setBatchNo(disp_activity_batchNo);
}
//--------------------------------------------------------------------
// JOIN ACTIVITY DISPATCH INFO
// 2.ȡ�ù��������۵Ļ�ڵ���Ϣ
//--------------------------------------------------------------------
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
join_activity_batchNo = rs.getInt("int_batchNo");
join_monitor_counter = rs.getInt("int_join_monitor");
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
if ((disp_activity_batchNo + 1) < join_activity_batchNo)
{
eventResult.first(false);
eventResult.last(false);
return eventResult;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 3. ȡ�û�۵Ļ�ڵ㵱ǰ��ɵ�ǰ�̹�������Ϣ
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
List inTrans = joinActivity.getIncomingTransitions();
int inTrans_size = inTrans.size();
int falseTrans_size = 0;
strSQL =
"SELECT int_batchNo FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "WHERE vc_disp_flag=? "
+ "AND vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
List not_found_inTrans = new ArrayList();
for (int i = 0; i < inTrans_size; ++i)
{
WorkflowTransition flaseTransition = (WorkflowTransition) inTrans.get(i);
WorkflowActivity falseActivity = flaseTransition.getFromWorkflowActivity();
String false_owner_process_id = falseActivity.getWorkflowProcess().getUUID();
String false_activity_id = falseActivity.getUUID();
pstmt.setString(1, "FALSE");
pstmt.setString(2, packageId);
pstmt.setString(3, processId);
pstmt.setString(4, caseId);
pstmt.setString(5, false_owner_process_id);
pstmt.setString(6, false_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
falseTrans_size += 1;
}
else
{
not_found_inTrans.add(flaseTransition);
}
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// -----------------Lookup In event_userTransaction ---------------------------------
//------------------VIP Code Section By zosatapo----------------------------------------
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
Connection event_conn = null;
PreparedStatement event_pstmt = null;
ResultSet event_rs=null;
try
{
event_conn = (Connection) event_userTransaction.getStoreConnection().get();
strSQL =
"SELECT int_batchNo FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "WHERE vc_disp_flag=? "
+ "AND vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
event_pstmt = event_conn.prepareStatement(strSQL);
int not_found_inTrans_size = not_found_inTrans.size();
for (int i = 0; i < not_found_inTrans_size; ++i)
{
WorkflowTransition flaseTransition = (WorkflowTransition) not_found_inTrans.get(i);
WorkflowActivity falseActivity = flaseTransition.getFromWorkflowActivity();
String false_owner_process_id = falseActivity.getWorkflowProcess().getUUID();
String false_activity_id = falseActivity.getUUID();
event_pstmt.setString(1, "FALSE");
event_pstmt.setString(2, packageId);
event_pstmt.setString(3, processId);
event_pstmt.setString(4, caseId);
event_pstmt.setString(5, false_owner_process_id);
event_pstmt.setString(6, false_activity_id);
event_rs = event_pstmt.executeQuery();
if (event_rs.next())
{
falseTrans_size += 1;
}
}//~end for (int i = 0; i < not_found_inTrans_size; ++i)
ConnUtils.cleanupNoThrow(event_pstmt);
event_pstmt = null;
}
finally
{
ConnUtils.cleanupNoThrow(event_pstmt);
event_pstmt = null;
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
int join_monitor_total = inTrans_size - falseTrans_size;
//*********************************************************************
if (disp_activity_batchNo == join_activity_batchNo)
{
eventResult.first(true);
eventResult.last(false);
join_monitor_counter = 0;
}
else
{
eventResult.first(false);
eventResult.last(false);
}
//if((join_monitor_counter+1) == join_monitor_total)
if ((join_monitor_counter + 1) >= join_monitor_total)
{
eventResult.last(true);
}
if (join_activity_batchNo == 0)
{
strSQL =
"INSERT INTO "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+"(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo,int_join_monitor) "
+ " VALUES(?,?,?,?,?,?,?)";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
pstmt.setInt(6, join_activity_batchNo + 1);
pstmt.setInt(7, join_monitor_counter + 1);
pstmt.execute();
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
}
else
{
if (eventResult.first())
{
join_activity_batchNo = +1;
}
strSQL =
"UPDATE "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
+ "SET int_batchNo=?,int_join_monitor=?,vc_disp_flag=? "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setInt(1, join_activity_batchNo);
pstmt.setInt(2, join_monitor_counter + 1);
pstmt.setString(3, "TRUE");
pstmt.setString(4, packageId);
pstmt.setString(5, processId);
pstmt.setString(6, caseId);
pstmt.setString(7, join_owner_process_id);
pstmt.setString(8, join_activity_id);
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
}
String join_work_id = null;
if (eventResult.first())
{
join_work_id =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowWork.getWorkflowCase(),
joinActivity,
null,
workflowWork.getDispatchTime());
}
else
{
strSQL =
"SELECT vc_uuid FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_WORK)
+ " "
+ "WHERE dat_acceptTime IS NULL "
+ "AND vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
join_work_id = rs.getString("vc_uuid");
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
}
eventResult.setJoinWorkID(join_work_id);
}
catch (Exception ex)
{
eventResult.setException(ex);
}
finally
{
ConnUtils.cleanupNoThrow(pstmt);
}
return eventResult;
}
private static MonitorEventResult dispatch_weightJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
return null;
}
private static MonitorEventResult dispatch_instanceAndJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
String disp_activity_id = dispActivity.getUUID();
String packageId = workflowProcess.getWorkflowPackage().getUUID();
String processId = workflowProcess.getUUID();
String caseId = workflowCase.getUUID();
WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
String join_activity_id = joinActivity.getUUID();
Connection conn = (Connection) userTransaction.getStoreConnection().get();
PreparedStatement pstmt = null;
ResultSet rs = null;
String strSQL = null;
MonitorEventResult eventResult = new MonitorEventResult();
try
{
String join_work_id = null;
strSQL =
"SELECT vc_uuid FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_WORK)
+ " "
+ "WHERE dat_acceptTime IS NULL "
+ "AND vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_activityid=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, join_owner_process_id);
pstmt.setString(5, join_activity_id);
rs = pstmt.executeQuery();
if (rs.next())
{
eventResult.first(false);
eventResult.last(false);
join_work_id = rs.getString("vc_uuid");
}
else
{
eventResult.first(true);
eventResult.last(false);
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
int join_monitor_counter = 0;
int join_monitor_total = 0;
strSQL =
"SELECT vc_batchNo FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
+ " "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_to=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, workflowWork.getUUID());
rs = pstmt.executeQuery();
rs.next();
String dispBatchNo = rs.getString("vc_batchNo");
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
strSQL =
"SELECT count(*) FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
+ " "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_batchNo=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, dispBatchNo);
rs = pstmt.executeQuery();
rs.next();
join_monitor_total = rs.getInt(1);
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
if (eventResult.first())
{
join_monitor_counter = 0;
}
else
{
//destination instanceAndJoin activity all in-transitions
//ONLY ==ONE== in-transition
List inTrans = joinActivity.getIncomingTransitions();
WorkflowTransition tempTrans = (WorkflowTransition) inTrans.get(0);
strSQL =
"SELECT count(*) FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
+ " "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_owner_processid=? "
+ "AND vc_transitionid=? "
+ "AND vc_to=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, tempTrans.getWorkflowProcess().getUUID());
pstmt.setString(5, tempTrans.getUUID());
pstmt.setString(6, join_work_id);
rs = pstmt.executeQuery();
join_monitor_counter = rs.getInt(1);
}
if ((join_monitor_counter + 1) >= join_monitor_total)
{
eventResult.last(true);
}
if (eventResult.first())
{
join_work_id =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowWork.getWorkflowCase(),
joinActivity,
null,
workflowWork.getDispatchTime());
}
eventResult.setJoinWorkID(join_work_id);
}
catch (Exception ex)
{
eventResult.setException(ex);
}
finally
{
ConnUtils.cleanupNoThrow(pstmt);
}
return eventResult;
}
private static MonitorEventResult dispatch_instanceXorJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
String disp_activity_id = dispActivity.getUUID();
String packageId = workflowProcess.getWorkflowPackage().getUUID();
String processId = workflowProcess.getUUID();
String caseId = workflowCase.getUUID();
WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
String join_activity_id = joinActivity.getUUID();
Connection conn = (Connection) userTransaction.getStoreConnection().get();
PreparedStatement pstmt = null;
ResultSet rs = null;
String strSQL = null;
MonitorEventResult eventResult = new MonitorEventResult();
try
{
int join_monitor_counter = 0;
int join_monitor_total = 0;
strSQL =
"SELECT vc_batchNo FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
+ " "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_to=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, workflowWork.getUUID());
rs = pstmt.executeQuery();
rs.next();
String dispBatchNo = rs.getString("vc_batchNo");
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
strSQL =
"SELECT vc_to FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
+ " "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_batchNo=? ";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, dispBatchNo);
rs = pstmt.executeQuery();
Vector vector_work_id = new Vector();
while (rs.next())
{
vector_work_id.addElement(rs.getString("vc_to"));
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
strSQL =
"SELECT vc_to FROM "
+ caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
+ " "
+ "WHERE vc_packageid=? "
+ "AND vc_processid=? "
+ "AND vc_caseid=? "
+ "AND vc_from=? ";
pstmt = conn.prepareStatement(strSQL);
int disp_work_total = vector_work_id.size();
eventResult.first(true);
eventResult.last(true);
for (int i = 0; i < disp_work_total; ++i)
{
pstmt.setString(1, packageId);
pstmt.setString(2, processId);
pstmt.setString(3, caseId);
pstmt.setString(4, (String) vector_work_id.elementAt(i));
rs = pstmt.executeQuery();
if (rs.next())
{
eventResult.first(false);
eventResult.last(false);
break;
}
}
ConnUtils.cleanupNoThrow(pstmt);
pstmt = null;
String join_work_id = null;
if (eventResult.first())
{
join_work_id =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowWork.getWorkflowCase(),
joinActivity,
null,
workflowWork.getDispatchTime());
}
eventResult.setJoinWorkID(join_work_id);
}
catch (Exception ex)
{
eventResult.setException(ex);
}
finally
{
ConnUtils.cleanupNoThrow(pstmt);
}
return eventResult;
}
private static MonitorEventResult dispatch_instanceOrJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
return null;
}
private static MonitorEventResult dispatch_instanceWeightJoin(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
UserTransaction event_userTransaction,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
{
return null;
}
}