package org.basuyi.xflow.core.config;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.basuyi.xflow.core.WorkflowStatus;
import org.basuyi.xflow.core.config.model.ActivityFactory;
import org.basuyi.xflow.core.config.model.WfConfigAction;
import org.basuyi.xflow.core.config.model.WfConfigActivity;
import org.basuyi.xflow.core.config.model.WfConfigArgument;
import org.basuyi.xflow.core.config.model.WfConfigCondition;
import org.basuyi.xflow.core.config.model.WfConfigParameter;
import org.basuyi.xflow.core.config.model.WfConfigResult;
import org.basuyi.xflow.core.config.model.WfConfigSubflowActivity;
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.core.utils.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* �����������ļ���ȡ��
* @author mashuai
* @version 0.1
* @date 2009-10-21
*/
public class WorkflowXMLConfig extends AbstractWorkflowConfig {
/**
* ��ʼ�������������Ķ���
* @return
*/
public WorkflowContext initContext(String workflowId) {
/*�����������ļ�·��*/
String config_path = WorkflowDefination.WF_CONFIG_DIR + WorkflowDefination.DIR_DELIMITER + workflowId + WorkflowDefination.WF_CONFIG_EXTENTION;
if (context != null) {
return context;
}
SAXReader reader = new SAXReader();
Document doc = null;
try {
File file = new File(config_path);
doc = reader.read(file);
setContext(doc, context);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return context;
}
/**
* ���������������ļ������ù����������Ķ���
* @param doc
* @param context2
*/
private void setContext(Document doc, WorkflowContext context2) throws Exception {
Element root = doc.getRootElement();
/*ȡ�ù�����������Ϣ*/
String workflowId = StringUtils.getElementValue(root, "id");
String workflowName = StringUtils.getElementValue(root, "name");
String description = StringUtils.getElementValue(root, "description");
Workflow workflow = new Workflow();
/*���������������в����ڵ�*/
List parameters = root.element("parameters").elements("parameter");
Map<String, WfConfigParameter> workflowParameters = new HashMap<String, WfConfigParameter>();
for (int i = 0; parameters != null && i < parameters.size(); i++) {
Element parameter = (Element)parameters.get(i);
/*���ò�����Ϣ*/
WfConfigParameter workflowParameter = new WfConfigParameter();
workflowParameter.setType(StringUtils.getAttributeValue(parameter, "type"));
workflowParameter.setKey(StringUtils.getElementValue(parameter));
workflowParameters.put(workflowParameter.getKey(), workflowParameter);
}
/*���������������л��ڽڵ�*/
List activities = root.element("activities").elements("activity");
Map<String, WfConfigActivity> workflowActivities = new HashMap<String, WfConfigActivity>();
for (int i = 0; activities != null && i < activities.size(); i++) {
Element activity = (Element)activities.get(i);
/*���û��ڻ�����Ϣ*/
WfConfigActivity workflowActivity = ActivityFactory.getActivity(StringUtils.getAttributeValue(activity, "type"));
workflowActivity.setActivityId(StringUtils.getAttributeValue(activity, "id"));
workflowActivity.setActivityName(StringUtils.getAttributeValue(activity, "name"));
workflowActivity.setActivityType(StringUtils.getAttributeValue(activity, "type"));
workflowActivity.setDecription(StringUtils.getElementValue(activity, "description"));
/*���ó�ʼ����*/
if ("start".equals(StringUtils.getAttributeValue(activity, "type")))
workflow.setStartActivity(workflowActivity);
workflowActivities.put(workflowActivity.getActivityId(), workflowActivity);
/*���û���ִ����Ϣ*/
if ("subflow".equals(workflowActivity.getActivityType())) {/*�û���Ϊ������*/
fetchSubflowctivity(activity, workflowActivity);
} else if ("user".equals(workflowActivity.getActivityType())) {/*�û���Ϊ�û��ӿ�*/
fetchUserActivity(activity, workflowActivity);
} else {
fetchAppActivity(activity, workflowActivity);
}
/*��ȡ�û��������н��������Ϣ*/
fetchResultInfo(activity, workflowActivity);
}
/*���ù���������*/
workflow.setActivities(workflowActivities);
workflow.setDescription(description);
workflow.setWorkflowId(workflowId);
workflow.setWorkflowName(workflowName);
workflow.setWfConfigParameters(workflowParameters);
context = new WorkflowContext();
context.setWorkflow(workflow);
context.setEngineStatus(WorkflowStatus.NORMAL);
}
/**
* *��ȡ�û��������н��������Ϣ
* @param activity
* @param workflowActivity
*/
private void fetchResultInfo(Element activity, WfConfigActivity workflowActivity) {
/*�����û��������н���ڵ�*/
List results = activity.element("results").elements("result");
Map<String, WfConfigResult> workflowResults = new HashMap<String, WfConfigResult>();
workflowActivity.setResults(workflowResults);
for (int j = 0; results != null && j < results.size(); j++) {
Element result = (Element)results.get(j);
/*���ý������*/
WfConfigResult workflowResult = new WfConfigResult();
workflowResult.setResultId(StringUtils.getAttributeValue(result, "id"));
workflowResult.setResultName(StringUtils.getAttributeValue(result, "name"));
workflowResult.setResultType(StringUtils.getAttributeValue(result, "type"));
workflowResult.setActivityId(StringUtils.getAttributeValue(result, "activity"));
workflowResult.setStatus(StringUtils.getAttributeValue(result, "status"));
workflowResult.setNextStatus(StringUtils.getAttributeValue(result, "next-status"));
workflowResult.setPolicy(StringUtils.getAttributeValue(result, "policy"));
if (result.elements("condition") != null) {
List<WfConfigCondition> workflowConditions = new ArrayList<WfConfigCondition>();
for (Element condition: (List<Element>)result.elements("condition")) {
WfConfigCondition workflowCondition = new WfConfigCondition();
workflowCondition.setConditionId(StringUtils.getAttributeValue(condition, "id"));
workflowCondition.setConditionName(StringUtils.getAttributeValue(condition, "name"));
workflowCondition.setConditionType(StringUtils.getAttributeValue(condition, "type"));
WfConfigArgument arg = new WfConfigArgument();
arg.setArgValue(StringUtils.getElementValue(condition, "arg"));
arg.setArgName(StringUtils.getAttributeValue(condition.element("arg"), "name"));
workflowCondition.setArgument(arg);
workflowConditions.add(workflowCondition);
}
workflowResult.setConditions(workflowConditions);
}
workflowResults.put(workflowResult.getActivityId(), workflowResult);
}
}
/**
* ��ȡӦ�û�����Ϣ
* @param activity
* @param workflowActivity
*/
private void fetchAppActivity(Element activity, WfConfigActivity workflowActivity) {
/*�����û��������ж����ڵ�*/
List actions = activity.element("actions").elements("action");
List<WfConfigAction> workflowActions = new ArrayList<WfConfigAction>();
workflowActivity.setActions(workflowActions);
for (int j = 0; actions != null && j < actions.size(); j++) {
Element action = (Element)actions.get(j);
/*���ö�������*/
WfConfigAction workflowAction = new WfConfigAction();
workflowActions.add(workflowAction);
workflowAction.setActionId(StringUtils.getAttributeValue(action, "id"));
workflowAction.setActionName(StringUtils.getAttributeValue(action, "name"));
workflowAction.setType(StringUtils.getAttributeValue(action, "type"));
WfConfigArgument arg = new WfConfigArgument();
arg.setArgValue(StringUtils.getElementValue(action, "arg"));
arg.setArgName(StringUtils.getAttributeValue(action.element("arg"), "name"));
workflowAction.setArgument(arg);
}
}
/**
* ��ȡ�û�������Ϣ
* @param activity
* @param workflowActivity
*/
private void fetchUserActivity(Element activity, WfConfigActivity workflowActivity) {
WfConfigUserActivity wfConfigUserActivity = (WfConfigUserActivity)workflowActivity;
/*�����û���������ִ��ǰ�����ڵ�*/
if (activity.element("pre-actions") != null) {
List preActions = activity.element("pre-actions").elements("action");
List<WfConfigAction> workflowPreActions = new ArrayList<WfConfigAction>();
wfConfigUserActivity.setPreActions(workflowPreActions);
for (int j = 0; preActions != null && j < preActions.size(); j++) {
Element action = (Element)preActions.get(j);
/*���ö�������*/
WfConfigAction workflowAction = new WfConfigAction();
workflowPreActions.add(workflowAction);
workflowAction.setActionId(StringUtils.getAttributeValue(action, "id"));
workflowAction.setActionName(StringUtils.getAttributeValue(action, "name"));
workflowAction.setType(StringUtils.getAttributeValue(action, "type"));
WfConfigArgument arg = new WfConfigArgument();
arg.setArgValue(StringUtils.getElementValue(action, "arg"));
arg.setArgName(StringUtils.getAttributeValue(action.element("arg"), "name"));
workflowAction.setArgument(arg);
}
}
/*�����û���������ִ�к����ڵ�*/
if (activity.element("post-actions") != null) {
List postActions = activity.element("post-actions").elements("action");
List<WfConfigAction> workflowPostActions = new ArrayList<WfConfigAction>();
wfConfigUserActivity.setPostActions(workflowPostActions);
for (int j = 0; postActions != null && j < postActions.size(); j++) {
Element action = (Element)postActions.get(j);
/*���ö�������*/
WfConfigAction workflowAction = new WfConfigAction();
workflowPostActions.add(workflowAction);
workflowAction.setActionId(StringUtils.getAttributeValue(action, "id"));
workflowAction.setActionName(StringUtils.getAttributeValue(action, "name"));
workflowAction.setType(StringUtils.getAttributeValue(action, "type"));
WfConfigArgument arg = new WfConfigArgument();
arg.setArgValue(StringUtils.getElementValue(action, "arg"));
arg.setArgName(StringUtils.getAttributeValue(action.element("arg"), "name"));
workflowAction.setArgument(arg);
}
}
/*ȡ���û�����*/
Element user_policy = activity.element("user-policy");
if (user_policy != null) {
Element entry = user_policy.element("entry");
String entryType = StringUtils.getAttributeValue(entry, "type");
WfConfigUserPolicy wfConfigUserPolicy = new WfConfigUserPolicy();
wfConfigUserPolicy.setEntryType(entryType);
wfConfigUserPolicy.setEntry(StringUtils.getElementValue(user_policy, "entry"));
String type = StringUtils.getAttributeValue(user_policy, "type");
wfConfigUserPolicy.setType(type);
if ("rbac".equals(type)) {
wfConfigUserPolicy.setRoleId(StringUtils.getElementValue(user_policy, "role"));
} else if ("user-input".equals(type)) {
wfConfigUserPolicy.setUserId(StringUtils.getElementValue(user_policy, "user-input"));
}
wfConfigUserActivity.setUserPolicy(wfConfigUserPolicy);
}
}
/**
* ��ȡ�����̻�����Ϣ
* @param activity
* @param workflowActivity
*/
private void fetchSubflowctivity(Element activity, WfConfigActivity workflowActivity) {
WfConfigSubflowActivity wfConfigSubflowActivity = (WfConfigSubflowActivity)workflowActivity;
/*�����û���������ִ��ǰ�����ڵ�*/
if (activity.element("pre-actions") != null) {
List preActions = activity.element("pre-actions").elements("action");
List<WfConfigAction> workflowPreActions = new ArrayList<WfConfigAction>();
wfConfigSubflowActivity.setPreActions(workflowPreActions);
for (int j = 0; preActions != null && j < preActions.size(); j++) {
Element action = (Element)preActions.get(j);
/*���ö�������*/
WfConfigAction workflowAction = new WfConfigAction();
workflowPreActions.add(workflowAction);
workflowAction.setActionId(StringUtils.getAttributeValue(action, "id"));
workflowAction.setActionName(StringUtils.getAttributeValue(action, "name"));
workflowAction.setType(StringUtils.getAttributeValue(action, "type"));
WfConfigArgument arg = new WfConfigArgument();
arg.setArgValue(StringUtils.getElementValue(action, "arg"));
arg.setArgName(StringUtils.getAttributeValue(action.element("arg"), "name"));
workflowAction.setArgument(arg);
}
}
/*�����û���������ִ�к����ڵ�*/
if (activity.element("post-actions") != null) {
List postActions = activity.element("post-actions").elements("action");
List<WfConfigAction> workflowPostActions = new ArrayList<WfConfigAction>();
wfConfigSubflowActivity.setPostActions(workflowPostActions);
for (int j = 0; postActions != null && j < postActions.size(); j++) {
Element action = (Element)postActions.get(j);
/*���ö�������*/
WfConfigAction workflowAction = new WfConfigAction();
workflowPostActions.add(workflowAction);
workflowAction.setActionId(StringUtils.getAttributeValue(action, "id"));
workflowAction.setActionName(StringUtils.getAttributeValue(action, "name"));
workflowAction.setType(StringUtils.getAttributeValue(action, "type"));
WfConfigArgument arg = new WfConfigArgument();
arg.setArgValue(StringUtils.getElementValue(action, "arg"));
arg.setArgName(StringUtils.getAttributeValue(action.element("arg"), "name"));
workflowAction.setArgument(arg);
}
}
/*ȡ�������̱�ʶ*/
wfConfigSubflowActivity.setSubflowId(StringUtils.getElementValue(activity, "subflow"));
}
}