package org.basuyi.xflow.core;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.basuyi.xflow.core.config.WorkflowConfig;
import org.basuyi.xflow.core.config.WorkflowConfigFactory;
import org.basuyi.xflow.core.config.model.WfConfigActivity;
import org.basuyi.xflow.core.config.model.WfConfigUserActivity;
import org.basuyi.xflow.core.config.model.WfConfigUserPolicy;
import org.basuyi.xflow.core.config.model.Workflow;
import org.basuyi.xflow.core.config.model.WorkflowContext;
import org.basuyi.xflow.core.config.model.WorkflowDefination;
import org.basuyi.xflow.model.WfControl;
import org.basuyi.xflow.model.WfProcess;
import org.basuyi.xflow.model.WfProcessDispatch;
import org.basuyi.xflow.core.service.WorkflowService;
import org.basuyi.xflow.core.utils.StringUtils;
/**
* �������ݿ����õĹ���������ʵ��
* @author mashuai
* @version 0.1
* @date 2009-10-21
*/
public class DBWorkflowEngine extends AbstractWorkflowEngine {
private WorkflowService wfServiceNoTx;
private WorkflowService wfServiceTx;
public Map<String, Object> preStartWorkflow(Map<String, Object> in_params) {
String workflowId = StringUtils.trimToString(in_params.get(WorkflowDefination.WORKFLOW_ID));
String userId = StringUtils.trimToString(in_params.get(WorkflowDefination.USER_ID));
String postId = StringUtils.trimToString(in_params.get(WorkflowDefination.POST_ID));
String orgId = StringUtils.trimToString(in_params.get(WorkflowDefination.ORG_ID));
String dispatcher = StringUtils.trimToString(in_params.get(WorkflowDefination.DISPATCHER));
String opt_user_id = StringUtils.trimToString(in_params.get(WorkflowDefination.OPT_USER_ID));
String is_subflow = StringUtils.trimToString(in_params.get(WorkflowDefination.IS_SUBFLOW));
Workflow upper_workflow = (Workflow)in_params.get(WorkflowDefination.UPPER_WORKFLOW);
String upper_activity_id = StringUtils.trimToString(in_params.get(WorkflowDefination.UPPER_ACTIVITY_ID));
String wf_inst_id = StringUtils.trimToString(in_params.get(WorkflowDefination.WF_INST_ID));
String wf_process_seq = StringUtils.trimToString(in_params.get(WorkflowDefination.WF_PROCESS_SEQ));
String page_id = StringUtils.trimToString(in_params.get(WorkflowDefination.USER_ENTRY));
Map<String, Object> upper_wf_params = (Map<String, Object>)in_params.get(WorkflowDefination.UPPER_WF_PARAMS);
/*������û�������룬�淶�����������������еı�Ҫ����*/
if (!"".equals(wf_process_seq)) {
WfProcess i_wf_process = new WfProcess();
i_wf_process.setWfProcessSeq(StringUtils.transToLong(wf_process_seq));
WfProcess wf_process = wfServiceNoTx.getWfProcess(i_wf_process);
if (wf_process != null) {
String currentActivityId = wf_process.getActivityId();
WfControl i_wf_control = new WfControl();
i_wf_control.setWfInstId(StringUtils.transToLong(wf_inst_id));
WfControl wf_control = wfServiceNoTx.getWfControl(i_wf_control);
currentActivityId = wf_control.getCurrentActivityId();
WfConfigActivity currentActivity = workflow.getActivityById(currentActivityId);
context.setCurrentActivity(currentActivity);
context.setEngineStatus(WorkflowStatus.SUSPEND);
this.context.put(WorkflowDefination.CONTEXT_KEY_WF_CONTROL, wf_control);
this.context.putPrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS, wf_process);
}
}
context.setSubflow("1".equals(is_subflow) ? true : false);
if (context.isSubflow()) {
context.setUpperWorkflow(upper_workflow);
context.setParams(upper_wf_params);
} else if ("".equals(wf_process_seq)) {
WfControl wf_control = new WfControl();
wf_control.setWorkflowId(workflowId);
wf_control.setCreateDate(new Date());
wf_control.setStartDate(new Date());
wf_control.setStatus(0L);
wf_control.setCreator(StringUtils.transToLong(userId));
this.wfServiceNoTx.saveWfControl(wf_control);
this.context.put(WorkflowDefination.CONTEXT_KEY_WF_CONTROL, wf_control);
}
context.put(WorkflowDefination.CONTEXT_KEY_WORKFLOW_ID, workflowId);
context.put(WorkflowDefination.CONTEXT_KEY_ORG_ID, orgId);
context.put(WorkflowDefination.CONTEXT_KEY_POST_ID, postId);
context.put(WorkflowDefination.CONTEXT_KEY_USER_ID, userId);
context.put(WorkflowDefination.CONTEXT_KEY_DISPATCHER, dispatcher);
context.put(WorkflowDefination.CONTEXT_KEY_OPT_USER_ID, opt_user_id);
context.put(WorkflowDefination.CONTEXT_KEY_UPPER_ACTIVITY_ID, upper_activity_id);
context.put(WorkflowDefination.CONTEXT_KEY_WF_SERVICE_NOTX, wfServiceNoTx);
context.put(WorkflowDefination.CONTEXT_KEY_WF_SERVICE_TX, wfServiceTx);
return null;
}
@Override
protected void initWorkflowContext(String i_workflowId) {
String [] workflowId_array = i_workflowId.split("\\.");
String workflowId = workflowId_array[workflowId_array.length - 1];
String workflow_config_policy = StringUtils.trimToString(properties.getProperty(WorkflowDefination.WF_CONFIG_POLICY));
WorkflowConfig configure = new WorkflowConfigFactory().getWorkflowConfig(workflow_config_policy);
context = configure.initContext(workflowId);
}
@Override
protected void cacheWorkflowContext() {
// String cache_file = (String)this.getProperties().get("cache_dir");
// ContextUtils.outputs(this.getContext(), cache_file);
}
@Override
protected void loadWorkflowContext() {
// String cache_file = (String)this.getProperties().get("cache_dir");
// this.setContext((WorkflowContext)ContextUtils.inputs(cache_file));
}
@Override
protected void lanchUserInterface(WorkflowContext context) {
// TODO Auto-generated method stub
}
@Override
protected void afterExecuteActivity(WfConfigActivity wfConfigActivity) {
WfProcess wf_process = (WfProcess)this.context.getPrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS);
wf_process.setFinishDate(new Date());
wf_process.setStatus(WorkflowDefination.WF_PROCESS_STATUS_S);//�ɹ�
wf_process.setOperater(StringUtils.transToLong((String)this.context.get(WorkflowDefination.CONTEXT_KEY_USER_ID)));
this.wfServiceNoTx.saveWfProcess(wf_process);
this.context.removePrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS);
}
@Override
protected void beforeExecuteActivity(WfConfigActivity wfConfigActivity) {
WfControl wf_control = (WfControl)this.context.get(WorkflowDefination.CONTEXT_KEY_WF_CONTROL);
WfProcess wf_process = (WfProcess)this.context.getPrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS);
if (wf_process == null) {
wf_process = new WfProcess();
}
wf_process.setWorkflowId(StringUtils.trimToString(context.get(WorkflowDefination.CONTEXT_KEY_WORKFLOW_ID)));
if (!"".equals(StringUtils.trimToString(context.get(WorkflowDefination.CONTEXT_KEY_UPPER_ACTIVITY_ID)))) {
wf_process.setActivityId(StringUtils.trimToString(context.get(WorkflowDefination.CONTEXT_KEY_UPPER_ACTIVITY_ID)) + "." + wfConfigActivity.getActivityId());
} else {
wf_process.setActivityId(wfConfigActivity.getActivityId());
}
wf_process.setStartDate(new Date());
wf_process.setWfControl(wf_control);
wf_process.setStatus(WorkflowDefination.WF_PROCESS_STATUS_I);//��ʼ
wf_process.setStartDate(new Date());
wf_process.setOperateDate(new Date());
wf_process.setOperater(StringUtils.transToLong((String)this.context.get(WorkflowDefination.CONTEXT_KEY_USER_ID)));
this.wfServiceNoTx.saveWfProcess(wf_process);
this.context.putPrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS, wf_process);
wf_control.setCurrentActivityId(wfConfigActivity.getActivityId());
this.wfServiceNoTx.saveWfControl(wf_control);
}
public void setWfServiceNoTx(WorkflowService wfServiceNoTx) {
this.wfServiceNoTx = wfServiceNoTx;
}
public void setWfServiceTx(WorkflowService wfServiceTx) {
this.wfServiceTx = wfServiceTx;
}
@Override
protected void errorExecuteActivity(WfConfigActivity wfConfigActivity) {
WfProcess wf_process = (WfProcess)this.context.getPrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS);
wf_process.setFinishDate(new Date());
wf_process.setStatus(WorkflowDefination.WF_PROCESS_STATUS_F);//ʧ��
wf_process.setOperater(StringUtils.transToLong((String)this.context.get(WorkflowDefination.CONTEXT_KEY_USER_ID)));
this.wfServiceNoTx.saveWfProcess(wf_process);
this.context.removePrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS);
}
@Override
protected void extendUserActivity(WfConfigActivity wfConfigActivity) {
WfProcessDispatch wf_dispatch = new WfProcessDispatch();
Map<String, Object> in_params = (Map<String, Object>)context.getPrivate(WorkflowDefination.IN_PARAMS);
String wf_process_seq = StringUtils.trimToString(in_params.get(WorkflowDefination.WF_PROCESS_SEQ));
if (!"".equals(wf_process_seq)) {
WfProcessDispatch i_wf_dispatch = new WfProcessDispatch();
i_wf_dispatch.setWfProcessSeq(StringUtils.transToLong(wf_process_seq));
List<WfProcessDispatch> wf_dispatch_list = wfServiceNoTx.getWfProcessDispatchByModel(i_wf_dispatch);
if (wf_dispatch_list != null && wf_dispatch_list.size() > 0) {
wf_dispatch = wf_dispatch_list.get(0);
}
} else {
WfProcess wf_process = (WfProcess)this.context.getPrivate(WorkflowDefination.CONTEXT_KEY_WF_PROCESS);
WfControl wf_control = (WfControl)this.context.get(WorkflowDefination.CONTEXT_KEY_WF_CONTROL);
wf_dispatch = new WfProcessDispatch();
wf_dispatch.setWfInstId(wf_control.getWfInstId());
wf_dispatch.setWfProcessSeq(wf_process.getWfProcessSeq());
}
WfConfigUserActivity wfConfigUserActivity = (WfConfigUserActivity)wfConfigActivity;
WfConfigUserPolicy wfConfigUserPolicy = wfConfigUserActivity.getUserPolicy();
if (WorkflowDefination.USER_POLICY_RBAC.equals(wfConfigUserPolicy.getType())) {
wf_dispatch.setDispatchType(1L);
} else if (WorkflowDefination.USER_POLICY_UESR_INPUT.equals(wfConfigUserPolicy.getType())) {
wf_dispatch.setDispatchType(0L);
}
if (WorkflowStatus.SUSPEND == context.getEngineStatus()) {
wf_dispatch.setDispatchStatus(1L);//�ȴ�����
} else if (WorkflowStatus.NORMAL == context.getEngineStatus()) {
wf_dispatch.setDispatchStatus(5L);//�������
}
wf_dispatch.setUserId(StringUtils.transToLong(this.context.getPrivate(WorkflowDefination.CONTEXT_KEY_USER_ID)));
wf_dispatch.setPostId(StringUtils.transToLong(this.context.getPrivate(WorkflowDefination.CONTEXT_KEY_POST_ID)));
wf_dispatch.setOrgId(StringUtils.transToLong(this.context.getPrivate(WorkflowDefination.CONTEXT_KEY_ORG_ID)));
wf_dispatch.setOptDate(new Date());
this.wfServiceNoTx.saveWfProcessDispatch(wf_dispatch);
}
@Override
protected Map<String, Object> postStartWorkflow(Map<String, Object> params) {
// TODO Auto-generated method stub
return null;
}
}