package foundation.action;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.util.MapList;
|
import foundation.util.Util;
|
|
public class WorkflowBuckets {
|
|
protected static Logger logger;
|
private ActionBucket actionBucket;
|
private MapList<String, Workflow> operatorRuntimeWorkflows;
|
private MapList<String, Workflow> objectRuntimeWorkflows;
|
private MapList<String, Workflow> objectWorkflows;
|
private MapList<String, Workflow> beforeObjectStateEventWorkflows;
|
private MapList<String, Workflow> afterObjectStateEventWorkflows;
|
private MapList<String, Workflow> operatorWorkflows;
|
private MapList<String, Workflow> beforeEventWorkflows;
|
private MapList<String, Workflow> afterEventWorkflows;
|
private boolean builded;
|
|
static {
|
logger = LogManager.getLogger(WorkflowBuckets.class);
|
}
|
|
public WorkflowBuckets() {
|
actionBucket = ActionBucket.getInstance();
|
operatorRuntimeWorkflows = new MapList<String, Workflow>();
|
objectRuntimeWorkflows = new MapList<String, Workflow>();
|
|
operatorWorkflows = new MapList<String, Workflow>();
|
beforeEventWorkflows = new MapList<String, Workflow>();
|
afterEventWorkflows = new MapList<String, Workflow>();
|
|
objectWorkflows = new MapList<String, Workflow>();
|
beforeObjectStateEventWorkflows = new MapList<String, Workflow>();
|
afterObjectStateEventWorkflows = new MapList<String, Workflow>();
|
|
builded = false;
|
}
|
|
public void registerOneAction(ActionMeta action) {
|
//1.
|
actionBucket.loadOne(action.getName(), action);
|
|
//2.
|
WorkStep step = new WorkStep(action);
|
String key = WorkStepKey.getOperatorKey(step.getOperator());
|
loadOneWorkStep(operatorWorkflows, key, step);
|
}
|
|
public void registerOneStep(WorkStep step) {
|
//1. 设置 step 的 action
|
String actionName = step.getActionName();
|
ActionMeta action = actionBucket.get(actionName);
|
|
if (action == null) {
|
logger.error("register work flow step error, action not exists: {}", actionName);
|
return;
|
}
|
|
step.setAction(action);
|
|
//2. 非事件触发的方法
|
String eventCode = step.getOnEventCode();
|
String dataName = step.getDataName();
|
|
if (Util.isEmpty(eventCode)) {
|
//2.1 根据 operator 执行的 step,(典型的是 data pipe 下面的方法)
|
if (Util.isEmpty(dataName)) {
|
String key = WorkStepKey.getOperatorKey(step.getOperator());
|
loadOneWorkStep(operatorWorkflows, key, step);
|
return;
|
}
|
|
//2.2 根据 对象 + operator 执行的 step,
|
String key = WorkStepKey.getObjectKey(dataName, step.getOperator());
|
loadOneWorkStep(objectWorkflows, key, step);
|
return;
|
}
|
|
//3. 事件触发的方法,要放到 event work flow 当中
|
Moment moment = step.getMoment();
|
|
if (Moment.Before == moment) {
|
//3.1 根据 operator 执行的 step,(典型的是 data pipe 下面的方法)
|
if (Util.isEmpty(dataName)) {
|
String key = WorkStepKey.getEventKey(moment, step.getOnEventCode());
|
loadOneWorkStep(beforeEventWorkflows, key, step);
|
return;
|
}
|
|
//3.2 根据 对象 + operator 执行的 step
|
String key = WorkStepKey.getObjectEventKey(dataName, moment, step.getOnEventCode());
|
loadOneWorkStep(beforeObjectStateEventWorkflows, key, step);
|
return;
|
}
|
else {
|
//3.1 根据 operator 执行的 step,(典型的是 data pipe 下面的方法)
|
if (Util.isEmpty(dataName)) {
|
String key = WorkStepKey.getEventKey(moment, step.getOnEventCode());
|
loadOneWorkStep(afterEventWorkflows, key, step);
|
}
|
|
//3.2 根据 对象 + operator 执行的 step
|
String key = WorkStepKey.getObjectEventKey(dataName, moment, step.getOnEventCode());
|
loadOneWorkStep(afterObjectStateEventWorkflows, key, step);
|
return;
|
}
|
}
|
|
public List<WorkStep> getWorkflow(String dataName, String operator, String event) throws Exception {
|
//1. 初始化检查
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
build();
|
}
|
}
|
}
|
|
List<WorkStep> result = new ArrayList<WorkStep>();
|
Workflow workflow = null; String key = null;
|
|
//1. before event
|
if (event != null) {
|
key = WorkStepKey.getObjectEventKey(dataName, Moment.Before, event);
|
workflow = beforeObjectStateEventWorkflows.get(key);
|
if (workflow != null) {
|
result.addAll(workflow.getList());
|
}
|
}
|
|
//2. 从对象 + operator + event work flow 里面查找
|
key = WorkStepKey.getObjectKey(dataName, operator);
|
workflow = objectRuntimeWorkflows.get(key);
|
|
//3. 从 operator work flow 里面查找
|
if (workflow == null) {
|
key = WorkStepKey.getOperatorKey(operator);
|
workflow = operatorRuntimeWorkflows.get(key);
|
}
|
|
if (workflow != null) {
|
result.addAll(workflow.getList());
|
}
|
|
//4.
|
if (event != null) {
|
key = WorkStepKey.getObjectEventKey(dataName, Moment.After, event);
|
workflow = afterObjectStateEventWorkflows.get(key);
|
if (workflow != null) {
|
result.addAll(workflow.getList());
|
}
|
}
|
|
return result;
|
}
|
|
public List<WorkStep> getWorkflow(String dataName, Moment moment, String event) {
|
//1. 初始化检查
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
build();
|
}
|
}
|
}
|
|
Workflow result = null;
|
|
//2. 从对象 + event work flow 里面查找
|
String key = WorkStepKey.getObjectEventKey(dataName, moment, event);
|
|
if (Moment.Before == moment) {
|
result = beforeObjectStateEventWorkflows.get(key);
|
}
|
else if (Moment.After == moment) {
|
result = afterObjectStateEventWorkflows.get(key);
|
}
|
|
if (result == null) {
|
return null;
|
}
|
|
return result.getList();
|
}
|
|
public void build() {
|
String key; String dataName; Events fireEvents;
|
|
//1. 加载 object work flow
|
for (Workflow workflow: objectWorkflows) {
|
key = workflow.getKey();
|
Workflow runtime = new Workflow(key);
|
objectRuntimeWorkflows.add(key, runtime);
|
|
for (WorkStep step: workflow) {
|
dataName = step.getDataName();
|
fireEvents = step.getFireEvents();
|
|
if (fireEvents == null) {
|
runtime.loadOne(step);
|
continue;
|
}
|
|
//2.1 加载 before event step
|
for (String fireEvent: fireEvents) {
|
key = WorkStepKey.getEventKey(Moment.Before, fireEvent);
|
loadOneEventFlow(runtime, key, beforeEventWorkflows);
|
|
key = WorkStepKey.getObjectEventKey(dataName, Moment.Before, fireEvent);
|
loadOneEventFlow(runtime, key, beforeObjectStateEventWorkflows);
|
}
|
|
//2.2 加载当期 step
|
runtime.loadOne(step);
|
|
//2.3 加载 after event step
|
int max = fireEvents.size() - 1;
|
|
for (int i = max; i >= 0; i--) {
|
String fireEvent = fireEvents.get(i);
|
|
key = WorkStepKey.getObjectEventKey(dataName, Moment.After, fireEvent);
|
loadOneEventFlow(runtime, key, afterObjectStateEventWorkflows);
|
|
key = WorkStepKey.getEventKey(Moment.After, fireEvent);
|
loadOneEventFlow(runtime, key, afterEventWorkflows);
|
}
|
}
|
}
|
|
//2. 加载 operator work flow
|
for (Workflow workflow: operatorWorkflows) {
|
key = workflow.getKey();
|
Workflow runtime = new Workflow(key);
|
operatorRuntimeWorkflows.add(key, runtime);
|
|
for (WorkStep step: workflow) {
|
dataName = step.getDataName();
|
fireEvents = step.getFireEvents();
|
|
if (fireEvents == null) {
|
runtime.loadOne(step);
|
continue;
|
}
|
|
//2.1 加载 before event step
|
for (String fireEvent: fireEvents) {
|
key = WorkStepKey.getEventKey(Moment.Before, fireEvent);
|
loadOneEventFlow(runtime, key, beforeEventWorkflows);
|
}
|
|
//2.2 加载当期 step
|
runtime.loadOne(step);
|
|
//2.3 加载 after event step
|
int max = fireEvents.size() - 1;
|
|
for (int i = max; i >= 0; i--) {
|
String fireEvent = fireEvents.get(i);
|
|
key = WorkStepKey.getEventKey(Moment.After, fireEvent);
|
loadOneEventFlow(runtime, key, afterEventWorkflows);
|
}
|
}
|
}
|
|
builded = true;
|
}
|
|
private void loadOneEventFlow(Workflow runtime, String key, MapList<String, Workflow> eventWorkflows) {
|
Workflow eventFlow = eventWorkflows.get(key);
|
|
if (eventFlow != null) {
|
List<WorkStep> steps = eventFlow.getList();
|
|
for (WorkStep step: steps) {
|
runtime.loadOne(step);
|
}
|
}
|
}
|
|
private void loadOneWorkStep(MapList<String, Workflow> workflows, String key, WorkStep step) {
|
Workflow workflow = workflows.get(key);
|
|
if (workflow == null) {
|
workflow = new Workflow(key);
|
workflows.add(key, workflow);
|
}
|
|
workflow.loadOne(step);
|
}
|
|
}
|