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 operatorRuntimeWorkflows; private MapList objectRuntimeWorkflows; private MapList objectWorkflows; private MapList beforeObjectStateEventWorkflows; private MapList afterObjectStateEventWorkflows; private MapList operatorWorkflows; private MapList beforeEventWorkflows; private MapList afterEventWorkflows; private boolean builded; static { logger = LogManager.getLogger(WorkflowBuckets.class); } public WorkflowBuckets() { actionBucket = ActionBucket.getInstance(); operatorRuntimeWorkflows = new MapList(); objectRuntimeWorkflows = new MapList(); operatorWorkflows = new MapList(); beforeEventWorkflows = new MapList(); afterEventWorkflows = new MapList(); objectWorkflows = new MapList(); beforeObjectStateEventWorkflows = new MapList(); afterObjectStateEventWorkflows = new MapList(); 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 getWorkflow(String dataName, String operator, String event) throws Exception { //1. 初始化检查 if (!builded) { synchronized (this) { if (!builded) { build(); } } } List result = new ArrayList(); 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 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 eventWorkflows) { Workflow eventFlow = eventWorkflows.get(key); if (eventFlow != null) { List steps = eventFlow.getList(); for (WorkStep step: steps) { runtime.loadOne(step); } } } private void loadOneWorkStep(MapList workflows, String key, WorkStep step) { Workflow workflow = workflows.get(key); if (workflow == null) { workflow = new Workflow(key); workflows.add(key, workflow); } workflow.loadOne(step); } }