//----------------------------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.store.util;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.huihoo.workflow.WorkflowException;
import org.huihoo.workflow.rules.ScriptException;
import org.huihoo.workflow.runtime.WorkflowCase;
import org.huihoo.workflow.runtime.WorkflowCaseContext;
import org.huihoo.workflow.runtime.WorkflowService;
import org.huihoo.workflow.runtime.WorkflowSubWork;
import org.huihoo.workflow.runtime.WorkflowWork;
import org.huihoo.workflow.store.UserDatabase;
import org.huihoo.workflow.store.persistent.UserTransaction;
import org.huihoo.workflow.store.spi.SpiCaseDatabase;
import org.huihoo.workflow.usermodel.WorkflowParticipant;
import org.huihoo.workflow.xpdl.WorkflowActivity;
import org.huihoo.workflow.xpdl.WorkflowPackage;
import org.huihoo.workflow.xpdl.WorkflowProcess;
import org.huihoo.workflow.xpdl.WorkflowTransition;
import org.huihoo.workflow.xpdl.activity.ActivityType;
import org.huihoo.workflow.xpdl.activity.PerformerType;
import org.huihoo.workflow.xpdl.activity.SubFlowImplementation;
import org.huihoo.workflow.xpdl.event.WorkflowActivityEvent;
public class DefaultActivityController
{
private static Log log = LogFactory.getLog(DefaultActivityController.class);
public static boolean dispatch_subflow(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition,
String pathDispBatch)
throws WorkflowException, ScriptException
{
log.debug(
"[dispatch_subflow] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowPackage workflowPackage = workflowProcess.getWorkflowPackage();
WorkflowActivity toActivity = workflowTransition.getToWorkflowActivity();
//1) create org.huihoo.workflow work for subflow task node
String parentDispWorkId = null;
if (workflowWork instanceof WorkflowSubWork)
{
//performer is null
WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
parentDispWorkId =
caseDatabase.createWorkflowSubWork(
workflowProcess,
operator,
userTransaction,
workflowCase,
toActivity,
subWork.getParentWorkflowWork(),
null,
subWork.getDispatchTime());
}
else
{
//performer is null
parentDispWorkId =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowCase,
toActivity,
null,
workflowWork.getDispatchTime());
}
WorkflowWork parentDispWork =
caseDatabase.findWorkflowWork(workflowProcess, operator, userTransaction, workflowCase, parentDispWorkId);
caseDatabase.createWorkflowPath(
workflowProcess,
operator,
userTransaction,
workflowCase,
workflowWork,
parentDispWork,
pathDispBatch,
WorkflowActivityEvent.WORK_DISPATCH);
//only accept ,not dispatch
DispatchController.accept_core(
workflowService,
workflowProcess,
operator,
caseDatabase,
userTransaction,
parentDispWork);
//2) create org.huihoo.workflow work for subflow process first task node
SubFlowImplementation impl = (SubFlowImplementation) toActivity.getImplementation();
String suPprocessId = impl.getProcessID();
WorkflowProcess subProcess = workflowPackage.findWorkflowProcess(suPprocessId);
WorkflowTransition firstTransition =
(WorkflowTransition) subProcess.getBeginActivity().getOutgoingTransitions().get(0);
WorkflowActivity firstActivity = firstTransition.getToWorkflowActivity();
String childDispWorkId =
caseDatabase.createWorkflowSubWork(
workflowProcess,
operator,
userTransaction,
workflowCase,
firstActivity,
parentDispWork,
null,
workflowWork.getDispatchTime());
WorkflowWork childDispWork =
caseDatabase.findWorkflowWork(workflowProcess, operator, userTransaction, workflowCase, childDispWorkId);
caseDatabase.createWorkflowWorkEvent(
workflowProcess,
userTransaction,
parentDispWork,
operator,
workflowWork.getDispatchTime(),
WorkflowActivityEvent.WORK_ENTER_SUBFLOW,
childDispWorkId);
return DispatchController.execute_dispatchIfNecessary(
workflowService,
workflowProcess,
operator,
caseDatabase,
userTransaction,
childDispWork);
}
//return parent process
public static boolean dispatch_r2p(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition,
String pathDispBatch)
throws WorkflowException, ScriptException
{
log.debug("[dispatch_r2p] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
WorkflowWork parentWork = subWork.getParentWorkflowWork();
caseDatabase.createWorkflowWorkEvent(
workflowProcess,
userTransaction,
workflowWork,
operator,
workflowWork.getDispatchTime(),
WorkflowActivityEvent.WORK_LEAVE_SUBFLOW,
parentWork.getUUID());
return DispatchController.dispatch_core(
workflowService,
workflowProcess,
operator,
caseDatabase,
userTransaction,
parentWork);
}
public static boolean dispatch_general(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition,
String pathDispBatch)
throws WorkflowException, ScriptException
{
log.debug(
"[dispatch_general] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());
PerformerType performerType = workflowTransition.getToWorkflowActivity().getPerformerType();
ActivityType activityType = workflowTransition.getToWorkflowActivity().getActivityType();
if (PerformerType.PERFORMER_AUTOMATION.equals(performerType)
|| !ActivityType.ACTIVITY_BUSINESS.equals(activityType))
{
return dispatch_automation(
workflowService,
workflowProcess,
operator,
caseDatabase,
userTransaction,
workflowWork,
workflowTransition,
pathDispBatch);
}
else
{
return dispatch_manual(
workflowService,
workflowProcess,
operator,
caseDatabase,
userTransaction,
workflowWork,
workflowTransition,
pathDispBatch);
}
}
private static boolean dispatch_automation(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition,
String pathDispBatch)
throws WorkflowException, ScriptException
{
log.debug(
"[dispatch_automation] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowActivity toActivity = workflowTransition.getToWorkflowActivity();
String autoDispWorkId = null;
if (workflowWork instanceof WorkflowSubWork)
{
//performer is null
WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
autoDispWorkId =
caseDatabase.createWorkflowSubWork(
workflowProcess,
operator,
userTransaction,
workflowCase,
toActivity,
subWork.getParentWorkflowWork(),
null,
subWork.getDispatchTime());
}
else
{
//performer is null
autoDispWorkId =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowCase,
toActivity,
null,
workflowWork.getDispatchTime());
}
WorkflowWork autoDispWork =
caseDatabase.findWorkflowWork(workflowProcess, operator, userTransaction, workflowCase, autoDispWorkId);
caseDatabase.createWorkflowPath(
workflowProcess,
operator,
userTransaction,
workflowCase,
workflowWork,
autoDispWork,
pathDispBatch,
WorkflowActivityEvent.WORK_DISPATCH);
return DispatchController.execute_dispatchIfNecessary(
workflowService,
workflowProcess,
operator,
caseDatabase,
userTransaction,
autoDispWork);
}
private static boolean dispatch_manual(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowParticipant operator,
SpiCaseDatabase caseDatabase,
UserTransaction userTransaction,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition,
String pathDispBatch)
throws WorkflowException
{
log.debug(
"[dispatch_manual] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());
WorkflowActivity workflowActivity = workflowTransition.getToWorkflowActivity();
PerformerType performerType = workflowActivity.getPerformerType();
WorkflowCase workflowCase = workflowWork.getWorkflowCase();
WorkflowCaseContext caseContext = workflowCase.getCaseContext();
UserDatabase userDatabase = workflowService.getUserDatabase();
List users = caseContext.getPerformersByTransition(workflowTransition);
if (users == null)
{
users = ParticipantSelector.select(workflowService, workflowProcess, workflowWork, workflowTransition);
}
log.debug("[dispatch_manual] postUsers: " + users);
int sizePerformer = users.size();
WorkflowParticipant performer = null;
String dispWorkId = null;
WorkflowWork dispWork = null;
if (workflowWork instanceof WorkflowSubWork)
{
for (int i = 0; i < sizePerformer; ++i)
{
performer = (WorkflowParticipant) users.get(i);
WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
dispWorkId =
caseDatabase.createWorkflowSubWork(
workflowProcess,
operator,
userTransaction,
workflowCase,
workflowActivity,
subWork.getParentWorkflowWork(),
performer,
subWork.getDispatchTime());
dispWork = caseDatabase.findWorkflowWork(workflowProcess, operator, workflowCase, dispWorkId);
caseDatabase.createWorkflowPath(
workflowProcess,
operator,
userTransaction,
workflowCase,
workflowWork,
dispWork,
pathDispBatch,
WorkflowActivityEvent.WORK_DISPATCH);
}
}
else
{
for (int i = 0; i < sizePerformer; ++i)
{
performer = (WorkflowParticipant) users.get(i);
dispWorkId =
caseDatabase.createWorkflowWork(
workflowProcess,
operator,
userTransaction,
workflowCase,
workflowActivity,
performer,
workflowWork.getDispatchTime());
dispWork = caseDatabase.findWorkflowWork(workflowProcess, operator, workflowCase, dispWorkId);
caseDatabase.createWorkflowPath(
workflowProcess,
operator,
userTransaction,
workflowCase,
workflowWork,
dispWork,
pathDispBatch,
WorkflowActivityEvent.WORK_DISPATCH);
}
}
return true;
}
}