Copy disabled (too large)
Download .txt
Showing preview only (17,246K chars total). Download the full file to get everything.
Repository: JDEasyFlow/jd-easyflow
Branch: master
Commit: c777019f49ff
Files: 1205
Total size: 16.1 MB
Directory structure:
gitextract_yjh79igv/
├── .gitignore
├── LICENSE.txt
├── NOTICE.txt
├── README-zh.md
├── README.md
├── easyflow-flow/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jd/
│ │ │ └── easyflow/
│ │ │ └── flow/
│ │ │ ├── common/
│ │ │ │ └── FlowExecutor.java
│ │ │ ├── el/
│ │ │ │ ├── ElEvaluator.java
│ │ │ │ ├── ElFactory.java
│ │ │ │ ├── ElRootMap.java
│ │ │ │ └── SpelEvaluator.java
│ │ │ ├── engine/
│ │ │ │ ├── FlowContext.java
│ │ │ │ ├── FlowEngine.java
│ │ │ │ ├── FlowParam.java
│ │ │ │ ├── FlowResult.java
│ │ │ │ ├── FlowRunner.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── FlowParamBuilder.java
│ │ │ │ ├── event/
│ │ │ │ │ ├── BaseFlowEventListener.java
│ │ │ │ │ ├── ExpFlowEventListener.java
│ │ │ │ │ ├── FlowEvent.java
│ │ │ │ │ ├── FlowEventListener.java
│ │ │ │ │ ├── FlowEventTrigger.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── EventFlowListener.java
│ │ │ │ │ └── InterruptFlowListener.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── FlowEngineFilter.java
│ │ │ │ │ ├── FlowEngineFilterManager.java
│ │ │ │ │ └── impl/
│ │ │ │ │ └── BaseFlowEngineFilter.java
│ │ │ │ └── impl/
│ │ │ │ ├── BaseFlowRunner.java
│ │ │ │ ├── CoreFlowEngine.java
│ │ │ │ ├── ExpFlowRunner.java
│ │ │ │ ├── FlowContextImpl.java
│ │ │ │ ├── FlowEngineImpl.java
│ │ │ │ ├── MultipleThreadFlowRunner.java
│ │ │ │ ├── ReusableThreadFlowRunner.java
│ │ │ │ └── SingleThreadFlowRunner.java
│ │ │ ├── exception/
│ │ │ │ └── FlowException.java
│ │ │ ├── filter/
│ │ │ │ ├── BaseFilter.java
│ │ │ │ ├── ExpFilter.java
│ │ │ │ ├── Filter.java
│ │ │ │ ├── FilterChain.java
│ │ │ │ └── FilterChainImpl.java
│ │ │ ├── model/
│ │ │ │ ├── Flow.java
│ │ │ │ ├── FlowLifeCycle.java
│ │ │ │ ├── FlowNode.java
│ │ │ │ ├── FlowPostHandler.java
│ │ │ │ ├── FlowPreHandler.java
│ │ │ │ ├── InitContext.java
│ │ │ │ ├── NodeAction.java
│ │ │ │ ├── NodeContext.java
│ │ │ │ ├── NodeContextAccessor.java
│ │ │ │ ├── NodeExecutor.java
│ │ │ │ ├── NodePostHandler.java
│ │ │ │ ├── NodePreHandler.java
│ │ │ │ ├── action/
│ │ │ │ │ ├── ActionResultEl.java
│ │ │ │ │ ├── CompensateNodeAction.java
│ │ │ │ │ ├── EventNodeAction.java
│ │ │ │ │ ├── ExecutorNodeAction.java
│ │ │ │ │ ├── ExpNodeAction.java
│ │ │ │ │ ├── FlowNodeAction.java
│ │ │ │ │ ├── InterruptNodeAction.java
│ │ │ │ │ ├── LoopNodeAction.java
│ │ │ │ │ ├── ParamExecutorNodeAction.java
│ │ │ │ │ └── compensate/
│ │ │ │ │ ├── CompensateAction.java
│ │ │ │ │ ├── CompensateFlowFilter.java
│ │ │ │ │ ├── CompensateFlowParseEventListener.java
│ │ │ │ │ ├── CompensateHelper.java
│ │ │ │ │ ├── CompensateNodeFilter.java
│ │ │ │ │ ├── CompensateNodePreHandlerFilter.java
│ │ │ │ │ └── FlowCompensateAction.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── FlowBuilder.java
│ │ │ │ ├── definition/
│ │ │ │ │ └── DefConstants.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── FlowFilter.java
│ │ │ │ │ ├── FlowFilterManager.java
│ │ │ │ │ ├── FlowPostHandlerFilter.java
│ │ │ │ │ ├── FlowPreHandlerFilter.java
│ │ │ │ │ ├── NodeActionFilter.java
│ │ │ │ │ ├── NodeFilter.java
│ │ │ │ │ ├── NodePostHandlerFilter.java
│ │ │ │ │ ├── NodePreHandlerFilter.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── BaseFlowFilter.java
│ │ │ │ │ ├── BaseFlowPostHandlerFilter.java
│ │ │ │ │ ├── BaseFlowPreHandlerFilter.java
│ │ │ │ │ ├── BaseNodeActionFilter.java
│ │ │ │ │ ├── BaseNodeFilter.java
│ │ │ │ │ ├── BaseNodePostHandlerFilter.java
│ │ │ │ │ └── BaseNodePreHandlerFilter.java
│ │ │ │ ├── flow/
│ │ │ │ │ ├── post/
│ │ │ │ │ │ └── ExpFlowPostHandler.java
│ │ │ │ │ └── pre/
│ │ │ │ │ └── ExpFlowPreHandler.java
│ │ │ │ ├── node/
│ │ │ │ │ └── NodeImpl.java
│ │ │ │ ├── parser/
│ │ │ │ │ ├── FlowParser.java
│ │ │ │ │ ├── FlowParserImpl.java
│ │ │ │ │ ├── event/
│ │ │ │ │ │ ├── ExpFlowParseEventListener.java
│ │ │ │ │ │ ├── FlowParseEvent.java
│ │ │ │ │ │ ├── FlowParseEventListener.java
│ │ │ │ │ │ └── FlowParseEventTypes.java
│ │ │ │ │ └── param/
│ │ │ │ │ ├── ActionParseParam.java
│ │ │ │ │ ├── FlowParseParam.java
│ │ │ │ │ ├── PostParseParam.java
│ │ │ │ │ └── PreParseParam.java
│ │ │ │ ├── post/
│ │ │ │ │ ├── AbstractNodePostHandler.java
│ │ │ │ │ ├── ConditionalNodePostHandler.java
│ │ │ │ │ ├── EventPostHandler.java
│ │ │ │ │ ├── ExecutorNodePostHandler.java
│ │ │ │ │ ├── ExpNodePostHandler.java
│ │ │ │ │ └── FixedNodePostHandler.java
│ │ │ │ └── pre/
│ │ │ │ ├── ExpNodePreHandler.java
│ │ │ │ ├── InclusiveCheckPreHandler.java
│ │ │ │ ├── MultiCheckPreHandler.java
│ │ │ │ ├── NodePreHandlerHelper.java
│ │ │ │ └── NodePrePropertyGetter.java
│ │ │ └── util/
│ │ │ ├── ExceptionUtil.java
│ │ │ ├── FlowConstants.java
│ │ │ ├── FlowEventTypes.java
│ │ │ ├── FlowIOUtil.java
│ │ │ ├── FlowNodeLinkUtil.java
│ │ │ ├── FlowStringUtil.java
│ │ │ ├── FlowUtil.java
│ │ │ ├── JsonFacade.java
│ │ │ ├── JsonFacadeJacksonImpl.java
│ │ │ ├── JsonPrettyHelper.java
│ │ │ ├── JsonUtil.java
│ │ │ ├── LockUtil.java
│ │ │ ├── Pair.java
│ │ │ └── Triple.java
│ │ └── resources/
│ │ └── pretty/
│ │ └── pretty-flow.json
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── jd/
│ │ └── easyflow/
│ │ └── flow/
│ │ ├── FlowTestSuite.java
│ │ ├── cases/
│ │ │ ├── action/
│ │ │ │ ├── ActionTest.java
│ │ │ │ ├── CompensateTest.java
│ │ │ │ ├── LoopNodeActionTest.java
│ │ │ │ ├── MockActionClass.java
│ │ │ │ ├── MockClassMethodAction.java
│ │ │ │ ├── MockInputOutputEventListener.java
│ │ │ │ └── MultipleActionTest.java
│ │ │ ├── common/
│ │ │ │ └── TestNodeExecutor.java
│ │ │ ├── event/
│ │ │ │ ├── EventFlowTest.java
│ │ │ │ └── TestEventNodeAction.java
│ │ │ ├── filter/
│ │ │ │ └── FilterTest.java
│ │ │ ├── flowengine/
│ │ │ │ ├── FlowEngineImplTest.java
│ │ │ │ ├── PocFlowEngineImpl.java
│ │ │ │ └── PocNodeImpl.java
│ │ │ ├── inclusive/
│ │ │ │ └── InclusiveTest.java
│ │ │ ├── interrupt/
│ │ │ │ └── InterruptTest.java
│ │ │ ├── listener/
│ │ │ │ └── InterruptFlowListenerTest.java
│ │ │ ├── logflag/
│ │ │ │ └── LogFlagTest.java
│ │ │ ├── mockbiz/
│ │ │ │ ├── CheckBiz.java
│ │ │ │ ├── LimitBiz.java
│ │ │ │ ├── LoanBiz.java
│ │ │ │ ├── LoanContractSignBiz.java
│ │ │ │ ├── MockFlowListener.java
│ │ │ │ └── MockLoanTest.java
│ │ │ ├── parallel/
│ │ │ │ └── ParallelTest.java
│ │ │ ├── parser/
│ │ │ │ ├── FlowParserTest.java
│ │ │ │ ├── TestAddFilterParseListener.java
│ │ │ │ ├── TestFlowParamAndResultPrintFilter.java
│ │ │ │ ├── TestFlowParseListener.java
│ │ │ │ └── TestFlowParserImpl.java
│ │ │ ├── performance/
│ │ │ │ ├── EmptyStepAction.java
│ │ │ │ ├── LoopStepAction.java
│ │ │ │ ├── MemoryTest.java
│ │ │ │ └── PerformanceTest.java
│ │ │ ├── posthandler/
│ │ │ │ ├── ConditionalPostHandlerTest.java
│ │ │ │ ├── FlowIndexTest.java
│ │ │ │ ├── NodePostHandlerTest.java
│ │ │ │ ├── PostHandlerFilterTest.java
│ │ │ │ ├── PostParamNode1Action.java
│ │ │ │ ├── PostParamNode2Action.java
│ │ │ │ ├── PostParamNode3Action.java
│ │ │ │ └── TestPostHandlerFilter.java
│ │ │ ├── prehandler/
│ │ │ │ └── PreHandlerTest.java
│ │ │ ├── pretty/
│ │ │ │ └── FlowDefPrettyHelperTest.java
│ │ │ ├── runner/
│ │ │ │ ├── MultiThreadTest.java
│ │ │ │ ├── ReusableThreadTest.java
│ │ │ │ ├── TestInterruptNodeAction.java
│ │ │ │ ├── TestMultiRunner.java
│ │ │ │ └── TestReusableThreadRunner.java
│ │ │ ├── share/
│ │ │ │ └── nodeaction/
│ │ │ │ └── TestStepAction.java
│ │ │ ├── spring/
│ │ │ │ └── SpringFlowTest.java
│ │ │ └── subflow/
│ │ │ ├── SubFlowTest.java
│ │ │ └── TestInvokeSubFlowNodeAction.java
│ │ ├── quickstart/
│ │ │ ├── QuickStart001Node01Action.java
│ │ │ ├── QuickStart002Node01Action.java
│ │ │ ├── QuickStart003Node01Action.java
│ │ │ └── QuickStartTest.java
│ │ └── unit/
│ │ └── util/
│ │ ├── JsonTest.java
│ │ └── TreeMapTest.java
│ └── resources/
│ ├── flow/
│ │ ├── cases/
│ │ │ ├── action/
│ │ │ │ ├── action_interrupt_001.json
│ │ │ │ ├── compensate_001.json
│ │ │ │ ├── compensate_002.json
│ │ │ │ ├── compensate_flow_001.json
│ │ │ │ ├── loop_test_001.json
│ │ │ │ └── multiple_action_001.json
│ │ │ ├── event/
│ │ │ │ ├── flow_event_001.json
│ │ │ │ ├── flow_event_002.json
│ │ │ │ ├── flow_event_003.json
│ │ │ │ └── flow_event_nolistener_001.json
│ │ │ ├── filter/
│ │ │ │ ├── inner_flow_engine_filter_001.json
│ │ │ │ ├── inner_flow_filter_001.json
│ │ │ │ └── inner_node_action_filter_001.json
│ │ │ ├── inclusive/
│ │ │ │ ├── flow_inclusive201.json
│ │ │ │ ├── flow_inclusive202.json
│ │ │ │ ├── flow_inclusive203.json
│ │ │ │ └── flow_inclusive303.json
│ │ │ ├── interrupt/
│ │ │ │ ├── interrupt_001.json
│ │ │ │ └── interrupt_002.json
│ │ │ ├── listener/
│ │ │ │ ├── interrupt_listener_001.json
│ │ │ │ ├── interrupt_listener_002.json
│ │ │ │ └── interrupt_listener_003.json
│ │ │ ├── logflag/
│ │ │ │ └── logflag_001.json
│ │ │ ├── mockbiz/
│ │ │ │ └── mock_loan_001.json
│ │ │ ├── parallel/
│ │ │ │ └── flow_parallel001.json
│ │ │ ├── parser/
│ │ │ │ ├── flow_multiple001.json
│ │ │ │ ├── parser_test_001.json
│ │ │ │ ├── parser_test_002.json
│ │ │ │ ├── parser_test_003.json
│ │ │ │ ├── parser_test_subflow_001.json
│ │ │ │ └── parser_test_subflow_002.json
│ │ │ ├── performance/
│ │ │ │ ├── flow_memory001.json
│ │ │ │ └── flow_performance001.json
│ │ │ ├── posthandler/
│ │ │ │ ├── flow_createexp_post_to_001.json
│ │ │ │ ├── flow_exp_post_to_001.json
│ │ │ │ ├── flow_index001.json
│ │ │ │ ├── flow_post_handler_filter_001.json
│ │ │ │ ├── flow_post_param_001.json
│ │ │ │ ├── flow_postdata_001.json
│ │ │ │ └── flow_when_createexp_001.json
│ │ │ ├── prehandler/
│ │ │ │ └── flow_prehandler_001.json
│ │ │ ├── pretty/
│ │ │ │ ├── pretty_multiple_test.json
│ │ │ │ └── pretty_test.json
│ │ │ ├── runner/
│ │ │ │ ├── flow_interrupt001.json
│ │ │ │ ├── flow_interrupt002.json
│ │ │ │ ├── flow_interrupt003.json
│ │ │ │ ├── flow_multi001.json
│ │ │ │ ├── flow_multi002.json
│ │ │ │ ├── flow_multi003.json
│ │ │ │ ├── flow_multi004.json
│ │ │ │ ├── flow_reusable001.json
│ │ │ │ ├── flow_reusable002.json
│ │ │ │ ├── flow_reusable003.json
│ │ │ │ └── flow_reusable004.json
│ │ │ ├── spring/
│ │ │ │ ├── applicationContext-flow-test.xml
│ │ │ │ └── flow_spring_001.json
│ │ │ └── subflow/
│ │ │ ├── flow_subflow_001.json
│ │ │ ├── flow_subflow_002.json
│ │ │ ├── flow_subflow_002_01.json
│ │ │ ├── flow_subflow_003.json
│ │ │ └── flow_subflow_003_01.json
│ │ └── quickstart/
│ │ └── quickstart_001.json
│ └── logback.xml
├── easyflow-flow-bpmn/
│ ├── BPMNDesigner.html
│ ├── pom.xml
│ ├── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ ├── .gitkeep
│ │ │ └── com/
│ │ │ └── jd/
│ │ │ └── easyflow/
│ │ │ └── flow/
│ │ │ └── bpmn/
│ │ │ ├── BpmnFlowParser.java
│ │ │ └── converter/
│ │ │ ├── BaseFlowNodeConverter.java
│ │ │ ├── BpmnConverter.java
│ │ │ ├── FlowNodeConverter.java
│ │ │ ├── activity/
│ │ │ │ ├── AdhocSubProcessConverter.java
│ │ │ │ ├── BusinessRuleTaskConverter.java
│ │ │ │ ├── CallActivityConverter.java
│ │ │ │ ├── EventSubProcessConverter.java
│ │ │ │ ├── ManualTaskConverter.java
│ │ │ │ ├── ReceiveTaskConverter.java
│ │ │ │ ├── ScriptTaskConverter.java
│ │ │ │ ├── SendTaskConverter.java
│ │ │ │ ├── ServiceTaskConverter.java
│ │ │ │ ├── SubProcessConverter.java
│ │ │ │ ├── TaskConverter.java
│ │ │ │ ├── TransactionConverter.java
│ │ │ │ └── UserTaskConverter.java
│ │ │ ├── event/
│ │ │ │ ├── EndEventConverter.java
│ │ │ │ ├── IntermediateCatchEventConverter.java
│ │ │ │ ├── StartEventConverter.java
│ │ │ │ └── ThrowEventConverter.java
│ │ │ ├── gateway/
│ │ │ │ ├── ComplexGatewayConverter.java
│ │ │ │ ├── EventGatewayConverter.java
│ │ │ │ ├── ExclusiveGatewayConverter.java
│ │ │ │ ├── InclusiveGatewayConverter.java
│ │ │ │ └── ParallelGatewayConverter.java
│ │ │ └── util/
│ │ │ ├── BpmnXmlConstants.java
│ │ │ └── ConvertUtil.java
│ │ └── test/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jd/
│ │ │ └── easyflow/
│ │ │ └── flow/
│ │ │ └── bpmn/
│ │ │ ├── FlowBpmnTestSuite.java
│ │ │ ├── cases/
│ │ │ │ ├── callactivity/
│ │ │ │ │ └── BpmnCallActivityTest.java
│ │ │ │ ├── chain/
│ │ │ │ │ └── FlowChainTest.java
│ │ │ │ ├── converter/
│ │ │ │ │ ├── BpmnConverterTest.java
│ │ │ │ │ └── BpmnTestService.java
│ │ │ │ ├── defaultflow/
│ │ │ │ │ └── DefaultFlowTest.java
│ │ │ │ ├── extension/
│ │ │ │ │ └── BpmnExtensionTest.java
│ │ │ │ ├── inclusive/
│ │ │ │ │ └── BpmnInclusiveTest.java
│ │ │ │ ├── logflag/
│ │ │ │ │ └── LogFlagTest.java
│ │ │ │ ├── parallel/
│ │ │ │ │ └── BpmnParallelTest.java
│ │ │ │ ├── share/
│ │ │ │ │ └── nodeaction/
│ │ │ │ │ ├── TestEventNodeAction.java
│ │ │ │ │ └── TestStepAction.java
│ │ │ │ ├── subprocess/
│ │ │ │ │ └── BpmnSubProcessTest.java
│ │ │ │ ├── terminate/
│ │ │ │ │ └── BpmnTerminateTest.java
│ │ │ │ └── throwevent/
│ │ │ │ └── BpmnThrowEventTest.java
│ │ │ ├── ext/
│ │ │ │ └── cases/
│ │ │ │ └── chain/
│ │ │ │ ├── ChainTest.java
│ │ │ │ ├── ChainTestService.java
│ │ │ │ ├── Plugin1.java
│ │ │ │ ├── Plugin2.java
│ │ │ │ └── Plugin3.java
│ │ │ └── quickstart/
│ │ │ ├── QuickStart001Node01Action.java
│ │ │ ├── QuickStart002Node01Action.java
│ │ │ ├── QuickStart003Node01Action.java
│ │ │ └── QuickStartTest.java
│ │ └── resources/
│ │ ├── flow/
│ │ │ ├── cases/
│ │ │ │ ├── callactivity/
│ │ │ │ │ ├── flow_callactivity_test_001.bpmn
│ │ │ │ │ └── flow_sub_of_called.bpmn
│ │ │ │ ├── chain/
│ │ │ │ │ └── flow_chaintest1.bpmn
│ │ │ │ ├── converter/
│ │ │ │ │ ├── compensate001.bpmn
│ │ │ │ │ ├── flow001.json
│ │ │ │ │ ├── flow_multiple_001.bpmn
│ │ │ │ │ ├── process_1.bpmn
│ │ │ │ │ └── process_1_simple.bpmn
│ │ │ │ ├── defaultflow/
│ │ │ │ │ └── default_flow_001.bpmn
│ │ │ │ ├── extension/
│ │ │ │ │ └── process_1.bpmn
│ │ │ │ ├── inclusive/
│ │ │ │ │ ├── flow_inclusive001.bpmn
│ │ │ │ │ └── flow_inclusive002.bpmn
│ │ │ │ ├── logflag/
│ │ │ │ │ └── logflag_001.bpmn
│ │ │ │ ├── parallel/
│ │ │ │ │ ├── flow_multi_parallel_subflow_001.bpmn
│ │ │ │ │ └── flow_parallel001.bpmn
│ │ │ │ ├── subprocess/
│ │ │ │ │ └── flow_subprocess_test_001.bpmn
│ │ │ │ ├── terminate/
│ │ │ │ │ └── flow_terminate001.bpmn
│ │ │ │ └── throwevent/
│ │ │ │ └── flow_throwevent001.bpmn
│ │ │ ├── ext/
│ │ │ │ └── cases/
│ │ │ │ └── chain/
│ │ │ │ └── flow_chaintest1.bpmn
│ │ │ └── quickstart/
│ │ │ └── quickstart_001.bpmn
│ │ └── logback.xml
│ └── static/
│ ├── plugins/
│ │ ├── bootstrap/
│ │ │ ├── css/
│ │ │ │ ├── bootstrap-grid.css
│ │ │ │ ├── bootstrap-reboot.css
│ │ │ │ └── bootstrap.css
│ │ │ └── js/
│ │ │ ├── bootstrap.bundle.js
│ │ │ └── bootstrap.js
│ │ ├── bootstrap-multiselect/
│ │ │ ├── css/
│ │ │ │ └── bootstrap-multiselect.css
│ │ │ ├── js/
│ │ │ │ └── bootstrap-multiselect.js
│ │ │ └── less/
│ │ │ └── bootstrap-multiselect.less
│ │ ├── bpmnjs/
│ │ │ ├── assets/
│ │ │ │ ├── bpmn-font/
│ │ │ │ │ └── css/
│ │ │ │ │ ├── bpmn-codes.css
│ │ │ │ │ ├── bpmn-embedded.css
│ │ │ │ │ └── bpmn.css
│ │ │ │ ├── bpmn-js.css
│ │ │ │ └── diagram-js.css
│ │ │ ├── bpmn-modeler.development.js
│ │ │ ├── bpmn-navigated-viewer.development.js
│ │ │ ├── bpmn-viewer.development.js
│ │ │ └── changeForEasyflow/
│ │ │ ├── changelog.txt
│ │ │ └── rollup.config.js
│ │ ├── flow/
│ │ │ ├── bpmn.js
│ │ │ ├── flow.css
│ │ │ └── flow.js
│ │ ├── fontawesome/
│ │ │ └── css/
│ │ │ └── all.css
│ │ ├── jquery/
│ │ │ └── jquery-3.6.0.js
│ │ ├── jquery-validation/
│ │ │ └── jquery.validate.js
│ │ └── std-common/
│ │ ├── common.css
│ │ ├── common.js
│ │ ├── messages_default.js
│ │ └── messages_zh.js
│ └── test/
│ └── JsonPropertyEditor.html
├── easyflow-flow-extension/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── jd/
│ │ └── easyflow/
│ │ └── flow/
│ │ └── ext/
│ │ ├── chain/
│ │ │ ├── BaseChainPlugin.java
│ │ │ ├── ChainConstants.java
│ │ │ ├── ChainInvoker.java
│ │ │ └── TargetAction.java
│ │ ├── check/
│ │ │ ├── CheckErrorItem.java
│ │ │ ├── CheckParam.java
│ │ │ ├── CheckResult.java
│ │ │ ├── FlowChecker.java
│ │ │ └── impl/
│ │ │ ├── AllFlowNodeLinkChecker.java
│ │ │ ├── ExpNodeActionDotCheckFlowParseListener.java
│ │ │ ├── FlowNodeLinkCheckConfig.java
│ │ │ ├── FlowNodeLinkCheckFlowParseListener.java
│ │ │ ├── FlowNodeLinkChecker.java
│ │ │ ├── InfiniteLoopCheckFlowParseListener.java
│ │ │ └── SubFlowCheckFlowParseListener.java
│ │ ├── funcall/
│ │ │ ├── FunCallConstants.java
│ │ │ ├── FunCallEventListener.java
│ │ │ ├── FunCallFlowPostHandler.java
│ │ │ ├── FunCallFlowPreHandler.java
│ │ │ └── FunCallNodeAction.java
│ │ ├── interrupt/
│ │ │ ├── ExtInterruptNodeAction.java
│ │ │ ├── ExtNodeThreadHolder.java
│ │ │ ├── ExtNodeThreadInterruptFlowFilter.java
│ │ │ ├── ExtNodeThreadInterruptHelper.java
│ │ │ └── ExtNodeThreadInterruptNodeFilter.java
│ │ ├── model/
│ │ │ └── action/
│ │ │ ├── JavaScriptNodeAction.java
│ │ │ └── ShellNodeAction.java
│ │ ├── serialize/
│ │ │ ├── FlowParamAssembleData.java
│ │ │ ├── FlowParamAssembleManager.java
│ │ │ ├── FlowParamAssembler.java
│ │ │ ├── FlowParamSerializeManager.java
│ │ │ ├── FlowParamSerializer.java
│ │ │ └── impl/
│ │ │ ├── BaseFlowParamSerializer.java
│ │ │ ├── DefaultFlowParamAssembler.java
│ │ │ ├── JavaFlowParamSerializer.java
│ │ │ └── JsonFlowParamSerializer.java
│ │ ├── session/
│ │ │ ├── FlowSession.java
│ │ │ ├── FlowSessionConstants.java
│ │ │ ├── FlowSessionImpl.java
│ │ │ └── SessionMultiCheckPreHandler.java
│ │ └── timeout/
│ │ ├── TimeoutFlowFilter.java
│ │ ├── TimeoutNodeActionFilter.java
│ │ └── TimeoutTemplate.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── jd/
│ │ └── easyflow/
│ │ └── flow/
│ │ └── ext/
│ │ ├── FlowExtTestSuite.java
│ │ ├── cases/
│ │ │ ├── chain/
│ │ │ │ ├── ChainTest.java
│ │ │ │ ├── ChainTestService.java
│ │ │ │ ├── Filter1.java
│ │ │ │ ├── Filter2.java
│ │ │ │ ├── Filter3.java
│ │ │ │ ├── Plugin1.java
│ │ │ │ ├── Plugin2.java
│ │ │ │ └── Plugin3.java
│ │ │ ├── check/
│ │ │ │ ├── FlowNodeLinkCheckTest.java
│ │ │ │ └── InfiniteLoopCheckTest.java
│ │ │ ├── funcall/
│ │ │ │ ├── FunCallTest.java
│ │ │ │ └── MockActionClass.java
│ │ │ ├── interrupt/
│ │ │ │ └── ExtInterruptTest.java
│ │ │ ├── model/
│ │ │ │ └── action/
│ │ │ │ ├── JavaScriptNodeActionTest.java
│ │ │ │ └── ShellNodeActionTest.java
│ │ │ ├── session/
│ │ │ │ ├── MockRequestAsyncCall.java
│ │ │ │ └── SessionFlowTest.java
│ │ │ └── timeout/
│ │ │ ├── TestTimeoutNodeAction.java
│ │ │ └── TimeoutFilterTest.java
│ │ └── serialize/
│ │ └── impl/
│ │ └── JsonFlowParamSerializerTest.java
│ └── resources/
│ └── flow/
│ └── cases/
│ ├── chain/
│ │ └── flow_chaintest2.json
│ ├── check/
│ │ ├── check_infinite_loop_001.json
│ │ ├── check_infinite_loop_002.json
│ │ ├── check_infinite_loop_003.json
│ │ ├── check_isolated_001.json
│ │ ├── check_isolated_002.json
│ │ ├── check_nonEnd_001.json
│ │ ├── check_nonStart_001.json
│ │ ├── check_notexists_001.json
│ │ └── check_preCheckNodesNotExists_001.json
│ ├── funcall/
│ │ ├── funcall_test_001.json
│ │ └── funcall_test_002.json
│ ├── interrupt/
│ │ └── ext_interrupt_001.json
│ ├── model/
│ │ └── action/
│ │ ├── javascript_test_001.json
│ │ └── shell_test_001.json
│ ├── session/
│ │ └── flow_session_001.json
│ └── timeout/
│ ├── flow_timeout_001.json
│ └── flow_timeout_002.json
├── easyflow-fsm/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── jd/
│ │ └── easyflow/
│ │ └── fsm/
│ │ ├── CoreFsmManager.java
│ │ ├── Fsm.java
│ │ ├── FsmContext.java
│ │ ├── FsmManager.java
│ │ ├── FsmParam.java
│ │ ├── FsmResult.java
│ │ ├── builder/
│ │ │ ├── FsmBuilder.java
│ │ │ └── FsmContextBuilder.java
│ │ ├── el/
│ │ │ ├── ElEvaluator.java
│ │ │ ├── ElFactory.java
│ │ │ ├── ElRootMap.java
│ │ │ └── SpelEvaluator.java
│ │ ├── event/
│ │ │ ├── ExpFsmEventListener.java
│ │ │ ├── FsmEvent.java
│ │ │ ├── FsmEventListener.java
│ │ │ └── FsmEventTrigger.java
│ │ ├── exception/
│ │ │ └── FsmException.java
│ │ ├── filter/
│ │ │ ├── ExpFilter.java
│ │ │ ├── Filter.java
│ │ │ └── FilterChain.java
│ │ ├── listener/
│ │ │ └── FsmCommonListener.java
│ │ ├── model/
│ │ │ ├── Event.java
│ │ │ ├── FsmLifeCycle.java
│ │ │ ├── FsmPostHandler.java
│ │ │ ├── FsmPreHandler.java
│ │ │ ├── InitContext.java
│ │ │ ├── PostHandleResult.java
│ │ │ ├── State.java
│ │ │ ├── Transition.java
│ │ │ ├── TransitionAction.java
│ │ │ ├── TransitionContext.java
│ │ │ ├── TransitionExecutor.java
│ │ │ ├── TransitionPostHandler.java
│ │ │ ├── TransitionPreHandler.java
│ │ │ ├── builder/
│ │ │ │ └── TransitionBuilder.java
│ │ │ ├── check/
│ │ │ │ ├── CheckErrorItem.java
│ │ │ │ ├── CheckParam.java
│ │ │ │ ├── CheckResult.java
│ │ │ │ ├── FsmChecker.java
│ │ │ │ └── impl/
│ │ │ │ ├── AllFsmStateLinkChecker.java
│ │ │ │ ├── FsmStateLinkCheckConfig.java
│ │ │ │ ├── FsmStateLinkCheckFsmParseListener.java
│ │ │ │ └── FsmStateLinkChecker.java
│ │ │ ├── definition/
│ │ │ │ └── DefConstants.java
│ │ │ └── impl/
│ │ │ ├── EventImpl.java
│ │ │ ├── StateImpl.java
│ │ │ ├── TransitionImpl.java
│ │ │ ├── action/
│ │ │ │ ├── ActionResultEl.java
│ │ │ │ └── ExpTransitionAction.java
│ │ │ ├── fsm/
│ │ │ │ ├── post/
│ │ │ │ │ └── ExpFsmPostHandler.java
│ │ │ │ └── pre/
│ │ │ │ └── ExpFsmPreHandler.java
│ │ │ ├── post/
│ │ │ │ ├── AbstractTransitionPostHandler.java
│ │ │ │ ├── ConditionalTransitionPostHandler.java
│ │ │ │ ├── ExpTransitionPostHandler.java
│ │ │ │ ├── FixedTransitionPostHandler.java
│ │ │ │ └── TransitionContextResultPostHandler.java
│ │ │ └── pre/
│ │ │ └── ExpTransitionPreHandler.java
│ │ ├── parser/
│ │ │ ├── FsmParser.java
│ │ │ └── event/
│ │ │ ├── ExpFsmParseEventListener.java
│ │ │ ├── FsmParseEvent.java
│ │ │ ├── FsmParseEventListener.java
│ │ │ └── FsmParseEventTypes.java
│ │ └── util/
│ │ ├── FsmConstants.java
│ │ ├── FsmEventTypes.java
│ │ ├── FsmIOUtil.java
│ │ ├── FsmStateLinkUtil.java
│ │ ├── FsmStringUtil.java
│ │ ├── FsmUtil.java
│ │ ├── JsonFacade.java
│ │ ├── JsonFacadeJacksonImpl.java
│ │ ├── JsonUtil.java
│ │ ├── Pair.java
│ │ ├── TransitionUtil.java
│ │ └── Triple.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── jd/
│ │ └── easyflow/
│ │ └── fsm/
│ │ ├── FsmTestSuite.java
│ │ ├── cases/
│ │ │ ├── check/
│ │ │ │ └── FsmStateLinkCheckTest.java
│ │ │ ├── event/
│ │ │ │ └── MultipleEventTest.java
│ │ │ ├── filter/
│ │ │ │ ├── FsmFilterTest.java
│ │ │ │ ├── PreHandlerPostConstructTestFilter.java
│ │ │ │ ├── StateTransitionPreHandlerTestFilter.java
│ │ │ │ ├── TransitionEmptyFilter.java
│ │ │ │ └── TransitionPreHandlerTestFilter.java
│ │ │ ├── fsmmanager/
│ │ │ │ ├── PocFsm.java
│ │ │ │ ├── PocFsmManager.java
│ │ │ │ └── PocTransition.java
│ │ │ ├── mockbiz/
│ │ │ │ ├── CompanyAuthService.java
│ │ │ │ ├── FsmMockBizTest.java
│ │ │ │ └── WhitelistService.java
│ │ │ ├── parser/
│ │ │ │ ├── FsmParserTest.java
│ │ │ │ └── TestTransitionAction.java
│ │ │ ├── post/
│ │ │ │ ├── PostTest.java
│ │ │ │ └── TestPostManuallyTransitionPreHandlerFilter.java
│ │ │ └── postevent/
│ │ │ └── PostEventTest.java
│ │ └── quickstart/
│ │ ├── AStateE1EventTstAction.java
│ │ └── FsmQuickStartTest.java
│ └── resources/
│ ├── fsm/
│ │ ├── cases/
│ │ │ ├── check/
│ │ │ │ ├── check_isolated_001.json
│ │ │ │ ├── check_nonEndNoNext_001.json
│ │ │ │ ├── check_nonStartNoPrevious_001.json
│ │ │ │ └── check_notExists_001.json
│ │ │ ├── filter/
│ │ │ │ ├── tst_empty_filter_001.json
│ │ │ │ ├── tst_prehandler_filter_001.json
│ │ │ │ ├── tst_prehandler_filter_002.json
│ │ │ │ └── tst_prehandler_filter_003.json
│ │ │ ├── mockbiz/
│ │ │ │ └── fsm_mockbiz.json
│ │ │ ├── multipleevent/
│ │ │ │ └── fsm_multipleevent.json
│ │ │ ├── parser/
│ │ │ │ ├── fsm_parser_test.json
│ │ │ │ └── fsm_parser_test_create_exp.json
│ │ │ ├── post/
│ │ │ │ └── fsm_post_manually.json
│ │ │ └── postevent/
│ │ │ └── fsm_postevent.json
│ │ └── quickstart/
│ │ └── quickstart_001.json
│ └── logback.xml
├── easyflow-process/
│ ├── easyflow-process-admin/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jd/
│ │ │ └── easyflow/
│ │ │ ├── admin/
│ │ │ │ ├── form/
│ │ │ │ │ └── adapter/
│ │ │ │ │ └── page/
│ │ │ │ │ ├── FormTemplateAdminController.java
│ │ │ │ │ └── converter/
│ │ │ │ │ └── PagerConverter.java
│ │ │ │ ├── process/
│ │ │ │ │ └── adapter/
│ │ │ │ │ └── page/
│ │ │ │ │ ├── Bpmn2JsonController.java
│ │ │ │ │ ├── ProcessDefinitionController.java
│ │ │ │ │ ├── ProcessInstanceController.java
│ │ │ │ │ ├── ProcessTaskController.java
│ │ │ │ │ ├── converter/
│ │ │ │ │ │ ├── PagerConverter.java
│ │ │ │ │ │ ├── ProcessDefinitionConverter.java
│ │ │ │ │ │ ├── ProcessInstanceConverter.java
│ │ │ │ │ │ └── ProcessTaskConverter.java
│ │ │ │ │ ├── dto/
│ │ │ │ │ │ ├── CommonTaskExecuteDTO.java
│ │ │ │ │ │ ├── CommonTaskProcessInstanceCreateDTO.java
│ │ │ │ │ │ ├── ProcessDefDTO.java
│ │ │ │ │ │ ├── ProcessInstanceInfoForPagerDTO.java
│ │ │ │ │ │ └── ProcessTaskInfoForPagerDTO.java
│ │ │ │ │ ├── extension/
│ │ │ │ │ │ └── UserGroupAdminExtension.java
│ │ │ │ │ └── util/
│ │ │ │ │ ├── AdminProcessConstants.java
│ │ │ │ │ └── ClientErrorCode.java
│ │ │ │ └── processunit/
│ │ │ │ └── adapter/
│ │ │ │ └── page/
│ │ │ │ ├── ProcessUnitController.java
│ │ │ │ └── converter/
│ │ │ │ └── PagerConverter.java
│ │ │ └── common/
│ │ │ └── adapter/
│ │ │ └── page/
│ │ │ ├── BasePageController.java
│ │ │ ├── WebResponse.java
│ │ │ └── WebResponseCode.java
│ │ └── resources/
│ │ ├── easyflow/
│ │ │ └── messages/
│ │ │ ├── easyflow-admin-framework.properties
│ │ │ ├── easyflow-admin-framework_zh.properties
│ │ │ ├── easyflow-form-admin.properties
│ │ │ ├── easyflow-form-admin_zh.properties
│ │ │ ├── easyflow-process-admin.properties
│ │ │ ├── easyflow-process-admin_zh.properties
│ │ │ ├── easyflow-processunit-admin.properties
│ │ │ └── easyflow-processunit-admin_zh.properties
│ │ ├── static/
│ │ │ ├── css/
│ │ │ │ ├── common.css
│ │ │ │ └── frame.css
│ │ │ ├── js/
│ │ │ │ ├── biz.js
│ │ │ │ ├── common.js
│ │ │ │ ├── messages_default.js
│ │ │ │ └── messages_zh.js
│ │ │ └── plugins/
│ │ │ ├── bootstrap-multiselect/
│ │ │ │ ├── css/
│ │ │ │ │ └── bootstrap-multiselect.css
│ │ │ │ ├── js/
│ │ │ │ │ └── bootstrap-multiselect.js
│ │ │ │ └── less/
│ │ │ │ └── bootstrap-multiselect.less
│ │ │ ├── bootstrap-table/
│ │ │ │ ├── bootstrap-table-locale-all.js
│ │ │ │ ├── bootstrap-table-locale-all.min.js
│ │ │ │ ├── bootstrap-table.css
│ │ │ │ ├── bootstrap-table.js
│ │ │ │ ├── bootstrap-table.min.css
│ │ │ │ └── bootstrap-table.min.js
│ │ │ ├── bootstrap4/
│ │ │ │ ├── css/
│ │ │ │ │ ├── bootstrap-grid.css
│ │ │ │ │ ├── bootstrap-grid.css.map
│ │ │ │ │ ├── bootstrap-grid.min.css
│ │ │ │ │ ├── bootstrap-grid.min.css.map
│ │ │ │ │ ├── bootstrap-reboot.css
│ │ │ │ │ ├── bootstrap-reboot.css.map
│ │ │ │ │ ├── bootstrap-reboot.min.css
│ │ │ │ │ ├── bootstrap-reboot.min.css.map
│ │ │ │ │ ├── bootstrap.css
│ │ │ │ │ ├── bootstrap.css.map
│ │ │ │ │ ├── bootstrap.min.css
│ │ │ │ │ └── bootstrap.min.css.map
│ │ │ │ └── js/
│ │ │ │ ├── bootstrap.bundle.js
│ │ │ │ ├── bootstrap.bundle.js.map
│ │ │ │ ├── bootstrap.bundle.min.js
│ │ │ │ ├── bootstrap.bundle.min.js.map
│ │ │ │ ├── bootstrap.js
│ │ │ │ ├── bootstrap.js.map
│ │ │ │ ├── bootstrap.min.js
│ │ │ │ └── bootstrap.min.js.map
│ │ │ ├── bpmnjs/
│ │ │ │ ├── assets/
│ │ │ │ │ ├── bpmn-font/
│ │ │ │ │ │ └── css/
│ │ │ │ │ │ ├── bpmn-codes.css
│ │ │ │ │ │ ├── bpmn-embedded.css
│ │ │ │ │ │ └── bpmn.css
│ │ │ │ │ ├── bpmn-js.css
│ │ │ │ │ └── diagram-js.css
│ │ │ │ ├── bpmn-modeler.development.js
│ │ │ │ ├── bpmn-modeler.production.min.js
│ │ │ │ ├── bpmn-navigated-viewer.development.js
│ │ │ │ ├── bpmn-navigated-viewer.production.min.js
│ │ │ │ ├── bpmn-viewer.development.js
│ │ │ │ ├── bpmn-viewer.production.min.js
│ │ │ │ └── changeForEasyflow/
│ │ │ │ ├── changelog.txt
│ │ │ │ └── rollup.config.js
│ │ │ ├── dataview/
│ │ │ │ ├── dataview-app.js
│ │ │ │ ├── dataview-biz.js
│ │ │ │ ├── dataview-config.js
│ │ │ │ ├── dataview-demo.html
│ │ │ │ ├── dataview.css
│ │ │ │ └── dataview.js
│ │ │ ├── flow/
│ │ │ │ ├── bpmn.js
│ │ │ │ ├── flow.css
│ │ │ │ └── flow.js
│ │ │ ├── fontawesome/
│ │ │ │ └── css/
│ │ │ │ ├── all.css
│ │ │ │ └── all.min.css
│ │ │ ├── jquery/
│ │ │ │ ├── jquery-3.6.0.js
│ │ │ │ ├── jquery-3.6.0.min.js
│ │ │ │ └── jquery-3.6.0.min.map
│ │ │ └── jquery-validation/
│ │ │ ├── custom.validate.js
│ │ │ ├── jquery.validate.js
│ │ │ ├── jquery.validate.min.js
│ │ │ └── messages_zh.js
│ │ └── templates/
│ │ ├── easyflow/
│ │ │ ├── formtemplate/
│ │ │ │ ├── formTemplateAdd.html
│ │ │ │ ├── formTemplateDetail.html
│ │ │ │ ├── formTemplateEdit.html
│ │ │ │ └── formTemplateList.html
│ │ │ ├── process/
│ │ │ │ ├── processdefinition/
│ │ │ │ │ ├── processDefinitionAdd.html
│ │ │ │ │ ├── processDefinitionDetail.html
│ │ │ │ │ ├── processDefinitionEdit.html
│ │ │ │ │ ├── processDefinitionList.html
│ │ │ │ │ └── processSelectFrame.html
│ │ │ │ ├── processinstance/
│ │ │ │ │ ├── commonTaskProcessInstanceAdd.html
│ │ │ │ │ ├── processInstanceCreate.html
│ │ │ │ │ ├── processInstanceDetail.html
│ │ │ │ │ └── processInstanceList.html
│ │ │ │ └── processtask/
│ │ │ │ ├── commonProcessTaskDetail.html
│ │ │ │ ├── commonProcessTaskExecute.html
│ │ │ │ ├── commonProcessTaskPassReject.html
│ │ │ │ └── processTaskList.html
│ │ │ └── processunit/
│ │ │ ├── processUnitExecutionDetail.html
│ │ │ ├── processUnitExecutionList.html
│ │ │ ├── processUnitInstanceDetail.html
│ │ │ └── processUnitInstanceList.html
│ │ └── layout.html
│ ├── easyflow-process-api/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── com/
│ │ └── jd/
│ │ └── easyflow/
│ │ ├── codegenerator/
│ │ │ └── adapter/
│ │ │ └── export/
│ │ │ ├── CodeGenerateExport.java
│ │ │ └── dto/
│ │ │ ├── BatchGenerateParam.java
│ │ │ ├── BatchGenerateResult.java
│ │ │ ├── GenerateParam.java
│ │ │ └── GenerateResult.java
│ │ ├── common/
│ │ │ ├── adapter/
│ │ │ │ ├── export/
│ │ │ │ │ ├── dto/
│ │ │ │ │ │ ├── ExportRequest.java
│ │ │ │ │ │ ├── ExportResponse.java
│ │ │ │ │ │ ├── ExportResponseCode.java
│ │ │ │ │ │ └── pager/
│ │ │ │ │ │ ├── FieldEntry.java
│ │ │ │ │ │ ├── PagerCondition.java
│ │ │ │ │ │ ├── PagerConditionHelper.java
│ │ │ │ │ │ ├── PagerResult.java
│ │ │ │ │ │ └── SortEntry.java
│ │ │ │ │ └── util/
│ │ │ │ │ └── ExportResponseUtil.java
│ │ │ │ └── message/
│ │ │ │ └── BaseMessage.java
│ │ │ └── client/
│ │ │ └── dto/
│ │ │ ├── ClientRequest.java
│ │ │ ├── ClientResponse.java
│ │ │ └── ClientResponseCode.java
│ │ ├── form/
│ │ │ └── adapter/
│ │ │ └── export/
│ │ │ ├── FormTemplateExport.java
│ │ │ └── dto/
│ │ │ └── FormTemplateDTO.java
│ │ ├── process/
│ │ │ ├── adapter/
│ │ │ │ ├── export/
│ │ │ │ │ ├── ProcessDefinitionExport.java
│ │ │ │ │ ├── ProcessInstanceExport.java
│ │ │ │ │ ├── ProcessScheduleExport.java
│ │ │ │ │ ├── ProcessTaskExport.java
│ │ │ │ │ ├── ProcessToolExport.java
│ │ │ │ │ ├── ProcessTransactionExport.java
│ │ │ │ │ ├── constant/
│ │ │ │ │ │ ├── ProcessInstanceConstants.java
│ │ │ │ │ │ ├── ProcessTaskConstants.java
│ │ │ │ │ │ ├── ProcessTransactionConstants.java
│ │ │ │ │ │ └── ShardingConstants.java
│ │ │ │ │ ├── dto/
│ │ │ │ │ │ ├── definition/
│ │ │ │ │ │ │ ├── NodeDTO.java
│ │ │ │ │ │ │ ├── ProcessDTO.java
│ │ │ │ │ │ │ ├── ProcessDefinitionDTO.java
│ │ │ │ │ │ │ ├── QueryNodeReq.java
│ │ │ │ │ │ │ └── QueryProcessDefinitionReq.java
│ │ │ │ │ │ ├── instance/
│ │ │ │ │ │ │ ├── CanCancelProcessInstanceReq.java
│ │ │ │ │ │ │ ├── CanCancelProcessInstanceRes.java
│ │ │ │ │ │ │ ├── CancelProcessInstanceReq.java
│ │ │ │ │ │ │ ├── CancelProcessInstanceRes.java
│ │ │ │ │ │ │ ├── CreateProcessInstanceReq.java
│ │ │ │ │ │ │ ├── CreateProcessInstanceRes.java
│ │ │ │ │ │ │ ├── LockProcessInstanceReq.java
│ │ │ │ │ │ │ ├── PersistDTO.java
│ │ │ │ │ │ │ ├── ProcessInstanceDTO.java
│ │ │ │ │ │ │ ├── ProcessNodeExecutionDTO.java
│ │ │ │ │ │ │ ├── ProcessNodeInstanceDTO.java
│ │ │ │ │ │ │ ├── QueryOpenNodeInstanceReq.java
│ │ │ │ │ │ │ ├── QueryProcessInstanceReq.java
│ │ │ │ │ │ │ ├── QueryProcessNodeReqDTO.java
│ │ │ │ │ │ │ ├── RollbackNodeReq.java
│ │ │ │ │ │ │ ├── RollbackNodeRes.java
│ │ │ │ │ │ │ ├── StdProcessContextDTO.java
│ │ │ │ │ │ │ ├── StdProcessDTO.java
│ │ │ │ │ │ │ └── UnlockProcessInstanceReq.java
│ │ │ │ │ │ ├── schedule/
│ │ │ │ │ │ │ ├── ScheduleProcessReq.java
│ │ │ │ │ │ │ └── ScheduleProcessRes.java
│ │ │ │ │ │ ├── task/
│ │ │ │ │ │ │ ├── CanWithdrawTaskReq.java
│ │ │ │ │ │ │ ├── CanWithdrawTaskRes.java
│ │ │ │ │ │ │ ├── ExecuteTaskReq.java
│ │ │ │ │ │ │ ├── ExecuteTaskRes.java
│ │ │ │ │ │ │ ├── ProcessTaskAssignDTO.java
│ │ │ │ │ │ │ ├── ProcessTaskDTO.java
│ │ │ │ │ │ │ ├── ProcessTaskEventDTO.java
│ │ │ │ │ │ │ ├── QueryTaskReq.java
│ │ │ │ │ │ │ ├── TaskOperateCmd.java
│ │ │ │ │ │ │ ├── TaskOperateCmdResult.java
│ │ │ │ │ │ │ ├── TaskOperateCommand.java
│ │ │ │ │ │ │ ├── TaskOperateCommandResult.java
│ │ │ │ │ │ │ ├── TaskOperationsReq.java
│ │ │ │ │ │ │ ├── TaskOperationsRes.java
│ │ │ │ │ │ │ ├── WithdrawTaskReq.java
│ │ │ │ │ │ │ ├── WithdrawTaskRes.java
│ │ │ │ │ │ │ ├── cmd/
│ │ │ │ │ │ │ │ ├── TaskCreateCmd.java
│ │ │ │ │ │ │ │ └── TaskExecuteCmd.java
│ │ │ │ │ │ │ └── command/
│ │ │ │ │ │ │ ├── MultipleTaskCreateCommand.java
│ │ │ │ │ │ │ ├── MultipleTaskCreateCommandResult.java
│ │ │ │ │ │ │ ├── TaskCreateCommand.java
│ │ │ │ │ │ │ ├── TaskCreateCommandResult.java
│ │ │ │ │ │ │ ├── TaskExecuteCommand.java
│ │ │ │ │ │ │ └── TaskExecuteCommandResult.java
│ │ │ │ │ │ └── transaction/
│ │ │ │ │ │ ├── BatchObjectIdReq.java
│ │ │ │ │ │ ├── BatchObjectIdRes.java
│ │ │ │ │ │ ├── TxnCommand.java
│ │ │ │ │ │ ├── TxnCommandResult.java
│ │ │ │ │ │ ├── TxnReq.java
│ │ │ │ │ │ ├── TxnRes.java
│ │ │ │ │ │ └── command/
│ │ │ │ │ │ ├── BatchUpdateTxnCommand.java
│ │ │ │ │ │ ├── BatchUpdateTxnCommandResult.java
│ │ │ │ │ │ ├── InterruptTxnCommand.java
│ │ │ │ │ │ └── InterruptTxnCommandResult.java
│ │ │ │ │ └── enums/
│ │ │ │ │ └── ProcessExportResponseCode.java
│ │ │ │ └── message/
│ │ │ │ ├── ProcessInstanceStatusMessage.java
│ │ │ │ ├── ProcessNodeInstanceStatusMessage.java
│ │ │ │ └── ProcessTaskStatusMessage.java
│ │ │ └── spi/
│ │ │ └── client/
│ │ │ ├── ProcessScheduleClientService.java
│ │ │ ├── ProcessTaskClientService.java
│ │ │ ├── dto/
│ │ │ │ ├── ProcessExecuteReq.java
│ │ │ │ ├── ProcessExecuteRes.java
│ │ │ │ ├── ProcessTaskCallReq.java
│ │ │ │ └── ProcessTaskCallRes.java
│ │ │ └── enums/
│ │ │ └── ProcessClientResponseCode.java
│ │ └── processunit/
│ │ ├── adapter/
│ │ │ └── export/
│ │ │ ├── ProcessUnitExport.java
│ │ │ └── dto/
│ │ │ ├── ExecPolicyDTO.java
│ │ │ ├── ProcessUnitCreateReq.java
│ │ │ ├── ProcessUnitCreateRes.java
│ │ │ ├── ProcessUnitDTO.java
│ │ │ ├── ProcessUnitExecuteReq.java
│ │ │ ├── ProcessUnitExecuteRes.java
│ │ │ ├── ProcessUnitExecutionDTO.java
│ │ │ ├── ProcessUnitExecutionQueryReq.java
│ │ │ ├── ProcessUnitInstanceDTO.java
│ │ │ ├── ProcessUnitInstanceQueryReq.java
│ │ │ ├── ProcessUnitQueryReq.java
│ │ │ ├── ProcessUnitUpdateReq.java
│ │ │ ├── ProcessUnitUpdateRes.java
│ │ │ ├── ShardingInfoDTO.java
│ │ │ ├── ShardingInfoQueryReq.java
│ │ │ ├── ShutdownReq.java
│ │ │ ├── ShutdownRes.java
│ │ │ ├── SyncAfterCallReq.java
│ │ │ ├── SyncAfterCallRes.java
│ │ │ ├── SyncBeforeCallReq.java
│ │ │ └── SyncBeforeCallRes.java
│ │ └── spi/
│ │ └── client/
│ │ ├── ProcessUnitClientService.java
│ │ └── dto/
│ │ ├── AsyncCallRealReq.java
│ │ └── AsyncCallRealRes.java
│ ├── easyflow-process-client/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jd/
│ │ │ └── easyflow/
│ │ │ ├── codegenerator/
│ │ │ │ └── client/
│ │ │ │ ├── CodeGenerateHelper.java
│ │ │ │ └── CodeGenerateParam.java
│ │ │ ├── process/
│ │ │ │ └── client/
│ │ │ │ ├── common/
│ │ │ │ │ └── PropertiesUtil.java
│ │ │ │ ├── flow/
│ │ │ │ │ ├── StdFlowEngineImpl.java
│ │ │ │ │ ├── StdFlowProcessConstants.java
│ │ │ │ │ ├── StdProcessFlowEngineFilter.java
│ │ │ │ │ ├── StdProcessFlowFilter.java
│ │ │ │ │ ├── StdProcessFlowListener.java
│ │ │ │ │ ├── StdProcessFlowNodeFilter.java
│ │ │ │ │ ├── asyncnode/
│ │ │ │ │ │ ├── CreateAsyncProcessUnitNodeAction.java
│ │ │ │ │ │ └── ExecuteAsyncProcessUnitNodeEl.java
│ │ │ │ │ ├── compensate/
│ │ │ │ │ │ ├── StdProcessCompensateFlowFilter.java
│ │ │ │ │ │ ├── StdProcessCompensateHelper.java
│ │ │ │ │ │ └── StdProcessCompensateNodeFilter.java
│ │ │ │ │ ├── eventinfo/
│ │ │ │ │ │ └── StdFlowProcessEventInfoListener.java
│ │ │ │ │ ├── flowretry/
│ │ │ │ │ │ ├── FlowRetryEl.java
│ │ │ │ │ │ └── FlowRetryFilter.java
│ │ │ │ │ ├── noderetry/
│ │ │ │ │ │ └── NodeActionRetryFilter.java
│ │ │ │ │ └── util/
│ │ │ │ │ ├── StdFlowEl.java
│ │ │ │ │ └── StdProcessFlowUtil.java
│ │ │ │ ├── fsm/
│ │ │ │ │ ├── StdFsmManager.java
│ │ │ │ │ ├── StdFsmProcessConstants.java
│ │ │ │ │ ├── StdProcessFsmFilter.java
│ │ │ │ │ ├── StdProcessFsmListener.java
│ │ │ │ │ ├── StdProcessFsmManagerFilter.java
│ │ │ │ │ ├── StdProcessFsmTransitionFilter.java
│ │ │ │ │ └── eventinfo/
│ │ │ │ │ └── StdFsmProcessEventInfoListener.java
│ │ │ │ ├── runtime/
│ │ │ │ │ ├── CacheObject.java
│ │ │ │ │ ├── ObjectIdManager.java
│ │ │ │ │ ├── ProcessCache.java
│ │ │ │ │ ├── ProcessConverter.java
│ │ │ │ │ ├── ProcessInclusiveCheckHelper.java
│ │ │ │ │ ├── ProcessRuntimeErrorCode.java
│ │ │ │ │ ├── ProcessRuntimeManager.java
│ │ │ │ │ ├── ProcessRuntimeService.java
│ │ │ │ │ ├── StdNode.java
│ │ │ │ │ ├── StdNodeContext.java
│ │ │ │ │ ├── StdProcess.java
│ │ │ │ │ ├── StdProcessConstants.java
│ │ │ │ │ ├── StdProcessContext.java
│ │ │ │ │ ├── core/
│ │ │ │ │ │ ├── Node.java
│ │ │ │ │ │ ├── NodeContext.java
│ │ │ │ │ │ ├── Process.java
│ │ │ │ │ │ ├── ProcessContext.java
│ │ │ │ │ │ ├── ProcessEngine.java
│ │ │ │ │ │ ├── ProcessEngineImpl.java
│ │ │ │ │ │ ├── ProcessException.java
│ │ │ │ │ │ ├── ProcessParam.java
│ │ │ │ │ │ └── ProcessResult.java
│ │ │ │ │ └── eventinfo/
│ │ │ │ │ ├── NodeInstanceEventInfo.java
│ │ │ │ │ ├── ProcessEventInfoCache.java
│ │ │ │ │ ├── ProcessEventInfoListener.java
│ │ │ │ │ └── ProcessInstanceEventInfo.java
│ │ │ │ ├── schedule/
│ │ │ │ │ └── ProcessScheduleClientServiceImpl.java
│ │ │ │ ├── task/
│ │ │ │ │ ├── TaskConstants.java
│ │ │ │ │ ├── TaskErrorCode.java
│ │ │ │ │ ├── biz/
│ │ │ │ │ │ ├── TaskBizService.java
│ │ │ │ │ │ ├── dto/
│ │ │ │ │ │ │ ├── TaskBizParam.java
│ │ │ │ │ │ │ └── TaskBizResult.java
│ │ │ │ │ │ └── impl/
│ │ │ │ │ │ ├── CallTaskBizService.java
│ │ │ │ │ │ ├── FlowTaskBizService.java
│ │ │ │ │ │ ├── RuleAndCallTaskBizService.java
│ │ │ │ │ │ └── RuleTaskBizService.java
│ │ │ │ │ ├── flow/
│ │ │ │ │ │ ├── BaseTaskNodeAction.java
│ │ │ │ │ │ ├── TaskCreateAndExecuteNodeAction.java
│ │ │ │ │ │ ├── TaskCreateNodeAction.java
│ │ │ │ │ │ ├── TaskExecuteNodeAction.java
│ │ │ │ │ │ └── TaskFlowListener.java
│ │ │ │ │ ├── service/
│ │ │ │ │ │ ├── TaskClientManager.java
│ │ │ │ │ │ ├── TaskClientOperation.java
│ │ │ │ │ │ ├── TaskClientService.java
│ │ │ │ │ │ ├── dto/
│ │ │ │ │ │ │ ├── TaskCreateParam.java
│ │ │ │ │ │ │ └── TaskExecuteParam.java
│ │ │ │ │ │ └── operation/
│ │ │ │ │ │ ├── BaseTaskOperation.java
│ │ │ │ │ │ ├── ExecuteTaskOperation.java
│ │ │ │ │ │ └── SaveTaskOperation.java
│ │ │ │ │ └── util/
│ │ │ │ │ └── TaskEl.java
│ │ │ │ └── util/
│ │ │ │ ├── ElUtil.java
│ │ │ │ ├── ExportRequestBuilder.java
│ │ │ │ ├── Pair.java
│ │ │ │ ├── ProcessConstants.java
│ │ │ │ ├── ProcessUtil.java
│ │ │ │ └── StdProcessUtil.java
│ │ │ └── processunit/
│ │ │ └── client/
│ │ │ ├── ProcessUnitClient.java
│ │ │ ├── ProcessUnitHelper.java
│ │ │ ├── bean/
│ │ │ │ ├── ExecContext.java
│ │ │ │ ├── ExecParam.java
│ │ │ │ ├── ExecPolicy.java
│ │ │ │ ├── ExecResult.java
│ │ │ │ ├── ProcessUnit.java
│ │ │ │ ├── ProcessUnitCreateAndExecuteReq.java
│ │ │ │ ├── ProcessUnitCreateAndExecuteRes.java
│ │ │ │ ├── ProcessUnitExecution.java
│ │ │ │ └── ProcessUnitInstance.java
│ │ │ ├── converter/
│ │ │ │ └── ProcessUnitConverter.java
│ │ │ ├── gateway/
│ │ │ │ └── ProcessUnitServerGateway.java
│ │ │ ├── message/
│ │ │ │ └── ProcessUnitClientServiceMessageListener.java
│ │ │ ├── service/
│ │ │ │ ├── ProcessUnitExecutor.java
│ │ │ │ └── impl/
│ │ │ │ ├── AsyncClientProcessUnitExecutor.java
│ │ │ │ ├── BaseProcessUnitExecutor.java
│ │ │ │ ├── ProcessUnitClientAsyncExecuteSpel.java
│ │ │ │ ├── ProcessUnitClientServiceImpl.java
│ │ │ │ └── SyncClientProcessUnitExecutor.java
│ │ │ └── util/
│ │ │ └── ProcessUnitConstants.java
│ │ └── resources/
│ │ └── easyflow/
│ │ ├── easyflow-spring-process-client-processunit.xml
│ │ ├── easyflow-spring-process-client.xml
│ │ └── easyflow-spring-processunit-client.xml
│ ├── easyflow-process-common/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jd/
│ │ │ └── easyflow/
│ │ │ ├── common/
│ │ │ │ ├── dto/
│ │ │ │ │ ├── BaseRequest.java
│ │ │ │ │ ├── BaseResponse.java
│ │ │ │ │ ├── DataRequest.java
│ │ │ │ │ ├── DataResponse.java
│ │ │ │ │ └── pager/
│ │ │ │ │ ├── FieldEntry.java
│ │ │ │ │ ├── PagerCondition.java
│ │ │ │ │ ├── PagerConditionHelper.java
│ │ │ │ │ ├── PagerResult.java
│ │ │ │ │ └── SortEntry.java
│ │ │ │ ├── exception/
│ │ │ │ │ ├── EasyFlowException.java
│ │ │ │ │ ├── UserException.java
│ │ │ │ │ └── util/
│ │ │ │ │ └── ExceptionUtil.java
│ │ │ │ └── util/
│ │ │ │ ├── AssertUtils.java
│ │ │ │ ├── CommonErrorCode.java
│ │ │ │ ├── IAssertUtils.java
│ │ │ │ ├── MessageUtil.java
│ │ │ │ └── UUIDUtil.java
│ │ │ ├── el/
│ │ │ │ ├── ElEvaluator.java
│ │ │ │ ├── ElFactory.java
│ │ │ │ └── SpelEvaluator.java
│ │ │ ├── message/
│ │ │ │ ├── BaseMessageListener.java
│ │ │ │ ├── Message.java
│ │ │ │ ├── MessageListener.java
│ │ │ │ ├── MessageSendService.java
│ │ │ │ ├── impl/
│ │ │ │ │ └── NoopMessageSendServiceImpl.java
│ │ │ │ ├── spring/
│ │ │ │ │ ├── EventMessage.java
│ │ │ │ │ ├── EventMessageListener.java
│ │ │ │ │ └── SpringMessageSendServiceImpl.java
│ │ │ │ └── util/
│ │ │ │ └── MsgBizIdWrapper.java
│ │ │ ├── net/
│ │ │ │ └── NetUtils.java
│ │ │ ├── objects/
│ │ │ │ └── factory/
│ │ │ │ ├── DefaultObjectFactory.java
│ │ │ │ ├── ObjectFactory.java
│ │ │ │ ├── ObjectFactorys.java
│ │ │ │ ├── ObjectProvider.java
│ │ │ │ └── spring/
│ │ │ │ └── SpringObjectProvider.java
│ │ │ ├── properties/
│ │ │ │ ├── PropertiesAccessor.java
│ │ │ │ ├── PropertyUtil.java
│ │ │ │ ├── classpath/
│ │ │ │ │ └── ClassPathPropertiesAccessor.java
│ │ │ │ └── spring/
│ │ │ │ ├── SpringEnvPropertiesAccessor.java
│ │ │ │ └── SpringPropertySourcesPropertiesAccessor.java
│ │ │ ├── spel/
│ │ │ │ └── SpelHelper.java
│ │ │ └── utils/
│ │ │ └── json/
│ │ │ ├── JSON.java
│ │ │ ├── JsonFacade.java
│ │ │ ├── JsonFacadeJacksonImpl.java
│ │ │ └── JsonSerializeConfig.java
│ │ └── resources/
│ │ └── easyflow/
│ │ └── easyflow-spring-message-spring.xml
│ ├── easyflow-process-sample/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jd/
│ │ │ └── easyflow/
│ │ │ └── integration/
│ │ │ ├── all/
│ │ │ │ └── admin/
│ │ │ │ ├── IndexController.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── JakartaSampleAuthFilter.java
│ │ │ │ │ └── SampleAuthFilter.java
│ │ │ │ ├── process/
│ │ │ │ │ └── SampleUserGroupAdminExtensionImpl.java
│ │ │ │ └── sample/
│ │ │ │ └── SampleUserHolder.java
│ │ │ └── open/
│ │ │ └── IntegrationOpenApplication.java
│ │ ├── resources/
│ │ │ ├── application-open-all.yml
│ │ │ ├── config/
│ │ │ │ └── sampleUserGroup.json
│ │ │ ├── flow/
│ │ │ │ ├── client/
│ │ │ │ │ └── flow_empty.json
│ │ │ │ └── server/
│ │ │ │ ├── flow_task_001.bpmn
│ │ │ │ └── flow_task_001.json
│ │ │ ├── fsm/
│ │ │ │ └── client/
│ │ │ │ └── fsm_empty.json
│ │ │ ├── logback.xml
│ │ │ └── spring/
│ │ │ └── open/
│ │ │ ├── easyflow-spring-open-all.xml
│ │ │ ├── spring-datasource-sharding.xml
│ │ │ └── spring-datasource.xml
│ │ └── script/
│ │ └── sql/
│ │ ├── create_all_table.sql
│ │ ├── drop_all_table.sql
│ │ ├── sample_form_template.sql
│ │ ├── sample_form_template_zh_CN.sql
│ │ └── sample_sharding.sql
│ ├── easyflow-process-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── jd/
│ │ │ │ └── easyflow/
│ │ │ │ ├── action/
│ │ │ │ │ ├── Action.java
│ │ │ │ │ ├── ActionAspect.java
│ │ │ │ │ ├── ActionConstants.java
│ │ │ │ │ ├── ActionInfo.java
│ │ │ │ │ └── SimpleExportAopFunction.java
│ │ │ │ ├── alert/
│ │ │ │ │ ├── AlertClient.java
│ │ │ │ │ ├── AlertParam.java
│ │ │ │ │ ├── AlertUtil.java
│ │ │ │ │ └── LogAlertClient.java
│ │ │ │ ├── cache/
│ │ │ │ │ ├── CacheService.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── LocalCacheServiceImpl.java
│ │ │ │ │ ├── NoopCacheServiceImpl.java
│ │ │ │ │ └── UnsupportedCacheServiceImpl.java
│ │ │ │ ├── codegenerator/
│ │ │ │ │ ├── adapter/
│ │ │ │ │ │ └── export/
│ │ │ │ │ │ └── CodeGenerateExportImpl.java
│ │ │ │ │ ├── domain/
│ │ │ │ │ │ ├── constant/
│ │ │ │ │ │ │ └── CodeGeneratorConstants.java
│ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ ├── entity/
│ │ │ │ │ │ │ │ └── SequenceEntity.java
│ │ │ │ │ │ │ └── vo/
│ │ │ │ │ │ │ └── CodeGenerateReq.java
│ │ │ │ │ │ ├── repository/
│ │ │ │ │ │ │ └── SequenceRepository.java
│ │ │ │ │ │ └── service/
│ │ │ │ │ │ ├── CodeGenerateDomainService.java
│ │ │ │ │ │ └── CodeGenerator.java
│ │ │ │ │ └── infrastructure/
│ │ │ │ │ ├── converter/
│ │ │ │ │ │ └── SequenceConverter.java
│ │ │ │ │ ├── persistence/
│ │ │ │ │ │ ├── mapper/
│ │ │ │ │ │ │ └── SequenceMapper.java
│ │ │ │ │ │ └── po/
│ │ │ │ │ │ └── Sequence.java
│ │ │ │ │ └── repository/
│ │ │ │ │ └── SequenceRepositoryImpl.java
│ │ │ │ ├── common/
│ │ │ │ │ └── app/
│ │ │ │ │ ├── AppResponseTransformer.java
│ │ │ │ │ └── dto/
│ │ │ │ │ ├── AppRequest.java
│ │ │ │ │ └── AppResponse.java
│ │ │ │ ├── form/
│ │ │ │ │ ├── adapter/
│ │ │ │ │ │ └── export/
│ │ │ │ │ │ ├── FormTemplateExportImpl.java
│ │ │ │ │ │ └── converter/
│ │ │ │ │ │ ├── FormTemplateConverter.java
│ │ │ │ │ │ └── PagerConverter.java
│ │ │ │ │ ├── domain/
│ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ └── entity/
│ │ │ │ │ │ │ └── FormTemplateEntity.java
│ │ │ │ │ │ ├── repository/
│ │ │ │ │ │ │ └── FormTemplateRepository.java
│ │ │ │ │ │ └── service/
│ │ │ │ │ │ └── FormTemplateDomainService.java
│ │ │ │ │ └── infrastructure/
│ │ │ │ │ ├── converter/
│ │ │ │ │ │ └── FormTemplateConverter.java
│ │ │ │ │ ├── persistence/
│ │ │ │ │ │ ├── mapper/
│ │ │ │ │ │ │ └── FormTemplateMapper.java
│ │ │ │ │ │ └── po/
│ │ │ │ │ │ └── FormTemplate.java
│ │ │ │ │ └── repository/
│ │ │ │ │ └── FormTemplateRepositoryImpl.java
│ │ │ │ ├── lock/
│ │ │ │ │ ├── LockService.java
│ │ │ │ │ ├── LockUtil.java
│ │ │ │ │ ├── Locker.java
│ │ │ │ │ ├── db/
│ │ │ │ │ │ └── DbLockService.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── BaseLockService.java
│ │ │ │ │ ├── LockerImpl.java
│ │ │ │ │ └── NoopLocker.java
│ │ │ │ ├── process/
│ │ │ │ │ ├── adapter/
│ │ │ │ │ │ └── export/
│ │ │ │ │ │ ├── ProcessDefinitionExportImpl.java
│ │ │ │ │ │ ├── ProcessInstanceExportImpl.java
│ │ │ │ │ │ ├── ProcessScheduleExportImpl.java
│ │ │ │ │ │ ├── ProcessTaskExportImpl.java
│ │ │ │ │ │ ├── ProcessToolExportImpl.java
│ │ │ │ │ │ ├── ProcessTransactionExportImpl.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ ├── PagerConverter.java
│ │ │ │ │ │ │ ├── ProcessDefinitionConverter.java
│ │ │ │ │ │ │ ├── ProcessInstanceConverter.java
│ │ │ │ │ │ │ ├── ProcessScheduleConverter.java
│ │ │ │ │ │ │ ├── ProcessTaskConverter.java
│ │ │ │ │ │ │ └── ProcessToolConverter.java
│ │ │ │ │ │ └── sharding/
│ │ │ │ │ │ ├── ProcessInstanceExportShardingImpl.java
│ │ │ │ │ │ ├── ProcessTaskExportShardingImpl.java
│ │ │ │ │ │ ├── ProcessToolExportShardingImpl.java
│ │ │ │ │ │ └── ProcessTransactionExportShardingImpl.java
│ │ │ │ │ ├── domain/
│ │ │ │ │ │ ├── constant/
│ │ │ │ │ │ │ ├── ProcessConstants.java
│ │ │ │ │ │ │ ├── ProcessDefinitionConstants.java
│ │ │ │ │ │ │ ├── ProcessTaskConstants.java
│ │ │ │ │ │ │ └── StdProcessConstants.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ ├── ProcessInstanceDomainConverter.java
│ │ │ │ │ │ │ └── ProcessTaskDomainConverter.java
│ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ ├── entity/
│ │ │ │ │ │ │ │ ├── ProcessDefinitionEntity.java
│ │ │ │ │ │ │ │ ├── ProcessInstanceEntity.java
│ │ │ │ │ │ │ │ ├── ProcessNodeExecutionEntity.java
│ │ │ │ │ │ │ │ ├── ProcessNodeInstanceEntity.java
│ │ │ │ │ │ │ │ ├── ProcessTaskAssignEntity.java
│ │ │ │ │ │ │ │ ├── ProcessTaskEntity.java
│ │ │ │ │ │ │ │ └── ProcessTaskEventEntity.java
│ │ │ │ │ │ │ ├── enums/
│ │ │ │ │ │ │ │ └── ProcessResponseCode.java
│ │ │ │ │ │ │ └── vo/
│ │ │ │ │ │ │ ├── CreateProcessInstanceReqVO.java
│ │ │ │ │ │ │ ├── CreateProcessInstanceResVO.java
│ │ │ │ │ │ │ ├── CreateProcessTaskVO.java
│ │ │ │ │ │ │ ├── DoExecuteProcessTaskReqVO.java
│ │ │ │ │ │ │ ├── ExecuteProcessTaskReqVO.java
│ │ │ │ │ │ │ ├── ProcessDefinitionForListVO.java
│ │ │ │ │ │ │ ├── QueryProcessNodeReq.java
│ │ │ │ │ │ │ ├── QueryTaskAssignReqVO.java
│ │ │ │ │ │ │ ├── QueryTaskEventReqVO.java
│ │ │ │ │ │ │ ├── QueryTaskReqVO.java
│ │ │ │ │ │ │ ├── RollbackNodeReqVO.java
│ │ │ │ │ │ │ ├── ScheduleProcessReqVO.java
│ │ │ │ │ │ │ ├── ScheduleProcessResVO.java
│ │ │ │ │ │ │ └── TaskInfoForPagerVO.java
│ │ │ │ │ │ ├── repository/
│ │ │ │ │ │ │ ├── ProcessRepository.java
│ │ │ │ │ │ │ └── ProcessTaskRepository.java
│ │ │ │ │ │ └── service/
│ │ │ │ │ │ ├── ProcessDefinitionDomainService.java
│ │ │ │ │ │ ├── ProcessInstanceDomainService.java
│ │ │ │ │ │ ├── ProcessScheduleDomainService.java
│ │ │ │ │ │ ├── ProcessScheduleInvoker.java
│ │ │ │ │ │ ├── ProcessTaskDomainService.java
│ │ │ │ │ │ ├── ProcessToolDomainService.java
│ │ │ │ │ │ ├── TaskOperateDomainService.java
│ │ │ │ │ │ └── impl/
│ │ │ │ │ │ └── ProcessScheduleSpiInvoker.java
│ │ │ │ │ └── infrastructure/
│ │ │ │ │ ├── converter/
│ │ │ │ │ │ ├── ProcessConverter.java
│ │ │ │ │ │ └── ProcessTaskConverter.java
│ │ │ │ │ ├── persistence/
│ │ │ │ │ │ ├── mapper/
│ │ │ │ │ │ │ ├── ProcessDefinitionMapper.java
│ │ │ │ │ │ │ ├── ProcessInstanceMapper.java
│ │ │ │ │ │ │ ├── ProcessNodeExecutionMapper.java
│ │ │ │ │ │ │ ├── ProcessNodeInstanceMapper.java
│ │ │ │ │ │ │ ├── ProcessTaskAssignMapper.java
│ │ │ │ │ │ │ ├── ProcessTaskEventMapper.java
│ │ │ │ │ │ │ └── ProcessTaskMapper.java
│ │ │ │ │ │ └── po/
│ │ │ │ │ │ ├── ProcessDefinition.java
│ │ │ │ │ │ ├── ProcessInstance.java
│ │ │ │ │ │ ├── ProcessNodeExecution.java
│ │ │ │ │ │ ├── ProcessNodeInstance.java
│ │ │ │ │ │ ├── ProcessTask.java
│ │ │ │ │ │ ├── ProcessTaskAssign.java
│ │ │ │ │ │ └── ProcessTaskEvent.java
│ │ │ │ │ ├── repository/
│ │ │ │ │ │ ├── ProcessRepositoryImpl.java
│ │ │ │ │ │ └── ProcessTaskRepositoryImpl.java
│ │ │ │ │ └── sharding/
│ │ │ │ │ └── ProcessShardingDataQuerier.java
│ │ │ │ ├── processunit/
│ │ │ │ │ ├── adapter/
│ │ │ │ │ │ ├── export/
│ │ │ │ │ │ │ ├── ProcessUnitExportImpl.java
│ │ │ │ │ │ │ └── converter/
│ │ │ │ │ │ │ ├── PagerConverter.java
│ │ │ │ │ │ │ └── ProcessUnitConverter.java
│ │ │ │ │ │ ├── message/
│ │ │ │ │ │ │ ├── ProcessUnitCreateMessageListener.java
│ │ │ │ │ │ │ ├── ProcessUnitExecuteMessageListener.java
│ │ │ │ │ │ │ └── ProcessUnitUpdateMessageListener.java
│ │ │ │ │ │ └── task/
│ │ │ │ │ │ ├── ProcessUnitAutoRunFlagUpdateTask.java
│ │ │ │ │ │ ├── ProcessUnitAutoRunTask.java
│ │ │ │ │ │ ├── ProcessUnitShardingCompareTask.java
│ │ │ │ │ │ └── ProcessUnitShardingMigrateTask.java
│ │ │ │ │ ├── domain/
│ │ │ │ │ │ ├── constant/
│ │ │ │ │ │ │ ├── ContextDataKeys.java
│ │ │ │ │ │ │ └── ProcessUnitConstants.java
│ │ │ │ │ │ ├── gateway/
│ │ │ │ │ │ │ └── ProcessUnitClientGateway.java
│ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ │ └── ProcessUnitExecuteConverter.java
│ │ │ │ │ │ │ ├── entity/
│ │ │ │ │ │ │ │ ├── ProcessUnitEntity.java
│ │ │ │ │ │ │ │ ├── ProcessUnitExecutionEntity.java
│ │ │ │ │ │ │ │ └── ProcessUnitInstanceEntity.java
│ │ │ │ │ │ │ ├── enums/
│ │ │ │ │ │ │ │ └── ProcessUnitErrorCodeEnum.java
│ │ │ │ │ │ │ └── vo/
│ │ │ │ │ │ │ ├── BatchExecuteReq.java
│ │ │ │ │ │ │ ├── BatchExecuteRes.java
│ │ │ │ │ │ │ ├── ExecContext.java
│ │ │ │ │ │ │ ├── ExecParam.java
│ │ │ │ │ │ │ ├── ExecPolicy.java
│ │ │ │ │ │ │ ├── ExecResult.java
│ │ │ │ │ │ │ ├── ExecuteReq.java
│ │ │ │ │ │ │ ├── ExecuteRes.java
│ │ │ │ │ │ │ ├── ProcessUnitExecuteMessage.java
│ │ │ │ │ │ │ ├── ProcessUnitInstanceKey.java
│ │ │ │ │ │ │ ├── QueryAsyncInstanceVO.java
│ │ │ │ │ │ │ ├── ShardingCompareContext.java
│ │ │ │ │ │ │ ├── ShardingMigrateContext.java
│ │ │ │ │ │ │ ├── SyncAfterCallReq.java
│ │ │ │ │ │ │ ├── SyncAfterCallRes.java
│ │ │ │ │ │ │ ├── SyncBeforeCallReq.java
│ │ │ │ │ │ │ └── SyncBeforeCallRes.java
│ │ │ │ │ │ ├── repository/
│ │ │ │ │ │ │ └── ProcessUnitRepository.java
│ │ │ │ │ │ ├── service/
│ │ │ │ │ │ │ ├── ProcessUnitExecutionPersistHandler.java
│ │ │ │ │ │ │ ├── ProcessUnitExecutor.java
│ │ │ │ │ │ │ ├── ProcessUnitService.java
│ │ │ │ │ │ │ ├── ProcessUnitShardingToolService.java
│ │ │ │ │ │ │ └── impl/
│ │ │ │ │ │ │ ├── AsyncServerProcessUnitExecutor.java
│ │ │ │ │ │ │ ├── BaseProcessUnitExecutor.java
│ │ │ │ │ │ │ ├── SyncServerProcessUnitExecutor.java
│ │ │ │ │ │ │ └── execution/
│ │ │ │ │ │ │ ├── DummyPersistHandler.java
│ │ │ │ │ │ │ ├── ExecutionPersister.java
│ │ │ │ │ │ │ ├── SyncPersistHandler.java
│ │ │ │ │ │ │ └── ThreadPoolAsyncPersistHandler.java
│ │ │ │ │ │ └── support/
│ │ │ │ │ │ ├── LockManager.java
│ │ │ │ │ │ └── PuTransactionTemplate.java
│ │ │ │ │ └── infrastructure/
│ │ │ │ │ ├── converter/
│ │ │ │ │ │ └── ProcessUnitConverter.java
│ │ │ │ │ ├── gateway/
│ │ │ │ │ │ ├── ProcessUnitClientGatewayImpl.java
│ │ │ │ │ │ └── ProcessUnitClientServiceMessageImpl.java
│ │ │ │ │ ├── persistence/
│ │ │ │ │ │ ├── mapper/
│ │ │ │ │ │ │ ├── ProcessUnitExecutionMapper.java
│ │ │ │ │ │ │ └── ProcessUnitInstanceMapper.java
│ │ │ │ │ │ └── po/
│ │ │ │ │ │ ├── ProcessUnitExecution.java
│ │ │ │ │ │ └── ProcessUnitInstance.java
│ │ │ │ │ └── repository/
│ │ │ │ │ ├── ProcessUnitConfigCache.java
│ │ │ │ │ ├── ProcessUnitConfigFileCache.java
│ │ │ │ │ └── ProcessUnitRepositoryImpl.java
│ │ │ │ └── sharding/
│ │ │ │ ├── CurrentShardInfo.java
│ │ │ │ ├── ShardingHolder.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── DataSourceInfo.java
│ │ │ │ │ ├── ShardGroupInfo.java
│ │ │ │ │ ├── ShardInfo.java
│ │ │ │ │ ├── ShardingConfig.java
│ │ │ │ │ ├── ShardingConfigManager.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── ShardingConfigManagerFileImpl.java
│ │ │ │ │ └── ShardingConfigManagerImpl.java
│ │ │ │ ├── datasource/
│ │ │ │ │ ├── DataSourceFactory.java
│ │ │ │ │ ├── ShardingDataSource.java
│ │ │ │ │ └── impl/
│ │ │ │ │ └── HikariDataSourceFactory.java
│ │ │ │ ├── mybatis/
│ │ │ │ │ ├── ShardingNotSupportedMapper.java
│ │ │ │ │ └── ShardingSupportedMapper.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── ExportRequestShardComputer.java
│ │ │ │ │ ├── ShardingComputeResult.java
│ │ │ │ │ ├── ShardingData.java
│ │ │ │ │ ├── ShardingDataQueryer.java
│ │ │ │ │ ├── ShardingService.java
│ │ │ │ │ └── impl/
│ │ │ │ │ └── ShardingServiceImpl.java
│ │ │ │ └── transaction/
│ │ │ │ └── ShardingSpringManagedTransactionFactory.java
│ │ │ └── resources/
│ │ │ └── easyflow/
│ │ │ ├── easyflow-spring-codegenerator-server.xml
│ │ │ ├── easyflow-spring-form-server.xml
│ │ │ ├── easyflow-spring-lock-db.xml
│ │ │ ├── easyflow-spring-process-server-sharding.xml
│ │ │ ├── easyflow-spring-process-server.xml
│ │ │ ├── easyflow-spring-processunit-server-sharding.xml
│ │ │ ├── easyflow-spring-processunit-server.xml
│ │ │ ├── mapper/
│ │ │ │ ├── FormTemplateMapper.xml
│ │ │ │ ├── ProcessDefinitionMapper.xml
│ │ │ │ ├── ProcessInstanceMapper.xml
│ │ │ │ ├── ProcessNodeExecutionMapper.xml
│ │ │ │ ├── ProcessNodeInstanceMapper.xml
│ │ │ │ ├── ProcessTaskAssignMapper.xml
│ │ │ │ ├── ProcessTaskEventMapper.xml
│ │ │ │ ├── ProcessTaskMapper.xml
│ │ │ │ ├── ProcessUnitExecutionMapper.xml
│ │ │ │ ├── ProcessUnitInstanceMapper.xml
│ │ │ │ └── SequenceMapper.xml
│ │ │ ├── messages/
│ │ │ │ ├── easyflow-process-server.properties
│ │ │ │ └── easyflow-process-server_zh.properties
│ │ │ └── shardingmapper/
│ │ │ ├── ProcessInstanceMapper.xml
│ │ │ ├── ProcessNodeExecutionMapper.xml
│ │ │ ├── ProcessNodeInstanceMapper.xml
│ │ │ ├── ProcessTaskAssignMapper.xml
│ │ │ ├── ProcessTaskEventMapper.xml
│ │ │ ├── ProcessTaskMapper.xml
│ │ │ ├── ProcessUnitExecutionMapper.xml
│ │ │ └── ProcessUnitInstanceMapper.xml
│ │ └── script/
│ │ ├── codegenerator-latest.sql
│ │ ├── form-latest.sql
│ │ ├── lock-latest.sql
│ │ ├── process-latest.sql
│ │ └── process-latest_zh.sql
│ └── pom.xml
└── pom.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
.project
.mvn/
local/
.DS_Store
.metadata/
.joycode
================================================
FILE: LICENSE.txt
================================================
Copyright 2021-2022 Jingdong Technology Holding Co. LTD.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
===============================================================================
JD-EASYFLOW SUBCOMPONENTS:
JDEasyFlow includes a number of subcomponents with separate copyright notices and
license terms. Your use of these subcomponents is subject
to the terms and conditions of the following licenses.
>>> Bpmn-js:
Copyright (c) 2014-present Camunda Services GmbH
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in the
Software without restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
The source code responsible for displaying the bpmn.io project watermark that
links back to https://bpmn.io as part of rendered diagrams MUST NOT be
removed or changed. When this software is being used in a website or application,
the watermark must stay fully visible and not visually overlapped by other elements.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.
>>> Bootstrap:
The MIT License (MIT)
Copyright (c) 2011-2018 Twitter, Inc.
Copyright (c) 2011-2018 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
>>> Bootstrap-multiselect:
Apache License, Version 2.0:
Copyright (c) 2012 - 2021 David Stutz
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
BSD 3-Clause License:
Copyright (c) 2012 - 2021 David Stutz All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
Neither the name of David Stutz nor the names of its contributors may be used to
endorse or promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
>>> Fontawesome:
Font Awesome Free License
-------------------------
Font Awesome Free is free, open source, and GPL friendly. You can use it for
commercial projects, open source projects, or really almost whatever you want.
Full Font Awesome Free license: https://fontawesome.com/license/free.
# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
packaged as SVG and JS file types.
# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
In the Font Awesome Free download, the SIL OFL license applies to all icons
packaged as web and desktop font files.
# Code: MIT License (https://opensource.org/licenses/MIT)
In the Font Awesome Free download, the MIT license applies to all non-font and
non-icon files.
# Attribution
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
Awesome Free files already contain embedded comments with sufficient
attribution, so you shouldn't need to do anything additional when using these
files normally.
We've kept attribution comments terse, so we ask that you do not actively work
to remove them from files, especially code. They're a great way for folks to
learn about Font Awesome.
# Brand Icons
All brand icons are trademarks of their respective owners. The use of these
trademarks does not indicate endorsement of the trademark holder by Font
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
to represent the company, product, or service to which they refer.**
>>> JQuery:
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>>> Jquery validation:
The MIT License (MIT)
Copyright Jörn Zaefferer
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>>> bootstrap table:
(The MIT License)
Copyright (c) 2012-2019 Zhixin Wen <wenzhixin2010@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
===============================================================================
================================================
FILE: NOTICE.txt
================================================
1.JDEasyflow use bpmn-js(https://bpmn.io/) component to render bpmn diagram. You should obey
their license rule(https://bpmn.io/license/) when using related function. Especially, you
should notice and obey the bellow rule in their license:
"The source code responsible for displaying the bpmn.io project watermark that
links back to https://bpmn.io as part of rendered diagrams MUST NOT be
removed or changed. When this software is being used in a website or application,
the watermark must stay fully visible and not visually overlapped by other elements."
2.JDEasyFlow license can be seen in LICENSE.txt. In addition, JDEasyFlow depends on a number of
components with separate copyright notices and license terms. Your use of
these components is subject to the terms and conditions of the licenses of the
following links:
>>> Apache maven:
https://github.com/apache/maven/blob/master/LICENSE
>>> Spring framework:
https://github.com/spring-projects/spring-framework/blob/main/src/docs/dist/license.txt
>>> Commons-logging:
https://github.com/apache/commons-logging/blob/master/LICENSE.txt
>>> Logback:
https://logback.qos.ch/license.html
>>> Slf4j:
https://www.slf4j.org/license.html
>>> Commons-lang3:
https://github.com/apache/commons-lang/blob/master/LICENSE.txt
>>> Commons-io:
https://github.com/apache/commons-io/blob/master/LICENSE.txt
>>> Commons-collections:
https://github.com/apache/commons-collections/blob/master/LICENSE.txt
>>> Jackson:
https://github.com/FasterXML/jackson-databind/blob/2.11.4/LICENSE
https://github.com/FasterXML/jackson-annotations/blob/2.11.4/LICENSE
https://github.com/FasterXML/jackson-core/blob/2.11.4/LICENSE
>>> Junit:
https://junit.org/junit4/license.html
>>> Hamcrest-core:
http://hamcrest.org/JavaHamcrest/
>>> Lombok:
https://github.com/projectlombok/lombok/blob/master/LICENSE
>>> Activiti:
https://github.com/Activiti/Activiti/blob/develop/LICENSE.txt
>>> Joda:
https://www.joda.org/joda-time/licenses.html
>>> HikariCP:
https://github.com/brettwooldridge/HikariCP/blob/dev/LICENSE
>>> log4j:
https://github.com/apache/logging-log4j2/blob/2.x/LICENSE.txt
>>> attoparser:
https://www.attoparser.org/license.html
>>> tomcat:
https://github.com/apache/tomcat/blob/main/LICENSE
>>> mybatis:
https://github.com/mybatis/mybatis-3/blob/master/LICENSE
>>> thymeleaf:
https://github.com/thymeleaf/thymeleaf/blob/3.1-master/LICENSE.txt
>>> Spring Boot:
https://github.com/spring-projects/spring-boot/blob/main/LICENSE.txt
>>> unbescapse:
https://www.unbescape.org/license.html
>>> aspectj:
https://github.com/eclipse-aspectj/aspectj/blob/master/LICENSE
>>> snakeyml:
https://github.com/snakeyaml/snakeyaml/blob/master/LICENSE.txt
================================================
FILE: README-zh.md
================================================
# JDEasyFlow
### 介绍
JDEasyFlow是一款通用流程编排组件, 适用于服务编排、工作流、任务审批等场景。它的特点是简单、灵活、易扩展。开发人员30分钟可入门上手,半天可掌握其原理。
### 软件架构
JDEasyFlow底层为流程引擎/状态机模块(使用时选一便可,建议优先使用流程引擎),此模块提供了基于JSON格式的JDEasyFlow规范进行流程编排的能力。
BPMN模块提供了基于BPMN规范进行流程定义和可视化的能力,流程可视化基于[bpmn-js](https://bpmn.io/),其本质为提供了将BPMN格式流程定义转换为JDEasyFlow格式的能力。
### 使用说明
在源码的test目录下有quickstart测试用例,可直接运行或调试以了解使用方式和运行原理。
#### 流程引擎
1. 代码中引入easyflow-flow jar包,以maven为例:
```
<dependency>
<groupId>com.jd.easyflow</groupId>
<artifactId>easyflow-flow</artifactId>
<version>{latestVersion}</version>
</dependency>
```
2. 编写流程定义文件
以node001->node002->node003的执行顺序为例:
```
{"id": "quickstart_001", "name": "Quick Start 001",
"nodes": [
{"id": "node001","name": "Node001","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()"},"start": true,"post": {"to": "node002"}},
{"id": "node002","name": "Node002","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()"},"post": {"to": "node003"}},
{"id": "node003","name": "Node003","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()"}}
]
}
```
其中QuickStart001Node01Action等为java节点动作类
3. 编写应用启动时加载流程引擎的代码
```
FlowEngineImpl flowEngine = new FlowEngineImpl();
flowEngine.setFlowPath("classpath:flow/quickstart/quickstart_001.json");
flowEngine.init();
```
Spring环境可直接定义FlowEngineImpl bean(不要显式配置或调用init方法).
4. 编写具体流程调用执行的代码
```
FlowParam param = new FlowParam("quickstart_001");
FlowResult result = flowEngine.execute(param);
```
日志打印结果如下:
```
[main ] INFO FlowEngineImpl - Start parsing definition files:easyflow-flow/target/test-classes/flow/quickstart/quickstart_001.json
[main ] INFO FlowEngineImpl - SART EXECUTE FLOW, flowId:quickstart_001 nodeIds:null
[main ] INFO BaseFlowRunner - EXECUTE NODE:node001
[main ] INFO QuickStart001Node01Action - Execute Node 001
[main ] INFO BaseFlowRunner - NEXT NODES:node002
[main ] INFO BaseFlowRunner - EXECUTE NODE:node002
[main ] INFO QuickStart002Node01Action - Execute Node 002
[main ] INFO BaseFlowRunner - NEXT NODES:node003
[main ] INFO BaseFlowRunner - EXECUTE NODE:node003
[main ] INFO QuickStart003Node01Action - Execute Node 003
[main ] INFO BaseFlowRunner - NEXT NODES:
[main ] INFO QuickStartTest - Execute finish, current node is:node003
```
以上只是简单使用示例,EasyFlow可支持很多的配置项和使用场景,更多使用见wiki文档.
#### 流程引擎-BPMN
打开easyflow-flow-bpmn/BPMNDesigner.html流程设计器. 点击导入按钮,导入easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn文件,可在设计器中看到和以上JSON定义等价的BPMN流程定义.
使用时只需要将FlowEngineImpl的flowParser设置为BpmnFlowParser.
#### 工作流
工作流模块提供了基于流程引擎的持久化和任务审批能力, 需要关系型数据库支持. 源码中的示例工程启动步骤如下:
1. 检出本工程库代码至本地.
1. 安装关系型数据库, 如MYSQL(使用时需遵守其许可).
1. 建库表, 数据库名为easyflow, 表结构可参考源码中的create_all_table.sql和sample_form_template.sql.
1. sample模块的application-open-all.yml文件中配置数据库连接信息, pom中引入数据库驱动jar包.
1. 编译构建代码工程, 启动IntegrationOpenApplication类. 启动成功后访问http://localhost:9888便可看到JDEasyFlow管理界面.
### 更多
JDEasyFlow具有非常灵活的扩展性,你可以基于目前已开源组件扩展做更多的功能.
### 联系我们
email: liyuliang5@jd.com
================================================
FILE: README.md
================================================
# JDEasyFlow
### Introduce
JDEasyFlow is a general flow orchestration component, suitable for service orchestration, workflow, auditing, etc. The characteristics are easy use, flexible, easy extended. Developer can understand using it in 30 minutes, understand its principle half of the day.
### Architecture
JDEasyFlow bottom layer is flow engine/state machine.(select one when use it, flow engine is recommanded), this module supply flow orchestration ability base on JSON format flow definition.
BPMN module supply define flow based on BPMN and visualization ability. visualization is based on [bpmn-js](https://bpmn.io/). The essence of this module is
convert BPMN format definition to JDEasyFlow JSON format definition.
### Usage
There are test cases in the test package of source code. You can run or debug directly to understand its usage and implement principle.
#### Flow Engine
1. Import easyflow-flow jar. take maven as example:
```
<dependency>
<groupId>com.jd.easyflow</groupId>
<artifactId>easyflow-flow</artifactId>
<version>{latestVersion}</version>
</dependency>
```
2. Write flow definition. For example, the sequence is node001->node002->node003:
```
{"id": "quickstart_001", "name": "Quick Start 001",
"nodes": [
{"id": "node001","name": "Node001","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()"},"start": true,"post": {"to": "node002"}},
{"id": "node002","name": "Node002","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()"},"post": {"to": "node003"}},
{"id": "node003","name": "Node003","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()"}}
]
}
```
QuickStart001Node01Action and so on is java node action class.
3. Write the code of loading flow engine when application start.
```
FlowEngineImpl flowEngine = new FlowEngineImpl();
flowEngine.setFlowPath("classpath:flow/quickstart/quickstart_001.json");
flowEngine.init();
```
You can define FlowEngineImpl bean in Spring(DO NOT configure or invoke init() method explicitly).
4. Write the code of invoking flow engine.
```
FlowParam param = new FlowParam("quickstart_001");
FlowResult result = flowEngine.execute(param);
```
The executing log are as follows:
```
[main ] INFO FlowEngineImpl - Start parsing definition files:easyflow-flow/target/test-classes/flow/quickstart/quickstart_001.json
[main ] INFO FlowEngineImpl - SART EXECUTE FLOW, flowId:quickstart_001 nodeIds:null
[main ] INFO BaseFlowRunner - EXECUTE NODE:node001
[main ] INFO QuickStart001Node01Action - Execute Node 001
[main ] INFO BaseFlowRunner - NEXT NODES:node002
[main ] INFO BaseFlowRunner - EXECUTE NODE:node002
[main ] INFO QuickStart002Node01Action - Execute Node 002
[main ] INFO BaseFlowRunner - NEXT NODES:node003
[main ] INFO BaseFlowRunner - EXECUTE NODE:node003
[main ] INFO QuickStart003Node01Action - Execute Node 003
[main ] INFO BaseFlowRunner - NEXT NODES:
[main ] INFO QuickStartTest - Execute finish, current node is:node003
```
Above is simple usecase, JDEasyFlow support many configurations and use cases. More can be seen in wiki doc.
#### FlowEngine-BPMN
Open flow designer with path easyflow-flow-bpmn/BPMNDesigner.html. Click import button, import easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn file. You can see bpmn flow definition of equal JSON format.
You only need set flowPaser of FlowEngineImpl to BpmnFlowParser when use.
#### Process
Process module provide persistence and task audit ability based on flow engine, needing relation database support. Sample application in the source code can be started as follows:
1. Checkout source code.
1. Install relation database system, for example MYSQL(You should obey their license).
1. Create database and table. Database name is easyflow, Table schema can be referred by create_all_table.sql and sample_form_template.sql.
1. Config database connection info in application-open-all.yml of sample module, Import database driver jar in pom.xml of sample module.
1. Build the project. Start IntegrationOpenApplication. Access http://localhost:9888.
### More
JDEasyFlow has very flexible extension ability. You can implement more features based on current component. For example flow data persistence, auditting, exception retry.
### Contact US
mailTo: liyuliang5@jd.com
================================================
FILE: easyflow-flow/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>easyflow-parent</artifactId>
<groupId>com.jd.easyflow</groupId>
<version>1.7.3</version>
</parent>
<artifactId>easyflow-flow</artifactId>
<name>easyflow-flow</name>
<packaging>jar</packaging>
<properties>
</properties>
<dependencies>
<!--spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<!-- logback & slf4j dependencies -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!--other -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/common/FlowExecutor.java
================================================
package com.jd.easyflow.flow.common;
import com.jd.easyflow.flow.engine.FlowContext;
/**
*
* @author liyuliang5
*
* @param <T> type
*/
public interface FlowExecutor<T> {
/**
* Common execute method
*
* @param context FlowContext
* @return result
*/
T execute(FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElEvaluator.java
================================================
package com.jd.easyflow.flow.el;
import java.util.Map;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeContext;
/**
*
* @author liyuliang5
*
*/
public interface ElEvaluator {
/**
* Evaluate with default context.
* @param <T>
* @param exp
* @param root
* @param cache
* @return
*/
<T> T evalWithDefaultContext(String exp, Object root, boolean cache);
/**
* Evaluate el value.
* @param <T>
* @param exp
* @param nodeContext
* @param flowContext
* @param data
* @return
*/
<T>T eval(String exp, NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data);
String evalTemplateWithDefaultContext(String template, Object root, boolean cache);
String evalTemplate(String template, NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElFactory.java
================================================
package com.jd.easyflow.flow.el;
/**
*
* @author liyuliang5
*
*/
public class ElFactory {
private static ElEvaluator defaultEvaluator = new SpelEvaluator();
public static ElEvaluator get() {
return defaultEvaluator;
}
public static void setDefaultEvaluator(ElEvaluator evaluator) {
defaultEvaluator = evaluator;
}
public void setDefault(ElEvaluator evaluator) {
ElFactory.defaultEvaluator = evaluator;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElRootMap.java
================================================
package com.jd.easyflow.flow.el;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeContext;
/**
*
* @author liyuliang5
*/
public class ElRootMap implements Map<String, Object> {
private static final String KEY_NODE_CONTEXT = "nodeContext";
private static final String KEY_ACTION_RESULT = "actionResult";
private static final String KEY_NODE_BIZ_CONTEXT = "nodeBizContext";
private static final String KEY_CONTEXT = "context";
private static final String KEY_BIZ_CONTEXT = "bizContext";
private static final String KEY_PARAM = "param";
private static final String KEY_BIZ_PARAM = "bizParam";
private static final String KEY_PARAM_DATA = "paramData";
private static final String KEY_RESULT = "result";
private static final String KEY_BIZ_RESULT = "bizResult";
private static final String KEY_RESULT_DATA = "resultData";
NodeContext nodeContext;
FlowContext context;
Map<String, Object> data;
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean containsKey(Object key) {
if (key == null) {
return data == null ? false : data.containsKey(key);
}
if (key.getClass() == String.class) {
switch ((String) key) {
case KEY_NODE_CONTEXT:
case KEY_ACTION_RESULT:
case KEY_NODE_BIZ_CONTEXT:
case KEY_CONTEXT:
case KEY_BIZ_CONTEXT:
case KEY_PARAM:
case KEY_BIZ_PARAM:
case KEY_PARAM_DATA:
case KEY_RESULT:
case KEY_BIZ_RESULT:
case KEY_RESULT_DATA:
return true;
default:
return data == null ? false : data.containsKey(key);
}
}
return false;
}
@Override
public Object get(Object key) {
if (key == null) {
return data == null ? null : data.get(key);
}
if (key.getClass() == String.class) {
Object value = null;
switch ((String) key) {
case KEY_NODE_CONTEXT:
value = nodeContext;
break;
case KEY_ACTION_RESULT:
value = nodeContext == null ? null : nodeContext.getActionResult();
break;
case KEY_NODE_BIZ_CONTEXT:
value = nodeContext == null ? null : nodeContext.getNodeContext();
break;
case KEY_CONTEXT:
value = context;
break;
case KEY_BIZ_CONTEXT:
value = context == null ? null : context.getContext();
break;
case KEY_PARAM:
value = context == null ? null : context.getParam();
break;
case KEY_BIZ_PARAM:
value = context == null ? null : (context.getParam() == null ? null : context.getParam().getParam());
break;
case KEY_PARAM_DATA:
value = context == null ? null : (context.getParam() == null ? null : context.getParam().getDataMap());
break;
case KEY_RESULT:
value = context == null ? null : context.getResult();
break;
case KEY_BIZ_RESULT:
value = context == null ? null : (context.getResult() == null ? null : context.getResult().getResult());
break;
case KEY_RESULT_DATA:
value = context == null ? null : (context.getResult() == null ? null : context.getResult().getDataMap());
default:
// NOOP
}
if (value == null && data != null) {
value = data.get(key);
}
return value;
}
return null;
}
@Override
public int size() {
throw new UnsupportedOperationException();
}
@Override
public boolean containsValue(Object value) {
throw new UnsupportedOperationException();
}
@Override
public Object put(String key, Object value) {
throw new UnsupportedOperationException();
}
@Override
public Object remove(Object key) {
throw new UnsupportedOperationException();
}
@Override
public void putAll(Map<? extends String, ? extends Object> m) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
throw new UnsupportedOperationException();
}
@Override
public Set<String> keySet() {
throw new UnsupportedOperationException();
}
@Override
public Collection<Object> values() {
throw new UnsupportedOperationException();
}
@Override
public Set<Entry<String, Object>> entrySet() {
throw new UnsupportedOperationException();
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/el/SpelEvaluator.java
================================================
package com.jd.easyflow.flow.el;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.expression.BeanFactoryResolver;
import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.util.JsonUtil;
/**
*
* @author liyuliang5
*
*/
public class SpelEvaluator implements ElEvaluator, ApplicationContextAware {
private static final Logger logger = LoggerFactory.getLogger(SpelEvaluator.class);
// Normal implementation.
public static final int ROOT_TYPE_HASH_MAP = 0;
// Performance is higher than HashMap
public static final int ROOT_TYPE_ROOT_MAP = 1;
private int rootType = ROOT_TYPE_ROOT_MAP;
private boolean cache = true;
private StandardEvaluationContext context = new StandardEvaluationContext();
private Map<String, Expression> cacheMap = new ConcurrentHashMap();
private ExpressionParser parser = new SpelExpressionParser();
private ApplicationContext applicationContext;
private static Map<String, Expression> templateCacheMap = new ConcurrentHashMap();
{
context.addPropertyAccessor(new MapAccessor());
}
@Override
public <T> T evalWithDefaultContext(String exp, Object root, boolean cache) {
try {
Expression expression;
if (cache) {
expression = cacheMap.get(exp);
if (expression == null) {
expression = parser.parseExpression(exp);
cacheMap.put(exp, expression);
}
} else {
expression = parser.parseExpression(exp);
}
Object value = expression.getValue(context, root);
return (T) value;
} catch (Exception e) {
if (logger.isErrorEnabled()) {
logger.error("Eval spel exception, exp:" + exp + "," + e.getMessage());
}
throw e;
}
}
@Override
public <T> T eval(String exp, NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data) {
if (flowContext.isLogOn() && logger.isInfoEnabled()) {
logger.info("EVAL SPEL:" + exp);
}
Object root = null;
switch (rootType) {
case ROOT_TYPE_HASH_MAP:
root = buildHashMapRoot(nodeContext, flowContext, data);
break;
case ROOT_TYPE_ROOT_MAP:
root = buildRootMapRoot(nodeContext, flowContext, data);
break;
}
Object result = null;
try {
result = evalWithDefaultContext(exp, root, cache);
} catch (Exception e) {
if (flowContext.isLogOn() && logger.isErrorEnabled()) {
logger.error("EVAL SPEL EXCEPTION, EXP:" + exp + "," + e.getMessage());
}
throw e;
}
if (flowContext.isLogOn() && logger.isInfoEnabled()) {
try {
logger.info("SPEL RESULT:" + JsonUtil.toJsonString(result));
} catch (Throwable t) {
logger.info("spel result to json string exception:" + t.getMessage());
}
}
return (T) result;
}
private Object buildHashMapRoot(NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data) {
Map<String, Object> root = new HashMap<>();
if (nodeContext != null) {
root.put("nodeContext", nodeContext);
root.put("actionResult", nodeContext.getActionResult());
if (nodeContext.getNodeContext() != null) {
root.put("nodeBizContext", nodeContext.getNodeContext());
}
}
if (flowContext != null) {
root.put("context", flowContext);
if (flowContext.getContext() != null) {
root.put("bizContext", flowContext.getContext());
}
root.put("param", flowContext.getParam());
if (flowContext.getParam() != null && flowContext.getParam().getParam() != null) {
root.put("bizParam", flowContext.getParam().getParam());
}
if (flowContext.getParam() != null && flowContext.getParam().getDataMap() != null) {
root.put("paramData", flowContext.getParam().getDataMap());
}
root.put("result", flowContext.getResult());
if (flowContext.getResult() != null && flowContext.getResult().getResult() != null) {
root.put("bizResult", flowContext.getResult().getResult());
root.put("resultData", flowContext.getResult().getDataMap());
}
}
if (data != null) {
root.putAll(data);
}
return root;
}
private Object buildRootMapRoot(NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data) {
ElRootMap root = new ElRootMap();
root.nodeContext = nodeContext;
root.context = flowContext;
if (data != null) {
root.data = data;
}
return root;
}
@Override
public String evalTemplate(String template, NodeContext nodeContext, FlowContext flowContext,
Map<String, Object> data) {
if (flowContext.isLogOn() && logger.isInfoEnabled()) {
logger.info("EVAL TEMPLATE:" + template);
}
Object root = null;
switch (rootType) {
case ROOT_TYPE_HASH_MAP:
root = buildHashMapRoot(nodeContext, flowContext, data);
break;
case ROOT_TYPE_ROOT_MAP:
root = buildRootMapRoot(nodeContext, flowContext, data);
break;
}
String result = null;
try {
result = evalTemplateWithDefaultContext(template, root, cache);
} catch (Exception e) {
if (flowContext.isLogOn() && logger.isErrorEnabled()) {
logger.error("EVAL TEMPLATE EXCEPTION, TEMPLATE:" + template + "," + e.getMessage());
}
throw e;
}
if (flowContext.isLogOn() && logger.isInfoEnabled()) {
logger.info("TEMPLATE RESULT:" + result);
}
return result;
}
@Override
public String evalTemplateWithDefaultContext(String template, Object root, boolean cache) {
try {
Expression expression;
if (cache) {
expression = templateCacheMap.get(template);
if (expression == null) {
expression = parser.parseExpression(template, ParserContext.TEMPLATE_EXPRESSION);
templateCacheMap.put(template, expression);
}
} else {
expression = parser.parseExpression(template, ParserContext.TEMPLATE_EXPRESSION);
}
Object result = null;
result = expression.getValue(context, root);
if (result == null) {
return null;
}
return result.toString();
} catch (Exception e) {
logger.error("SPEL template eval exception, template:" + template, e);
throw e;
}
}
public int getRootType() {
return rootType;
}
public void setRootType(int rootType) {
this.rootType = rootType;
}
public boolean isCache() {
return cache;
}
public void setCache(boolean cache) {
this.cache = cache;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
context.setBeanResolver(new BeanFactoryResolver(applicationContext));
}
public StandardEvaluationContext getContext() {
return context;
}
public void setContext(StandardEvaluationContext context) {
this.context = context;
}
public ExpressionParser getParser() {
return parser;
}
public void setParser(ExpressionParser parser) {
this.parser = parser;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowContext.java
================================================
package com.jd.easyflow.flow.engine;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.jd.easyflow.flow.el.ElEvaluator;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.NodeContext;
/**
* Flow context.
* @author liyuliang5
*
*/
public interface FlowContext extends Serializable {
/**
* Get start node context list.
* @return
*/
List<NodeContext> getStartNodes();
/**
* Set start node context list.
* @param startNodes
*/
void setStartNodes(List<NodeContext> startNodes);
/**
* Get end node context list.
* From every start node, if execute to no next node(Including execute nodes), we add it to end node list.
* @return
*/
List<NodeContext> getEndNodes();
/**
* Put context data.
* @param key
* @param value
*/
void put(String key, Object value);
/**
* Get context data.
* @param <T>
* @param key
* @return
*/
<T> T get(String key);
/**
* Delete key.
* @param key
*/
void remove(String key);
/**
* Get data.
* @return
*/
Map<String, Object> getData();
/**
* Get flow param.
* @return
*/
FlowParam getParam();
/**
* Set flow param.
* @param param
*/
void setParam(FlowParam param);
/**
* Get flow result.
* @return
*/
FlowResult getResult();
/**
* Set flow result.
* @param result
*/
void setResult(FlowResult result);
/**
* Get flow id.
* @return
*/
String getFlowId();
/**
* Set flow id.
* @param flowId
*/
void setFlowId(String flowId);
/**
* Get flow.
* @return
*/
Flow getFlow();
/**
* Set flow.
* @param flow
*/
void setFlow(Flow flow);
/**
* Get flow engine.
* @return
*/
FlowEngine getFlowEngine();
/**
* Set interrupted. only can from false to true.
* @param interrupted
*/
void setInterrupted();
/**
* Get interrupted.
* @return
*/
boolean isInterrupted();
/**
* Get pre result.
* @return
*/
Boolean getPreResult();
/**
* Get log flag.
* @return
*/
Boolean getLogFlag();
/**
* Set log flag.
* @param logFlag
*/
void setLogFlag(Boolean logFlag);
/**
*
* @return
*/
boolean isLogOn();
/**
* Get business context.
* @param <T>
* @return
*/
<T>T getContext();
/**
* Set business context.
* @param context
*/
void setContext(Object context);
/**
* Get ElEvaluator.
* @return
*/
ElEvaluator getElEvaluator();
/**
* Whether record history.
* @return
*/
boolean isRecordHistory();
/**
* Get FlowContext of parent flow.
* @return
*/
FlowContext getParentContext();
/**
* Get nodeContext of parent flow.
* @return
*/
NodeContext getParentNodeContext();
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowEngine.java
================================================
package com.jd.easyflow.flow.engine;
import java.util.Map;
import com.jd.easyflow.flow.el.ElEvaluator;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.parser.FlowParser;
/**
*
* @author liyuliang5
*
*/
public interface FlowEngine {
/**
* Execute flow.
* @param param
* @return
*/
FlowResult execute(FlowParam param);
/**
* Get flow definition.
* @param id
* @return
*/
Flow getFlow(String id);
/**
* Get flow parser.
* @return
*/
FlowParser getFlowParser();
/**
* Get engine properties.
* @return
*/
Map<String, Object> getProperties();
/**
* Get engine property.
* @param <T>
* @param key
* @return
*/
<T>T getProperty(String key);
/**
*
* @return
*/
ElEvaluator getElEvaluator();
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowParam.java
================================================
package com.jd.easyflow.flow.engine;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.jd.easyflow.flow.engine.impl.FlowContextImpl;
/**
*
* @author liyuliang5
*
*/
public class FlowParam implements Serializable {
public FlowParam() {
// NOOP
}
public FlowParam(String flowId) {
this.flowId = flowId;
}
public FlowParam(String flowId, Object param) {
this.flowId = flowId;
this.param = param;
}
public FlowParam(String flowId, String[] nodeIds, Object param) {
this.flowId = flowId;
this.nodeIds = nodeIds;
this.param = param;
}
public FlowParam(String flowId, String[] nodeIds, Object param, Map<String, Object> dataMap) {
this.flowId = flowId;
this.nodeIds = nodeIds;
this.param = param;
if (dataMap != null) {
for (Entry<String, Object> entry : dataMap.entrySet()) {
if (entry.getValue() == null) {
this.dataMap.remove(entry.getKey());
} else {
this.dataMap.put(entry.getKey(), entry.getValue());
}
}
}
this.dataMap = dataMap;
}
public FlowParam(String flowId, String nodeId, Object param) {
this.flowId = flowId;
this.nodeIds = new String[] { nodeId };
this.param = param;
}
private String flowId;
private String[] nodeIds;
/**
* business param.
*/
private Object param;
/**
* flow context.
*/
@JsonIgnore
private FlowContext context;
/**
* common param data.
*/
private Map<String, Object> dataMap = new ConcurrentHashMap<String, Object>();
/**
* log flag
*/
private Boolean logFlag;
public String getFlowId() {
return flowId;
}
public void setFlowId(String flowId) {
this.flowId = flowId;
}
public String[] getNodeIds() {
return nodeIds;
}
public void setNodeIds(String[] nodeIds) {
this.nodeIds = nodeIds;
}
public void setNodeId(String nodeId) {
if (nodeId == null) {
return;
}
this.nodeIds = new String[] { nodeId };
}
public <T> T getParam() {
return (T) param;
}
/**
* param should be Object[] or List
*
* @param <T>
* @param index
* @return
*/
public <T> T getParam(int index) {
if (param == null) {
return null;
}
if (param instanceof Object[]) {
return (T) ((Object[]) param)[index];
} else if (param instanceof List) {
return (T) ((List) param).get(index);
}
throw new IllegalStateException("Param:" + param + " is not index type");
}
/**
* param should be Map
*
* @param <T>
* @param key
* @return
*/
public <T> T getParam(String key) {
if (param == null) {
return null;
}
return (T) ((Map<String, Object>) param).get(key);
}
public void putParam(String key, Object value) {
if (param == null) {
param = new ConcurrentHashMap<>();
}
if (value == null) {
((Map<String, Object>) param).remove(key);
} else {
((Map<String, Object>) param).put(key, value);
}
}
public void setParam(Object param) {
this.param = param;
}
public FlowContext getContext() {
return context;
}
/**
* High level method.
* @param context. SHOULD use new FlowContext Object and can only invoke some methods.
*/
public void setContext(FlowContext context) {
this.context = context;
}
public Map<String, Object> getDataMap() {
return dataMap;
}
public void setDataMapFrom(FlowParam fromParam) {
this.dataMap = fromParam.dataMap;
}
public void put(String key, Object value) {
if (value == null) {
dataMap.remove(key);
} else {
dataMap.put(key, value);
}
}
public <T> T get(String key) {
return (T) dataMap.get(key);
}
public void putContextData(String key, Object value) {
if (context == null) {
context = new FlowContextImpl();
}
if (value == null) {
context.remove(key);
} else {
context.put(key, value);
}
}
public void setBizContext(Object bizContext) {
if (context == null) {
context = new FlowContextImpl();
}
context.setContext(bizContext);
}
public Boolean getLogFlag() {
return logFlag;
}
public void setLogFlag(Boolean logFlag) {
this.logFlag = logFlag;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowResult.java
================================================
package com.jd.easyflow.flow.engine;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.fasterxml.jackson.annotation.JsonIgnore;
/**
*
* @author liyuliang5
*
*/
public class FlowResult implements Serializable {
@JsonIgnore
private FlowContext context;
private Object result;
/**
* common result data.
*/
private Map<String, Object> dataMap = new ConcurrentHashMap<String, Object>();
public FlowContext getContext() {
return context;
}
public void setContext(FlowContext context) {
this.context = context;
}
public synchronized <T> T getResult() {
return (T) result;
}
public synchronized void setResult(Object result) {
this.result = result;
}
/**
*
* Put result. putResult or addResult should use only one.
*
* @param key
* @param value
*/
public synchronized void putResult(String key, Object value) {
if (result == null) {
result = new ConcurrentHashMap<>();
}
if (value == null) {
((Map<String, Object>) result).remove(key);
} else {
((Map<String, Object>) result).put(key, value);
}
}
/**
*
* Add result. putResult or addResult should use only one.
*
* @param value
*/
public synchronized void addResult(Object value) {
if (result == null) {
result = new ArrayList<Object>();
}
((List<Object>) result).add(value);
}
public synchronized <T> T getResult(String key) {
if (result == null) {
return null;
}
return (T) ((Map<String, Object>) result).get(key);
}
public synchronized <T> T getResult(int index) {
if (result == null) {
return null;
}
return (T) ((List<Object>) result).get(index);
}
public Map<String, Object> getDataMap() {
return dataMap;
}
public void setDataMapFrom(FlowResult result) {
this.dataMap = result.dataMap;
}
public void put(String key, Object value) {
if (value == null) {
dataMap.remove(key);
} else {
dataMap.put(key, value);
}
}
public <T> T get(String key) {
return (T) dataMap.get(key);
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowRunner.java
================================================
package com.jd.easyflow.flow.engine;
import com.jd.easyflow.flow.model.FlowLifeCycle;
/**
* Flow runner.
* @author liyuliang5
* @date 2021/07/26
*/
public interface FlowRunner extends FlowLifeCycle {
/**
* Run flow.
* @param context
*/
void run(FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/builder/FlowParamBuilder.java
================================================
package com.jd.easyflow.flow.engine.builder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowParam;
/**
*
* @author liyuliang5
*
*/
public class FlowParamBuilder {
private FlowParam param;
public static FlowParamBuilder create(String flowId, String nodeId) {
FlowParam param = new FlowParam();
param.setFlowId(flowId);
param.setNodeIds(new String[] {nodeId});
FlowParamBuilder builder = new FlowParamBuilder();
builder.param = param;
return builder;
}
public static FlowParamBuilder create(String flowId, String[] nodeIds) {
FlowParam param = new FlowParam();
param.setFlowId(flowId);
param.setNodeIds(nodeIds);
FlowParamBuilder builder = new FlowParamBuilder();
builder.param = param;
return builder;
}
public FlowParamBuilder putParam(String key, Object value) {
if (param.getParam() == null) {
param.setParam( new HashMap<>());
}
((Map<String, Object>) param.getParam()).put(key, value);
return this;
}
public FlowParamBuilder addParam(Object value) {
if (param.getParam() == null) {
param.setParam(new ArrayList());
}
((List<Object>) param.getParam()).add(value);
return this;
}
public FlowParamBuilder addParams(Object... values) {
if (param.getParam() == null) {
param.setParam(new ArrayList());
}
((List<Object>) param.getParam()).addAll(Arrays.asList(values));
return this;
}
public FlowParamBuilder paramObject(Object o) {
param.setParam(o);
return this;
}
public FlowParamBuilder putData(String key, Object value) {
param.put(key, value);
return this;
}
public FlowParamBuilder putData(Map<String, Object> dataMap) {
if (dataMap != null) {
for (Entry<String, Object> entry : dataMap.entrySet()) {
param.put(entry.getKey(), entry.getValue());
}
}
return this;
}
public FlowParamBuilder setContext(FlowContext context) {
param.setContext(context);
return this;
}
public FlowParam build() {
return param;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/BaseFlowEventListener.java
================================================
package com.jd.easyflow.flow.engine.event;
import java.util.List;
import java.util.Map;
import com.jd.easyflow.flow.util.Pair;
/**
* @author liyuliang5
*/
public abstract class BaseFlowEventListener implements FlowEventListener {
protected Pair<String, Integer>[] acceptedEvents;
@Override
public Pair<String, Integer>[] getAcceptedEvents() {
return acceptedEvents;
}
public void setAcceptedEvents(Pair<String, Integer>[] acceptedEvents) {
this.acceptedEvents = acceptedEvents;
}
@Override
public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {
if (definition == null) {
return;
}
List<Map<String, Object>> acceptedEvents = (List<Map<String, Object>>)definition.get("acceptedEvents");
if (acceptedEvents != null) {
this.acceptedEvents = new Pair[acceptedEvents.size()];
for (int i = 0; i < acceptedEvents.size(); i++) {
Map<String, Object> acceptedEvent = acceptedEvents.get(i);
String event = (String) acceptedEvent.get("event");
Integer order = (Integer) acceptedEvent.get("order");
this.acceptedEvents[i] = Pair.of(event, order);
}
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/ExpFlowEventListener.java
================================================
package com.jd.easyflow.flow.engine.event;
import java.util.HashMap;
import java.util.Map;
import com.jd.easyflow.flow.el.ElEvaluator;
import com.jd.easyflow.flow.el.ElFactory;
/**
*
* @author liyuliang5
*
*/
public class ExpFlowEventListener extends BaseFlowEventListener {
private ElEvaluator elEvaluator;
private String exp;
public ExpFlowEventListener() {
}
public ExpFlowEventListener(String exp) {
this.exp = exp;
}
@Override
public void on(FlowEvent flowEvent) {
Map<String, Object> data = new HashMap<>();
data.put("event", flowEvent);
ElEvaluator evaluator = elEvaluator;
if (evaluator == null && flowEvent.getContext() != null) {
elEvaluator = flowEvent.getContext().getElEvaluator();
}
if (evaluator == null) {
evaluator = ElFactory.get();
}
evaluator.eval(exp, null, flowEvent.getContext(), data);
}
public ElEvaluator getElEvaluator() {
return elEvaluator;
}
public void setElEvaluator(ElEvaluator elEvaluator) {
this.elEvaluator = elEvaluator;
}
public String getExp() {
return exp;
}
public void setExp(String exp) {
this.exp = exp;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEvent.java
================================================
package com.jd.easyflow.flow.engine.event;
import java.util.List;
import java.util.Map;
import com.jd.easyflow.flow.engine.FlowContext;
/**
*
* @author liyuliang5
*
*/
public class FlowEvent {
private String type;
private Object data;
private FlowContext context;
public FlowEvent() {
}
public FlowEvent(String type, Object data, FlowContext context) {
this.type = type;
this.data = data;
this.context = context;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public <T>T getMapData(String key) {
if (data == null) {
return null;
}
return (T) ((Map<String, Object>) data).get(key);
}
public <T>T getListData(int index) {
if (data == null) {
return null;
}
return (T) ((List<Object>) data).get(index);
}
public FlowContext getContext() {
return context;
}
public void setContext(FlowContext context) {
this.context = context;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEventListener.java
================================================
package com.jd.easyflow.flow.engine.event;
import com.jd.easyflow.flow.model.FlowLifeCycle;
import com.jd.easyflow.flow.util.Pair;
/**
*
* @author liyuliang5
*
*/
public interface FlowEventListener extends FlowLifeCycle {
/**
*
* @return List of Event and order priority pair.
* The highest order values has highest priority.
* If order value same, the front configured has higher priority.
*/
default Pair<String, Integer>[] getAcceptedEvents() {
return null;
}
/**
* Listener Id.
* @return
*/
default String getId() {
return this.getClass().getName();
}
/**
* Callback of event.
* @param flowEvent
*/
public void on(FlowEvent flowEvent);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEventTrigger.java
================================================
package com.jd.easyflow.flow.engine.event;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.InitContext;
import com.jd.easyflow.flow.util.Pair;
/**
*
* @author liyuliang5
*
*/
public class FlowEventTrigger {
public static final Logger logger = LoggerFactory.getLogger(FlowEventTrigger.class);
public static final String NULL_KEY = null;
private List<FlowEventListener> listenerList;
private Map<String, TreeMap<Integer, List<FlowEventListener>>> listenerMap;
public void init(InitContext initContext, Flow flow) {
if (listenerList != null) {
for (FlowEventListener listener : listenerList) {
listener.init(initContext, flow);
}
}
}
public void destroy () {
if (listenerList != null) {
for (FlowEventListener listener : listenerList) {
listener.destroy();
}
}
}
public void addListener(FlowEventListener listener) {
if (listenerList == null) {
listenerList = new ArrayList();
listenerMap = new HashMap<>();
}
listenerList.add(listener);
Pair<String, Integer>[] pairs = listener.getAcceptedEvents();
if (pairs == null) {
pairs = new Pair[] { Pair.of(NULL_KEY, 0) };
}
for (Pair<String, Integer> pair : pairs) {
TreeMap<Integer, List<FlowEventListener>> map = listenerMap.get(pair.getLeft());
if (map == null) {
map = new TreeMap<Integer, List<FlowEventListener>>(Comparator.reverseOrder());
listenerMap.put(pair.getLeft(), map);
}
List<FlowEventListener> listeners = map.get(pair.getRight());
if (listeners == null) {
listeners = new ArrayList();
map.put(pair.getRight(), listeners);
}
listeners.add(listener);
}
}
public void triggerEvent(String eventType, FlowContext context) {
triggerEvent(eventType, null, context, false);
}
public void triggerEvent(String eventType, Object eventData, FlowContext context, boolean catchThrowable) {
if (listenerList == null || listenerList.size() == 0) {
return;
}
FlowEvent event = null;
TreeMap<Integer, List<FlowEventListener>> map = listenerMap.get(eventType);
if (map != null) {
event = createEvent(eventType, eventData, context);
}
// priority>0
if (map != null) {
for (Entry<Integer, List<FlowEventListener>> entry : map.entrySet()) {
if (entry.getKey() <= 0) {
break;
}
for (FlowEventListener listener : entry.getValue()) {
onEvent(event, listener, catchThrowable);
}
}
}
// key exists and priority =0
if (map != null) {
List<FlowEventListener> keyZeroListeners = map.get(0);
if (keyZeroListeners != null) {
for (FlowEventListener listener : keyZeroListeners) {
onEvent(event, listener, catchThrowable);
}
}
}
// key is null
TreeMap<Integer, List<FlowEventListener>> nullMap = listenerMap.get(NULL_KEY);
if (nullMap != null) {
List<FlowEventListener> nullZeroListeners = nullMap.get(0);
if (nullZeroListeners != null) {
if (event == null) {
event = createEvent(eventType, eventData, context);
}
for (FlowEventListener listener : nullZeroListeners) {
onEvent(event, listener, catchThrowable);
}
}
}
// priority<0
if (map != null) {
for (Entry<Integer, List<FlowEventListener>> entry : map.entrySet()) {
if (entry.getKey() >= 0) {
continue;
}
for (int i = 0; i < entry.getValue().size(); i++) {
onEvent(event, entry.getValue().get(entry.getValue().size() - 1 - i), catchThrowable);
}
}
}
}
private FlowEvent createEvent(String eventType, Object eventData, FlowContext context) {
FlowEvent event = new FlowEvent();
event.setType(eventType);
event.setData(eventData);
event.setContext(context);
return event;
}
private void onEvent(FlowEvent event, FlowEventListener listener, boolean catchThrowable) {
if (!catchThrowable) {
listener.on(event);
} else {
try {
listener.on(event);
} catch (Throwable t) { //NOSONAR
logger.error("Exception on event of " + listener.getClass().getName() + ", message:" + t.getMessage(), t);
}
}
}
public List<FlowEventListener> getListenerList() {
return listenerList;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/impl/EventFlowListener.java
================================================
package com.jd.easyflow.flow.engine.event.impl;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.event.BaseFlowEventListener;
import com.jd.easyflow.flow.engine.event.FlowEvent;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.util.FlowConstants;
import com.jd.easyflow.flow.util.FlowEventTypes;
import com.jd.easyflow.flow.util.FlowStringUtil;
import com.jd.easyflow.flow.util.Pair;
/**
* Listener of event node.
* @author liyuliang5
*
*/
public class EventFlowListener extends BaseFlowEventListener {
private static final Logger logger = LoggerFactory.getLogger(EventFlowListener.class);
private int initEndEventOrder = FlowConstants.EVENT_ORDER_START;
@Override
public Pair<String, Integer>[] getAcceptedEvents() {
if (this.acceptedEvents != null) {
return acceptedEvents;
}
return new Pair[] { Pair.of(FlowEventTypes.INIT_END, initEndEventOrder) };
}
@Override
public void on(FlowEvent event) {
switch (event.getType()) {
case FlowEventTypes.INIT_END: {
String eventId = event.getContext().getParam().get(FlowConstants.PARAM_DATA_EVENT);
if (FlowStringUtil.isNotEmpty(eventId)) {
List<NodeContext> startNodes = event.getContext().getStartNodes();
if (event.getContext().isLogOn() && logger.isInfoEnabled()) {
logger.info("EVENT ID:" + eventId);
}
if (startNodes != null && ! startNodes.isEmpty()) {
startNodes.forEach(node -> node.put(FlowConstants.NODE_CONTEXT_DATA_EVENT, eventId));
}
}
break;
}
default:
break;
}
}
public int getInitEndEventOrder() {
return initEndEventOrder;
}
public void setInitEndEventOrder(int initEndEventOrder) {
this.initEndEventOrder = initEndEventOrder;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/impl/InterruptFlowListener.java
================================================
package com.jd.easyflow.flow.engine.event.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.event.BaseFlowEventListener;
import com.jd.easyflow.flow.engine.event.FlowEvent;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.util.FlowConstants;
import com.jd.easyflow.flow.util.FlowEventTypes;
import com.jd.easyflow.flow.util.FlowUtil;
import com.jd.easyflow.flow.util.Pair;
/**
* Listen node end event, process interrupt scene.
* @author liyuliang5
*
*/
public class InterruptFlowListener extends BaseFlowEventListener {
private static final Logger logger = LoggerFactory.getLogger(InterruptFlowListener.class);
private static final Pair<String, Integer>[] DEFAULT_ACCEPTED_EVENTS = new Pair[]{Pair.of(FlowEventTypes.NODE_END, FlowConstants.EVENT_ORDER_START)};
public InterruptFlowListener() {
this.acceptedEvents = DEFAULT_ACCEPTED_EVENTS;
}
@Override
public void on(FlowEvent event) {
switch (event.getType()) {
case FlowEventTypes.NODE_END: {
NodeContext nodeContext = (NodeContext) event.getData();
FlowContext context = event.getContext();
Boolean interrupt = FlowUtil.nodeProperty(FlowConstants.PROP_INTERRUPT, nodeContext, context);
if (interrupt == null) {
String interruptExp = FlowUtil.nodeProperty(FlowConstants.PROP_INTERRUPT_EXP, nodeContext, context);
if (interruptExp != null) {
interrupt = context.getElEvaluator().eval(interruptExp, nodeContext, context, null);
}
if (interrupt == null) {
String flowInterruptExp = context.getFlow().getProperty(FlowConstants.PROP_INTERRUPT_EXP);
if (flowInterruptExp != null) {
interrupt = context.getElEvaluator().eval(flowInterruptExp, nodeContext, context, null);
}
}
}
if (logger.isDebugEnabled()) {
logger.debug("Flow interrupt result:" + interrupt);
}
if (Boolean.TRUE.equals(interrupt)) {
context.setInterrupted();
}
break;
}
default:
break;
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/FlowEngineFilter.java
================================================
package com.jd.easyflow.flow.engine.filter;
import com.jd.easyflow.flow.engine.FlowEngine;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.filter.Filter;
import com.jd.easyflow.flow.util.Pair;
/**
* @author liyuliang5
*/
public interface FlowEngineFilter extends Filter<Pair<FlowParam, FlowEngine>, FlowResult> {
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/FlowEngineFilterManager.java
================================================
package com.jd.easyflow.flow.engine.filter;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import com.jd.easyflow.flow.engine.FlowEngine;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.filter.Filter;
import com.jd.easyflow.flow.filter.FilterChain;
import com.jd.easyflow.flow.filter.FilterChainImpl;
import com.jd.easyflow.flow.model.InitContext;
import com.jd.easyflow.flow.util.Pair;
/**
* @author liyuliang5
*/
public class FlowEngineFilterManager {
protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters;
protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> innerFilters;
protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> outerFilters;
public void init(InitContext initContext, FlowEngine flowEngine) {
if (filters != null) {
filters.forEach(filter -> {
filter.init(initContext, flowEngine);
});
refreshFilters();
}
}
public boolean noOuterFilter() {
return outerFilters == null || outerFilters.size() == 0;
}
public FlowResult doOuterFilter(Pair<FlowParam, FlowEngine> p, Function<Pair<FlowParam, FlowEngine>, FlowResult> outerInvoker) {
FilterChain<Pair<FlowParam, FlowEngine>, FlowResult> chain = new FilterChainImpl<Pair<FlowParam, FlowEngine>, FlowResult>(outerFilters,
outerInvoker);
return chain.doFilter(p);
}
public boolean noInnerFilter() {
return innerFilters == null || innerFilters.size() == 0;
}
public FlowResult doInnerFilter(Pair<FlowParam, FlowEngine> p, Function<Pair<FlowParam, FlowEngine>, FlowResult> innerInvoker) {
FilterChain<Pair<FlowParam, FlowEngine>, FlowResult> chain = new FilterChainImpl<Pair<FlowParam, FlowEngine>, FlowResult>(innerFilters,
innerInvoker);
return chain.doFilter(p);
}
public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getFilters() {
return filters;
}
public void setFilters(List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters) {
this.filters = filters;
refreshFilters();
}
private void refreshFilters() {
if (filters == null) {
this.innerFilters = this.outerFilters = null;
} else {
this.innerFilters = new ArrayList<Filter<Pair<FlowParam, FlowEngine>, FlowResult>>();
this.outerFilters = new ArrayList<Filter<Pair<FlowParam, FlowEngine>, FlowResult>>();
for (Filter filter : filters) {
int filterOrder = filter.getOrder();
int pos = 0;
if (filterOrder < 0) {
for (; pos < innerFilters.size(); pos++) {
if (((Filter) innerFilters.get(pos)).getOrder() < filterOrder) {
break;
}
}
innerFilters.add(pos, filter);
} else {
for (; pos < outerFilters.size(); pos++) {
if (((Filter) outerFilters.get(pos)).getOrder() < filterOrder) {
break;
}
}
outerFilters.add(pos, filter);
}
}
}
}
public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getInnerFilters() {
return innerFilters;
}
public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getOuterFilters() {
return outerFilters;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/impl/BaseFlowEngineFilter.java
================================================
package com.jd.easyflow.flow.engine.filter.impl;
import com.jd.easyflow.flow.engine.FlowEngine;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.engine.filter.FlowEngineFilter;
import com.jd.easyflow.flow.filter.BaseFilter;
import com.jd.easyflow.flow.util.Pair;
/**
* @author liyuliang5
*/
public abstract class BaseFlowEngineFilter extends BaseFilter<Pair<FlowParam, FlowEngine>, FlowResult> implements FlowEngineFilter {
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/BaseFlowRunner.java
================================================
package com.jd.easyflow.flow.engine.impl;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowRunner;
import com.jd.easyflow.flow.exception.FlowException;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.NodeContextAccessor;
import com.jd.easyflow.flow.util.FlowEventTypes;
import com.jd.easyflow.flow.util.Triple;
/**
*
* @author liyuliang5
*
*/
public abstract class BaseFlowRunner implements FlowRunner {
private static final Logger logger = LoggerFactory.getLogger(BaseFlowRunner.class);
private Function<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> outerNodeInvoker = p -> invokeNode(p.getLeft(), p.getMiddle(), p.getRight());
private Function<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> innerNodeInvoker = p -> p.getLeft().execute(p.getMiddle(), p.getRight());
private Function<FlowContext, Boolean> outerFlowPreHandlerInvoker = p -> invokePreHandler(p.getFlow(), p);
private Function<FlowContext, Boolean> innerFlowPreHandlerInvoker = p -> p.getFlow().getPreHandler().preHandle(p);
private Function<FlowContext, Void> outerFlowPostHandlerInvoker = p -> {invokePostHandler(p.getFlow(), p); return null;};
private Function<FlowContext, Void> innerFlowPostHandlerInvoker = p -> {p.getFlow().getPostHandler().postHandle(p); return null;};
@Override
public void run(FlowContext context) {
Flow flow = context.getFlow();
flow.triggerEvent(FlowEventTypes.RUN_START, context);
if (! executePreHandler(flow, context)) {
flow.triggerEvent(FlowEventTypes.RUN_END, context);
return;
}
runNodes((FlowContextImpl) context);
executePostHandler(flow, context);
flow.triggerEvent(FlowEventTypes.RUN_END, context);
}
/**
* Run flow.
*
* @param context
*/
public abstract void runNodes(FlowContextImpl context);
protected NodeContext[] runOneNodeAndAddNextNodes(NodeContext currentNode, FlowContextImpl context) {
NodeContext[] nextNodes = runOneNode(currentNode, context);
if (nextNodes != null) {
context.addNodes(nextNodes);
}
return nextNodes;
}
/**
* Run one node.
*
* @param currentNode
* @param context
* @param flow
* @return next nodes
*/
protected NodeContext[] runOneNode(NodeContext currentNode, FlowContextImpl context) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("EXECUTE NODE:" + currentNode.getNodeId());
}
FlowNode node = context.getFlow().getNode(currentNode.getNodeId());
if (node == null) {
throw new FlowException("Node " + currentNode.getNodeId() + " not exists");
}
NodeContext[] nextNodes = null;
try {
currentNode = runNode(node, currentNode, context);
// get next nodes
nextNodes = currentNode.getNextNodes();
} catch (Throwable t) { // NOSONAR
NodeContextAccessor.setThrowable(currentNode, t);
throw t;
} finally {
if (nextNodes == null) {
((FlowContextImpl) context).addEndNode(currentNode);
}
}
// print nodes info
if (context.isLogOn() && logger.isInfoEnabled()) {
if (nextNodes == null || nextNodes.length == 0) {
logger.info("NEXT NODES:");
} else if (nextNodes.length == 1) {
logger.info("NEXT NODES:" + nextNodes[0].getNodeId());
} else {
StringBuilder builder = new StringBuilder();
for (NodeContext n : nextNodes) {
builder.append(n.getNodeId()).append(",");
}
logger.info("NEXT NODES:" + (builder.length() == 0 ? "" : builder.substring(0, builder.length() - 1)));
}
}
// Clear previous node to avoid OOM
if (!context.isRecordHistory()) {
NodeContextAccessor.setPreviousNode(currentNode, null);
NodeContextAccessor.setNextNodes(currentNode, null);
}
return nextNodes;
}
protected NodeContext runNode(FlowNode node, NodeContext currentNode, FlowContextImpl context) {
Flow flow = context.getFlow();
if (flow.getFilterManager().noOuterNodeFilter()) {
return invokeNode(node, currentNode, context);
}
return flow.getFilterManager().doOuterNodeFilter(Triple.of(node, currentNode, context), outerNodeInvoker);
}
private NodeContext invokeNode(FlowNode node, NodeContext currentNode, FlowContext context) {
Throwable throwable = null;
Flow flow = context.getFlow();
try {
flow.triggerEvent(FlowEventTypes.NODE_START, currentNode, context, false);
// Execute node
if (flow.getFilterManager().noInnerNodeFilter()) {
currentNode = node.execute(currentNode, context);
} else {
currentNode = flow.getFilterManager().doInnerNodeFilter(Triple.of(node, currentNode, context), innerNodeInvoker);
}
flow.triggerEvent(FlowEventTypes.NODE_END, currentNode, context, false);
return currentNode;
} catch (Throwable t) {// NOSONAR
throwable = t;
if (context.isLogOn() && logger.isErrorEnabled()) {
logger.error("Flow node execute exception, Node:" + currentNode.getNodeId() + "," + t.getMessage());
}
throw t;
} finally {
NodeContextAccessor.setThrowable(currentNode, throwable);
flow.triggerEvent(FlowEventTypes.NODE_COMPLETE, currentNode, context, true);
}
}
private boolean executePreHandler(Flow flow, FlowContext context) {
if (flow.getFilterManager().noOuterFlowPreHandlerFilter()) {
return invokePreHandler(flow, context);
} else {
Boolean preResult = flow.getFilterManager().doOuterFlowPreHandlerFilter(context, outerFlowPreHandlerInvoker);
((FlowContextImpl) context).setPreResult(preResult);
return preResult == null ? true : preResult;
}
}
private boolean invokePreHandler(Flow flow, FlowContext context) {
if (flow.getPreHandler() != null) {
flow.triggerEvent(FlowEventTypes.FLOW_PRE_START, context);
boolean preResult;
if (flow.getFilterManager().noInnerFlowPreHandlerFilter()) {
preResult = flow.getPreHandler().preHandle(context);
} else {
Boolean result = flow.getFilterManager().doInnerFlowPreHandlerFilter(context, innerFlowPreHandlerInvoker);
preResult = result == null ? true : result;
}
((FlowContextImpl) context).setPreResult(preResult);
flow.triggerEvent(FlowEventTypes.FLOW_PRE_END, context);
}
return context.getPreResult() == null ? true : context.getPreResult();
}
private void executePostHandler(Flow flow, FlowContext context) {
if (flow.getFilterManager().noOuterFlowPostHandlerFilter()) {
invokePostHandler(flow, context);
} else {
flow.getFilterManager().doOuterFlowPostHandlerFilter(context, outerFlowPostHandlerInvoker);
}
}
private void invokePostHandler(Flow flow, FlowContext context) {
if (flow.getPostHandler() != null) {
flow.triggerEvent(FlowEventTypes.FLOW_POST_START, context);
if (flow.getFilterManager().noInnerFlowPostHandlerFilter()) {
flow.getPostHandler().postHandle(context);
} else {
flow.getFilterManager().doInnerFlowPostHandlerFilter(context, innerFlowPostHandlerInvoker);
}
flow.triggerEvent(FlowEventTypes.FLOW_POST_END, context);
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/CoreFlowEngine.java
================================================
package com.jd.easyflow.flow.engine.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.el.ElEvaluator;
import com.jd.easyflow.flow.el.ElFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowEngine;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.engine.FlowRunner;
import com.jd.easyflow.flow.engine.event.FlowEventListener;
import com.jd.easyflow.flow.engine.event.FlowEventTrigger;
import com.jd.easyflow.flow.engine.filter.FlowEngineFilterManager;
import com.jd.easyflow.flow.exception.FlowException;
import com.jd.easyflow.flow.filter.Filter;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.parser.FlowParser;
import com.jd.easyflow.flow.model.parser.FlowParserImpl;
import com.jd.easyflow.flow.util.FlowConstants;
import com.jd.easyflow.flow.util.FlowEventTypes;
import com.jd.easyflow.flow.util.FlowIOUtil;
import com.jd.easyflow.flow.util.JsonUtil;
import com.jd.easyflow.flow.util.Pair;
/**
*
* @author liyuliang5
*/
public abstract class CoreFlowEngine implements FlowEngine {
public static final Logger logger = LoggerFactory.getLogger(CoreFlowEngine.class);
protected Map<String, Flow> flowMap = new ConcurrentHashMap<>();
protected Map<String, String> flowDefinitionMap = new ConcurrentHashMap<String, String>();
protected FlowEventTrigger eventTrigger = new FlowEventTrigger();
protected FlowEngineFilterManager filterManager = new FlowEngineFilterManager();
protected List<FlowEventListener> listeners;
protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters;
protected String flowPath;
protected volatile boolean inited;
protected FlowRunner defaultFlowRunner = new SingleThreadFlowRunner();
/**
* Default is json definition parser.
*/
protected FlowParser flowParser = new FlowParserImpl();
protected Map<String, Object> properties = new ConcurrentHashMap<>();
protected ElEvaluator elEvaluator;
private Function<Pair<FlowParam, FlowEngine>, FlowResult> outerFlowEngineInvoker = p -> invokeFlowEngine(p.getLeft());
private Function<Pair<FlowParam, FlowEngine>, FlowResult> innerFlowEngineInvoker = p -> executeFlow(p.getLeft());
private Function<FlowContext, FlowResult> outerFlowInvoker = p -> invokeFlow(p);
private Function<FlowContext, FlowResult> innerFlowInvoker = p -> {
init(p);
run(p);
return p.getResult();
};
public void init() {
if (inited) {
return;
}
if (elEvaluator == null) {
elEvaluator = ElFactory.get();
}
if (flowParser instanceof FlowParserImpl) {
((FlowParserImpl) flowParser).setElEvaluator(elEvaluator);
}
loadFlow();
if (listeners != null) {
listeners.forEach(listener -> {
eventTrigger.addListener(listener);
});
}
eventTrigger.init(null, null);
if (filters != null) {
filterManager.setFilters(filters);
}
filterManager.init(null, null);
if (defaultFlowRunner != null) {
defaultFlowRunner.init(null, null);
}
inited = true;
}
protected abstract void loadFlow();
protected void loadFlowInputStream(InputStream inputStream) throws IOException {
String flowDefinition = FlowIOUtil.toString(inputStream);
List<Flow> flowList = flowParser.parse(flowDefinition);
flowDefinitionMap.put(flowList.get(0).getId(), flowDefinition);
flowList.forEach(flow -> {
if (flowMap.containsKey(flow.getId())) {
throw new FlowException("Flow " + flow.getId() + " exists");
}
flowMap.put(flow.getId(), flow);
});
}
/**
* Start flow engine, exeucte flow.
*/
@Override
public FlowResult execute(FlowParam param) {
if (! inited) {
throw new FlowException("Flow engine is not inited. flowId:" + param.getFlowId());
}
boolean logOn = (param.getContext() != null && param.getContext().getLogFlag() != null) ? param.getContext().getLogFlag() : (param.getLogFlag() == null || param.getLogFlag());
if (logOn && logger.isInfoEnabled()) {
logger.info("START EXECUTE FLOW, flowId:" + param.getFlowId() + " nodeIds:"
+ Arrays.toString(param.getNodeIds()));
}
if (logOn && logger.isDebugEnabled()) {
try {
logger.debug("Flow param:" + JsonUtil.toJsonString(param));
} catch (Throwable t) {
logger.debug("Flow param to json string exception:" + t.getMessage());
}
}
if (filterManager.noOuterFilter()) {
return invokeFlowEngine(param);
} else {
return filterManager.doOuterFilter(Pair.of(param, this), outerFlowEngineInvoker);
}
}
protected FlowResult invokeFlowEngine(FlowParam param) {
FlowResult result = null;
// No flow engine listener scenario
if (eventTrigger.getListenerList() == null || eventTrigger.getListenerList().size() == 0) {
if (filterManager.noInnerFilter()) {
result = executeFlow(param);
} else {
result = filterManager.doInnerFilter(Pair.of(param, this), innerFlowEngineInvoker);
}
return result;
}
// Has flow engine listener scenario
Map<String, Object> data = new HashMap<>();
data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_PARAM, param);
data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_FLOW_ENGINE, this);
try {
eventTrigger.triggerEvent(FlowEventTypes.FLOW_ENGINE_START, data, null, false);
if (filterManager.noInnerFilter()) {
result = executeFlow(param);
} else {
result = filterManager.doInnerFilter(Pair.of(param, this), innerFlowEngineInvoker);
}
data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_RESULT, result);
eventTrigger.triggerEvent(FlowEventTypes.FLOW_ENGINE_END, data, null, false);
return result;
} catch (Throwable t) {
data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_EXCEPTION, t);
throw t;
} finally {
eventTrigger.triggerEvent(FlowEventTypes.FLOW_ENGINE_COMPLETE, data, null, true);
}
}
protected FlowResult executeFlow(FlowParam param) {
// init flow context
FlowContext context = initContext(param);
// find flow definition
Flow flow = findFlow(context);
if (flow == null) {
throw new FlowException("Flow is null, context flow id:" + context.getFlowId() + ", param flow id:" + param.getFlowId());
}
// set log flag
if (context.getLogFlag() == null) {
if (param.getLogFlag() != null) {
context.setLogFlag(param.getLogFlag());
} else {
context.setLogFlag(flow.getLogFlag());
}
}
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("EXECUTE FLOW, flowId:" + flow.getId());
}
if (flow.getFilterManager().noOuterFilter()) {
return invokeFlow(context);
} else {
return flow.getFilterManager().doOuterFilter(context, outerFlowInvoker);
}
}
protected FlowResult invokeFlow(FlowContext context) {
Flow flow = context.getFlow();
Throwable throwable = null;
try {
flow.triggerEvent(FlowEventTypes.FLOW_START, context);
if (flow.getFilterManager().noInnerFilter()) {
init(context);
run(context);
} else {
FlowResult flowResult = flow.getFilterManager().doInnerFilter(context, innerFlowInvoker);
context.setResult(flowResult);
}
flow.triggerEvent(FlowEventTypes.FLOW_END, context);
return context.getResult();
} catch (Throwable t) { // NOSONAR
throwable = t;
if (context.isLogOn() && logger.isErrorEnabled()) {
logger.error("Flow execute exception, Flow:" + flow.getId() + "," + t.getMessage());
}
throw t;
} finally {
flow.triggerEvent(FlowEventTypes.FLOW_COMPLETE, throwable, context, true);
}
}
protected FlowContext initContext(FlowParam param) {
FlowContext context = param.getContext() != null ? param.getContext() : new FlowContextImpl();
if (context.getParam() == null) {
context.setParam(param);
}
if (context.getResult() == null) {
FlowResult result = new FlowResult();
context.setResult(result);
result.setContext(context);
}
if (context.getFlowId() == null) {
context.setFlowId(param.getFlowId());
}
((FlowContextImpl) context).setFlowEngine(this);
if (context.getElEvaluator() == null) {
((FlowContextImpl) context).setElEvaluator(getElEvaluator());
}
return context;
}
protected void run(FlowContext context) {
FlowRunner flowRunner = context.getFlow().getRunner();
if (flowRunner == null) {
flowRunner = defaultFlowRunner;
}
flowRunner.run(context);
}
/**
*
* Find flow definition.
*
* @return
*/
protected Flow findFlow(FlowContext context) {
Flow flow = context.getFlow();
if (flow == null) {
flow = getFlow(context.getFlowId());
if (flow == null) {
throw new FlowException("Flow " + context.getFlowId() + " not exists");
}
context.setFlow(flow);
}
// Exists scenario changing flow id
context.setFlowId(flow.getId());
return flow;
}
@Override
public Flow getFlow(String flowId) {
return flowMap.get(flowId);
}
/**
*
* Init flow context.
*
* @param param
*/
protected void init(FlowContext context) {
context.getFlow().triggerEvent(FlowEventTypes.INIT_START, context);
if (context.getStartNodes() == null) {
String[] nodeIds = context.getParam().getNodeIds();
// If nodeIds is null, using startNodeIds: if is empty array, run empty flow
// instance.
if (nodeIds == null) {
nodeIds = context.getFlow().getStartNodeIds();
}
if (nodeIds == null) {
throw new FlowException("no start node");
}
NodeContext[] nodes = new NodeContext[nodeIds.length];
for (int i = 0; i < nodeIds.length; i++) {
nodes[i] = new NodeContext(nodeIds[i]);
}
((FlowContextImpl) context).addNodes(nodes);
context.setStartNodes(Arrays.asList(nodes));
} else {
((FlowContextImpl) context).addNodes(context.getStartNodes().toArray(new NodeContext[context.getStartNodes().size()]));
}
context.getFlow().triggerEvent(FlowEventTypes.INIT_END, context);
}
public void addFlow(Flow flow) {
flowMap.put(flow.getId(), flow);
}
public void destroy() {
if (defaultFlowRunner != null) {
defaultFlowRunner.destroy();
}
if (flowMap != null && flowMap.size() > 0) {
for (Entry<String, Flow> entry : flowMap.entrySet()) {
entry.getValue().destroy();
}
}
this.eventTrigger.destroy();
if (this.filters != null) {
filters.forEach( filter -> {
filter.destroy();
});
}
}
public String getFlowPath() {
return flowPath;
}
public void setFlowPath(String flowPath) {
this.flowPath = flowPath;
}
public Map<String, Flow> getFlowMap() {
return flowMap;
}
public void setFlowMap(Map<String, Flow> flowMap) {
this.flowMap = flowMap;
}
public Map<String, String> getFlowDefinitionMap() {
return flowDefinitionMap;
}
public void setFlowDefinitionMap(Map<String, String> flowDefinitionMap) {
this.flowDefinitionMap = flowDefinitionMap;
}
public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getFilters() {
return filters;
}
public void setFilters(List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters) {
this.filters = filters;
}
public FlowEventTrigger getEventTrigger() {
return eventTrigger;
}
public void setEventTrigger(FlowEventTrigger eventTrigger) {
this.eventTrigger = eventTrigger;
}
public List<FlowEventListener> getListeners() {
return listeners;
}
public void setListeners(List<FlowEventListener> listeners) {
this.listeners = listeners;
}
public FlowRunner getDefaultFlowRunner() {
return defaultFlowRunner;
}
public void setDefaultFlowRunner(FlowRunner defaultFlowRunner) {
this.defaultFlowRunner = defaultFlowRunner;
}
@Override
public FlowParser getFlowParser() {
return flowParser;
}
public void setFlowParser(FlowParser flowParser) {
this.flowParser = flowParser;
}
public boolean isInited() {
return inited;
}
public void setInited(boolean inited) {
this.inited = inited;
}
public Map<String, Object> getProperties() {
return properties;
}
public void setProperties(Map<String, Object> properties) {
this.properties = properties;
}
@Override
public <T>T getProperty(String key) {
return (T) properties.get(key);
}
public void setProperty(String key, Object value) {
properties.put(key, value);
}
public ElEvaluator getElEvaluator() {
return elEvaluator;
}
public void setElEvaluator(ElEvaluator elEvaluator) {
this.elEvaluator = elEvaluator;
}
public FlowEngineFilterManager getFilterManager() {
return filterManager;
}
public void setFilterManager(FlowEngineFilterManager filterManager) {
this.filterManager = filterManager;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/ExpFlowRunner.java
================================================
package com.jd.easyflow.flow.engine.impl;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowRunner;
/**
*
* @author liyuliang5
*
*/
public class ExpFlowRunner implements FlowRunner{
private String exp;
public ExpFlowRunner() {
}
public ExpFlowRunner(String exp) {
this.exp = exp;
}
@Override
public void run(FlowContext context) {
context.getElEvaluator().eval(exp, null, context, null);
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/FlowContextImpl.java
================================================
package com.jd.easyflow.flow.engine.impl;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.jd.easyflow.flow.el.ElEvaluator;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowEngine;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.util.FlowConstants;
/**
* Flow Context.
*
* @author liyuliang5
*
*/
public class FlowContextImpl implements FlowContext {
/**
* Flow id.
*/
private String flowId;
/**
* Flow definition.
*/
private Flow flow;
/**
* Flow param.
*/
private FlowParam param;
/**
* Flow result.
*/
private FlowResult result;
/**
* Start nodes.
*/
private List<NodeContext> startNodes;
/**
* End nodes.
*/
private List<NodeContext> endNodes;
/**
* Node context list waiting execute.
*/
private Deque<NodeContext> nodeStack = new ArrayDeque<NodeContext>();
/**
* Common data map.
*/
private Map<String, Object> data = new ConcurrentHashMap<String, Object>();
/**
* business context
*/
private Object context;
/**
* Flow engine.
*/
@JsonIgnore
private FlowEngine flowEngine;
/**
* interrupted
*/
private volatile boolean interrupted = false;
private Boolean preResult;
private Boolean logFlag;
private ElEvaluator elEvaluator;
private Boolean recordHistory;
private FlowContext parentContext;
private NodeContext parentNodeContext;
@Override
public void put(String key, Object value) {
if (value == null) {
data.remove(key);
} else {
data.put(key, value);
}
}
@Override
public <T> T get(String key) {
return (T) data.get(key);
}
@Override
public void remove(String key) {
data.remove(key);
}
public synchronized void addNodes(NodeContext[] nodes) {
for (int i = 0; i < nodes.length; i++) {
nodeStack.push(nodes[nodes.length - 1 - i]);
}
}
/**
* Get next node.
*/
public synchronized NodeContext getNextNode() {
if (nodeStack.isEmpty()) {
return null;
}
return nodeStack.pop();
}
@Override
public FlowParam getParam() {
return param;
}
@Override
public void setParam(FlowParam param) {
this.param = param;
}
@Override
public FlowResult getResult() {
return result;
}
@Override
public void setResult(FlowResult result) {
this.result = result;
}
@Override
public String getFlowId() {
return flowId;
}
@Override
public void setFlowId(String flowId) {
this.flowId = flowId;
}
@Override
public Flow getFlow() {
return flow;
}
@Override
public void setFlow(Flow flow) {
this.flow = flow;
}
@Override
public Map<String, Object> getData() {
return data;
}
public void setDataFrom(FlowContext fromContext) {
this.data = fromContext.getData();
}
@Override
public FlowEngine getFlowEngine() {
return flowEngine;
}
public void setFlowEngine(FlowEngine flowEngine) {
this.flowEngine = flowEngine;
}
@Override
public List<NodeContext> getStartNodes() {
return startNodes;
}
@Override
public void setStartNodes(List<NodeContext> startNodes) {
this.startNodes = startNodes;
}
@Override
public List<NodeContext> getEndNodes() {
return endNodes;
}
public void setEndNodes(List<NodeContext> endNodes) {
this.endNodes = endNodes;
}
public synchronized void addEndNode(NodeContext node) {
if (endNodes == null) {
endNodes = new ArrayList();
}
endNodes.add(node);
}
@Override
public boolean isInterrupted() {
return interrupted;
}
@Override
public void setInterrupted() {
this.interrupted = true;
}
@Override
public Boolean getPreResult() {
return preResult;
}
public void setPreResult(Boolean preResult) {
this.preResult = preResult;
}
@Override
public Boolean getLogFlag() {
return logFlag;
}
@Override
public void setLogFlag(Boolean logFlag) {
this.logFlag = logFlag;
}
@Override
public boolean isLogOn() {
return logFlag == null || this.logFlag.booleanValue();
}
@Override
public <T>T getContext() {
return (T) context;
}
@Override
public void setContext(Object context) {
this.context = context;
}
@Override
public ElEvaluator getElEvaluator() {
return elEvaluator;
}
public void setElEvaluator(ElEvaluator elEvaluator) {
this.elEvaluator = elEvaluator;
}
@Override
public boolean isRecordHistory() {
if (recordHistory == null) {
recordHistory = ! Boolean.FALSE.equals(flow.getProperty(FlowConstants.FLOW_PROPERTY_RECORD_HISTORY));
}
return recordHistory;
}
public Boolean getRecordHistory() {
return recordHistory;
}
public void setRecordHistory(Boolean recordHistory) {
this.recordHistory = recordHistory;
}
@Override
public FlowContext getParentContext() {
return parentContext;
}
public void setParentContext(FlowContext parentContext) {
this.parentContext = parentContext;
}
@Override
public NodeContext getParentNodeContext() {
return parentNodeContext;
}
public void setParentNodeContext(NodeContext parentNodeContext) {
this.parentNodeContext = parentNodeContext;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/FlowEngineImpl.java
================================================
package com.jd.easyflow.flow.engine.impl;
import java.io.IOException;
import java.io.InputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.SmartLifecycle;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import com.jd.easyflow.flow.el.ElEvaluator;
import com.jd.easyflow.flow.el.ElFactory;
import com.jd.easyflow.flow.el.SpelEvaluator;
/**
* FlowEngineImpl. Adding spring integration based on CoreFlowEngine.
* @author liyuliang5
*
*/
public class FlowEngineImpl extends CoreFlowEngine implements SmartLifecycle, ApplicationContextAware {
public static final Logger logger = LoggerFactory.getLogger(FlowEngineImpl.class);
private ApplicationContext applicationContext;
private int phase = Integer.MIN_VALUE;
private boolean autoStartup = true;
private volatile boolean isRunning = false;
@Override
public void init() {
if (inited) {
return;
}
if (applicationContext != null) {
ElEvaluator elEvaluator = ElFactory.get();
if (elEvaluator instanceof SpelEvaluator) {
SpelEvaluator spelEvaluator = (SpelEvaluator) elEvaluator;
if (spelEvaluator.getApplicationContext() == null) {
spelEvaluator.setApplicationContext(applicationContext);
}
}
}
super.init();
inited = true;
}
protected void loadFlow() {
if (flowPath == null) {
return;
}
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources;
String[] flowPaths = flowPath.split(",");
for (String path : flowPaths) {
try {
resources = resolver.getResources(path.trim());
for (Resource resource : resources) {
if (logger.isInfoEnabled()) {
logger.info("Start parsing definition files:" + resource.getURI());
}
try (InputStream is = resource.getInputStream()) {
loadFlowInputStream(is);
}
}
} catch (IOException e) {
throw new RuntimeException("Flow definition file parse exception", e);
}
}
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public void start() {
init();
isRunning = true;
}
@Override
public void stop() {
isRunning = false;
destroy();
}
@Override
public boolean isAutoStartup() {
return autoStartup;
}
@Override
public void stop(Runnable callback) {
stop();
callback.run();
}
@Override
public boolean isRunning() {
return isRunning;
}
@Override
public int getPhase() {
return phase;
}
public void setPhase(int phase) {
this.phase = phase;
}
public void setAutoStartup(boolean autoStartup) {
this.autoStartup = autoStartup;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/MultipleThreadFlowRunner.java
================================================
package com.jd.easyflow.flow.engine.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.exception.FlowException;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.util.ExceptionUtil;
import com.jd.easyflow.flow.util.FlowConstants;
/**
* Multiple thread runner.
*
* @author liyuliang5
* @date 2021/07/26
*/
public class MultipleThreadFlowRunner extends BaseFlowRunner {
private static final Logger logger = LoggerFactory.getLogger(MultipleThreadFlowRunner.class);
protected static long startId = System.currentTimeMillis();
protected Executor executor;
protected long timeout = 0;
protected boolean throwExceptionOnTimeout = false;
public MultipleThreadFlowRunner() {
}
public MultipleThreadFlowRunner(Executor executor, long timeout) {
this.executor = executor;
this.timeout = timeout;
}
public MultipleThreadFlowRunner(Executor executor, long timeout, boolean throwExceptionOnTimeout) {
this.executor = executor;
this.timeout = timeout;
this.throwExceptionOnTimeout = throwExceptionOnTimeout;
}
@Override
public void runNodes(FlowContextImpl context) {
String runId = startId++ + "";
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Start running flow node, runId:" + runId);
}
CountDownLatch lock = new CountDownLatch(1);
AtomicInteger counter = new AtomicInteger();
scheduleNodes(context, counter, lock, runId);
try {
if (timeout == 0) {
lock.await();
} else {
boolean result = lock.await(timeout, TimeUnit.MILLISECONDS);
context.put(FlowConstants.FLOW_CTX_MULTI_AWAIT_RESULT, result);
if (result == false) {
context.setInterrupted();
if (throwExceptionOnTimeout) {
throw new FlowException("flow execution timeout, runId:" + runId + ", flowId:" + context.getFlowId());
}
}
}
} catch (InterruptedException e) {
throw new FlowException(e);
}
List<NodeContext> exceptions = context.get(FlowConstants.FLOW_CTX_MULTI_EXCEPTIONS);
// Default behavior is throwing first exception.
if (exceptions != null && exceptions.size() > 0) {
if (context.isLogOn()) {
logger.error("Flow execute exception");
}
Throwable t = exceptions.get(0).get(FlowConstants.NODE_CTX_MULTI_EXCEPTION);
throw ExceptionUtil.throwException(t);
}
}
protected void scheduleNodes(FlowContextImpl context, AtomicInteger counter, CountDownLatch lock,
String runId) {
addTaskIfExists(context, counter, lock, runId);
}
/**
* Add task.
*
* @param context
* @param executor
* @param counter
* @param lock
*/
private void addTaskIfExists(FlowContextImpl context, AtomicInteger counter, CountDownLatch lock,
String runId) {
NodeContext currentNode;
while ((currentNode = context.getNextNode()) != null) {
final NodeContext finalCurrentNode = currentNode;
counter.addAndGet(1);
executor.execute(() -> {
try {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Start execute flow node:" + finalCurrentNode.getNodeId() + ", runId:" + runId);
}
NodeContext[] nextNodes = runOneNode(finalCurrentNode, context);
if (nextNodes != null) {
context.addNodes(nextNodes);
}
if (context.isInterrupted()) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Flow state is interrupted");
}
lock.countDown();
return;
}
addTaskIfExists(context, counter, lock, runId);
int count = counter.addAndGet(-1);
if (count == 0) {
lock.countDown();
}
} catch (Throwable t) { // NOSONAR
addException(context, finalCurrentNode, t);
if (context.isInterrupted()) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Flow state is interrupted");
}
lock.countDown();
return;
}
int count = counter.addAndGet(-1);
if (count == 0) {
lock.countDown();
}
}
});
}
}
/**
* Add exception.
*
* @param context
* @param nodeContext
* @param t
*/
protected void addException(FlowContext context, NodeContext nodeContext, Throwable t) {
synchronized (context) {
List<NodeContext> exceptionNodes = context.get(FlowConstants.FLOW_CTX_MULTI_EXCEPTIONS);
if (exceptionNodes == null) {
exceptionNodes = new ArrayList<NodeContext>();
context.put(FlowConstants.FLOW_CTX_MULTI_EXCEPTIONS, exceptionNodes);
}
nodeContext.put(FlowConstants.NODE_CTX_MULTI_EXCEPTION, t);
exceptionNodes.add(nodeContext);
}
}
protected void printStackTrace() {
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < stack.length; i++) {
builder.append(stack[i].toString() + "\n");
}
logger.error("Flow execute exception,\n " + builder);
}
public Executor getExecutor() {
return executor;
}
public void setExecutor(Executor executor) {
this.executor = executor;
}
public long getTimeout() {
return timeout;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
public boolean isThrowExceptionOnTimeout() {
return throwExceptionOnTimeout;
}
public void setThrowExceptionOnTimeout(boolean throwExceptionOnTimeout) {
this.throwExceptionOnTimeout = throwExceptionOnTimeout;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/ReusableThreadFlowRunner.java
================================================
package com.jd.easyflow.flow.engine.impl;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.model.NodeContext;
/**
* Reuse thread first.
*
* @author liyuliang5
*
*/
public class ReusableThreadFlowRunner extends MultipleThreadFlowRunner {
private static final Logger logger = LoggerFactory.getLogger(ReusableThreadFlowRunner.class);
public ReusableThreadFlowRunner() {
}
public ReusableThreadFlowRunner(Executor executor, long timeout) {
this.executor = executor;
this.timeout = timeout;
}
public ReusableThreadFlowRunner(Executor executor, long timeout, boolean throwExceptionOnTimeout) {
this.executor = executor;
this.timeout = timeout;
this.throwExceptionOnTimeout = throwExceptionOnTimeout;
}
@Override
protected void scheduleNodes(FlowContextImpl context, AtomicInteger counter, CountDownLatch lock, String runId) {
List<NodeContext> startNodes = context.getStartNodes();
if (startNodes.size() == 0) {
lock.countDown();
return;
}
counter.addAndGet(startNodes.size());
if (timeout == 0) {
runNodes(startNodes.toArray(new NodeContext[startNodes.size()]), context, counter, lock, runId);
} else {
executor.execute(() -> {
runNodes(startNodes.toArray(new NodeContext[startNodes.size()]), context, counter, lock, runId);
});
}
}
private void runNodes(NodeContext[] nodes, FlowContextImpl context, AtomicInteger counter, CountDownLatch lock,
String runId) {
while (true) {
if (nodes == null || nodes.length == 0) {
return;
}
if (nodes.length > 1) {
for (int i = 1; i < nodes.length; i++) {
final NodeContext finalNode = nodes[i];
executor.execute(() -> {
runNodes(new NodeContext[] { finalNode }, context, counter, lock, runId);
});
}
}
NodeContext[] nextNodes = doRunOneNode(nodes[0], context, counter, lock, runId);
nodes = nextNodes;
}
}
private NodeContext[] doRunOneNode(NodeContext node, FlowContextImpl context, AtomicInteger counter,
CountDownLatch lock, String runId) {
NodeContext[] nextNodes = null;
try {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Start execute flow node:" + node.getNodeId() + ", runId:" + runId);
}
nextNodes = super.runOneNode(node, context);
} catch (Throwable t) { // NOSONAR
addException(context, node, t);
}
if (context.isInterrupted()) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Flow state is interrupted");
}
lock.countDown();
return null;
}
if (nextNodes != null && nextNodes.length > 0) {
counter.addAndGet(nextNodes.length);
}
int count = counter.addAndGet(-1);
if (count == 0) {
lock.countDown();
}
return nextNodes;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/SingleThreadFlowRunner.java
================================================
package com.jd.easyflow.flow.engine.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.model.NodeContext;
/**
* Single thread executor.
*
* @author liyuliang5
* @date 2021/07/25
*/
public class SingleThreadFlowRunner extends BaseFlowRunner {
public static final Logger logger = LoggerFactory.getLogger(SingleThreadFlowRunner.class);
/**
*
* DFS.
*
* @param context
*/
@Override
public void runNodes(FlowContextImpl context) {
NodeContext currentNode;
// Loop execute.
while ((currentNode = context.getNextNode()) != null) {
if (context.isInterrupted()) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Flow interrupted!");
}
break;
}
NodeContext[] nextNodes = runOneNode(currentNode, context);
if (nextNodes != null) {
context.addNodes(nextNodes);
}
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/exception/FlowException.java
================================================
package com.jd.easyflow.flow.exception;
/**
*
* @author liyuliang5
*
*/
public class FlowException extends RuntimeException {
public FlowException() {
}
public FlowException(String message) {
super(message);
}
public FlowException(Throwable cause) {
super(cause);
}
public FlowException(String message, Throwable cause) {
super(message, cause);
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/BaseFilter.java
================================================
package com.jd.easyflow.flow.filter;
import java.util.Map;
/**
*
*/
public abstract class BaseFilter<T, R> implements Filter<T, R> {
protected int order;
@Override
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
@Override
public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {
if (definition == null) {
return;
}
Integer order = (Integer) definition.get("order");
if (order != null) {
this.order = order;
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/ExpFilter.java
================================================
package com.jd.easyflow.flow.filter;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.el.ElEvaluator;
import com.jd.easyflow.flow.el.ElFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowEngine;
import com.jd.easyflow.flow.util.JsonUtil;
import com.jd.easyflow.flow.util.Pair;
import com.jd.easyflow.flow.util.Triple;
/**
*
* @author liyuliang5
*
* @param <T>
* @param <R>
*/
public class ExpFilter<T, R> extends BaseFilter<T, R> {
private static final Logger logger = LoggerFactory.getLogger(ExpFilter.class);
private ElEvaluator elEvaluator;
private String exp;
public ExpFilter() {
}
public ExpFilter(String exp) {
this.exp = exp;
}
@Override
public R doFilter(T request, FilterChain<T, R> chain) {
Map<String, Object> data = new HashMap<>();
data.put("request", request);
data.put("chain", chain);
if (logger.isDebugEnabled()) {
logger.debug("EVAL SPEL:" + exp);
}
ElEvaluator evaluator = this.elEvaluator;
if (evaluator == null) {
if (request instanceof FlowContext) {
evaluator = ((FlowContext) request).getElEvaluator();
} else if (request instanceof Pair) {
if (((Pair) request).getRight() instanceof FlowContext) {
evaluator = ((FlowContext) ((Pair) request).getRight()).getElEvaluator();
} else if (((Pair) request).getRight() instanceof FlowEngine) {
evaluator = ((FlowEngine) ((Pair) request).getRight()).getElEvaluator();
}
} else if (request instanceof Triple && ((Triple) request).getRight() instanceof FlowContext) {
evaluator = ((FlowContext) ((Triple) request).getRight()).getElEvaluator();
}
}
if (evaluator == null) {
evaluator = ElFactory.get();
}
R result = evaluator.evalWithDefaultContext(exp, data, true);
if (logger.isDebugEnabled()) {
try {
logger.debug("SPEL RESULT:" + JsonUtil.toJsonString(result));
} catch (Throwable t) {
logger.debug("SPEL RESULT to json string exception:" + t.getMessage());
}
}
return result;
}
public String getExp() {
return exp;
}
public void setExp(String exp) {
this.exp = exp;
}
public ElEvaluator getElEvaluator() {
return elEvaluator;
}
public void setElEvaluator(ElEvaluator elEvaluator) {
this.elEvaluator = elEvaluator;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/Filter.java
================================================
package com.jd.easyflow.flow.filter;
import com.jd.easyflow.flow.model.FlowLifeCycle;
/**
*
* @author liyuliang5
*
* @param <T>
* @param <R>
*/
public interface Filter<T,R> extends FlowLifeCycle {
/**
* Do filter.
* @param request
* @param chain
* @return
*/
R doFilter(T request, FilterChain<T, R> chain);
/**
*
* The highest order value has the highest priority.
* If order value same, the front configured has higher priority.
* DO NOT override this method unless you have requirement and know its behavior.
* @return
*/
default int getOrder() {return 0;};
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/FilterChain.java
================================================
package com.jd.easyflow.flow.filter;
/**
* @author liyuliang5
* @param <T>
* @param <R>
*/
public interface FilterChain<T, R> {
public R doFilter(T param);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/FilterChainImpl.java
================================================
package com.jd.easyflow.flow.filter;
import java.util.List;
import java.util.function.Function;
/**
*
* @author liyuliang5
*
* @param <T>
* @param <R>
*/
public class FilterChainImpl<T, R> implements FilterChain<T, R> {
private List<Filter<T, R>> filters;
private Function<T, R> invoker;
private int pos = -1;
public FilterChainImpl(List<Filter<T, R>> filters, Function<T, R> invoker) {
this.filters = filters;
this.invoker = invoker;
}
public R doFilter(T param) {
pos++;
if (pos < filters.size()) {
return filters.get(pos).doFilter(param, this);
}
return invoker.apply(param);
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/Flow.java
================================================
package com.jd.easyflow.flow.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowRunner;
import com.jd.easyflow.flow.engine.event.FlowEventTrigger;
import com.jd.easyflow.flow.exception.FlowException;
import com.jd.easyflow.flow.model.filter.FlowFilterManager;
import com.jd.easyflow.flow.model.parser.FlowParser;
/**
*
* @author liyuliang5
*
*/
public class Flow implements FlowLifeCycle {
public static final String DOLLAR = "$";
private String id;
private String name;
private String[] startNodeIds;
private List<FlowNode> nodeList;
private Map<String, Object> properties = new ConcurrentHashMap<>();
private Map<String, FlowNode> nodeMap;
/**
* relation of node id and index.
*/
private Map<String, Integer> nodeIndexMap;
private FlowPreHandler preHandler;
private FlowPostHandler postHandler;
private FlowEventTrigger eventTrigger = new FlowEventTrigger();
private FlowFilterManager filterManager = new FlowFilterManager();
private FlowRunner runner;
@JsonIgnore
private FlowParser flowParser;
private Boolean logFlag;
@Override
public void init(InitContext initContext, Object parent) {
if (preHandler != null) {
preHandler.init(initContext, this);
}
if (nodeList != null) {
for (FlowNode flowNode : nodeList) {
flowNode.init(initContext, this);
}
}
if (postHandler != null) {
postHandler.init(initContext, this);
}
eventTrigger.init(initContext, this);
filterManager.init(initContext, this);
if (runner != null) {
runner.init(initContext, this);
}
}
@Override
public void destroy() {
if (preHandler != null) {
preHandler.destroy();
}
if (nodeList != null) {
for (FlowNode flowNode : nodeList) {
flowNode.destroy();
}
}
if (postHandler != null) {
postHandler.destroy();
}
eventTrigger.destroy();
filterManager.destroy();
if (runner != null) {
runner.destroy();
}
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<FlowNode> getNodeList() {
return nodeList;
}
public void initNodeList(List<FlowNode> nodeList) {
for (FlowNode node : nodeList) {
addNode(node);
}
}
public Map<String, Object> getProperties() {
return properties;
}
public void setProperties(Map<String, Object> properties) {
this.properties.clear();
putProperties(properties);
}
public void putProperties(Map<String, Object> properties) {
if (properties == null) {
return;
}
for (Entry<String, Object> entry : properties.entrySet()) {
if (entry.getValue() == null) {
this.properties.remove(entry.getKey());
} else {
this.properties.put(entry.getKey(), entry.getValue());
}
}
}
public Map<String, FlowNode> getNodeMap() {
return nodeMap;
}
public void setProperty(String key, Object value) {
if (value == null) {
properties.remove(key);
} else {
properties.put(key, value);
}
}
public <T> T getProperty(String key) {
return (T) properties.get(key);
}
public void addNode(FlowNode node) {
if (node.getId().startsWith(DOLLAR)) {
throw new IllegalArgumentException("Node ID CANNOT start with $");
}
if (this.nodeList == null) {
this.nodeList = new ArrayList<>();
}
if (this.nodeMap == null) {
this.nodeMap = new HashMap<>();
}
if (this.nodeMap.containsKey(node.getId())) {
throw new FlowException("Node:" + node.getId() + " duplicate");
}
if (this.nodeIndexMap == null) {
this.nodeIndexMap = new HashMap<>();
}
this.nodeList.add(node);
this.nodeMap.put(node.getId(), node);
this.nodeIndexMap.put(node.getId(), this.nodeList.size() - 1);
}
public void setNodeList(List<FlowNode> nodeList) {
if (nodeList == null) {
this.nodeList = null;
this.nodeMap = null;
this.nodeIndexMap = null;
} else {
this.nodeList = nodeList;
this.nodeMap = new HashMap<>();
this.nodeIndexMap = new HashMap<>();
for (FlowNode node : nodeList) {
this.nodeMap.put(node.getId(), node);
this.nodeIndexMap.put(node.getId(), this.nodeList.size() - 1);
}
}
}
public FlowNode getNode(String nodeId) {
return this.nodeMap.get(nodeId);
}
public int getNodeIndex(String nodeId) {
return this.nodeIndexMap.get(nodeId);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public FlowEventTrigger getEventTrigger() {
return eventTrigger;
}
public void setEventTrigger(FlowEventTrigger eventTrigger) {
this.eventTrigger = eventTrigger;
}
public void triggerEvent(String eventType, FlowContext context) {
this.eventTrigger.triggerEvent(eventType, context);
}
public void triggerEvent(String eventType, Object eventData, FlowContext context, boolean catchThrowable) {
this.eventTrigger.triggerEvent(eventType, eventData, context, catchThrowable);
}
public String[] getStartNodeIds() {
return startNodeIds;
}
public void setStartNodeIds(String[] startNodeIds) {
this.startNodeIds = startNodeIds;
}
public FlowRunner getRunner() {
return runner;
}
public void setRunner(FlowRunner runner) {
this.runner = runner;
}
public String stringify() {
if (flowParser == null) {
return null;
}
return flowParser.stringify(this);
}
public FlowParser getFlowParser() {
return flowParser;
}
public void setFlowParser(FlowParser flowParser) {
this.flowParser = flowParser;
}
public FlowPreHandler getPreHandler() {
return preHandler;
}
public void setPreHandler(FlowPreHandler preHandler) {
this.preHandler = preHandler;
}
public FlowPostHandler getPostHandler() {
return postHandler;
}
public void setPostHandler(FlowPostHandler postHandler) {
this.postHandler = postHandler;
}
public Boolean getLogFlag() {
return logFlag;
}
public void setLogFlag(Boolean logFlag) {
this.logFlag = logFlag;
}
public FlowFilterManager getFilterManager() {
return filterManager;
}
public void setFilterManager(FlowFilterManager filterManager) {
this.filterManager = filterManager;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowLifeCycle.java
================================================
package com.jd.easyflow.flow.model;
import java.util.Map;
/**
*
* @author liyuliang5
*/
public interface FlowLifeCycle {
/**
* Invoked after element constructed on flow parsing, the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.
* @param definition
* @param context
*/
default void postConstruct(Map<String, Object> definition, Map<String, Object> context) {}
/**
* Invoked after Flow is constructed, the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.
* @param initContext
* @param parent
*/
default void init(InitContext initContext, Object parent) {}
/**
* Invoked on FlowEngine destroy, the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.
*/
default void destroy() {}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowNode.java
================================================
package com.jd.easyflow.flow.model;
import java.util.Map;
import com.jd.easyflow.flow.engine.FlowContext;
/**
*
* @author liyuliang5
*
*/
public interface FlowNode extends FlowLifeCycle {
/**
* Execute node.
* @param nodeContext
* @param context
* @return
*/
NodeContext execute(NodeContext nodeContext, FlowContext context);
/**
* Get node ID
* @return
*/
default String getId() {
return null;
}
/**
* Get node name.
* @return
*/
default String getName() {
return null;
}
/**
* Get all node properties.
* @return
*/
default Map<String, Object> getProperties() {
return null;
}
/**
* Get property.
* @param <T>
* @param key
* @return
*/
default <T> T getProperty(String key) {
Map<String, Object> properties = getProperties();
if (properties == null) {
return null;
}
return (T) properties.get(key);
}
/**
* Set property.
* @param key
* @param value
*/
default void setProperty(String key, Object value) {
if (value == null) {
getProperties().remove(key);
} else {
getProperties().put(key, value);
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowPostHandler.java
================================================
package com.jd.easyflow.flow.model;
import com.jd.easyflow.flow.engine.FlowContext;
/**
*
* @author liyuliang5
*
*/
public interface FlowPostHandler extends FlowLifeCycle {
void postHandle(FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowPreHandler.java
================================================
package com.jd.easyflow.flow.model;
import com.jd.easyflow.flow.engine.FlowContext;
/**
*
* @author liyuliang5
*
*/
public interface FlowPreHandler extends FlowLifeCycle {
boolean preHandle(FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/InitContext.java
================================================
package com.jd.easyflow.flow.model;
import java.util.List;
import java.util.Map;
import com.jd.easyflow.flow.model.parser.FlowParser;
/**
* Flow node init context.
* @author liyuliang5
*
*/
public class InitContext {
private boolean parseEl;
private FlowParser flowParser;
private List<Flow> flowList;
private Map<String, Object> flowDefinitionMap;
private Flow flow;
public boolean isParseEl() {
return parseEl;
}
public void setParseEl(boolean parseEl) {
this.parseEl = parseEl;
}
public FlowParser getFlowParser() {
return flowParser;
}
public void setFlowParser(FlowParser flowParser) {
this.flowParser = flowParser;
}
public List<Flow> getFlowList() {
return flowList;
}
public void setFlowList(List<Flow> flowList) {
this.flowList = flowList;
}
public Map<String, Object> getFlowDefinitionMap() {
return flowDefinitionMap;
}
public void setFlowDefinitionMap(Map<String, Object> flowDefinitionMap) {
this.flowDefinitionMap = flowDefinitionMap;
}
public Flow getFlow() {
return flow;
}
public void setFlow(Flow flow) {
this.flow = flow;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeAction.java
================================================
package com.jd.easyflow.flow.model;
import com.jd.easyflow.flow.engine.FlowContext;
/**
*
* @author liyuliang5
*
*/
public interface NodeAction extends FlowLifeCycle {
/**
* Execute node action.
* @param <T>
* @param nodeContext
* @param context
* @return
*/
<T>T execute(NodeContext nodeContext, FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeContext.java
================================================
package com.jd.easyflow.flow.model;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* Generally setter is not needed for user. Using @see NodeContextAccessor if necessary.
* @author liyuliang5
*
*/
public class NodeContext implements Serializable {
public NodeContext(String nodeId) {
this.nodeId = nodeId;
}
private String nodeId;
private NodeContext previousNode;
private NodeContext[] nextNodes;
private Boolean preResult;
private Object actionResult;
private Throwable throwable;
private volatile Map<String, Object> dataMap;
/**
* business context
*/
private Object nodeContext;
public Object getActionResult() {
return actionResult;
}
protected void setActionResult(Object actionResult) {
this.actionResult = actionResult;
}
public Map<String, Object> getDataMap() {
return dataMap;
}
protected void setDataMap(Map<String, Object> dataMap) {
this.dataMap = dataMap;
}
public void put(String key, Object value) {
if (dataMap == null) {
synchronized (this) {
if (dataMap == null) {
dataMap = new ConcurrentHashMap<String, Object>();
}
}
}
if (value == null) {
dataMap.remove(key);
} else {
dataMap.put(key, value);
}
}
public <T> T get(String key) {
if (dataMap == null) {
return null;
}
return (T) dataMap.get(key);
}
public void remove(String key) {
dataMap.remove(key);
}
protected void setNextNodeIds(String[] nextNodeIds) {
if (nextNodeIds == null) {
this.nextNodes = null;
return;
}
nextNodes = new NodeContext[nextNodeIds.length];
for (int i = 0; i < nextNodeIds.length; i++) {
NodeContext nextNode = new NodeContext(nextNodeIds[i]);
nextNode.setPreviousNode(this);
nextNodes[i] = nextNode;
}
}
protected void setNextNodes(NodeContext[] nextNodes) {
this.nextNodes = nextNodes;
if (nextNodes != null) {
for (int i = 0; i < nextNodes.length; i++) {
nextNodes[i].setPreviousNode(this);
}
}
}
public NodeContext[] getNextNodes() {
return nextNodes;
}
public String getNodeId() {
return nodeId;
}
protected void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public NodeContext getPreviousNode() {
return previousNode;
}
protected void setPreviousNode(NodeContext previousNode) {
this.previousNode = previousNode;
}
public Throwable getThrowable() {
return throwable;
}
protected void setThrowable(Throwable throwable) {
this.throwable = throwable;
}
public Boolean getPreResult() {
return preResult;
}
protected void setPreResult(Boolean preResult) {
this.preResult = preResult;
}
public <T>T getNodeContext() {
return (T) nodeContext;
}
public void setNodeContext(Object nodeContext) {
this.nodeContext = nodeContext;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeContextAccessor.java
================================================
package com.jd.easyflow.flow.model;
import java.util.Map;
/**
* @author liyuliang5.
* Using separate setter to avoid mistake setting.
*
*/
public class NodeContextAccessor {
public static void setNodeId(NodeContext nodeContext, String nodeId) {
nodeContext.setNodeId(nodeId);
}
public static void setPreResult(NodeContext nodeContext, Boolean preResult) {
nodeContext.setPreResult(preResult);
}
public static void setActionResult(NodeContext nodeContext, Object actionResult) {
nodeContext.setActionResult(actionResult);
}
public static void setNextNodeIds(NodeContext nodeContext, String[] nextNodeIds) {
nodeContext.setNextNodeIds(nextNodeIds);
}
public static void setNextNodes(NodeContext nodeContext, NodeContext[] nextNodes) {
nodeContext.setNextNodes(nextNodes);
}
public static void setPreviousNode(NodeContext nodeContext, NodeContext previousNode) {
nodeContext.setPreviousNode(previousNode);
}
public static void setThrowable(NodeContext nodeContext, Throwable t) {
nodeContext.setThrowable(t);
}
public static void setDataMap(NodeContext nodeContext, Map<String, Object> dataMap) {
nodeContext.setDataMap(dataMap);
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeExecutor.java
================================================
package com.jd.easyflow.flow.model;
import com.jd.easyflow.flow.engine.FlowContext;
/**
* Executor of node and subcomponent level.
* @author liyuliang5
*
* @param <T>
*/
public interface NodeExecutor<T> {
/**
* Execute.
* @param nodeContext
* @param context
* @return
*/
public T execute(NodeContext nodeContext, FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodePostHandler.java
================================================
package com.jd.easyflow.flow.model;
import com.jd.easyflow.flow.engine.FlowContext;
/**
* Node post handler.
* @author liyuliang5
* @date 2021/07/09
*/
public interface NodePostHandler extends FlowLifeCycle {
/**
* Post handle.
* @param nodeContext
* @param context
* @return
*/
public NodeContext[] postHandle(NodeContext nodeContext, FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodePreHandler.java
================================================
package com.jd.easyflow.flow.model;
import com.jd.easyflow.flow.engine.FlowContext;
/**
*
* @author liyuliang5
*
*/
public interface NodePreHandler extends FlowLifeCycle {
/**
* Pre handle.
* @param nodeContext
* @param context
* @return
*/
boolean preHandle(NodeContext nodeContext, FlowContext context);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ActionResultEl.java
================================================
package com.jd.easyflow.flow.model.action;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.NodeExecutor;
/**
* Used for condition create expression.
* @author liyuliang5
*/
public class ActionResultEl implements NodeExecutor<Boolean> {
public static final String OP_EQ = "==";
public static final String OP_NEQ = "!=";
private String operator;
private Object value;
public ActionResultEl() {
}
public ActionResultEl(String operator, Object value) {
this.operator = operator;
this.value = value;
}
public static ActionResultEl create(String operator, Object value) {
ActionResultEl el = new ActionResultEl();
el.operator = operator;
el.value = value;
return el;
}
@Override
public Boolean execute(NodeContext nodeContext, FlowContext context) {
Object actionResult = nodeContext.getActionResult();
switch (operator) {
case OP_EQ:
return actionResult == value || (actionResult != null && actionResult.equals(value));
case OP_NEQ:
return actionResult != value && (actionResult == null || ! actionResult.equals(value));
default: {
throw new UnsupportedOperationException("Unsupported operator " + operator);
}
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/CompensateNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import java.util.ArrayList;
import java.util.List;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.exception.FlowException;
import com.jd.easyflow.flow.filter.Filter;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.InitContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.action.compensate.CompensateHelper;
import com.jd.easyflow.flow.model.action.compensate.CompensateNodeFilter;
import com.jd.easyflow.flow.model.action.compensate.CompensateNodePreHandlerFilter;
import com.jd.easyflow.flow.util.FlowConstants;
import com.jd.easyflow.flow.util.Pair;
import com.jd.easyflow.flow.util.Triple;
/**
* @author liyuliang5
*/
public class CompensateNodeAction implements NodeAction {
@Override
public <T> T execute(NodeContext nodeContext, FlowContext context) {
CompensateHelper.compensate(context);
return null;
}
@Override
public void init(InitContext initContext, Object flowNode) {
boolean recordHistory = ! Boolean.FALSE.equals(initContext.getFlow().getProperty(FlowConstants.FLOW_PROPERTY_RECORD_HISTORY));
if (! recordHistory) {
throw new FlowException("CompensateNodeAction must record history");
}
initNodeFilter(initContext, flowNode);
initNodePreHandlerFilter(initContext, flowNode);
}
private void initNodeFilter(InitContext initContext, Object flowNode) {
List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> filters = initContext.getFlow().getFilterManager().getNodeFilters();
boolean contains = false;
if (filters == null) {
filters = new ArrayList<>();
initContext.getFlow().getFilterManager().setNodeFilters(filters);
}
for (Filter filter : filters) {
if (filter instanceof CompensateNodeFilter) {
contains = true;
break;
}
}
if (!contains) {
filters.add(0, new CompensateNodeFilter(Integer.MAX_VALUE));
initContext.getFlow().getFilterManager().setNodeFilters(filters);
}
}
private void initNodePreHandlerFilter(InitContext initContext, Object flowNode) {
List<Filter<Pair<NodeContext, FlowContext>, Boolean>> nodePreHandlerFilters = initContext.getFlow().getFilterManager().getNodePreHandlerFilters();
boolean contains = false;
if (nodePreHandlerFilters == null) {
nodePreHandlerFilters = new ArrayList<>();
initContext.getFlow().getFilterManager().setNodePreHandlerFilters(nodePreHandlerFilters);
}
for (Filter filter : nodePreHandlerFilters) {
if (filter instanceof CompensateNodePreHandlerFilter) {
contains = true;
break;
}
}
if (!contains) {
nodePreHandlerFilters.add(0, new CompensateNodePreHandlerFilter(Integer.MAX_VALUE));
initContext.getFlow().getFilterManager().setNodePreHandlerFilters(nodePreHandlerFilters);
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/EventNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.event.FlowEventListener;
import com.jd.easyflow.flow.engine.event.impl.EventFlowListener;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.InitContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.definition.DefConstants;
import com.jd.easyflow.flow.model.parser.param.ActionParseParam;
import com.jd.easyflow.flow.util.FlowConstants;
/**
* Event node action.
*
* @author liyuliang5
*
*/
public class EventNodeAction implements NodeAction {
private static final Logger logger = LoggerFactory.getLogger(EventNodeAction.class);
private boolean autoAddEventFlowListener = true;
public EventNodeAction() {
}
public EventNodeAction(boolean autoAddEventFlowListener) {
this.autoAddEventFlowListener = autoAddEventFlowListener;
}
@Override
public void init(InitContext initContext, Object flowNode) {
initEventActionMap(initContext, (FlowNode) flowNode);
if (autoAddEventFlowListener) {
List<FlowEventListener> listeners = initContext.getFlow().getEventTrigger().getListenerList();
boolean exists = false;
if (listeners != null) {
for (FlowEventListener listener : listeners) {
if (listener instanceof EventFlowListener) {
exists = true;
break;
}
}
}
if (! exists) {
logger.info("Auto add EventFlowListener");
initContext.getFlow().getEventTrigger().addListener(new EventFlowListener());
}
}
}
@Override
public Object execute(NodeContext nodeContext, FlowContext context) {
String event = nodeContext.get(FlowConstants.NODE_CONTEXT_DATA_EVENT);
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Event is:" + event);
}
if (event == null) {
event = FlowConstants.NONE_EVENT;
}
Map<String, NodeAction> eventActionMap = context.getFlow().getNode(nodeContext.getNodeId())
.getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);
// For exp scenario
if (eventActionMap == null) {
InitContext initContext = new InitContext();
initContext.setFlowParser(context.getFlowEngine().getFlowParser());
initContext.setParseEl(true);
initContext.setFlow(context.getFlow());
initEventActionMap(initContext, context.getFlow().getNode(nodeContext.getNodeId()));
eventActionMap = context.getFlow().getNode(nodeContext.getNodeId())
.getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);
}
NodeAction nodeAction = eventActionMap.get(event);
if (nodeAction == null) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Event node action is null");
}
return null;
}
return nodeAction.execute(nodeContext, context);
}
private void initEventActionMap(InitContext initContext, FlowNode flowNode) {
Map<String, Object> eventActionMap = flowNode.getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);
if (eventActionMap != null) {
return;
}
eventActionMap = new ConcurrentHashMap<>();
Map<String, Object> map = flowNode.getProperty(FlowConstants.NODE_PROP_EVENTS);
if (map != null) {
for (Entry<String, Object> entry : map.entrySet()) {
String event = entry.getKey();
Object eventConf = (Object) entry.getValue();
Map<String, Object> eventActionConfMap = null;
if (eventConf instanceof String) {
eventActionConfMap = new HashMap<>();
eventActionConfMap.put(DefConstants.COMMON_PROP_EXP, (String) eventConf);
} else {
Map<String, Object> eventConfMap = (Map<String, Object>) eventConf;
eventActionConfMap = (Map<String, Object>) eventConfMap.get("action");
}
if (eventActionConfMap != null) {
NodeAction nodeAction = initContext.getFlowParser()
.parseNodeAction(new ActionParseParam(eventActionConfMap, initContext.getFlowList(),
initContext.isParseEl(), initContext.getFlow(), flowNode));
if (nodeAction != null) {
nodeAction.init(initContext, flowNode);
eventActionMap.put(event, nodeAction);
}
}
}
}
flowNode.setProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP, eventActionMap);
}
public boolean isAutoAddEventFlowListener() {
return autoAddEventFlowListener;
}
public void setAutoAddEventFlowListener(boolean autoAddEventFlowListener) {
this.autoAddEventFlowListener = autoAddEventFlowListener;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ExecutorNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.NodeExecutor;
/**
*
* @author liyuliang5
*
*/
public class ExecutorNodeAction implements NodeAction {
private NodeExecutor executor;
public ExecutorNodeAction() {
}
public ExecutorNodeAction(NodeExecutor executor) {
this.executor = executor;
}
@Override
public <T> T execute(NodeContext nodeContext, FlowContext context) {
Object result = executor.execute(nodeContext, context);
return (T) result;
}
public NodeExecutor getExecutor() {
return executor;
}
public void setExecutor(NodeExecutor executor) {
this.executor = executor;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ExpNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
/**
*
* @author liyuliang5
*
*/
public class ExpNodeAction implements NodeAction {
private static final Logger logger = LoggerFactory.getLogger(ExpNodeAction.class);
private String exp;
public ExpNodeAction() {
}
public ExpNodeAction(String exp) {
this.exp = exp;
}
@Override
public <T>T execute(NodeContext nodeContext, FlowContext context) {
Object result = context.getElEvaluator().eval(exp, nodeContext, context, null);
return (T) result;
}
public String getExp() {
return exp;
}
public void setExp(String exp) {
this.exp = exp;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/FlowNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import java.util.List;
import java.util.Map;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowEngine;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.engine.impl.FlowContextImpl;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.InitContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.definition.DefConstants;
import com.jd.easyflow.flow.model.parser.param.FlowParseParam;
import com.jd.easyflow.flow.util.FlowConstants;
/**
*
* Sub flow NodeAction.
*
* IMPORTANT NOTICE! This class should not be singleton!
*
* @author liyuliang5
* @version 1.0
* @since 1.0
*/
public class FlowNodeAction implements NodeAction {
protected String flowId;
protected String[] startNodeIds;
protected Boolean inherit;
protected Flow flow;
public FlowNodeAction() {
// NOOP
}
public FlowNodeAction(String flowId, String[] startNodeIds, boolean inherit) {
this.flowId = flowId;
this.startNodeIds = startNodeIds;
this.inherit = inherit;
}
@Override
public <T> T execute(NodeContext nodeContext, FlowContext context) {
FlowEngine engine = context.getFlowEngine();
FlowParam param = buildFlowParam(nodeContext, context);
FlowResult subResult = engine.execute(param);
processFlowResult(subResult, nodeContext, context);
return (T) subResult;
}
protected FlowParam buildFlowParam(NodeContext nodeContext, FlowContext context) {
// init param.
FlowParam param = new FlowParam();
param.setFlowId(flow == null ? flowId : flow.getId());
param.setNodeIds(startNodeIds);
if (inherit) {
param.setParam(context.getParam().getParam());
param.setDataMapFrom(context.getParam());
param.setLogFlag(context.getParam().getLogFlag());
}
// init context.
FlowContextImpl subContext = new FlowContextImpl();
if (inherit) {
subContext.setDataFrom(context);
subContext.setContext(context.getContext());
subContext.setLogFlag(context.getLogFlag());
subContext.setElEvaluator(context.getElEvaluator());
} else {
subContext.put(FlowConstants.CTX_PARENT_CONTEXT, context);
subContext.put(FlowConstants.CTX_PARENT_NODE_CONTEXT, nodeContext);
}
subContext.setParentContext(context);
subContext.setParentNodeContext(nodeContext);
// init result.
FlowResult result = new FlowResult();
if (inherit) {
result.setResult(context.getResult().getResult());
result.setDataMapFrom(context.getResult());
}
subContext.setFlow(flow);
param.setContext(subContext);
subContext.setResult(result);
return param;
}
protected void processFlowResult(FlowResult subResult, NodeContext nodeContext, FlowContext context) {
if (inherit) {
if (subResult != null && subResult.getContext() != null && subResult.getContext().isInterrupted()) {
context.setInterrupted();
}
}
}
public String getFlowId() {
return flowId;
}
public void setFlowId(String flowId) {
this.flowId = flowId;
}
public String[] getStartNodeIds() {
return startNodeIds;
}
public void setStartNodeIds(String[] startNodeIds) {
this.startNodeIds = startNodeIds;
}
public boolean isInherit() {
return inherit;
}
public void setInherit(boolean inherit) {
this.inherit = inherit;
}
@Override
public void init(InitContext initContext, Object parent) {
FlowNode node = (FlowNode) parent;
if (flowId == null) {
flowId = node.getProperty(DefConstants.COMMON_PROP_FLOW_ID);
if (flowId == null) {
Map<String, Object> flowDef = (Map<String, Object>) node.getProperty(DefConstants.COMMON_PROP_FLOW);
if (flowDef != null) {
FlowParseParam param = new FlowParseParam();
param.setObjectDefinition(flowDef);
param.setParseEl(initContext.isParseEl());
List<Flow> flowList = initContext.getFlowParser().parse(param);
initContext.getFlowList().addAll(flowList);
Flow subFlow = flowList.get(0);
flowId = subFlow.getId();
flow = subFlow;
}
}
}
if (startNodeIds == null) {
Object startNodeId = node.getProperty(DefConstants.NODE_ACTION_PROP_START_NODE_ID);
if (startNodeId != null) {
if (startNodeId instanceof String) {
startNodeIds = new String[] { (String) startNodeId };
} else {
startNodeIds = ((List<String>) startNodeId).toArray(new String[] {});
}
}
}
if (inherit == null) {
inherit = node.getProperty(DefConstants.NODE_ACTION_PROP_INHERIT);
}
if (inherit == null) {
inherit = true;
}
}
public void setFlow(Flow flow) {
this.flow = flow;
}
public Flow getFlow() {
return flow;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/InterruptNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
/**
*
* @author liyuliang5
*
*/
public class InterruptNodeAction implements NodeAction {
@Override
public <T> T execute(NodeContext nodeContext, FlowContext context) {
context.setInterrupted();
return null;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/LoopNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.exception.FlowException;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.InitContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.NodeExecutor;
import com.jd.easyflow.flow.model.parser.param.ActionParseParam;
/**
*
* IMPORTANT NOTICE! This class should not be singleton!
* @author liyuliang5
*/
public class LoopNodeAction implements NodeAction {
private static final Logger logger = LoggerFactory.getLogger(LoopNodeAction.class);
// Condition
private Boolean testBefore;
private String loopConditionExp;
private NodeExecutor<Boolean> loopConditionExecutor;
// MaxCount
private Long loopMaxCount;
private String loopMaxCountExp;
private NodeExecutor<Long> loopMaxCountExecutor;
// Action
protected NodeAction loopAction;
private String loopPreExp;
private NodeExecutor<Object> loopPreExecutor;
private String loopPostExp;
private NodeExecutor<Object> loopPostExecutor;
@Override
public <T> T execute(NodeContext nodeContext, FlowContext context) {
// compute loop maximum
Long maximum = null;
if (loopMaxCountExecutor != null) {
maximum = loopMaxCountExecutor.execute(nodeContext, context);
} else if (loopMaxCountExp != null) {
maximum = ((Number) context.getElEvaluator().eval(loopMaxCountExp, nodeContext, context, null)).longValue();
} else if (loopMaxCount != null) {
maximum = loopMaxCount;
}
if (context.isLogOn() && logger.isDebugEnabled()) {
logger.debug("Loop maximum:" + loopMaxCount);
}
if (maximum == null && loopConditionExp == null && loopConditionExecutor == null) {
throw new FlowException("Loop maximum and condition can not both be null");
}
if (loopPreExecutor != null) {
loopPreExecutor.execute(nodeContext, context);
} else if (loopPreExp != null) {
context.getElEvaluator().eval(loopPreExp, nodeContext, context, null);
}
for (long i = 0; maximum == null || i < maximum; i++) {
nodeContext.put("currentLoopIndex", i);
// test before
if (testBefore) {
if (loopConditionExecutor != null) {
boolean testResult = loopConditionExecutor.execute(nodeContext, context);
if (!testResult) {
break;
}
} else if (loopConditionExp != null) {
boolean testResult = context.getElEvaluator().eval(loopConditionExp, nodeContext, context, null);
if (!testResult) {
break;
}
}
}
// execute
loopAction.execute(nodeContext, context);
// test after
if (!testBefore) {
if (loopConditionExecutor != null) {
boolean testResult = loopConditionExecutor.execute(nodeContext, context);
if (!testResult) {
break;
}
} else if (loopConditionExp != null) {
boolean testResult = context.getElEvaluator().eval(loopConditionExp, nodeContext, context, null);
if (!testResult) {
break;
}
}
}
}
if (loopPostExecutor != null) {
loopPostExecutor.execute(nodeContext, context);
} else if (loopPostExp != null) {
context.getElEvaluator().eval(loopPostExp, nodeContext, context, null);
}
// result put to NodeContext
return null;
}
@Override
public void init(InitContext initContext, Object parent) {
FlowNode node = (FlowNode) parent;
testBefore = node.getProperty("loopTestBefore");
if (testBefore == null) {
throw new FlowException("Test before can not be null");
}
loopConditionExp = node.getProperty("loopConditionExp");
Map<String, Object> loopConditionExecutorConf = (Map<String, Object>) node
.getProperty("loopConditionExecutor");
if (loopConditionExecutorConf != null) {
String createExp = (String) loopConditionExecutorConf.get("createExp");
if (initContext.isParseEl() && createExp != null) {
loopConditionExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);
}
}
loopPreExp = node.getProperty("loopPreExp");
Map<String, Object> loopPreExecutorConf = (Map<String, Object>) node
.getProperty("loopPreExecutor");
if (loopPreExecutorConf != null) {
String createExp = (String) loopPreExecutorConf.get("createExp");
if (initContext.isParseEl() && createExp != null) {
loopPreExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);
}
}
loopPostExp = node.getProperty("loopPostExp");
Map<String, Object> loopPostExecutorConf = (Map<String, Object>) node
.getProperty("loopPostExecutor");
if (loopPostExecutorConf != null) {
String createExp = (String) loopPostExecutorConf.get("createExp");
if (initContext.isParseEl() && createExp != null) {
loopPostExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);
}
}
Object loopMaxCountConf = node.getProperty("loopMaxCount");
if (loopMaxCountConf != null) {
loopMaxCount = ((Number)loopMaxCountConf).longValue();
}
loopMaxCountExp = node.getProperty("loopMaxCountExp");
Map<String, Object> loopMaxCountExecutorConf = (Map<String, Object>) node.getProperty("loopMaxCountExecutor");
if (loopMaxCountExecutorConf != null) {
String createExp = (String) loopMaxCountExecutorConf.get("createExp");
if (initContext.isParseEl() && createExp != null) {
loopMaxCountExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);
}
}
Object loopActionConf = node.getProperty("loopAction");
if (loopActionConf != null) {
ActionParseParam param = new ActionParseParam(loopActionConf, initContext.getFlowList(),
initContext.isParseEl(), initContext.getFlow(), node);
loopAction = initContext.getFlowParser().parseNodeAction(param);
}
if (loopAction != null) {
loopAction.init(initContext, node);
}
if (initContext.isParseEl()) {
if (loopAction == null) {
throw new FlowException("Loop node action can not be null");
}
if (loopMaxCount == null && loopMaxCountExp == null && loopMaxCountExecutor == null && loopConditionExp == null && loopConditionExecutor == null) {
throw new FlowException("Loop maximum and loop condition can not both be null");
}
}
}
public NodeAction getLoopAction() {
return loopAction;
}
public void setLoopAction(NodeAction loopAction) {
this.loopAction = loopAction;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ParamExecutorNodeAction.java
================================================
package com.jd.easyflow.flow.model.action;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.NodeExecutor;
import com.jd.easyflow.flow.util.FlowConstants;
/**
*
* @author liyuliang5
*
*/
public class ParamExecutorNodeAction implements NodeAction {
@Override
public <T> T execute(NodeContext nodeContext, FlowContext context) {
NodeExecutor<Object> executor = context.getParam().get(FlowConstants.PARAM_ACTION_EXECUTOR);
Object result = executor.execute(nodeContext, context);
return (T) result;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateAction.java
================================================
package com.jd.easyflow.flow.model.action.compensate;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.model.NodeContext;
/**
* @author liyuliang5
*/
public interface CompensateAction {
public <T>T compensate(NodeContext nodeContext, FlowContext flowContext);
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateFlowFilter.java
================================================
package com.jd.easyflow.flow.model.action.compensate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.filter.FilterChain;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.filter.impl.BaseFlowFilter;
import com.jd.easyflow.flow.util.FlowConstants;
/**
* @author liyuliang5
*/
public class CompensateFlowFilter extends BaseFlowFilter {
private static final String CTX_KEY_ORIGINAL_START_NODES = "_original_start_nodes";
public CompensateFlowFilter() {
}
public CompensateFlowFilter(int order) {
this.order = order;
}
@Override
public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {
if (CompensateHelper.isCompensating(request)) {
List<NodeContext> originalStartNodes = request.get(CTX_KEY_ORIGINAL_START_NODES);
if (originalStartNodes == null) {
originalStartNodes = request.getStartNodes();
request.put(CTX_KEY_ORIGINAL_START_NODES, originalStartNodes);
}
Set<NodeContext> unCompensatedNodes = new HashSet<NodeContext>();
getUnCompensatedEndNodes(unCompensatedNodes, originalStartNodes);
List<NodeContext> startNodes = new ArrayList<NodeContext>();
for (NodeContext endNode : unCompensatedNodes) {
NodeContext startNode = CompensateHelper.createCompensateNode(endNode);
startNodes.add(startNode);
}
request.setStartNodes(startNodes);
}
FlowResult result = chain.doFilter(request);
return result;
}
private void getUnCompensatedEndNodes(Set<NodeContext> nodes, List<NodeContext> flowStartNodes) {
if (flowStartNodes == null || flowStartNodes.size() == 0) {
return;
}
for (NodeContext nodeContext : flowStartNodes) {
if (Boolean.TRUE.equals(nodeContext.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {
continue;
}
if (nodeContext.getNextNodes() == null || nodeContext.getNextNodes().length == 0) {
nodes.add(nodeContext);
continue;
}
boolean hasNext = false;
for (NodeContext next : nodeContext.getNextNodes()) {
if (! Boolean.TRUE.equals(nodeContext.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {
hasNext = true;
break;
}
}
if (! hasNext) {
nodes.add(nodeContext);
} else {
getUnCompensatedEndNodes(nodes, Arrays.asList(nodeContext.getNextNodes()));
}
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateFlowParseEventListener.java
================================================
package com.jd.easyflow.flow.model.action.compensate;
import java.util.ArrayList;
import java.util.List;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.filter.Filter;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.parser.event.FlowParseEvent;
import com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;
import com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;
import com.jd.easyflow.flow.util.Triple;
/**
* @author liyuliang5
*/
public class CompensateFlowParseEventListener implements FlowParseEventListener {
@Override
public void on(FlowParseEvent event) {
switch (event.getType()) {
case FlowParseEventTypes.INIT_FLOW_END: {
// CompensateNodeFilter
Flow flow = event.getFlow();
List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> nodeFilters = flow.getFilterManager().getNodeFilters();
boolean contains = false;
if (nodeFilters == null) {
nodeFilters = new ArrayList<>();
flow.getFilterManager().setNodeFilters(nodeFilters);
}
for (Filter filter : nodeFilters) {
if (filter instanceof CompensateNodeFilter) {
contains = true;
break;
}
}
if (!contains) {
nodeFilters.add(0, new CompensateNodeFilter(Integer.MAX_VALUE));
flow.getFilterManager().setNodeFilters(nodeFilters);
}
// CompensateFlowFilter
List<Filter<FlowContext, FlowResult>> filters = flow.getFilterManager().getFilters();
contains = false;
if (filters == null) {
filters = new ArrayList<>();
flow.getFilterManager().setFilters(filters);
}
for (Filter filter : filters) {
if (filter instanceof CompensateFlowFilter) {
contains = true;
break;
}
}
if (!contains) {
filters.add(0, new CompensateFlowFilter(Integer.MAX_VALUE));
flow.getFilterManager().setFilters(filters);
}
}
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateHelper.java
================================================
package com.jd.easyflow.flow.model.action.compensate;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.util.FlowConstants;
/**
* Unstable!!! Only for memory model!!!
* @author liyuliang5
*/
public class CompensateHelper {
private static final String FLOW_CONTEXT_COMPENSATE_FLAG = "_compensateFlag";
static final String FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG = "_compensateEndNodesFlag";
static final String NODE_CONTEXT_COMPENSATING_FLAG = "_compensatingFlag";
public static void compensate(FlowContext context) {
context.put(FLOW_CONTEXT_COMPENSATE_FLAG, true);
}
public static boolean isCompensating(FlowContext context) {
return Boolean.TRUE.equals(context.get(FLOW_CONTEXT_COMPENSATE_FLAG));
}
public static NodeContext createCompensateNode(NodeContext nodeContext) {
NodeContext nodeCtx = new NodeContext(nodeContext.getNodeId());
nodeCtx.put(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG, true);
nodeCtx.put(FlowConstants.NODECTX_COMPENSATE_FOR, nodeContext);
nodeContext.put(FlowConstants.NODECTX_COMPENSATED_BY, nodeCtx);
return nodeCtx;
}
public static FlowResult compensateFlow(FlowContext context) {
FlowParam compensateParam = new FlowParam();
CompensateHelper.compensate(context);
compensateParam.setContext(context);
FlowResult compensateResult = context.getFlowEngine().execute(compensateParam);
return compensateResult;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateNodeFilter.java
================================================
package com.jd.easyflow.flow.model.action.compensate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.filter.FilterChain;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.NodeContextAccessor;
import com.jd.easyflow.flow.model.filter.impl.BaseNodeFilter;
import com.jd.easyflow.flow.model.node.NodeImpl;
import com.jd.easyflow.flow.util.FlowConstants;
import com.jd.easyflow.flow.util.LockUtil;
import com.jd.easyflow.flow.util.Triple;
/**
* @author liyuliang5
*/
public class CompensateNodeFilter extends BaseNodeFilter {
private static final Logger logger = LoggerFactory.getLogger(CompensateNodeFilter.class);
private static final String CTX_COMENSATED_END_NODES_LOCK_KEY = "_compensated_end_nodes_lock";
private static final String NODE_CTX_COMENSATING_LOCK_KEY = "_compensating_lock";
public CompensateNodeFilter() {
}
public CompensateNodeFilter(int order) {
this.order = order;
}
@Override
public NodeContext doFilter(Triple<FlowNode, NodeContext, FlowContext> request,
FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain) {
FlowContext context = request.getRight();
NodeContext nodeContext = request.getMiddle();
if (! Boolean.TRUE.equals(nodeContext.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {
// Normal scenario.
NodeContext newNodeContext = chain.doFilter(request);
if (CompensateHelper.isCompensating(context)) {
// post to previous node.
List<NodeContext> compensatedNextNodes = new ArrayList<NodeContext>();
// current node previous nodes.
compensatedNextNodes.add(CompensateHelper.createCompensateNode(newNodeContext));
if (!Boolean.TRUE.equals(context.get(CompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG))) {
Object lockObj = LockUtil.getFlowContextLock(CTX_COMENSATED_END_NODES_LOCK_KEY, context);
synchronized (lockObj) {
// add end nodes.
if (!Boolean.TRUE.equals(context.get(CompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG))) {
Set<NodeContext> endNodes = new HashSet<NodeContext>();
getEndNodes(context.getStartNodes().toArray(new NodeContext[context.getStartNodes().size()]), endNodes);
for (NodeContext endNode : endNodes) {
compensatedNextNodes.add(CompensateHelper.createCompensateNode(endNode));
}
context.put(CompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG, true);
}
NodeContextAccessor.setNextNodes(newNodeContext,
compensatedNextNodes.toArray(new NodeContext[compensatedNextNodes.size()]));
}
}
}
newNodeContext.put(CompensateNodeFilter.class.getName(), true);
return newNodeContext;
} else {
// Compensate scenario.
NodeImpl nodeImpl = (NodeImpl) context.getFlow().getNode(nodeContext.getNodeId());
NodeContext originNodeCtx = nodeContext.get(FlowConstants.NODECTX_COMPENSATE_FOR);
Object lockObj = LockUtil.getNodeContextLock(NODE_CTX_COMENSATING_LOCK_KEY, originNodeCtx);
synchronized (lockObj) {
// Judge compensate
if (Boolean.TRUE.equals(originNodeCtx.get(CompensateHelper.NODE_CONTEXT_COMPENSATING_FLAG))) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Node:" + originNodeCtx.getNodeId() + "has been compensated, return");
}
return nodeContext;
}
List<NodeContext> originNextNodes = originNodeCtx.get(FlowConstants.NODECTX_NEXT_NODES);
if (originNextNodes == null && originNodeCtx.getNextNodes() != null) {
originNextNodes = Arrays.asList(originNodeCtx.getNextNodes());
}
if (originNextNodes != null && originNextNodes.size() > 0) {
String notCompensated = null;
for (NodeContext next : originNextNodes) {
if (Boolean.TRUE.equals(next.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {
continue;
}
if (!Boolean.TRUE.equals(next.get(FlowConstants.NODECTX_COMPENSATED_FLAG))) {
notCompensated = next.getNodeId();
break;
}
}
if (notCompensated != null) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Next nodes of " + originNodeCtx.getNodeId() + " not all compensated:" + notCompensated);
}
return nodeContext;
}
}
originNodeCtx.put(CompensateHelper.NODE_CONTEXT_COMPENSATING_FLAG, true);
}
// Execute compensate action
if (Boolean.FALSE.equals(originNodeCtx.getPreResult())) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Node:" + originNodeCtx.getNodeId() + " pre result is false, skip compensate action.");
}
} else {
NodeAction nodeAction = nodeImpl.getAction();
Object compensateResult = null;
NodeAction compensateNodeAction = (NodeAction) nodeImpl
.getProperty(FlowConstants.PROP_RUNTIME_COMPENSATE_ACTION);
if (compensateNodeAction != null) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Compensate using NodeAction:" + compensateNodeAction.getClass());
}
compensateResult = compensateNodeAction.execute(nodeContext, context);
} else if (nodeAction instanceof CompensateAction) {
if (context.isLogOn() && logger.isInfoEnabled()) {
logger.info("Compensate using CompensateAction");
}
compensateResult = ((CompensateAction) nodeAction).compensate(nodeContext, context);
}
NodeContextAccessor.setActionResult(nodeContext, compensateResult);
}
originNodeCtx.put(FlowConstants.NODECTX_COMPENSATED_FLAG, true);
// post to previous node.
List<NodeContext> previousList = originNodeCtx.get(FlowConstants.NODECTX_PREVIOUS_NODES);
if (previousList != null) {
// MultiCheck and InclusiveCheck
if (previousList.size() == 0) {
NodeContextAccessor.setNextNodes(nodeContext, null);
} else {
NodeContext[] previouses = new NodeContext[previousList.size()];
for (int i = 0; i < previousList.size(); i++) {
previouses[i] = CompensateHelper.createCompensateNode(previousList.get(i));
}
NodeContextAccessor.setNextNodes(nodeContext, previouses);
}
} else if (originNodeCtx.getPreviousNode() != null) {
NodeContextAccessor.setNextNodes(nodeContext,
new NodeContext[] { CompensateHelper.createCompensateNode(originNodeCtx.getPreviousNode()) });
} else {
NodeContextAccessor.setNextNodes(nodeContext, null);
}
return nodeContext;
}
}
private void getEndNodes(NodeContext[] nodes, Set<NodeContext> result) {
if (nodes == null || nodes.length == 0) {
return;
}
for (NodeContext node : nodes) {
if (!Boolean.TRUE.equals(node.get(CompensateNodeFilter.class.getName()))) {
continue;
}
if (node.getNextNodes() == null || node.getNextNodes().length == 0) {
result.add(node);
} else {
getEndNodes(node.getNextNodes(), result);
}
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateNodePreHandlerFilter.java
================================================
package com.jd.easyflow.flow.model.action.compensate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.filter.FilterChain;
import com.jd.easyflow.flow.model.NodeContext;
import com.jd.easyflow.flow.model.filter.impl.BaseNodePreHandlerFilter;
import com.jd.easyflow.flow.util.Pair;
/**
* @author liyuliang5
*/
public class CompensateNodePreHandlerFilter extends BaseNodePreHandlerFilter {
private static final Logger logger = LoggerFactory.getLogger(CompensateNodePreHandlerFilter.class);
public CompensateNodePreHandlerFilter() {
}
public CompensateNodePreHandlerFilter(int order) {
this.order = order;
}
@Override
public Boolean doFilter(Pair<NodeContext, FlowContext> request,
FilterChain<Pair<NodeContext, FlowContext>, Boolean> chain) {
Boolean result = chain.doFilter(request);
if (CompensateHelper.isCompensating(request.getRight())) {
if (request.getRight().isLogOn() && logger.isInfoEnabled()) {
logger.info("Compensating, NodePreHandler return false, node:" + request.getLeft().getNodeId());
}
return false;
} else {
return result;
}
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/FlowCompensateAction.java
================================================
package com.jd.easyflow.flow.model.action.compensate;
import com.jd.easyflow.flow.engine.FlowContext;
import com.jd.easyflow.flow.engine.FlowParam;
import com.jd.easyflow.flow.engine.FlowResult;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodeContext;
/**
* @author liyuliang5
*/
public class FlowCompensateAction implements NodeAction {
@Override
public FlowResult execute(NodeContext nodeContext, FlowContext context) {
FlowResult result = (FlowResult) nodeContext.getActionResult();
FlowParam param = new FlowParam();
param.setContext(result.getContext());
CompensateHelper.compensate(result.getContext());
FlowResult compensateResult = context.getFlowEngine().execute(param);
return compensateResult;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/builder/FlowBuilder.java
================================================
package com.jd.easyflow.flow.model.builder;
import com.jd.easyflow.flow.model.Flow;
import com.jd.easyflow.flow.model.FlowNode;
import com.jd.easyflow.flow.model.FlowPostHandler;
import com.jd.easyflow.flow.model.FlowPreHandler;
import com.jd.easyflow.flow.model.InitContext;
import com.jd.easyflow.flow.model.NodeAction;
import com.jd.easyflow.flow.model.NodePostHandler;
import com.jd.easyflow.flow.model.node.NodeImpl;
import com.jd.easyflow.flow.model.parser.FlowParser;
/**
*
* @author liyuliang5
*
*/
public class FlowBuilder {
private Flow flow;
public static FlowBuilder create(String id, String name) {
Flow flow = new Flow();
flow.setId(id);
flow.setName(name);
FlowBuilder builder = new FlowBuilder();
builder.flow = flow;
return builder;
}
public FlowBuilder setProperty(String key, Object value) {
flow.setProperty(key, value);
return this;
}
public FlowBuilder addNode(String nodeId, NodeAction action) {
return addNode(nodeId, action, null);
}
public FlowBuilder addNode(String nodeId, NodeAction action, NodePostHandler postHandler) {
NodeImpl node = new NodeImpl();
node.setId(nodeId);
node.setAction(action);
node.setPostHandler(postHandler);
flow.addNode(node);
return this;
}
public FlowBuilder addNode(FlowNode node) {
flow.addNode(node);
return this;
}
public FlowBuilder setStartNodeId(String startNodeId) {
flow.setStartNodeIds(new String[] {startNodeId});
return this;
}
public FlowBuilder setStartNodeIds(String[] startNodeIds) {
flow.setStartNodeIds(startNodeIds);
return this;
}
public FlowBuilder setFlowPreHandler(FlowPreHandler preHandler) {
flow.setPreHandler(preHandler);
return this;
}
public FlowBuilder setFlowPostHandler(FlowPostHandler postHandler) {
flow.setPostHandler(postHandler);
return this;
}
public Flow build() {
return flow;
}
public Flow buildAndInit() {
InitContext initContext = new InitContext();
initContext.setFlowParser(null);
initContext.setParseEl(true);
initContext.setFlowList(null);
initContext.setFlowDefinitionMap(null);
initContext.setFlow(flow);
flow.init(initContext, null);
return flow;
}
public Flow buildAndInit(FlowParser flowParser) {
InitContext initContext = new InitContext();
initContext.setFlowParser(flowParser);
initContext.setParseEl(true);
initContext.setFlowList(null);
initContext.setFlowDefinitionMap(null);
initContext.setFlow(flow);
flow.init(initContext, null);
return flow;
}
}
================================================
FILE: easyflow-flow/src/main/java/com/jd/easyflow/flow/model/definition/DefConstants.java
================================================
package com.jd.easyflow.flow.model.definition;
/**
*
* @author liyuliang5
*
*/
public class DefConstants {
public static final String COMMON_PROP_ID = "id";
public static final String COMMON_PROP_NAME = "name";
public static final String COMMON_PROP_EXP = "exp";
public static final String COMMON_PROP_FLOW = "flow";
public static final String COMMON_PROP_FLOW_ID = "flowId";
public static final String COMMON_PROP_CREATE_EXP = "createExp";
public static final String COMMON_PROP_PROPERTIES = "properties";
public static final String COMMON_PROP_CREATE = "create";
gitextract_yjh79igv/ ├── .gitignore ├── LICENSE.txt ├── NOTICE.txt ├── README-zh.md ├── README.md ├── easyflow-flow/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── jd/ │ │ │ └── easyflow/ │ │ │ └── flow/ │ │ │ ├── common/ │ │ │ │ └── FlowExecutor.java │ │ │ ├── el/ │ │ │ │ ├── ElEvaluator.java │ │ │ │ ├── ElFactory.java │ │ │ │ ├── ElRootMap.java │ │ │ │ └── SpelEvaluator.java │ │ │ ├── engine/ │ │ │ │ ├── FlowContext.java │ │ │ │ ├── FlowEngine.java │ │ │ │ ├── FlowParam.java │ │ │ │ ├── FlowResult.java │ │ │ │ ├── FlowRunner.java │ │ │ │ ├── builder/ │ │ │ │ │ └── FlowParamBuilder.java │ │ │ │ ├── event/ │ │ │ │ │ ├── BaseFlowEventListener.java │ │ │ │ │ ├── ExpFlowEventListener.java │ │ │ │ │ ├── FlowEvent.java │ │ │ │ │ ├── FlowEventListener.java │ │ │ │ │ ├── FlowEventTrigger.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── EventFlowListener.java │ │ │ │ │ └── InterruptFlowListener.java │ │ │ │ ├── filter/ │ │ │ │ │ ├── FlowEngineFilter.java │ │ │ │ │ ├── FlowEngineFilterManager.java │ │ │ │ │ └── impl/ │ │ │ │ │ └── BaseFlowEngineFilter.java │ │ │ │ └── impl/ │ │ │ │ ├── BaseFlowRunner.java │ │ │ │ ├── CoreFlowEngine.java │ │ │ │ ├── ExpFlowRunner.java │ │ │ │ ├── FlowContextImpl.java │ │ │ │ ├── FlowEngineImpl.java │ │ │ │ ├── MultipleThreadFlowRunner.java │ │ │ │ ├── ReusableThreadFlowRunner.java │ │ │ │ └── SingleThreadFlowRunner.java │ │ │ ├── exception/ │ │ │ │ └── FlowException.java │ │ │ ├── filter/ │ │ │ │ ├── BaseFilter.java │ │ │ │ ├── ExpFilter.java │ │ │ │ ├── Filter.java │ │ │ │ ├── FilterChain.java │ │ │ │ └── FilterChainImpl.java │ │ │ ├── model/ │ │ │ │ ├── Flow.java │ │ │ │ ├── FlowLifeCycle.java │ │ │ │ ├── FlowNode.java │ │ │ │ ├── FlowPostHandler.java │ │ │ │ ├── FlowPreHandler.java │ │ │ │ ├── InitContext.java │ │ │ │ ├── NodeAction.java │ │ │ │ ├── NodeContext.java │ │ │ │ ├── NodeContextAccessor.java │ │ │ │ ├── NodeExecutor.java │ │ │ │ ├── NodePostHandler.java │ │ │ │ ├── NodePreHandler.java │ │ │ │ ├── action/ │ │ │ │ │ ├── ActionResultEl.java │ │ │ │ │ ├── CompensateNodeAction.java │ │ │ │ │ ├── EventNodeAction.java │ │ │ │ │ ├── ExecutorNodeAction.java │ │ │ │ │ ├── ExpNodeAction.java │ │ │ │ │ ├── FlowNodeAction.java │ │ │ │ │ ├── InterruptNodeAction.java │ │ │ │ │ ├── LoopNodeAction.java │ │ │ │ │ ├── ParamExecutorNodeAction.java │ │ │ │ │ └── compensate/ │ │ │ │ │ ├── CompensateAction.java │ │ │ │ │ ├── CompensateFlowFilter.java │ │ │ │ │ ├── CompensateFlowParseEventListener.java │ │ │ │ │ ├── CompensateHelper.java │ │ │ │ │ ├── CompensateNodeFilter.java │ │ │ │ │ ├── CompensateNodePreHandlerFilter.java │ │ │ │ │ └── FlowCompensateAction.java │ │ │ │ ├── builder/ │ │ │ │ │ └── FlowBuilder.java │ │ │ │ ├── definition/ │ │ │ │ │ └── DefConstants.java │ │ │ │ ├── filter/ │ │ │ │ │ ├── FlowFilter.java │ │ │ │ │ ├── FlowFilterManager.java │ │ │ │ │ ├── FlowPostHandlerFilter.java │ │ │ │ │ ├── FlowPreHandlerFilter.java │ │ │ │ │ ├── NodeActionFilter.java │ │ │ │ │ ├── NodeFilter.java │ │ │ │ │ ├── NodePostHandlerFilter.java │ │ │ │ │ ├── NodePreHandlerFilter.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── BaseFlowFilter.java │ │ │ │ │ ├── BaseFlowPostHandlerFilter.java │ │ │ │ │ ├── BaseFlowPreHandlerFilter.java │ │ │ │ │ ├── BaseNodeActionFilter.java │ │ │ │ │ ├── BaseNodeFilter.java │ │ │ │ │ ├── BaseNodePostHandlerFilter.java │ │ │ │ │ └── BaseNodePreHandlerFilter.java │ │ │ │ ├── flow/ │ │ │ │ │ ├── post/ │ │ │ │ │ │ └── ExpFlowPostHandler.java │ │ │ │ │ └── pre/ │ │ │ │ │ └── ExpFlowPreHandler.java │ │ │ │ ├── node/ │ │ │ │ │ └── NodeImpl.java │ │ │ │ ├── parser/ │ │ │ │ │ ├── FlowParser.java │ │ │ │ │ ├── FlowParserImpl.java │ │ │ │ │ ├── event/ │ │ │ │ │ │ ├── ExpFlowParseEventListener.java │ │ │ │ │ │ ├── FlowParseEvent.java │ │ │ │ │ │ ├── FlowParseEventListener.java │ │ │ │ │ │ └── FlowParseEventTypes.java │ │ │ │ │ └── param/ │ │ │ │ │ ├── ActionParseParam.java │ │ │ │ │ ├── FlowParseParam.java │ │ │ │ │ ├── PostParseParam.java │ │ │ │ │ └── PreParseParam.java │ │ │ │ ├── post/ │ │ │ │ │ ├── AbstractNodePostHandler.java │ │ │ │ │ ├── ConditionalNodePostHandler.java │ │ │ │ │ ├── EventPostHandler.java │ │ │ │ │ ├── ExecutorNodePostHandler.java │ │ │ │ │ ├── ExpNodePostHandler.java │ │ │ │ │ └── FixedNodePostHandler.java │ │ │ │ └── pre/ │ │ │ │ ├── ExpNodePreHandler.java │ │ │ │ ├── InclusiveCheckPreHandler.java │ │ │ │ ├── MultiCheckPreHandler.java │ │ │ │ ├── NodePreHandlerHelper.java │ │ │ │ └── NodePrePropertyGetter.java │ │ │ └── util/ │ │ │ ├── ExceptionUtil.java │ │ │ ├── FlowConstants.java │ │ │ ├── FlowEventTypes.java │ │ │ ├── FlowIOUtil.java │ │ │ ├── FlowNodeLinkUtil.java │ │ │ ├── FlowStringUtil.java │ │ │ ├── FlowUtil.java │ │ │ ├── JsonFacade.java │ │ │ ├── JsonFacadeJacksonImpl.java │ │ │ ├── JsonPrettyHelper.java │ │ │ ├── JsonUtil.java │ │ │ ├── LockUtil.java │ │ │ ├── Pair.java │ │ │ └── Triple.java │ │ └── resources/ │ │ └── pretty/ │ │ └── pretty-flow.json │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── jd/ │ │ └── easyflow/ │ │ └── flow/ │ │ ├── FlowTestSuite.java │ │ ├── cases/ │ │ │ ├── action/ │ │ │ │ ├── ActionTest.java │ │ │ │ ├── CompensateTest.java │ │ │ │ ├── LoopNodeActionTest.java │ │ │ │ ├── MockActionClass.java │ │ │ │ ├── MockClassMethodAction.java │ │ │ │ ├── MockInputOutputEventListener.java │ │ │ │ └── MultipleActionTest.java │ │ │ ├── common/ │ │ │ │ └── TestNodeExecutor.java │ │ │ ├── event/ │ │ │ │ ├── EventFlowTest.java │ │ │ │ └── TestEventNodeAction.java │ │ │ ├── filter/ │ │ │ │ └── FilterTest.java │ │ │ ├── flowengine/ │ │ │ │ ├── FlowEngineImplTest.java │ │ │ │ ├── PocFlowEngineImpl.java │ │ │ │ └── PocNodeImpl.java │ │ │ ├── inclusive/ │ │ │ │ └── InclusiveTest.java │ │ │ ├── interrupt/ │ │ │ │ └── InterruptTest.java │ │ │ ├── listener/ │ │ │ │ └── InterruptFlowListenerTest.java │ │ │ ├── logflag/ │ │ │ │ └── LogFlagTest.java │ │ │ ├── mockbiz/ │ │ │ │ ├── CheckBiz.java │ │ │ │ ├── LimitBiz.java │ │ │ │ ├── LoanBiz.java │ │ │ │ ├── LoanContractSignBiz.java │ │ │ │ ├── MockFlowListener.java │ │ │ │ └── MockLoanTest.java │ │ │ ├── parallel/ │ │ │ │ └── ParallelTest.java │ │ │ ├── parser/ │ │ │ │ ├── FlowParserTest.java │ │ │ │ ├── TestAddFilterParseListener.java │ │ │ │ ├── TestFlowParamAndResultPrintFilter.java │ │ │ │ ├── TestFlowParseListener.java │ │ │ │ └── TestFlowParserImpl.java │ │ │ ├── performance/ │ │ │ │ ├── EmptyStepAction.java │ │ │ │ ├── LoopStepAction.java │ │ │ │ ├── MemoryTest.java │ │ │ │ └── PerformanceTest.java │ │ │ ├── posthandler/ │ │ │ │ ├── ConditionalPostHandlerTest.java │ │ │ │ ├── FlowIndexTest.java │ │ │ │ ├── NodePostHandlerTest.java │ │ │ │ ├── PostHandlerFilterTest.java │ │ │ │ ├── PostParamNode1Action.java │ │ │ │ ├── PostParamNode2Action.java │ │ │ │ ├── PostParamNode3Action.java │ │ │ │ └── TestPostHandlerFilter.java │ │ │ ├── prehandler/ │ │ │ │ └── PreHandlerTest.java │ │ │ ├── pretty/ │ │ │ │ └── FlowDefPrettyHelperTest.java │ │ │ ├── runner/ │ │ │ │ ├── MultiThreadTest.java │ │ │ │ ├── ReusableThreadTest.java │ │ │ │ ├── TestInterruptNodeAction.java │ │ │ │ ├── TestMultiRunner.java │ │ │ │ └── TestReusableThreadRunner.java │ │ │ ├── share/ │ │ │ │ └── nodeaction/ │ │ │ │ └── TestStepAction.java │ │ │ ├── spring/ │ │ │ │ └── SpringFlowTest.java │ │ │ └── subflow/ │ │ │ ├── SubFlowTest.java │ │ │ └── TestInvokeSubFlowNodeAction.java │ │ ├── quickstart/ │ │ │ ├── QuickStart001Node01Action.java │ │ │ ├── QuickStart002Node01Action.java │ │ │ ├── QuickStart003Node01Action.java │ │ │ └── QuickStartTest.java │ │ └── unit/ │ │ └── util/ │ │ ├── JsonTest.java │ │ └── TreeMapTest.java │ └── resources/ │ ├── flow/ │ │ ├── cases/ │ │ │ ├── action/ │ │ │ │ ├── action_interrupt_001.json │ │ │ │ ├── compensate_001.json │ │ │ │ ├── compensate_002.json │ │ │ │ ├── compensate_flow_001.json │ │ │ │ ├── loop_test_001.json │ │ │ │ └── multiple_action_001.json │ │ │ ├── event/ │ │ │ │ ├── flow_event_001.json │ │ │ │ ├── flow_event_002.json │ │ │ │ ├── flow_event_003.json │ │ │ │ └── flow_event_nolistener_001.json │ │ │ ├── filter/ │ │ │ │ ├── inner_flow_engine_filter_001.json │ │ │ │ ├── inner_flow_filter_001.json │ │ │ │ └── inner_node_action_filter_001.json │ │ │ ├── inclusive/ │ │ │ │ ├── flow_inclusive201.json │ │ │ │ ├── flow_inclusive202.json │ │ │ │ ├── flow_inclusive203.json │ │ │ │ └── flow_inclusive303.json │ │ │ ├── interrupt/ │ │ │ │ ├── interrupt_001.json │ │ │ │ └── interrupt_002.json │ │ │ ├── listener/ │ │ │ │ ├── interrupt_listener_001.json │ │ │ │ ├── interrupt_listener_002.json │ │ │ │ └── interrupt_listener_003.json │ │ │ ├── logflag/ │ │ │ │ └── logflag_001.json │ │ │ ├── mockbiz/ │ │ │ │ └── mock_loan_001.json │ │ │ ├── parallel/ │ │ │ │ └── flow_parallel001.json │ │ │ ├── parser/ │ │ │ │ ├── flow_multiple001.json │ │ │ │ ├── parser_test_001.json │ │ │ │ ├── parser_test_002.json │ │ │ │ ├── parser_test_003.json │ │ │ │ ├── parser_test_subflow_001.json │ │ │ │ └── parser_test_subflow_002.json │ │ │ ├── performance/ │ │ │ │ ├── flow_memory001.json │ │ │ │ └── flow_performance001.json │ │ │ ├── posthandler/ │ │ │ │ ├── flow_createexp_post_to_001.json │ │ │ │ ├── flow_exp_post_to_001.json │ │ │ │ ├── flow_index001.json │ │ │ │ ├── flow_post_handler_filter_001.json │ │ │ │ ├── flow_post_param_001.json │ │ │ │ ├── flow_postdata_001.json │ │ │ │ └── flow_when_createexp_001.json │ │ │ ├── prehandler/ │ │ │ │ └── flow_prehandler_001.json │ │ │ ├── pretty/ │ │ │ │ ├── pretty_multiple_test.json │ │ │ │ └── pretty_test.json │ │ │ ├── runner/ │ │ │ │ ├── flow_interrupt001.json │ │ │ │ ├── flow_interrupt002.json │ │ │ │ ├── flow_interrupt003.json │ │ │ │ ├── flow_multi001.json │ │ │ │ ├── flow_multi002.json │ │ │ │ ├── flow_multi003.json │ │ │ │ ├── flow_multi004.json │ │ │ │ ├── flow_reusable001.json │ │ │ │ ├── flow_reusable002.json │ │ │ │ ├── flow_reusable003.json │ │ │ │ └── flow_reusable004.json │ │ │ ├── spring/ │ │ │ │ ├── applicationContext-flow-test.xml │ │ │ │ └── flow_spring_001.json │ │ │ └── subflow/ │ │ │ ├── flow_subflow_001.json │ │ │ ├── flow_subflow_002.json │ │ │ ├── flow_subflow_002_01.json │ │ │ ├── flow_subflow_003.json │ │ │ └── flow_subflow_003_01.json │ │ └── quickstart/ │ │ └── quickstart_001.json │ └── logback.xml ├── easyflow-flow-bpmn/ │ ├── BPMNDesigner.html │ ├── pom.xml │ ├── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ ├── .gitkeep │ │ │ └── com/ │ │ │ └── jd/ │ │ │ └── easyflow/ │ │ │ └── flow/ │ │ │ └── bpmn/ │ │ │ ├── BpmnFlowParser.java │ │ │ └── converter/ │ │ │ ├── BaseFlowNodeConverter.java │ │ │ ├── BpmnConverter.java │ │ │ ├── FlowNodeConverter.java │ │ │ ├── activity/ │ │ │ │ ├── AdhocSubProcessConverter.java │ │ │ │ ├── BusinessRuleTaskConverter.java │ │ │ │ ├── CallActivityConverter.java │ │ │ │ ├── EventSubProcessConverter.java │ │ │ │ ├── ManualTaskConverter.java │ │ │ │ ├── ReceiveTaskConverter.java │ │ │ │ ├── ScriptTaskConverter.java │ │ │ │ ├── SendTaskConverter.java │ │ │ │ ├── ServiceTaskConverter.java │ │ │ │ ├── SubProcessConverter.java │ │ │ │ ├── TaskConverter.java │ │ │ │ ├── TransactionConverter.java │ │ │ │ └── UserTaskConverter.java │ │ │ ├── event/ │ │ │ │ ├── EndEventConverter.java │ │ │ │ ├── IntermediateCatchEventConverter.java │ │ │ │ ├── StartEventConverter.java │ │ │ │ └── ThrowEventConverter.java │ │ │ ├── gateway/ │ │ │ │ ├── ComplexGatewayConverter.java │ │ │ │ ├── EventGatewayConverter.java │ │ │ │ ├── ExclusiveGatewayConverter.java │ │ │ │ ├── InclusiveGatewayConverter.java │ │ │ │ └── ParallelGatewayConverter.java │ │ │ └── util/ │ │ │ ├── BpmnXmlConstants.java │ │ │ └── ConvertUtil.java │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── jd/ │ │ │ └── easyflow/ │ │ │ └── flow/ │ │ │ └── bpmn/ │ │ │ ├── FlowBpmnTestSuite.java │ │ │ ├── cases/ │ │ │ │ ├── callactivity/ │ │ │ │ │ └── BpmnCallActivityTest.java │ │ │ │ ├── chain/ │ │ │ │ │ └── FlowChainTest.java │ │ │ │ ├── converter/ │ │ │ │ │ ├── BpmnConverterTest.java │ │ │ │ │ └── BpmnTestService.java │ │ │ │ ├── defaultflow/ │ │ │ │ │ └── DefaultFlowTest.java │ │ │ │ ├── extension/ │ │ │ │ │ └── BpmnExtensionTest.java │ │ │ │ ├── inclusive/ │ │ │ │ │ └── BpmnInclusiveTest.java │ │ │ │ ├── logflag/ │ │ │ │ │ └── LogFlagTest.java │ │ │ │ ├── parallel/ │ │ │ │ │ └── BpmnParallelTest.java │ │ │ │ ├── share/ │ │ │ │ │ └── nodeaction/ │ │ │ │ │ ├── TestEventNodeAction.java │ │ │ │ │ └── TestStepAction.java │ │ │ │ ├── subprocess/ │ │ │ │ │ └── BpmnSubProcessTest.java │ │ │ │ ├── terminate/ │ │ │ │ │ └── BpmnTerminateTest.java │ │ │ │ └── throwevent/ │ │ │ │ └── BpmnThrowEventTest.java │ │ │ ├── ext/ │ │ │ │ └── cases/ │ │ │ │ └── chain/ │ │ │ │ ├── ChainTest.java │ │ │ │ ├── ChainTestService.java │ │ │ │ ├── Plugin1.java │ │ │ │ ├── Plugin2.java │ │ │ │ └── Plugin3.java │ │ │ └── quickstart/ │ │ │ ├── QuickStart001Node01Action.java │ │ │ ├── QuickStart002Node01Action.java │ │ │ ├── QuickStart003Node01Action.java │ │ │ └── QuickStartTest.java │ │ └── resources/ │ │ ├── flow/ │ │ │ ├── cases/ │ │ │ │ ├── callactivity/ │ │ │ │ │ ├── flow_callactivity_test_001.bpmn │ │ │ │ │ └── flow_sub_of_called.bpmn │ │ │ │ ├── chain/ │ │ │ │ │ └── flow_chaintest1.bpmn │ │ │ │ ├── converter/ │ │ │ │ │ ├── compensate001.bpmn │ │ │ │ │ ├── flow001.json │ │ │ │ │ ├── flow_multiple_001.bpmn │ │ │ │ │ ├── process_1.bpmn │ │ │ │ │ └── process_1_simple.bpmn │ │ │ │ ├── defaultflow/ │ │ │ │ │ └── default_flow_001.bpmn │ │ │ │ ├── extension/ │ │ │ │ │ └── process_1.bpmn │ │ │ │ ├── inclusive/ │ │ │ │ │ ├── flow_inclusive001.bpmn │ │ │ │ │ └── flow_inclusive002.bpmn │ │ │ │ ├── logflag/ │ │ │ │ │ └── logflag_001.bpmn │ │ │ │ ├── parallel/ │ │ │ │ │ ├── flow_multi_parallel_subflow_001.bpmn │ │ │ │ │ └── flow_parallel001.bpmn │ │ │ │ ├── subprocess/ │ │ │ │ │ └── flow_subprocess_test_001.bpmn │ │ │ │ ├── terminate/ │ │ │ │ │ └── flow_terminate001.bpmn │ │ │ │ └── throwevent/ │ │ │ │ └── flow_throwevent001.bpmn │ │ │ ├── ext/ │ │ │ │ └── cases/ │ │ │ │ └── chain/ │ │ │ │ └── flow_chaintest1.bpmn │ │ │ └── quickstart/ │ │ │ └── quickstart_001.bpmn │ │ └── logback.xml │ └── static/ │ ├── plugins/ │ │ ├── bootstrap/ │ │ │ ├── css/ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ └── bootstrap.css │ │ │ └── js/ │ │ │ ├── bootstrap.bundle.js │ │ │ └── bootstrap.js │ │ ├── bootstrap-multiselect/ │ │ │ ├── css/ │ │ │ │ └── bootstrap-multiselect.css │ │ │ ├── js/ │ │ │ │ └── bootstrap-multiselect.js │ │ │ └── less/ │ │ │ └── bootstrap-multiselect.less │ │ ├── bpmnjs/ │ │ │ ├── assets/ │ │ │ │ ├── bpmn-font/ │ │ │ │ │ └── css/ │ │ │ │ │ ├── bpmn-codes.css │ │ │ │ │ ├── bpmn-embedded.css │ │ │ │ │ └── bpmn.css │ │ │ │ ├── bpmn-js.css │ │ │ │ └── diagram-js.css │ │ │ ├── bpmn-modeler.development.js │ │ │ ├── bpmn-navigated-viewer.development.js │ │ │ ├── bpmn-viewer.development.js │ │ │ └── changeForEasyflow/ │ │ │ ├── changelog.txt │ │ │ └── rollup.config.js │ │ ├── flow/ │ │ │ ├── bpmn.js │ │ │ ├── flow.css │ │ │ └── flow.js │ │ ├── fontawesome/ │ │ │ └── css/ │ │ │ └── all.css │ │ ├── jquery/ │ │ │ └── jquery-3.6.0.js │ │ ├── jquery-validation/ │ │ │ └── jquery.validate.js │ │ └── std-common/ │ │ ├── common.css │ │ ├── common.js │ │ ├── messages_default.js │ │ └── messages_zh.js │ └── test/ │ └── JsonPropertyEditor.html ├── easyflow-flow-extension/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── jd/ │ │ └── easyflow/ │ │ └── flow/ │ │ └── ext/ │ │ ├── chain/ │ │ │ ├── BaseChainPlugin.java │ │ │ ├── ChainConstants.java │ │ │ ├── ChainInvoker.java │ │ │ └── TargetAction.java │ │ ├── check/ │ │ │ ├── CheckErrorItem.java │ │ │ ├── CheckParam.java │ │ │ ├── CheckResult.java │ │ │ ├── FlowChecker.java │ │ │ └── impl/ │ │ │ ├── AllFlowNodeLinkChecker.java │ │ │ ├── ExpNodeActionDotCheckFlowParseListener.java │ │ │ ├── FlowNodeLinkCheckConfig.java │ │ │ ├── FlowNodeLinkCheckFlowParseListener.java │ │ │ ├── FlowNodeLinkChecker.java │ │ │ ├── InfiniteLoopCheckFlowParseListener.java │ │ │ └── SubFlowCheckFlowParseListener.java │ │ ├── funcall/ │ │ │ ├── FunCallConstants.java │ │ │ ├── FunCallEventListener.java │ │ │ ├── FunCallFlowPostHandler.java │ │ │ ├── FunCallFlowPreHandler.java │ │ │ └── FunCallNodeAction.java │ │ ├── interrupt/ │ │ │ ├── ExtInterruptNodeAction.java │ │ │ ├── ExtNodeThreadHolder.java │ │ │ ├── ExtNodeThreadInterruptFlowFilter.java │ │ │ ├── ExtNodeThreadInterruptHelper.java │ │ │ └── ExtNodeThreadInterruptNodeFilter.java │ │ ├── model/ │ │ │ └── action/ │ │ │ ├── JavaScriptNodeAction.java │ │ │ └── ShellNodeAction.java │ │ ├── serialize/ │ │ │ ├── FlowParamAssembleData.java │ │ │ ├── FlowParamAssembleManager.java │ │ │ ├── FlowParamAssembler.java │ │ │ ├── FlowParamSerializeManager.java │ │ │ ├── FlowParamSerializer.java │ │ │ └── impl/ │ │ │ ├── BaseFlowParamSerializer.java │ │ │ ├── DefaultFlowParamAssembler.java │ │ │ ├── JavaFlowParamSerializer.java │ │ │ └── JsonFlowParamSerializer.java │ │ ├── session/ │ │ │ ├── FlowSession.java │ │ │ ├── FlowSessionConstants.java │ │ │ ├── FlowSessionImpl.java │ │ │ └── SessionMultiCheckPreHandler.java │ │ └── timeout/ │ │ ├── TimeoutFlowFilter.java │ │ ├── TimeoutNodeActionFilter.java │ │ └── TimeoutTemplate.java │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── jd/ │ │ └── easyflow/ │ │ └── flow/ │ │ └── ext/ │ │ ├── FlowExtTestSuite.java │ │ ├── cases/ │ │ │ ├── chain/ │ │ │ │ ├── ChainTest.java │ │ │ │ ├── ChainTestService.java │ │ │ │ ├── Filter1.java │ │ │ │ ├── Filter2.java │ │ │ │ ├── Filter3.java │ │ │ │ ├── Plugin1.java │ │ │ │ ├── Plugin2.java │ │ │ │ └── Plugin3.java │ │ │ ├── check/ │ │ │ │ ├── FlowNodeLinkCheckTest.java │ │ │ │ └── InfiniteLoopCheckTest.java │ │ │ ├── funcall/ │ │ │ │ ├── FunCallTest.java │ │ │ │ └── MockActionClass.java │ │ │ ├── interrupt/ │ │ │ │ └── ExtInterruptTest.java │ │ │ ├── model/ │ │ │ │ └── action/ │ │ │ │ ├── JavaScriptNodeActionTest.java │ │ │ │ └── ShellNodeActionTest.java │ │ │ ├── session/ │ │ │ │ ├── MockRequestAsyncCall.java │ │ │ │ └── SessionFlowTest.java │ │ │ └── timeout/ │ │ │ ├── TestTimeoutNodeAction.java │ │ │ └── TimeoutFilterTest.java │ │ └── serialize/ │ │ └── impl/ │ │ └── JsonFlowParamSerializerTest.java │ └── resources/ │ └── flow/ │ └── cases/ │ ├── chain/ │ │ └── flow_chaintest2.json │ ├── check/ │ │ ├── check_infinite_loop_001.json │ │ ├── check_infinite_loop_002.json │ │ ├── check_infinite_loop_003.json │ │ ├── check_isolated_001.json │ │ ├── check_isolated_002.json │ │ ├── check_nonEnd_001.json │ │ ├── check_nonStart_001.json │ │ ├── check_notexists_001.json │ │ └── check_preCheckNodesNotExists_001.json │ ├── funcall/ │ │ ├── funcall_test_001.json │ │ └── funcall_test_002.json │ ├── interrupt/ │ │ └── ext_interrupt_001.json │ ├── model/ │ │ └── action/ │ │ ├── javascript_test_001.json │ │ └── shell_test_001.json │ ├── session/ │ │ └── flow_session_001.json │ └── timeout/ │ ├── flow_timeout_001.json │ └── flow_timeout_002.json ├── easyflow-fsm/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── jd/ │ │ └── easyflow/ │ │ └── fsm/ │ │ ├── CoreFsmManager.java │ │ ├── Fsm.java │ │ ├── FsmContext.java │ │ ├── FsmManager.java │ │ ├── FsmParam.java │ │ ├── FsmResult.java │ │ ├── builder/ │ │ │ ├── FsmBuilder.java │ │ │ └── FsmContextBuilder.java │ │ ├── el/ │ │ │ ├── ElEvaluator.java │ │ │ ├── ElFactory.java │ │ │ ├── ElRootMap.java │ │ │ └── SpelEvaluator.java │ │ ├── event/ │ │ │ ├── ExpFsmEventListener.java │ │ │ ├── FsmEvent.java │ │ │ ├── FsmEventListener.java │ │ │ └── FsmEventTrigger.java │ │ ├── exception/ │ │ │ └── FsmException.java │ │ ├── filter/ │ │ │ ├── ExpFilter.java │ │ │ ├── Filter.java │ │ │ └── FilterChain.java │ │ ├── listener/ │ │ │ └── FsmCommonListener.java │ │ ├── model/ │ │ │ ├── Event.java │ │ │ ├── FsmLifeCycle.java │ │ │ ├── FsmPostHandler.java │ │ │ ├── FsmPreHandler.java │ │ │ ├── InitContext.java │ │ │ ├── PostHandleResult.java │ │ │ ├── State.java │ │ │ ├── Transition.java │ │ │ ├── TransitionAction.java │ │ │ ├── TransitionContext.java │ │ │ ├── TransitionExecutor.java │ │ │ ├── TransitionPostHandler.java │ │ │ ├── TransitionPreHandler.java │ │ │ ├── builder/ │ │ │ │ └── TransitionBuilder.java │ │ │ ├── check/ │ │ │ │ ├── CheckErrorItem.java │ │ │ │ ├── CheckParam.java │ │ │ │ ├── CheckResult.java │ │ │ │ ├── FsmChecker.java │ │ │ │ └── impl/ │ │ │ │ ├── AllFsmStateLinkChecker.java │ │ │ │ ├── FsmStateLinkCheckConfig.java │ │ │ │ ├── FsmStateLinkCheckFsmParseListener.java │ │ │ │ └── FsmStateLinkChecker.java │ │ │ ├── definition/ │ │ │ │ └── DefConstants.java │ │ │ └── impl/ │ │ │ ├── EventImpl.java │ │ │ ├── StateImpl.java │ │ │ ├── TransitionImpl.java │ │ │ ├── action/ │ │ │ │ ├── ActionResultEl.java │ │ │ │ └── ExpTransitionAction.java │ │ │ ├── fsm/ │ │ │ │ ├── post/ │ │ │ │ │ └── ExpFsmPostHandler.java │ │ │ │ └── pre/ │ │ │ │ └── ExpFsmPreHandler.java │ │ │ ├── post/ │ │ │ │ ├── AbstractTransitionPostHandler.java │ │ │ │ ├── ConditionalTransitionPostHandler.java │ │ │ │ ├── ExpTransitionPostHandler.java │ │ │ │ ├── FixedTransitionPostHandler.java │ │ │ │ └── TransitionContextResultPostHandler.java │ │ │ └── pre/ │ │ │ └── ExpTransitionPreHandler.java │ │ ├── parser/ │ │ │ ├── FsmParser.java │ │ │ └── event/ │ │ │ ├── ExpFsmParseEventListener.java │ │ │ ├── FsmParseEvent.java │ │ │ ├── FsmParseEventListener.java │ │ │ └── FsmParseEventTypes.java │ │ └── util/ │ │ ├── FsmConstants.java │ │ ├── FsmEventTypes.java │ │ ├── FsmIOUtil.java │ │ ├── FsmStateLinkUtil.java │ │ ├── FsmStringUtil.java │ │ ├── FsmUtil.java │ │ ├── JsonFacade.java │ │ ├── JsonFacadeJacksonImpl.java │ │ ├── JsonUtil.java │ │ ├── Pair.java │ │ ├── TransitionUtil.java │ │ └── Triple.java │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── jd/ │ │ └── easyflow/ │ │ └── fsm/ │ │ ├── FsmTestSuite.java │ │ ├── cases/ │ │ │ ├── check/ │ │ │ │ └── FsmStateLinkCheckTest.java │ │ │ ├── event/ │ │ │ │ └── MultipleEventTest.java │ │ │ ├── filter/ │ │ │ │ ├── FsmFilterTest.java │ │ │ │ ├── PreHandlerPostConstructTestFilter.java │ │ │ │ ├── StateTransitionPreHandlerTestFilter.java │ │ │ │ ├── TransitionEmptyFilter.java │ │ │ │ └── TransitionPreHandlerTestFilter.java │ │ │ ├── fsmmanager/ │ │ │ │ ├── PocFsm.java │ │ │ │ ├── PocFsmManager.java │ │ │ │ └── PocTransition.java │ │ │ ├── mockbiz/ │ │ │ │ ├── CompanyAuthService.java │ │ │ │ ├── FsmMockBizTest.java │ │ │ │ └── WhitelistService.java │ │ │ ├── parser/ │ │ │ │ ├── FsmParserTest.java │ │ │ │ └── TestTransitionAction.java │ │ │ ├── post/ │ │ │ │ ├── PostTest.java │ │ │ │ └── TestPostManuallyTransitionPreHandlerFilter.java │ │ │ └── postevent/ │ │ │ └── PostEventTest.java │ │ └── quickstart/ │ │ ├── AStateE1EventTstAction.java │ │ └── FsmQuickStartTest.java │ └── resources/ │ ├── fsm/ │ │ ├── cases/ │ │ │ ├── check/ │ │ │ │ ├── check_isolated_001.json │ │ │ │ ├── check_nonEndNoNext_001.json │ │ │ │ ├── check_nonStartNoPrevious_001.json │ │ │ │ └── check_notExists_001.json │ │ │ ├── filter/ │ │ │ │ ├── tst_empty_filter_001.json │ │ │ │ ├── tst_prehandler_filter_001.json │ │ │ │ ├── tst_prehandler_filter_002.json │ │ │ │ └── tst_prehandler_filter_003.json │ │ │ ├── mockbiz/ │ │ │ │ └── fsm_mockbiz.json │ │ │ ├── multipleevent/ │ │ │ │ └── fsm_multipleevent.json │ │ │ ├── parser/ │ │ │ │ ├── fsm_parser_test.json │ │ │ │ └── fsm_parser_test_create_exp.json │ │ │ ├── post/ │ │ │ │ └── fsm_post_manually.json │ │ │ └── postevent/ │ │ │ └── fsm_postevent.json │ │ └── quickstart/ │ │ └── quickstart_001.json │ └── logback.xml ├── easyflow-process/ │ ├── easyflow-process-admin/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── jd/ │ │ │ └── easyflow/ │ │ │ ├── admin/ │ │ │ │ ├── form/ │ │ │ │ │ └── adapter/ │ │ │ │ │ └── page/ │ │ │ │ │ ├── FormTemplateAdminController.java │ │ │ │ │ └── converter/ │ │ │ │ │ └── PagerConverter.java │ │ │ │ ├── process/ │ │ │ │ │ └── adapter/ │ │ │ │ │ └── page/ │ │ │ │ │ ├── Bpmn2JsonController.java │ │ │ │ │ ├── ProcessDefinitionController.java │ │ │ │ │ ├── ProcessInstanceController.java │ │ │ │ │ ├── ProcessTaskController.java │ │ │ │ │ ├── converter/ │ │ │ │ │ │ ├── PagerConverter.java │ │ │ │ │ │ ├── ProcessDefinitionConverter.java │ │ │ │ │ │ ├── ProcessInstanceConverter.java │ │ │ │ │ │ └── ProcessTaskConverter.java │ │ │ │ │ ├── dto/ │ │ │ │ │ │ ├── CommonTaskExecuteDTO.java │ │ │ │ │ │ ├── CommonTaskProcessInstanceCreateDTO.java │ │ │ │ │ │ ├── ProcessDefDTO.java │ │ │ │ │ │ ├── ProcessInstanceInfoForPagerDTO.java │ │ │ │ │ │ └── ProcessTaskInfoForPagerDTO.java │ │ │ │ │ ├── extension/ │ │ │ │ │ │ └── UserGroupAdminExtension.java │ │ │ │ │ └── util/ │ │ │ │ │ ├── AdminProcessConstants.java │ │ │ │ │ └── ClientErrorCode.java │ │ │ │ └── processunit/ │ │ │ │ └── adapter/ │ │ │ │ └── page/ │ │ │ │ ├── ProcessUnitController.java │ │ │ │ └── converter/ │ │ │ │ └── PagerConverter.java │ │ │ └── common/ │ │ │ └── adapter/ │ │ │ └── page/ │ │ │ ├── BasePageController.java │ │ │ ├── WebResponse.java │ │ │ └── WebResponseCode.java │ │ └── resources/ │ │ ├── easyflow/ │ │ │ └── messages/ │ │ │ ├── easyflow-admin-framework.properties │ │ │ ├── easyflow-admin-framework_zh.properties │ │ │ ├── easyflow-form-admin.properties │ │ │ ├── easyflow-form-admin_zh.properties │ │ │ ├── easyflow-process-admin.properties │ │ │ ├── easyflow-process-admin_zh.properties │ │ │ ├── easyflow-processunit-admin.properties │ │ │ └── easyflow-processunit-admin_zh.properties │ │ ├── static/ │ │ │ ├── css/ │ │ │ │ ├── common.css │ │ │ │ └── frame.css │ │ │ ├── js/ │ │ │ │ ├── biz.js │ │ │ │ ├── common.js │ │ │ │ ├── messages_default.js │ │ │ │ └── messages_zh.js │ │ │ └── plugins/ │ │ │ ├── bootstrap-multiselect/ │ │ │ │ ├── css/ │ │ │ │ │ └── bootstrap-multiselect.css │ │ │ │ ├── js/ │ │ │ │ │ └── bootstrap-multiselect.js │ │ │ │ └── less/ │ │ │ │ └── bootstrap-multiselect.less │ │ │ ├── bootstrap-table/ │ │ │ │ ├── bootstrap-table-locale-all.js │ │ │ │ ├── bootstrap-table-locale-all.min.js │ │ │ │ ├── bootstrap-table.css │ │ │ │ ├── bootstrap-table.js │ │ │ │ ├── bootstrap-table.min.css │ │ │ │ └── bootstrap-table.min.js │ │ │ ├── bootstrap4/ │ │ │ │ ├── css/ │ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ │ ├── bootstrap-grid.css.map │ │ │ │ │ ├── bootstrap-grid.min.css │ │ │ │ │ ├── bootstrap-grid.min.css.map │ │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ │ ├── bootstrap-reboot.css.map │ │ │ │ │ ├── bootstrap-reboot.min.css │ │ │ │ │ ├── bootstrap-reboot.min.css.map │ │ │ │ │ ├── bootstrap.css │ │ │ │ │ ├── bootstrap.css.map │ │ │ │ │ ├── bootstrap.min.css │ │ │ │ │ └── bootstrap.min.css.map │ │ │ │ └── js/ │ │ │ │ ├── bootstrap.bundle.js │ │ │ │ ├── bootstrap.bundle.js.map │ │ │ │ ├── bootstrap.bundle.min.js │ │ │ │ ├── bootstrap.bundle.min.js.map │ │ │ │ ├── bootstrap.js │ │ │ │ ├── bootstrap.js.map │ │ │ │ ├── bootstrap.min.js │ │ │ │ └── bootstrap.min.js.map │ │ │ ├── bpmnjs/ │ │ │ │ ├── assets/ │ │ │ │ │ ├── bpmn-font/ │ │ │ │ │ │ └── css/ │ │ │ │ │ │ ├── bpmn-codes.css │ │ │ │ │ │ ├── bpmn-embedded.css │ │ │ │ │ │ └── bpmn.css │ │ │ │ │ ├── bpmn-js.css │ │ │ │ │ └── diagram-js.css │ │ │ │ ├── bpmn-modeler.development.js │ │ │ │ ├── bpmn-modeler.production.min.js │ │ │ │ ├── bpmn-navigated-viewer.development.js │ │ │ │ ├── bpmn-navigated-viewer.production.min.js │ │ │ │ ├── bpmn-viewer.development.js │ │ │ │ ├── bpmn-viewer.production.min.js │ │ │ │ └── changeForEasyflow/ │ │ │ │ ├── changelog.txt │ │ │ │ └── rollup.config.js │ │ │ ├── dataview/ │ │ │ │ ├── dataview-app.js │ │ │ │ ├── dataview-biz.js │ │ │ │ ├── dataview-config.js │ │ │ │ ├── dataview-demo.html │ │ │ │ ├── dataview.css │ │ │ │ └── dataview.js │ │ │ ├── flow/ │ │ │ │ ├── bpmn.js │ │ │ │ ├── flow.css │ │ │ │ └── flow.js │ │ │ ├── fontawesome/ │ │ │ │ └── css/ │ │ │ │ ├── all.css │ │ │ │ └── all.min.css │ │ │ ├── jquery/ │ │ │ │ ├── jquery-3.6.0.js │ │ │ │ ├── jquery-3.6.0.min.js │ │ │ │ └── jquery-3.6.0.min.map │ │ │ └── jquery-validation/ │ │ │ ├── custom.validate.js │ │ │ ├── jquery.validate.js │ │ │ ├── jquery.validate.min.js │ │ │ └── messages_zh.js │ │ └── templates/ │ │ ├── easyflow/ │ │ │ ├── formtemplate/ │ │ │ │ ├── formTemplateAdd.html │ │ │ │ ├── formTemplateDetail.html │ │ │ │ ├── formTemplateEdit.html │ │ │ │ └── formTemplateList.html │ │ │ ├── process/ │ │ │ │ ├── processdefinition/ │ │ │ │ │ ├── processDefinitionAdd.html │ │ │ │ │ ├── processDefinitionDetail.html │ │ │ │ │ ├── processDefinitionEdit.html │ │ │ │ │ ├── processDefinitionList.html │ │ │ │ │ └── processSelectFrame.html │ │ │ │ ├── processinstance/ │ │ │ │ │ ├── commonTaskProcessInstanceAdd.html │ │ │ │ │ ├── processInstanceCreate.html │ │ │ │ │ ├── processInstanceDetail.html │ │ │ │ │ └── processInstanceList.html │ │ │ │ └── processtask/ │ │ │ │ ├── commonProcessTaskDetail.html │ │ │ │ ├── commonProcessTaskExecute.html │ │ │ │ ├── commonProcessTaskPassReject.html │ │ │ │ └── processTaskList.html │ │ │ └── processunit/ │ │ │ ├── processUnitExecutionDetail.html │ │ │ ├── processUnitExecutionList.html │ │ │ ├── processUnitInstanceDetail.html │ │ │ └── processUnitInstanceList.html │ │ └── layout.html │ ├── easyflow-process-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── jd/ │ │ └── easyflow/ │ │ ├── codegenerator/ │ │ │ └── adapter/ │ │ │ └── export/ │ │ │ ├── CodeGenerateExport.java │ │ │ └── dto/ │ │ │ ├── BatchGenerateParam.java │ │ │ ├── BatchGenerateResult.java │ │ │ ├── GenerateParam.java │ │ │ └── GenerateResult.java │ │ ├── common/ │ │ │ ├── adapter/ │ │ │ │ ├── export/ │ │ │ │ │ ├── dto/ │ │ │ │ │ │ ├── ExportRequest.java │ │ │ │ │ │ ├── ExportResponse.java │ │ │ │ │ │ ├── ExportResponseCode.java │ │ │ │ │ │ └── pager/ │ │ │ │ │ │ ├── FieldEntry.java │ │ │ │ │ │ ├── PagerCondition.java │ │ │ │ │ │ ├── PagerConditionHelper.java │ │ │ │ │ │ ├── PagerResult.java │ │ │ │ │ │ └── SortEntry.java │ │ │ │ │ └── util/ │ │ │ │ │ └── ExportResponseUtil.java │ │ │ │ └── message/ │ │ │ │ └── BaseMessage.java │ │ │ └── client/ │ │ │ └── dto/ │ │ │ ├── ClientRequest.java │ │ │ ├── ClientResponse.java │ │ │ └── ClientResponseCode.java │ │ ├── form/ │ │ │ └── adapter/ │ │ │ └── export/ │ │ │ ├── FormTemplateExport.java │ │ │ └── dto/ │ │ │ └── FormTemplateDTO.java │ │ ├── process/ │ │ │ ├── adapter/ │ │ │ │ ├── export/ │ │ │ │ │ ├── ProcessDefinitionExport.java │ │ │ │ │ ├── ProcessInstanceExport.java │ │ │ │ │ ├── ProcessScheduleExport.java │ │ │ │ │ ├── ProcessTaskExport.java │ │ │ │ │ ├── ProcessToolExport.java │ │ │ │ │ ├── ProcessTransactionExport.java │ │ │ │ │ ├── constant/ │ │ │ │ │ │ ├── ProcessInstanceConstants.java │ │ │ │ │ │ ├── ProcessTaskConstants.java │ │ │ │ │ │ ├── ProcessTransactionConstants.java │ │ │ │ │ │ └── ShardingConstants.java │ │ │ │ │ ├── dto/ │ │ │ │ │ │ ├── definition/ │ │ │ │ │ │ │ ├── NodeDTO.java │ │ │ │ │ │ │ ├── ProcessDTO.java │ │ │ │ │ │ │ ├── ProcessDefinitionDTO.java │ │ │ │ │ │ │ ├── QueryNodeReq.java │ │ │ │ │ │ │ └── QueryProcessDefinitionReq.java │ │ │ │ │ │ ├── instance/ │ │ │ │ │ │ │ ├── CanCancelProcessInstanceReq.java │ │ │ │ │ │ │ ├── CanCancelProcessInstanceRes.java │ │ │ │ │ │ │ ├── CancelProcessInstanceReq.java │ │ │ │ │ │ │ ├── CancelProcessInstanceRes.java │ │ │ │ │ │ │ ├── CreateProcessInstanceReq.java │ │ │ │ │ │ │ ├── CreateProcessInstanceRes.java │ │ │ │ │ │ │ ├── LockProcessInstanceReq.java │ │ │ │ │ │ │ ├── PersistDTO.java │ │ │ │ │ │ │ ├── ProcessInstanceDTO.java │ │ │ │ │ │ │ ├── ProcessNodeExecutionDTO.java │ │ │ │ │ │ │ ├── ProcessNodeInstanceDTO.java │ │ │ │ │ │ │ ├── QueryOpenNodeInstanceReq.java │ │ │ │ │ │ │ ├── QueryProcessInstanceReq.java │ │ │ │ │ │ │ ├── QueryProcessNodeReqDTO.java │ │ │ │ │ │ │ ├── RollbackNodeReq.java │ │ │ │ │ │ │ ├── RollbackNodeRes.java │ │ │ │ │ │ │ ├── StdProcessContextDTO.java │ │ │ │ │ │ │ ├── StdProcessDTO.java │ │ │ │ │ │ │ └── UnlockProcessInstanceReq.java │ │ │ │ │ │ ├── schedule/ │ │ │ │ │ │ │ ├── ScheduleProcessReq.java │ │ │ │ │ │ │ └── ScheduleProcessRes.java │ │ │ │ │ │ ├── task/ │ │ │ │ │ │ │ ├── CanWithdrawTaskReq.java │ │ │ │ │ │ │ ├── CanWithdrawTaskRes.java │ │ │ │ │ │ │ ├── ExecuteTaskReq.java │ │ │ │ │ │ │ ├── ExecuteTaskRes.java │ │ │ │ │ │ │ ├── ProcessTaskAssignDTO.java │ │ │ │ │ │ │ ├── ProcessTaskDTO.java │ │ │ │ │ │ │ ├── ProcessTaskEventDTO.java │ │ │ │ │ │ │ ├── QueryTaskReq.java │ │ │ │ │ │ │ ├── TaskOperateCmd.java │ │ │ │ │ │ │ ├── TaskOperateCmdResult.java │ │ │ │ │ │ │ ├── TaskOperateCommand.java │ │ │ │ │ │ │ ├── TaskOperateCommandResult.java │ │ │ │ │ │ │ ├── TaskOperationsReq.java │ │ │ │ │ │ │ ├── TaskOperationsRes.java │ │ │ │ │ │ │ ├── WithdrawTaskReq.java │ │ │ │ │ │ │ ├── WithdrawTaskRes.java │ │ │ │ │ │ │ ├── cmd/ │ │ │ │ │ │ │ │ ├── TaskCreateCmd.java │ │ │ │ │ │ │ │ └── TaskExecuteCmd.java │ │ │ │ │ │ │ └── command/ │ │ │ │ │ │ │ ├── MultipleTaskCreateCommand.java │ │ │ │ │ │ │ ├── MultipleTaskCreateCommandResult.java │ │ │ │ │ │ │ ├── TaskCreateCommand.java │ │ │ │ │ │ │ ├── TaskCreateCommandResult.java │ │ │ │ │ │ │ ├── TaskExecuteCommand.java │ │ │ │ │ │ │ └── TaskExecuteCommandResult.java │ │ │ │ │ │ └── transaction/ │ │ │ │ │ │ ├── BatchObjectIdReq.java │ │ │ │ │ │ ├── BatchObjectIdRes.java │ │ │ │ │ │ ├── TxnCommand.java │ │ │ │ │ │ ├── TxnCommandResult.java │ │ │ │ │ │ ├── TxnReq.java │ │ │ │ │ │ ├── TxnRes.java │ │ │ │ │ │ └── command/ │ │ │ │ │ │ ├── BatchUpdateTxnCommand.java │ │ │ │ │ │ ├── BatchUpdateTxnCommandResult.java │ │ │ │ │ │ ├── InterruptTxnCommand.java │ │ │ │ │ │ └── InterruptTxnCommandResult.java │ │ │ │ │ └── enums/ │ │ │ │ │ └── ProcessExportResponseCode.java │ │ │ │ └── message/ │ │ │ │ ├── ProcessInstanceStatusMessage.java │ │ │ │ ├── ProcessNodeInstanceStatusMessage.java │ │ │ │ └── ProcessTaskStatusMessage.java │ │ │ └── spi/ │ │ │ └── client/ │ │ │ ├── ProcessScheduleClientService.java │ │ │ ├── ProcessTaskClientService.java │ │ │ ├── dto/ │ │ │ │ ├── ProcessExecuteReq.java │ │ │ │ ├── ProcessExecuteRes.java │ │ │ │ ├── ProcessTaskCallReq.java │ │ │ │ └── ProcessTaskCallRes.java │ │ │ └── enums/ │ │ │ └── ProcessClientResponseCode.java │ │ └── processunit/ │ │ ├── adapter/ │ │ │ └── export/ │ │ │ ├── ProcessUnitExport.java │ │ │ └── dto/ │ │ │ ├── ExecPolicyDTO.java │ │ │ ├── ProcessUnitCreateReq.java │ │ │ ├── ProcessUnitCreateRes.java │ │ │ ├── ProcessUnitDTO.java │ │ │ ├── ProcessUnitExecuteReq.java │ │ │ ├── ProcessUnitExecuteRes.java │ │ │ ├── ProcessUnitExecutionDTO.java │ │ │ ├── ProcessUnitExecutionQueryReq.java │ │ │ ├── ProcessUnitInstanceDTO.java │ │ │ ├── ProcessUnitInstanceQueryReq.java │ │ │ ├── ProcessUnitQueryReq.java │ │ │ ├── ProcessUnitUpdateReq.java │ │ │ ├── ProcessUnitUpdateRes.java │ │ │ ├── ShardingInfoDTO.java │ │ │ ├── ShardingInfoQueryReq.java │ │ │ ├── ShutdownReq.java │ │ │ ├── ShutdownRes.java │ │ │ ├── SyncAfterCallReq.java │ │ │ ├── SyncAfterCallRes.java │ │ │ ├── SyncBeforeCallReq.java │ │ │ └── SyncBeforeCallRes.java │ │ └── spi/ │ │ └── client/ │ │ ├── ProcessUnitClientService.java │ │ └── dto/ │ │ ├── AsyncCallRealReq.java │ │ └── AsyncCallRealRes.java │ ├── easyflow-process-client/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── jd/ │ │ │ └── easyflow/ │ │ │ ├── codegenerator/ │ │ │ │ └── client/ │ │ │ │ ├── CodeGenerateHelper.java │ │ │ │ └── CodeGenerateParam.java │ │ │ ├── process/ │ │ │ │ └── client/ │ │ │ │ ├── common/ │ │ │ │ │ └── PropertiesUtil.java │ │ │ │ ├── flow/ │ │ │ │ │ ├── StdFlowEngineImpl.java │ │ │ │ │ ├── StdFlowProcessConstants.java │ │ │ │ │ ├── StdProcessFlowEngineFilter.java │ │ │ │ │ ├── StdProcessFlowFilter.java │ │ │ │ │ ├── StdProcessFlowListener.java │ │ │ │ │ ├── StdProcessFlowNodeFilter.java │ │ │ │ │ ├── asyncnode/ │ │ │ │ │ │ ├── CreateAsyncProcessUnitNodeAction.java │ │ │ │ │ │ └── ExecuteAsyncProcessUnitNodeEl.java │ │ │ │ │ ├── compensate/ │ │ │ │ │ │ ├── StdProcessCompensateFlowFilter.java │ │ │ │ │ │ ├── StdProcessCompensateHelper.java │ │ │ │ │ │ └── StdProcessCompensateNodeFilter.java │ │ │ │ │ ├── eventinfo/ │ │ │ │ │ │ └── StdFlowProcessEventInfoListener.java │ │ │ │ │ ├── flowretry/ │ │ │ │ │ │ ├── FlowRetryEl.java │ │ │ │ │ │ └── FlowRetryFilter.java │ │ │ │ │ ├── noderetry/ │ │ │ │ │ │ └── NodeActionRetryFilter.java │ │ │ │ │ └── util/ │ │ │ │ │ ├── StdFlowEl.java │ │ │ │ │ └── StdProcessFlowUtil.java │ │ │ │ ├── fsm/ │ │ │ │ │ ├── StdFsmManager.java │ │ │ │ │ ├── StdFsmProcessConstants.java │ │ │ │ │ ├── StdProcessFsmFilter.java │ │ │ │ │ ├── StdProcessFsmListener.java │ │ │ │ │ ├── StdProcessFsmManagerFilter.java │ │ │ │ │ ├── StdProcessFsmTransitionFilter.java │ │ │ │ │ └── eventinfo/ │ │ │ │ │ └── StdFsmProcessEventInfoListener.java │ │ │ │ ├── runtime/ │ │ │ │ │ ├── CacheObject.java │ │ │ │ │ ├── ObjectIdManager.java │ │ │ │ │ ├── ProcessCache.java │ │ │ │ │ ├── ProcessConverter.java │ │ │ │ │ ├── ProcessInclusiveCheckHelper.java │ │ │ │ │ ├── ProcessRuntimeErrorCode.java │ │ │ │ │ ├── ProcessRuntimeManager.java │ │ │ │ │ ├── ProcessRuntimeService.java │ │ │ │ │ ├── StdNode.java │ │ │ │ │ ├── StdNodeContext.java │ │ │ │ │ ├── StdProcess.java │ │ │ │ │ ├── StdProcessConstants.java │ │ │ │ │ ├── StdProcessContext.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── Node.java │ │ │ │ │ │ ├── NodeContext.java │ │ │ │ │ │ ├── Process.java │ │ │ │ │ │ ├── ProcessContext.java │ │ │ │ │ │ ├── ProcessEngine.java │ │ │ │ │ │ ├── ProcessEngineImpl.java │ │ │ │ │ │ ├── ProcessException.java │ │ │ │ │ │ ├── ProcessParam.java │ │ │ │ │ │ └── ProcessResult.java │ │ │ │ │ └── eventinfo/ │ │ │ │ │ ├── NodeInstanceEventInfo.java │ │ │ │ │ ├── ProcessEventInfoCache.java │ │ │ │ │ ├── ProcessEventInfoListener.java │ │ │ │ │ └── ProcessInstanceEventInfo.java │ │ │ │ ├── schedule/ │ │ │ │ │ └── ProcessScheduleClientServiceImpl.java │ │ │ │ ├── task/ │ │ │ │ │ ├── TaskConstants.java │ │ │ │ │ ├── TaskErrorCode.java │ │ │ │ │ ├── biz/ │ │ │ │ │ │ ├── TaskBizService.java │ │ │ │ │ │ ├── dto/ │ │ │ │ │ │ │ ├── TaskBizParam.java │ │ │ │ │ │ │ └── TaskBizResult.java │ │ │ │ │ │ └── impl/ │ │ │ │ │ │ ├── CallTaskBizService.java │ │ │ │ │ │ ├── FlowTaskBizService.java │ │ │ │ │ │ ├── RuleAndCallTaskBizService.java │ │ │ │ │ │ └── RuleTaskBizService.java │ │ │ │ │ ├── flow/ │ │ │ │ │ │ ├── BaseTaskNodeAction.java │ │ │ │ │ │ ├── TaskCreateAndExecuteNodeAction.java │ │ │ │ │ │ ├── TaskCreateNodeAction.java │ │ │ │ │ │ ├── TaskExecuteNodeAction.java │ │ │ │ │ │ └── TaskFlowListener.java │ │ │ │ │ ├── service/ │ │ │ │ │ │ ├── TaskClientManager.java │ │ │ │ │ │ ├── TaskClientOperation.java │ │ │ │ │ │ ├── TaskClientService.java │ │ │ │ │ │ ├── dto/ │ │ │ │ │ │ │ ├── TaskCreateParam.java │ │ │ │ │ │ │ └── TaskExecuteParam.java │ │ │ │ │ │ └── operation/ │ │ │ │ │ │ ├── BaseTaskOperation.java │ │ │ │ │ │ ├── ExecuteTaskOperation.java │ │ │ │ │ │ └── SaveTaskOperation.java │ │ │ │ │ └── util/ │ │ │ │ │ └── TaskEl.java │ │ │ │ └── util/ │ │ │ │ ├── ElUtil.java │ │ │ │ ├── ExportRequestBuilder.java │ │ │ │ ├── Pair.java │ │ │ │ ├── ProcessConstants.java │ │ │ │ ├── ProcessUtil.java │ │ │ │ └── StdProcessUtil.java │ │ │ └── processunit/ │ │ │ └── client/ │ │ │ ├── ProcessUnitClient.java │ │ │ ├── ProcessUnitHelper.java │ │ │ ├── bean/ │ │ │ │ ├── ExecContext.java │ │ │ │ ├── ExecParam.java │ │ │ │ ├── ExecPolicy.java │ │ │ │ ├── ExecResult.java │ │ │ │ ├── ProcessUnit.java │ │ │ │ ├── ProcessUnitCreateAndExecuteReq.java │ │ │ │ ├── ProcessUnitCreateAndExecuteRes.java │ │ │ │ ├── ProcessUnitExecution.java │ │ │ │ └── ProcessUnitInstance.java │ │ │ ├── converter/ │ │ │ │ └── ProcessUnitConverter.java │ │ │ ├── gateway/ │ │ │ │ └── ProcessUnitServerGateway.java │ │ │ ├── message/ │ │ │ │ └── ProcessUnitClientServiceMessageListener.java │ │ │ ├── service/ │ │ │ │ ├── ProcessUnitExecutor.java │ │ │ │ └── impl/ │ │ │ │ ├── AsyncClientProcessUnitExecutor.java │ │ │ │ ├── BaseProcessUnitExecutor.java │ │ │ │ ├── ProcessUnitClientAsyncExecuteSpel.java │ │ │ │ ├── ProcessUnitClientServiceImpl.java │ │ │ │ └── SyncClientProcessUnitExecutor.java │ │ │ └── util/ │ │ │ └── ProcessUnitConstants.java │ │ └── resources/ │ │ └── easyflow/ │ │ ├── easyflow-spring-process-client-processunit.xml │ │ ├── easyflow-spring-process-client.xml │ │ └── easyflow-spring-processunit-client.xml │ ├── easyflow-process-common/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── jd/ │ │ │ └── easyflow/ │ │ │ ├── common/ │ │ │ │ ├── dto/ │ │ │ │ │ ├── BaseRequest.java │ │ │ │ │ ├── BaseResponse.java │ │ │ │ │ ├── DataRequest.java │ │ │ │ │ ├── DataResponse.java │ │ │ │ │ └── pager/ │ │ │ │ │ ├── FieldEntry.java │ │ │ │ │ ├── PagerCondition.java │ │ │ │ │ ├── PagerConditionHelper.java │ │ │ │ │ ├── PagerResult.java │ │ │ │ │ └── SortEntry.java │ │ │ │ ├── exception/ │ │ │ │ │ ├── EasyFlowException.java │ │ │ │ │ ├── UserException.java │ │ │ │ │ └── util/ │ │ │ │ │ └── ExceptionUtil.java │ │ │ │ └── util/ │ │ │ │ ├── AssertUtils.java │ │ │ │ ├── CommonErrorCode.java │ │ │ │ ├── IAssertUtils.java │ │ │ │ ├── MessageUtil.java │ │ │ │ └── UUIDUtil.java │ │ │ ├── el/ │ │ │ │ ├── ElEvaluator.java │ │ │ │ ├── ElFactory.java │ │ │ │ └── SpelEvaluator.java │ │ │ ├── message/ │ │ │ │ ├── BaseMessageListener.java │ │ │ │ ├── Message.java │ │ │ │ ├── MessageListener.java │ │ │ │ ├── MessageSendService.java │ │ │ │ ├── impl/ │ │ │ │ │ └── NoopMessageSendServiceImpl.java │ │ │ │ ├── spring/ │ │ │ │ │ ├── EventMessage.java │ │ │ │ │ ├── EventMessageListener.java │ │ │ │ │ └── SpringMessageSendServiceImpl.java │ │ │ │ └── util/ │ │ │ │ └── MsgBizIdWrapper.java │ │ │ ├── net/ │ │ │ │ └── NetUtils.java │ │ │ ├── objects/ │ │ │ │ └── factory/ │ │ │ │ ├── DefaultObjectFactory.java │ │ │ │ ├── ObjectFactory.java │ │ │ │ ├── ObjectFactorys.java │ │ │ │ ├── ObjectProvider.java │ │ │ │ └── spring/ │ │ │ │ └── SpringObjectProvider.java │ │ │ ├── properties/ │ │ │ │ ├── PropertiesAccessor.java │ │ │ │ ├── PropertyUtil.java │ │ │ │ ├── classpath/ │ │ │ │ │ └── ClassPathPropertiesAccessor.java │ │ │ │ └── spring/ │ │ │ │ ├── SpringEnvPropertiesAccessor.java │ │ │ │ └── SpringPropertySourcesPropertiesAccessor.java │ │ │ ├── spel/ │ │ │ │ └── SpelHelper.java │ │ │ └── utils/ │ │ │ └── json/ │ │ │ ├── JSON.java │ │ │ ├── JsonFacade.java │ │ │ ├── JsonFacadeJacksonImpl.java │ │ │ └── JsonSerializeConfig.java │ │ └── resources/ │ │ └── easyflow/ │ │ └── easyflow-spring-message-spring.xml │ ├── easyflow-process-sample/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── jd/ │ │ │ └── easyflow/ │ │ │ └── integration/ │ │ │ ├── all/ │ │ │ │ └── admin/ │ │ │ │ ├── IndexController.java │ │ │ │ ├── filter/ │ │ │ │ │ ├── JakartaSampleAuthFilter.java │ │ │ │ │ └── SampleAuthFilter.java │ │ │ │ ├── process/ │ │ │ │ │ └── SampleUserGroupAdminExtensionImpl.java │ │ │ │ └── sample/ │ │ │ │ └── SampleUserHolder.java │ │ │ └── open/ │ │ │ └── IntegrationOpenApplication.java │ │ ├── resources/ │ │ │ ├── application-open-all.yml │ │ │ ├── config/ │ │ │ │ └── sampleUserGroup.json │ │ │ ├── flow/ │ │ │ │ ├── client/ │ │ │ │ │ └── flow_empty.json │ │ │ │ └── server/ │ │ │ │ ├── flow_task_001.bpmn │ │ │ │ └── flow_task_001.json │ │ │ ├── fsm/ │ │ │ │ └── client/ │ │ │ │ └── fsm_empty.json │ │ │ ├── logback.xml │ │ │ └── spring/ │ │ │ └── open/ │ │ │ ├── easyflow-spring-open-all.xml │ │ │ ├── spring-datasource-sharding.xml │ │ │ └── spring-datasource.xml │ │ └── script/ │ │ └── sql/ │ │ ├── create_all_table.sql │ │ ├── drop_all_table.sql │ │ ├── sample_form_template.sql │ │ ├── sample_form_template_zh_CN.sql │ │ └── sample_sharding.sql │ ├── easyflow-process-server/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── jd/ │ │ │ │ └── easyflow/ │ │ │ │ ├── action/ │ │ │ │ │ ├── Action.java │ │ │ │ │ ├── ActionAspect.java │ │ │ │ │ ├── ActionConstants.java │ │ │ │ │ ├── ActionInfo.java │ │ │ │ │ └── SimpleExportAopFunction.java │ │ │ │ ├── alert/ │ │ │ │ │ ├── AlertClient.java │ │ │ │ │ ├── AlertParam.java │ │ │ │ │ ├── AlertUtil.java │ │ │ │ │ └── LogAlertClient.java │ │ │ │ ├── cache/ │ │ │ │ │ ├── CacheService.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── LocalCacheServiceImpl.java │ │ │ │ │ ├── NoopCacheServiceImpl.java │ │ │ │ │ └── UnsupportedCacheServiceImpl.java │ │ │ │ ├── codegenerator/ │ │ │ │ │ ├── adapter/ │ │ │ │ │ │ └── export/ │ │ │ │ │ │ └── CodeGenerateExportImpl.java │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ │ └── CodeGeneratorConstants.java │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ ├── entity/ │ │ │ │ │ │ │ │ └── SequenceEntity.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ └── CodeGenerateReq.java │ │ │ │ │ │ ├── repository/ │ │ │ │ │ │ │ └── SequenceRepository.java │ │ │ │ │ │ └── service/ │ │ │ │ │ │ ├── CodeGenerateDomainService.java │ │ │ │ │ │ └── CodeGenerator.java │ │ │ │ │ └── infrastructure/ │ │ │ │ │ ├── converter/ │ │ │ │ │ │ └── SequenceConverter.java │ │ │ │ │ ├── persistence/ │ │ │ │ │ │ ├── mapper/ │ │ │ │ │ │ │ └── SequenceMapper.java │ │ │ │ │ │ └── po/ │ │ │ │ │ │ └── Sequence.java │ │ │ │ │ └── repository/ │ │ │ │ │ └── SequenceRepositoryImpl.java │ │ │ │ ├── common/ │ │ │ │ │ └── app/ │ │ │ │ │ ├── AppResponseTransformer.java │ │ │ │ │ └── dto/ │ │ │ │ │ ├── AppRequest.java │ │ │ │ │ └── AppResponse.java │ │ │ │ ├── form/ │ │ │ │ │ ├── adapter/ │ │ │ │ │ │ └── export/ │ │ │ │ │ │ ├── FormTemplateExportImpl.java │ │ │ │ │ │ └── converter/ │ │ │ │ │ │ ├── FormTemplateConverter.java │ │ │ │ │ │ └── PagerConverter.java │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ └── entity/ │ │ │ │ │ │ │ └── FormTemplateEntity.java │ │ │ │ │ │ ├── repository/ │ │ │ │ │ │ │ └── FormTemplateRepository.java │ │ │ │ │ │ └── service/ │ │ │ │ │ │ └── FormTemplateDomainService.java │ │ │ │ │ └── infrastructure/ │ │ │ │ │ ├── converter/ │ │ │ │ │ │ └── FormTemplateConverter.java │ │ │ │ │ ├── persistence/ │ │ │ │ │ │ ├── mapper/ │ │ │ │ │ │ │ └── FormTemplateMapper.java │ │ │ │ │ │ └── po/ │ │ │ │ │ │ └── FormTemplate.java │ │ │ │ │ └── repository/ │ │ │ │ │ └── FormTemplateRepositoryImpl.java │ │ │ │ ├── lock/ │ │ │ │ │ ├── LockService.java │ │ │ │ │ ├── LockUtil.java │ │ │ │ │ ├── Locker.java │ │ │ │ │ ├── db/ │ │ │ │ │ │ └── DbLockService.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── BaseLockService.java │ │ │ │ │ ├── LockerImpl.java │ │ │ │ │ └── NoopLocker.java │ │ │ │ ├── process/ │ │ │ │ │ ├── adapter/ │ │ │ │ │ │ └── export/ │ │ │ │ │ │ ├── ProcessDefinitionExportImpl.java │ │ │ │ │ │ ├── ProcessInstanceExportImpl.java │ │ │ │ │ │ ├── ProcessScheduleExportImpl.java │ │ │ │ │ │ ├── ProcessTaskExportImpl.java │ │ │ │ │ │ ├── ProcessToolExportImpl.java │ │ │ │ │ │ ├── ProcessTransactionExportImpl.java │ │ │ │ │ │ ├── converter/ │ │ │ │ │ │ │ ├── PagerConverter.java │ │ │ │ │ │ │ ├── ProcessDefinitionConverter.java │ │ │ │ │ │ │ ├── ProcessInstanceConverter.java │ │ │ │ │ │ │ ├── ProcessScheduleConverter.java │ │ │ │ │ │ │ ├── ProcessTaskConverter.java │ │ │ │ │ │ │ └── ProcessToolConverter.java │ │ │ │ │ │ └── sharding/ │ │ │ │ │ │ ├── ProcessInstanceExportShardingImpl.java │ │ │ │ │ │ ├── ProcessTaskExportShardingImpl.java │ │ │ │ │ │ ├── ProcessToolExportShardingImpl.java │ │ │ │ │ │ └── ProcessTransactionExportShardingImpl.java │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ │ ├── ProcessConstants.java │ │ │ │ │ │ │ ├── ProcessDefinitionConstants.java │ │ │ │ │ │ │ ├── ProcessTaskConstants.java │ │ │ │ │ │ │ └── StdProcessConstants.java │ │ │ │ │ │ ├── converter/ │ │ │ │ │ │ │ ├── ProcessInstanceDomainConverter.java │ │ │ │ │ │ │ └── ProcessTaskDomainConverter.java │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ ├── entity/ │ │ │ │ │ │ │ │ ├── ProcessDefinitionEntity.java │ │ │ │ │ │ │ │ ├── ProcessInstanceEntity.java │ │ │ │ │ │ │ │ ├── ProcessNodeExecutionEntity.java │ │ │ │ │ │ │ │ ├── ProcessNodeInstanceEntity.java │ │ │ │ │ │ │ │ ├── ProcessTaskAssignEntity.java │ │ │ │ │ │ │ │ ├── ProcessTaskEntity.java │ │ │ │ │ │ │ │ └── ProcessTaskEventEntity.java │ │ │ │ │ │ │ ├── enums/ │ │ │ │ │ │ │ │ └── ProcessResponseCode.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── CreateProcessInstanceReqVO.java │ │ │ │ │ │ │ ├── CreateProcessInstanceResVO.java │ │ │ │ │ │ │ ├── CreateProcessTaskVO.java │ │ │ │ │ │ │ ├── DoExecuteProcessTaskReqVO.java │ │ │ │ │ │ │ ├── ExecuteProcessTaskReqVO.java │ │ │ │ │ │ │ ├── ProcessDefinitionForListVO.java │ │ │ │ │ │ │ ├── QueryProcessNodeReq.java │ │ │ │ │ │ │ ├── QueryTaskAssignReqVO.java │ │ │ │ │ │ │ ├── QueryTaskEventReqVO.java │ │ │ │ │ │ │ ├── QueryTaskReqVO.java │ │ │ │ │ │ │ ├── RollbackNodeReqVO.java │ │ │ │ │ │ │ ├── ScheduleProcessReqVO.java │ │ │ │ │ │ │ ├── ScheduleProcessResVO.java │ │ │ │ │ │ │ └── TaskInfoForPagerVO.java │ │ │ │ │ │ ├── repository/ │ │ │ │ │ │ │ ├── ProcessRepository.java │ │ │ │ │ │ │ └── ProcessTaskRepository.java │ │ │ │ │ │ └── service/ │ │ │ │ │ │ ├── ProcessDefinitionDomainService.java │ │ │ │ │ │ ├── ProcessInstanceDomainService.java │ │ │ │ │ │ ├── ProcessScheduleDomainService.java │ │ │ │ │ │ ├── ProcessScheduleInvoker.java │ │ │ │ │ │ ├── ProcessTaskDomainService.java │ │ │ │ │ │ ├── ProcessToolDomainService.java │ │ │ │ │ │ ├── TaskOperateDomainService.java │ │ │ │ │ │ └── impl/ │ │ │ │ │ │ └── ProcessScheduleSpiInvoker.java │ │ │ │ │ └── infrastructure/ │ │ │ │ │ ├── converter/ │ │ │ │ │ │ ├── ProcessConverter.java │ │ │ │ │ │ └── ProcessTaskConverter.java │ │ │ │ │ ├── persistence/ │ │ │ │ │ │ ├── mapper/ │ │ │ │ │ │ │ ├── ProcessDefinitionMapper.java │ │ │ │ │ │ │ ├── ProcessInstanceMapper.java │ │ │ │ │ │ │ ├── ProcessNodeExecutionMapper.java │ │ │ │ │ │ │ ├── ProcessNodeInstanceMapper.java │ │ │ │ │ │ │ ├── ProcessTaskAssignMapper.java │ │ │ │ │ │ │ ├── ProcessTaskEventMapper.java │ │ │ │ │ │ │ └── ProcessTaskMapper.java │ │ │ │ │ │ └── po/ │ │ │ │ │ │ ├── ProcessDefinition.java │ │ │ │ │ │ ├── ProcessInstance.java │ │ │ │ │ │ ├── ProcessNodeExecution.java │ │ │ │ │ │ ├── ProcessNodeInstance.java │ │ │ │ │ │ ├── ProcessTask.java │ │ │ │ │ │ ├── ProcessTaskAssign.java │ │ │ │ │ │ └── ProcessTaskEvent.java │ │ │ │ │ ├── repository/ │ │ │ │ │ │ ├── ProcessRepositoryImpl.java │ │ │ │ │ │ └── ProcessTaskRepositoryImpl.java │ │ │ │ │ └── sharding/ │ │ │ │ │ └── ProcessShardingDataQuerier.java │ │ │ │ ├── processunit/ │ │ │ │ │ ├── adapter/ │ │ │ │ │ │ ├── export/ │ │ │ │ │ │ │ ├── ProcessUnitExportImpl.java │ │ │ │ │ │ │ └── converter/ │ │ │ │ │ │ │ ├── PagerConverter.java │ │ │ │ │ │ │ └── ProcessUnitConverter.java │ │ │ │ │ │ ├── message/ │ │ │ │ │ │ │ ├── ProcessUnitCreateMessageListener.java │ │ │ │ │ │ │ ├── ProcessUnitExecuteMessageListener.java │ │ │ │ │ │ │ └── ProcessUnitUpdateMessageListener.java │ │ │ │ │ │ └── task/ │ │ │ │ │ │ ├── ProcessUnitAutoRunFlagUpdateTask.java │ │ │ │ │ │ ├── ProcessUnitAutoRunTask.java │ │ │ │ │ │ ├── ProcessUnitShardingCompareTask.java │ │ │ │ │ │ └── ProcessUnitShardingMigrateTask.java │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ │ ├── ContextDataKeys.java │ │ │ │ │ │ │ └── ProcessUnitConstants.java │ │ │ │ │ │ ├── gateway/ │ │ │ │ │ │ │ └── ProcessUnitClientGateway.java │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ ├── converter/ │ │ │ │ │ │ │ │ └── ProcessUnitExecuteConverter.java │ │ │ │ │ │ │ ├── entity/ │ │ │ │ │ │ │ │ ├── ProcessUnitEntity.java │ │ │ │ │ │ │ │ ├── ProcessUnitExecutionEntity.java │ │ │ │ │ │ │ │ └── ProcessUnitInstanceEntity.java │ │ │ │ │ │ │ ├── enums/ │ │ │ │ │ │ │ │ └── ProcessUnitErrorCodeEnum.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── BatchExecuteReq.java │ │ │ │ │ │ │ ├── BatchExecuteRes.java │ │ │ │ │ │ │ ├── ExecContext.java │ │ │ │ │ │ │ ├── ExecParam.java │ │ │ │ │ │ │ ├── ExecPolicy.java │ │ │ │ │ │ │ ├── ExecResult.java │ │ │ │ │ │ │ ├── ExecuteReq.java │ │ │ │ │ │ │ ├── ExecuteRes.java │ │ │ │ │ │ │ ├── ProcessUnitExecuteMessage.java │ │ │ │ │ │ │ ├── ProcessUnitInstanceKey.java │ │ │ │ │ │ │ ├── QueryAsyncInstanceVO.java │ │ │ │ │ │ │ ├── ShardingCompareContext.java │ │ │ │ │ │ │ ├── ShardingMigrateContext.java │ │ │ │ │ │ │ ├── SyncAfterCallReq.java │ │ │ │ │ │ │ ├── SyncAfterCallRes.java │ │ │ │ │ │ │ ├── SyncBeforeCallReq.java │ │ │ │ │ │ │ └── SyncBeforeCallRes.java │ │ │ │ │ │ ├── repository/ │ │ │ │ │ │ │ └── ProcessUnitRepository.java │ │ │ │ │ │ ├── service/ │ │ │ │ │ │ │ ├── ProcessUnitExecutionPersistHandler.java │ │ │ │ │ │ │ ├── ProcessUnitExecutor.java │ │ │ │ │ │ │ ├── ProcessUnitService.java │ │ │ │ │ │ │ ├── ProcessUnitShardingToolService.java │ │ │ │ │ │ │ └── impl/ │ │ │ │ │ │ │ ├── AsyncServerProcessUnitExecutor.java │ │ │ │ │ │ │ ├── BaseProcessUnitExecutor.java │ │ │ │ │ │ │ ├── SyncServerProcessUnitExecutor.java │ │ │ │ │ │ │ └── execution/ │ │ │ │ │ │ │ ├── DummyPersistHandler.java │ │ │ │ │ │ │ ├── ExecutionPersister.java │ │ │ │ │ │ │ ├── SyncPersistHandler.java │ │ │ │ │ │ │ └── ThreadPoolAsyncPersistHandler.java │ │ │ │ │ │ └── support/ │ │ │ │ │ │ ├── LockManager.java │ │ │ │ │ │ └── PuTransactionTemplate.java │ │ │ │ │ └── infrastructure/ │ │ │ │ │ ├── converter/ │ │ │ │ │ │ └── ProcessUnitConverter.java │ │ │ │ │ ├── gateway/ │ │ │ │ │ │ ├── ProcessUnitClientGatewayImpl.java │ │ │ │ │ │ └── ProcessUnitClientServiceMessageImpl.java │ │ │ │ │ ├── persistence/ │ │ │ │ │ │ ├── mapper/ │ │ │ │ │ │ │ ├── ProcessUnitExecutionMapper.java │ │ │ │ │ │ │ └── ProcessUnitInstanceMapper.java │ │ │ │ │ │ └── po/ │ │ │ │ │ │ ├── ProcessUnitExecution.java │ │ │ │ │ │ └── ProcessUnitInstance.java │ │ │ │ │ └── repository/ │ │ │ │ │ ├── ProcessUnitConfigCache.java │ │ │ │ │ ├── ProcessUnitConfigFileCache.java │ │ │ │ │ └── ProcessUnitRepositoryImpl.java │ │ │ │ └── sharding/ │ │ │ │ ├── CurrentShardInfo.java │ │ │ │ ├── ShardingHolder.java │ │ │ │ ├── config/ │ │ │ │ │ ├── DataSourceInfo.java │ │ │ │ │ ├── ShardGroupInfo.java │ │ │ │ │ ├── ShardInfo.java │ │ │ │ │ ├── ShardingConfig.java │ │ │ │ │ ├── ShardingConfigManager.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── ShardingConfigManagerFileImpl.java │ │ │ │ │ └── ShardingConfigManagerImpl.java │ │ │ │ ├── datasource/ │ │ │ │ │ ├── DataSourceFactory.java │ │ │ │ │ ├── ShardingDataSource.java │ │ │ │ │ └── impl/ │ │ │ │ │ └── HikariDataSourceFactory.java │ │ │ │ ├── mybatis/ │ │ │ │ │ ├── ShardingNotSupportedMapper.java │ │ │ │ │ └── ShardingSupportedMapper.java │ │ │ │ ├── service/ │ │ │ │ │ ├── ExportRequestShardComputer.java │ │ │ │ │ ├── ShardingComputeResult.java │ │ │ │ │ ├── ShardingData.java │ │ │ │ │ ├── ShardingDataQueryer.java │ │ │ │ │ ├── ShardingService.java │ │ │ │ │ └── impl/ │ │ │ │ │ └── ShardingServiceImpl.java │ │ │ │ └── transaction/ │ │ │ │ └── ShardingSpringManagedTransactionFactory.java │ │ │ └── resources/ │ │ │ └── easyflow/ │ │ │ ├── easyflow-spring-codegenerator-server.xml │ │ │ ├── easyflow-spring-form-server.xml │ │ │ ├── easyflow-spring-lock-db.xml │ │ │ ├── easyflow-spring-process-server-sharding.xml │ │ │ ├── easyflow-spring-process-server.xml │ │ │ ├── easyflow-spring-processunit-server-sharding.xml │ │ │ ├── easyflow-spring-processunit-server.xml │ │ │ ├── mapper/ │ │ │ │ ├── FormTemplateMapper.xml │ │ │ │ ├── ProcessDefinitionMapper.xml │ │ │ │ ├── ProcessInstanceMapper.xml │ │ │ │ ├── ProcessNodeExecutionMapper.xml │ │ │ │ ├── ProcessNodeInstanceMapper.xml │ │ │ │ ├── ProcessTaskAssignMapper.xml │ │ │ │ ├── ProcessTaskEventMapper.xml │ │ │ │ ├── ProcessTaskMapper.xml │ │ │ │ ├── ProcessUnitExecutionMapper.xml │ │ │ │ ├── ProcessUnitInstanceMapper.xml │ │ │ │ └── SequenceMapper.xml │ │ │ ├── messages/ │ │ │ │ ├── easyflow-process-server.properties │ │ │ │ └── easyflow-process-server_zh.properties │ │ │ └── shardingmapper/ │ │ │ ├── ProcessInstanceMapper.xml │ │ │ ├── ProcessNodeExecutionMapper.xml │ │ │ ├── ProcessNodeInstanceMapper.xml │ │ │ ├── ProcessTaskAssignMapper.xml │ │ │ ├── ProcessTaskEventMapper.xml │ │ │ ├── ProcessTaskMapper.xml │ │ │ ├── ProcessUnitExecutionMapper.xml │ │ │ └── ProcessUnitInstanceMapper.xml │ │ └── script/ │ │ ├── codegenerator-latest.sql │ │ ├── form-latest.sql │ │ ├── lock-latest.sql │ │ ├── process-latest.sql │ │ └── process-latest_zh.sql │ └── pom.xml └── pom.xml
Showing preview only (1,260K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (14062 symbols across 929 files)
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/BpmnFlowParser.java
class BpmnFlowParser (line 24) | public class BpmnFlowParser extends FlowParserImpl {
method BpmnFlowParser (line 38) | public BpmnFlowParser() {
method init (line 42) | public void init() {
method parse (line 62) | @Override
method bpmnStringify (line 85) | public static String bpmnStringify(Flow flow) {
method getFlowPrettyConfigPath (line 92) | public String getFlowPrettyConfigPath() {
method setFlowPrettyConfigPath (line 96) | public void setFlowPrettyConfigPath(String flowPrettyConfigPath) {
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/BaseFlowNodeConverter.java
class BaseFlowNodeConverter (line 30) | public class BaseFlowNodeConverter implements FlowNodeConverter {
method convert (line 39) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/BpmnConverter.java
class BpmnConverter (line 91) | public class BpmnConverter {
method convert (line 143) | public static String convert(String bpmnXmlData) {
method convert (line 153) | public static String convert(String bpmnXmlData, Map<String, Object> f...
method convert (line 173) | public static List<Map<String, Object>> convert(InputStream inputStrea...
method convertProcess (line 204) | private static void convertProcess(Process process, BpmnModel bpmnMode...
method processBoundaryEvent (line 355) | private static void processBoundaryEvent(List<BoundaryEvent> boundaryE...
method getNodeDef (line 394) | private static Map<String, Object> getNodeDef(String nodeId, Map<Strin...
method getFlowNodeConverterMap (line 407) | public static Map<Class, FlowNodeConverter> getFlowNodeConverterMap() {
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/FlowNodeConverter.java
type FlowNodeConverter (line 13) | public interface FlowNodeConverter {
method convert (line 22) | Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Ma...
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/AdhocSubProcessConverter.java
class AdhocSubProcessConverter (line 12) | public class AdhocSubProcessConverter extends SubProcessConverter {
method convert (line 14) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/BusinessRuleTaskConverter.java
class BusinessRuleTaskConverter (line 14) | public class BusinessRuleTaskConverter extends BaseFlowNodeConverter {
method convert (line 16) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/CallActivityConverter.java
class CallActivityConverter (line 20) | public class CallActivityConverter extends BaseFlowNodeConverter {
method convert (line 22) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/EventSubProcessConverter.java
class EventSubProcessConverter (line 12) | public class EventSubProcessConverter extends SubProcessConverter {
method convert (line 14) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ManualTaskConverter.java
class ManualTaskConverter (line 14) | public class ManualTaskConverter extends BaseFlowNodeConverter {
method convert (line 16) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ReceiveTaskConverter.java
class ReceiveTaskConverter (line 19) | public class ReceiveTaskConverter extends BaseFlowNodeConverter {
method convert (line 21) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ScriptTaskConverter.java
class ScriptTaskConverter (line 21) | public class ScriptTaskConverter extends BaseFlowNodeConverter {
method convert (line 26) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/SendTaskConverter.java
class SendTaskConverter (line 14) | public class SendTaskConverter extends BaseFlowNodeConverter {
method convert (line 16) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ServiceTaskConverter.java
class ServiceTaskConverter (line 14) | public class ServiceTaskConverter extends BaseFlowNodeConverter {
method convert (line 16) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/SubProcessConverter.java
class SubProcessConverter (line 32) | public class SubProcessConverter extends BaseFlowNodeConverter {
method convert (line 37) | @Override
method convertSubProcess (line 74) | private static void convertSubProcess(SubProcess process, BpmnModel bp...
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/TaskConverter.java
class TaskConverter (line 14) | public class TaskConverter extends BaseFlowNodeConverter {
method convert (line 16) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/TransactionConverter.java
class TransactionConverter (line 13) | public class TransactionConverter extends SubProcessConverter {
method convert (line 15) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/UserTaskConverter.java
class UserTaskConverter (line 19) | public class UserTaskConverter extends BaseFlowNodeConverter {
method convert (line 21) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/EndEventConverter.java
class EndEventConverter (line 23) | public class EndEventConverter extends BaseFlowNodeConverter {
method convert (line 25) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/IntermediateCatchEventConverter.java
class IntermediateCatchEventConverter (line 18) | public class IntermediateCatchEventConverter extends BaseFlowNodeConvert...
method convert (line 20) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/StartEventConverter.java
class StartEventConverter (line 16) | public class StartEventConverter extends BaseFlowNodeConverter {
method convert (line 18) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/ThrowEventConverter.java
class ThrowEventConverter (line 21) | public class ThrowEventConverter extends BaseFlowNodeConverter {
method convert (line 23) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/ComplexGatewayConverter.java
class ComplexGatewayConverter (line 14) | public class ComplexGatewayConverter extends BaseFlowNodeConverter {
method convert (line 16) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/EventGatewayConverter.java
class EventGatewayConverter (line 14) | public class EventGatewayConverter extends BaseFlowNodeConverter {
method convert (line 16) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/ExclusiveGatewayConverter.java
class ExclusiveGatewayConverter (line 18) | public class ExclusiveGatewayConverter extends BaseFlowNodeConverter {
method convert (line 20) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/InclusiveGatewayConverter.java
class InclusiveGatewayConverter (line 24) | public class InclusiveGatewayConverter extends BaseFlowNodeConverter {
method convert (line 28) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/ParallelGatewayConverter.java
class ParallelGatewayConverter (line 24) | public class ParallelGatewayConverter extends BaseFlowNodeConverter {
method convert (line 26) | @Override
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/util/BpmnXmlConstants.java
class BpmnXmlConstants (line 8) | public class BpmnXmlConstants {
FILE: easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/util/ConvertUtil.java
class ConvertUtil (line 13) | public class ConvertUtil {
method getMapValue (line 15) | public static Map<String, Object> getMapValue(Map<String, Object> obj,...
method getListValue (line 24) | public static List<Object> getListValue(Map<String, Object> obj, Strin...
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/FlowBpmnTestSuite.java
class FlowBpmnTestSuite (line 19) | @RunWith(Suite.class)
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/callactivity/BpmnCallActivityTest.java
class BpmnCallActivityTest (line 15) | public class BpmnCallActivityTest {
method testCallActivity001 (line 19) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/chain/FlowChainTest.java
class FlowChainTest (line 22) | public class FlowChainTest {
method testNormal (line 29) | @Test
class TestPlugin (line 55) | public static class TestPlugin extends BaseChainPlugin {
method TestPlugin (line 61) | public TestPlugin(String name) {
method preHandle (line 66) | @Override
method postHandleNormal (line 72) | @Override
method postHandleException (line 77) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/converter/BpmnConverterTest.java
class BpmnConverterTest (line 29) | public class BpmnConverterTest {
method testConvert (line 37) | @Test
method testConvertSimple (line 51) | @Test
method testConvertMultiple (line 63) | @Test
method testConvertResult (line 75) | @Test
method testCompensate (line 94) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/converter/BpmnTestService.java
class BpmnTestService (line 6) | public class BpmnTestService {
method doScriptTask1 (line 10) | public void doScriptTask1() {
method doScriptTask2 (line 14) | public void doScriptTask2() {
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/defaultflow/DefaultFlowTest.java
class DefaultFlowTest (line 20) | public class DefaultFlowTest {
method testDefaultFlow001 (line 25) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/extension/BpmnExtensionTest.java
class BpmnExtensionTest (line 30) | public class BpmnExtensionTest {
method testExtension (line 34) | @Test
method testConvert (line 49) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/inclusive/BpmnInclusiveTest.java
class BpmnInclusiveTest (line 23) | public class BpmnInclusiveTest {
method testInclusive001 (line 28) | @Test
method testInclusive002 (line 48) | @Test
method testInclusive003 (line 72) | @Test
method testInclusive004 (line 96) | @Test
method testInclusive005 (line 120) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/logflag/LogFlagTest.java
class LogFlagTest (line 14) | public class LogFlagTest {
method testLogFlag001 (line 19) | @Test
method testLogFlag002 (line 32) | @Test
method testLogFlag003 (line 46) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/parallel/BpmnParallelTest.java
class BpmnParallelTest (line 37) | public class BpmnParallelTest {
method testParallel001 (line 44) | @Test
method testMultiParallelSubFlow001 (line 55) | @Test
class MainFlowNodeAction (line 69) | public static class MainFlowNodeAction implements NodeAction {
method execute (line 73) | @Override
method init (line 103) | @Override
class SubFlowNodeAction (line 118) | public static class SubFlowNodeAction implements NodeAction {
method execute (line 120) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/share/nodeaction/TestEventNodeAction.java
class TestEventNodeAction (line 18) | public class TestEventNodeAction implements NodeAction {
method execute (line 22) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/share/nodeaction/TestStepAction.java
class TestStepAction (line 16) | public class TestStepAction implements NodeAction {
method execute (line 20) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/subprocess/BpmnSubProcessTest.java
class BpmnSubProcessTest (line 15) | public class BpmnSubProcessTest {
method testSubFlow001 (line 20) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/terminate/BpmnTerminateTest.java
class BpmnTerminateTest (line 15) | public class BpmnTerminateTest {
method testTerminate001 (line 20) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/throwevent/BpmnThrowEventTest.java
class BpmnThrowEventTest (line 23) | public class BpmnThrowEventTest {
method testConvert (line 32) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/ChainTest.java
class ChainTest (line 15) | public class ChainTest {
method testChain1 (line 22) | @Test
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/ChainTestService.java
class ChainTestService (line 6) | public class ChainTestService {
method execute (line 10) | public Object execute() {
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/Plugin1.java
class Plugin1 (line 10) | public class Plugin1 extends BaseChainPlugin {
method preHandle (line 15) | @Override
method postHandleNormal (line 21) | @Override
method postHandleException (line 26) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/Plugin2.java
class Plugin2 (line 10) | public class Plugin2 extends BaseChainPlugin {
method preHandle (line 15) | @Override
method postHandleNormal (line 21) | @Override
method postHandleException (line 26) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/Plugin3.java
class Plugin3 (line 10) | public class Plugin3 extends BaseChainPlugin {
method preHandle (line 15) | @Override
method postHandleNormal (line 21) | @Override
method postHandleException (line 26) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStart001Node01Action.java
class QuickStart001Node01Action (line 15) | public class QuickStart001Node01Action implements NodeAction {
method execute (line 19) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStart002Node01Action.java
class QuickStart002Node01Action (line 15) | public class QuickStart002Node01Action implements NodeAction {
method execute (line 19) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStart003Node01Action.java
class QuickStart003Node01Action (line 15) | public class QuickStart003Node01Action implements NodeAction {
method execute (line 19) | @Override
FILE: easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStartTest.java
class QuickStartTest (line 19) | public class QuickStartTest {
method testQuickStart001 (line 23) | @Test
FILE: easyflow-flow-bpmn/static/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js
function forEach (line 173) | function forEach(array, callback) {
function Multiselect (line 186) | function Multiselect(select, options) {
FILE: easyflow-flow-bpmn/static/plugins/bootstrap/js/bootstrap.bundle.js
function _defineProperties (line 14) | function _defineProperties(target, props) {
function _createClass (line 24) | function _createClass(Constructor, protoProps, staticProps) {
function _defineProperty (line 30) | function _defineProperty(obj, key, value) {
function _objectSpread (line 45) | function _objectSpread(target) {
function _inheritsLoose (line 64) | function _inheritsLoose(subClass, superClass) {
function toType (line 86) | function toType(obj) {
function getSpecialTransitionEndEvent (line 90) | function getSpecialTransitionEndEvent() {
function transitionEndEmulator (line 104) | function transitionEndEmulator(duration) {
function setTransitionEndSupport (line 119) | function setTransitionEndSupport() {
function Alert (line 260) | function Alert(element) {
function Button (line 428) | function Button(element) {
function Carousel (line 635) | function Carousel(element, config) {
function Collapse (line 1195) | function Collapse(element, config) {
function microtaskDebounce (line 1539) | function microtaskDebounce(fn) {
function taskDebounce (line 1553) | function taskDebounce(fn) {
function isFunction (line 1586) | function isFunction(functionToCheck) {
function getStyleComputedProperty (line 1598) | function getStyleComputedProperty(element, property) {
function getParentNode (line 1615) | function getParentNode(element) {
function getScrollParent (line 1629) | function getScrollParent(element) {
function isIE (line 1667) | function isIE(version) {
function getOffsetParent (line 1684) | function getOffsetParent(element) {
function isOffsetContainer (line 1713) | function isOffsetContainer(element) {
function getRoot (line 1729) | function getRoot(node) {
function findCommonOffsetParent (line 1745) | function findCommonOffsetParent(element1, element2) {
function getScroll (line 1789) | function getScroll(element) {
function includeScroll (line 1813) | function includeScroll(rect, element) {
function getBordersSize (line 1836) | function getBordersSize(styles, axis) {
function getSize (line 1843) | function getSize(axis, body, html, computedStyle) {
function getWindowSizes (line 1847) | function getWindowSizes(document) {
function defineProperties (line 1865) | function defineProperties(target, props) {
function getClientRect (line 1922) | function getClientRect(offsets) {
function getBoundingClientRect (line 1936) | function getBoundingClientRect(element) {
function getOffsetRectRelativeToArbitraryNode (line 1985) | function getOffsetRectRelativeToArbitraryNode(children, parent) {
function getViewportOffsetRectRelativeToArtbitraryNode (line 2037) | function getViewportOffsetRectRelativeToArtbitraryNode(element) {
function isFixed (line 2066) | function isFixed(element) {
function getFixedPositionOffsetParent (line 2089) | function getFixedPositionOffsetParent(element) {
function getBoundaries (line 2112) | function getBoundaries(popper, reference, padding, boundariesElement) {
function getArea (line 2166) | function getArea(_ref) {
function computeAutoPlacement (line 2182) | function computeAutoPlacement(placement, refRect, popper, reference, bou...
function getReferenceOffsets (line 2243) | function getReferenceOffsets(state, popper, reference) {
function getOuterSizes (line 2257) | function getOuterSizes(element) {
function getOppositePlacement (line 2276) | function getOppositePlacement(placement) {
function getPopperOffsets (line 2293) | function getPopperOffsets(popper, referenceOffsets, placement) {
function find (line 2331) | function find(arr, check) {
function findIndex (line 2350) | function findIndex(arr, prop, value) {
function runModifiers (line 2375) | function runModifiers(modifiers, data, ends) {
function update (line 2405) | function update() {
function isModifierEnabled (line 2457) | function isModifierEnabled(modifiers, modifierName) {
function getSupportedPropertyName (line 2472) | function getSupportedPropertyName(property) {
function destroy (line 2491) | function destroy() {
function getWindow (line 2521) | function getWindow(element) {
function attachToScrollParents (line 2526) | function attachToScrollParents(scrollParent, event, callback, scrollPare...
function setupEventListeners (line 2543) | function setupEventListeners(reference, options, state, updateBound) {
function enableEventListeners (line 2563) | function enableEventListeners() {
function removeEventListeners (line 2575) | function removeEventListeners(reference, state) {
function disableEventListeners (line 2599) | function disableEventListeners() {
function isNumeric (line 2613) | function isNumeric(n) {
function setStyles (line 2625) | function setStyles(element, styles) {
function setAttributes (line 2644) | function setAttributes(element, attributes) {
function applyStyle (line 2664) | function applyStyle(data) {
function applyStyleOnLoad (line 2693) | function applyStyleOnLoad(reference, popper, options, modifierOptions, s...
function getRoundedOffsets (line 2730) | function getRoundedOffsets(data, shouldRound) {
function computeStyle (line 2769) | function computeStyle(data, options) {
function isModifierRequired (line 2870) | function isModifierRequired(modifiers, requestingName, requestedName) {
function arrow (line 2895) | function arrow(data, options) {
function getOppositeVariation (line 2977) | function getOppositeVariation(variation) {
function clockwise (line 3032) | function clockwise(placement) {
function flip (line 3053) | function flip(data, options) {
function keepTogether (line 3143) | function keepTogether(data) {
function toValue (line 3177) | function toValue(str, measurement, popperOffsets, referenceOffsets) {
function parseOffset (line 3229) | function parseOffset(offset, popperOffsets, referenceOffsets, basePlacem...
function offset (line 3305) | function offset(data, _ref) {
function preventOverflow (line 3346) | function preventOverflow(data, options) {
function shift (line 3417) | function shift(data) {
function hide (line 3450) | function hide(data) {
function inner (line 3488) | function inner(data) {
function Popper (line 3939) | function Popper(reference, popper) {
function Dropdown (line 4169) | function Dropdown(element, config) {
function Modal (line 4674) | function Modal(element, config) {
function allowedAttribute (line 5247) | function allowedAttribute(attr, allowedAttributeList) {
function sanitizeHtml (line 5271) | function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
function Tooltip (line 5408) | function Tooltip(element, config) {
function Popover (line 6086) | function Popover() {
function ScrollSpy (line 6273) | function ScrollSpy(element, config) {
function Tab (line 6568) | function Tab(element) {
function Toast (line 6805) | function Toast(element, config) {
FILE: easyflow-flow-bpmn/static/plugins/bootstrap/js/bootstrap.js
function _defineProperties (line 15) | function _defineProperties(target, props) {
function _createClass (line 25) | function _createClass(Constructor, protoProps, staticProps) {
function _defineProperty (line 31) | function _defineProperty(obj, key, value) {
function _objectSpread (line 46) | function _objectSpread(target) {
function _inheritsLoose (line 65) | function _inheritsLoose(subClass, superClass) {
function toType (line 87) | function toType(obj) {
function getSpecialTransitionEndEvent (line 91) | function getSpecialTransitionEndEvent() {
function transitionEndEmulator (line 105) | function transitionEndEmulator(duration) {
function setTransitionEndSupport (line 120) | function setTransitionEndSupport() {
function Alert (line 261) | function Alert(element) {
function Button (line 429) | function Button(element) {
function Carousel (line 636) | function Carousel(element, config) {
function Collapse (line 1196) | function Collapse(element, config) {
function Dropdown (line 1591) | function Dropdown(element, config) {
function Modal (line 2096) | function Modal(element, config) {
function allowedAttribute (line 2669) | function allowedAttribute(attr, allowedAttributeList) {
function sanitizeHtml (line 2693) | function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
function Tooltip (line 2830) | function Tooltip(element, config) {
function Popover (line 3508) | function Popover() {
function ScrollSpy (line 3695) | function ScrollSpy(element, config) {
function Tab (line 3990) | function Tab(element) {
function Toast (line 4227) | function Toast(element, config) {
FILE: easyflow-flow-bpmn/static/plugins/bpmnjs/bpmn-modeler.development.js
function e$3 (line 19) | function e$3(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{...
function createCommonjsModule (line 21) | function createCommonjsModule(fn, module) {
function Ids (line 98) | function Ids(seed) {
function flatten (line 193) | function flatten(arr) {
function isUndefined$2 (line 200) | function isUndefined$2(obj) {
function isDefined (line 204) | function isDefined(obj) {
function isNil (line 208) | function isNil(obj) {
function isArray$3 (line 212) | function isArray$3(obj) {
function isObject (line 216) | function isObject(obj) {
function isNumber (line 220) | function isNumber(obj) {
function isFunction (line 229) | function isFunction(obj) {
function isString (line 241) | function isString(obj) {
function ensureArray (line 251) | function ensureArray(obj) {
function has$1 (line 268) | function has$1(target, key) {
function find (line 332) | function find(collection, matcher) {
function findIndex (line 360) | function findIndex(collection, matcher) {
function filter (line 387) | function filter(collection, matcher) {
function forEach$1 (line 413) | function forEach$1(collection, iterator) {
function without (line 447) | function without(arr, matcher) {
function reduce (line 476) | function reduce(collection, iterator, result) {
function every (line 495) | function every(collection, matcher) {
function some (line 512) | function some(collection, matcher) {
function map$1 (line 527) | function map$1(collection, fn) {
function keys (line 546) | function keys(collection) {
function size (line 558) | function size(collection) {
function values (line 570) | function values(collection) {
function groupBy (line 583) | function groupBy(collection, extractor, grouped = {}) {
function uniqueBy (line 603) | function uniqueBy(extractor, ...collections) {
function sortBy (line 633) | function sortBy(collection, extractor) {
function matchPattern (line 681) | function matchPattern(pattern) {
function toExtractor (line 698) | function toExtractor(extractor) {
function toMatcher (line 717) | function toMatcher(matcher) {
function identity$1 (line 724) | function identity$1(arg) {
function toNum$1 (line 728) | function toNum$1(arg) {
function debounce (line 754) | function debounce(fn, timeout) {
function bind$2 (line 827) | function bind$2(fn, target) {
function assign$1 (line 839) | function assign$1(target, ...others) {
function pick (line 854) | function pick(target, properties) {
function omit (line 881) | function omit(target, properties) {
function _mergeNamespaces$1 (line 897) | function _mergeNamespaces$1(n, m) {
function isUndefined$1 (line 923) | function isUndefined$1(obj) {
function isArray$2 (line 927) | function isArray$2(obj) {
function has (line 939) | function has(target, key) {
function forEach (line 953) | function forEach(collection, iterator) {
function identity (line 979) | function identity(arg) {
function toNum (line 983) | function toNum(arg) {
function assign (line 995) | function assign(element, ...styleSources) {
function attr$1 (line 1019) | function attr$1(el, name, val) {
function classes$1 (line 1057) | function classes$1(el) {
function ClassList$1 (line 1068) | function ClassList$1(el) {
function clear$1 (line 1176) | function clear$1(el) {
function matches (line 1194) | function matches(element, selector) {
function closest (line 1205) | function closest(element, selector, checkYourSelf) {
function detect (line 1225) | function detect () {
function bind (line 1294) | function bind(el, selector, type, fn, capture) {
function unbind (line 1317) | function unbind(el, type, fn, capture) {
function parse$1 (line 1398) | function parse$1(html, doc) {
function query (line 1444) | function query(selector, el) {
function all (line 1450) | function all(selector, el) {
function remove$2 (line 1456) | function remove$2(el) {
function ensureImported (line 1460) | function ensureImported(element, target) {
function appendTo (line 1488) | function appendTo(element, target) {
function append (line 1504) | function append(target, node) {
function getAttribute (line 1580) | function getAttribute(node, name) {
function setAttribute (line 1588) | function setAttribute(node, name, value) {
function setAttributes (line 1606) | function setAttributes(node, attrs) {
function attr (line 1625) | function attr(node, name, value) {
function classes (line 1659) | function classes(el) {
function ClassList (line 1663) | function ClassList(el) {
function remove$1 (line 1768) | function remove$1(element) {
function clear (line 1788) | function clear(element) {
function clone$1 (line 1798) | function clone$1(element) {
function parse (line 1812) | function parse(svg) {
function parseDocument (line 1845) | function parseDocument(svg) {
function create$1 (line 1869) | function create$1(name, attrs) {
function getNode (line 1893) | function getNode() {
function extend$1 (line 1901) | function extend$1(object, props) {
function createMatrix (line 1922) | function createMatrix(a, b, c, d, e, f) {
function createTransform (line 1942) | function createTransform(matrix) {
function escape$1 (line 1964) | function escape$1(str, pattern) {
function serialize (line 1973) | function serialize(node, output) {
function set$1 (line 2033) | function set$1(element, svg) {
function get$1 (line 2059) | function get$1(element) {
function isFragment (line 2071) | function isFragment(node) {
function innerSVG (line 2075) | function innerSVG(element, svg) {
function slice$1 (line 2092) | function slice$1(arr) {
function wrapMatrix (line 2100) | function wrapMatrix(transformList, transform) {
function setTransforms (line 2109) | function setTransforms(transformList, transforms) {
function transform$1 (line 2127) | function transform$1(node, transforms) {
function isClass (line 2150) | function isClass(fn) {
function isArray$1 (line 2159) | function isArray$1(obj) {
function hasOwnProp (line 2169) | function hasOwnProp(obj, prop) {
function annotate (line 2184) | function annotate(...args) {
function parseAnnotations (line 2222) | function parseAnnotations(fn) {
function Injector (line 2255) | function Injector(modules, parent) {
function arrayUnwrap (line 2598) | function arrayUnwrap(type, value) {
function BaseRenderer (line 2622) | function BaseRenderer(eventBus, renderPriority) {
function componentsToPath (line 2711) | function componentsToPath(elements) {
function move (line 2720) | function move(point) {
function lineTo (line 2729) | function lineTo(point) {
function curveTo (line 2740) | function curveTo(p1, p2, p3) {
function drawPath (line 2749) | function drawPath(waypoints, cornerRadius) {
function getPointAtLength (line 2791) | function getPointAtLength(start, end, length) {
function vectorLength$1 (line 2806) | function vectorLength$1(x, y) {
function createLine (line 2817) | function createLine(points, attrs, radius) {
function updateLine (line 2843) | function updateLine(gfx, points) {
function getParents$1 (line 2877) | function getParents$1(elements) {
function getParent$1 (line 2888) | function getParent$1(element, parent) {
function add$1 (line 2913) | function add$1(elements, element, unique) {
function eachElement (line 2934) | function eachElement(elements, fn, depth) {
function selfAndChildren (line 2961) | function selfAndChildren(elements, unique, maxDepth) {
function selfAndAllChildren (line 2992) | function selfAndAllChildren(elements, allowDuplicates) {
function getClosure (line 3007) | function getClosure(elements, isTopLevel, closure) {
function getBBox (line 3089) | function getBBox(elements, stopRecursion) {
function getEnclosedElements (line 3151) | function getEnclosedElements(elements, bbox) {
function getType (line 3191) | function getType(element) {
function isFrameElement$1 (line 3209) | function isFrameElement$1(element) {
function copyObject (line 3215) | function copyObject(src1, src2) {
function DefaultRenderer (line 3234) | function DefaultRenderer(eventBus, styles) {
function Styles (line 3334) | function Styles() {
function remove (line 3428) | function remove(collection, element) {
function add (line 3451) | function add(collection, element, idx) {
function indexOf (line 3504) | function indexOf(collection, element) {
function pointDistance (line 3527) | function pointDistance(a, b) {
function pointsOnLine (line 3549) | function pointsOnLine(p, q, r, accuracy) {
function pointsAligned (line 3577) | function pointsAligned(a, b) {
function pointsAlignedOnAxis (line 3600) | function pointsAlignedOnAxis(axis, points) {
function pointInRect (line 3617) | function pointInRect(p, rect, tolerance) {
function getMidPoint (line 3634) | function getMidPoint(p, q) {
function getDefaultExportFromCjs (line 3641) | function getDefaultExportFromCjs (x) {
function hasProperty (line 3666) | function hasProperty(obj, property) {
function clone (line 3670) | function clone(obj) {
function repush (line 3687) | function repush(array, item) {
function cacher (line 3693) | function cacher(f) {
function parsePathString (line 3716) | function parsePathString(pathString) {
function paths (line 3766) | function paths(ps) {
function rectBBox (line 3789) | function rectBBox(x, y, width, height) {
function pathToString (line 3808) | function pathToString() {
function pathClone (line 3812) | function pathClone(pathArray) {
function findDotsAtSegment (line 3818) | function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
function bezierBBox (line 3833) | function bezierBBox(points) {
function isPointInsideBBox$2 (line 3845) | function isPointInsideBBox$2(bbox, x, y) {
function isBBoxIntersect (line 3852) | function isBBoxIntersect(bbox1, bbox2) {
function base3 (line 3869) | function base3(t, p1, p2, p3, p4) {
function bezlen (line 3875) | function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {
function intersectLines (line 3902) | function intersectLines(x1, y1, x2, y2, x3, y3, x4, y4) {
function fixError (line 3942) | function fixError(number) {
function findBezierIntersections (line 3946) | function findBezierIntersections(bez1, bez2, justCount) {
function findPathIntersections (line 4050) | function findPathIntersections(path1, path2, justCount) {
function pathToAbsolute (line 4117) | function pathToAbsolute(pathArray) {
function isLine (line 4214) | function isLine(bez) {
function lineToCurve (line 4223) | function lineToCurve(x1, y1, x2, y2) {
function qubicToCurve (line 4230) | function qubicToCurve(x1, y1, ax, ay, x2, y2) {
function arcToCurve (line 4244) | function arcToCurve(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x...
function curveBBox (line 4353) | function curveBBox(x0, y0, x1, y1, x2, y2, x3, y3) {
function pathToCurve (line 4430) | function pathToCurve(path) {
function isConnection (line 4580) | function isConnection(value) {
function isLabel (line 4591) | function isLabel(value) {
function roundBounds (line 4610) | function roundBounds(bounds) {
function roundPoint (line 4624) | function roundPoint(point) {
function asTRBL (line 4640) | function asTRBL(bounds) {
function asBounds (line 4657) | function asBounds(trbl) {
function getBoundsMid (line 4674) | function getBoundsMid(bounds) {
function getConnectionMid (line 4689) | function getConnectionMid(connection) {
function getMid (line 4748) | function getMid(element) {
function getOrientation (line 4771) | function getOrientation(rect, reference, padding) {
function getElementLineIntersection (line 4812) | function getElementLineIntersection(elementPath, linePath, cropStart) {
function getIntersections (line 4849) | function getIntersections(a, b) {
function filterRedundantWaypoints (line 4854) | function filterRedundantWaypoints(waypoints) {
function distance (line 4885) | function distance(a, b) {
function round$b (line 4929) | function round$b(number, resolution) {
function ensurePx (line 4933) | function ensurePx(number) {
function findRoot (line 4937) | function findRoot(element) {
function createContainer (line 4953) | function createContainer(options) {
function createGroup (line 4977) | function createGroup(parent, cls, childIndex) {
function Canvas (line 5015) | function Canvas(config, eventBus, graphicsFactory, elementRegistry) {
function setCTM (line 6199) | function setCTM(node, m) {
function ElementRegistry (line 6374) | function ElementRegistry(eventBus) {
function extend (line 6656) | function extend(collection, refs, property, target) {
function isExtended (line 6747) | function isExtended(collection) {
function hasOwnProperty$1 (line 6757) | function hasOwnProperty$1(e, property) {
function defineCollectionProperty (line 6761) | function defineCollectionProperty(ref, property, target) {
function defineProperty$1 (line 6779) | function defineProperty$1(ref, property, target) {
function Refs$1 (line 6862) | function Refs$1(a, b) {
function ElementImpl (line 6973) | function ElementImpl() {
function ShapeImpl (line 7051) | function ShapeImpl() {
function RootImpl (line 7093) | function RootImpl() {
function LabelImpl (line 7116) | function LabelImpl() {
function ConnectionImpl (line 7139) | function ConnectionImpl() {
function create (line 7263) | function create(type, attrs) {
function isModelElement (line 7278) | function isModelElement(obj) {
function ElementFactory$1 (line 7298) | function ElementFactory$1() {
function EventBus (line 7501) | function EventBus() {
function wrappedCallback (line 7592) | function wrappedCallback() {
function InternalEvent (line 7935) | function InternalEvent() { }
function invokeFunction (line 7958) | function invokeFunction(fn, args) {
function getVisual (line 7976) | function getVisual(gfx) {
function getChildren$1 (line 7986) | function getChildren$1(gfx) {
function transform (line 7997) | function transform(gfx, x, y, angle, amount) {
function translate$2 (line 8016) | function translate$2(gfx, x, y) {
function rotate (line 8028) | function rotate(gfx, angle) {
function GraphicsFactory (line 8050) | function GraphicsFactory(eventBus, elementRegistry) {
function prependTo (line 8313) | function prependTo(newNode, parentNode, siblingNode) {
function bootstrap (line 8355) | function bootstrap(modules) {
function createInjector (line 8370) | function createInjector(options) {
function Diagram (line 8435) | function Diagram(options, injector) {
function Base (line 8511) | function Base() { }
function Factory (line 8527) | function Factory(model, properties) {
function ModdleElement (line 8555) | function ModdleElement(attrs) {
function coerceType (line 8600) | function coerceType(type, value) {
function isBuiltIn (line 8614) | function isBuiltIn(type) {
function isSimple (line 8621) | function isSimple(type) {
function parseName (line 8634) | function parseName(name, defaultPrefix) {
function DescriptorBuilder (line 8664) | function DescriptorBuilder(nameNs) {
function Registry (line 8889) | function Registry(packages, properties) {
function traverseTrait (line 9008) | function traverseTrait(cls) {
function traverseSuper (line 9018) | function traverseSuper(cls, trait) {
function ensureAvailable (line 9070) | function ensureAvailable(packageMap, pkg, identifierKey) {
function Properties (line 9084) | function Properties(model) {
function isUndefined (line 9200) | function isUndefined(val) {
function defineProperty (line 9204) | function defineProperty(target, property, value) {
function Moddle (line 9236) | function Moddle(packages) {
function replaceEntities (line 9442) | function replaceEntities(_, d, x, z) {
function decodeEntities (line 9474) | function decodeEntities(s) {
function error$2 (line 9488) | function error$2(msg) {
function missingNamespaceForPrefix (line 9492) | function missingNamespaceForPrefix(prefix) {
function getter (line 9496) | function getter(getFn) {
function cloneNsMatrix (line 9503) | function cloneNsMatrix(nsMatrix) {
function uriPrefix (line 9511) | function uriPrefix(prefix) {
function buildNsMatrix (line 9515) | function buildNsMatrix(nsUriToPrefix) {
function noopGetContext (line 9529) | function noopGetContext() {
function throwFunc (line 9533) | function throwFunc(err) {
function Parser (line 9544) | function Parser(options) {
function hasLowerCaseAlias (line 10503) | function hasLowerCaseAlias(pkg) {
function serializeFormat (line 10514) | function serializeFormat(element) {
function serializeAsType (line 10518) | function serializeAsType(element) {
function serializeAsProperty (line 10522) | function serializeAsProperty(element) {
function capitalize (line 10526) | function capitalize(str) {
function aliasToName (line 10530) | function aliasToName(aliasNs, pkg) {
function prefixedToName (line 10539) | function prefixedToName(nameNs, pkg) {
function normalizeXsiTypeName (line 10553) | function normalizeXsiTypeName(name, model) {
function error$1 (line 10561) | function error$1(message) {
function getModdleDescriptor (line 10572) | function getModdleDescriptor(element) {
function Context (line 10586) | function Context(options) {
function BaseHandler (line 10660) | function BaseHandler() {}
function NoopHandler (line 10674) | function NoopHandler() { }
function BodyHandler (line 10682) | function BodyHandler() {}
function ReferenceHandler (line 10690) | function ReferenceHandler(property, context) {
function ValueHandler (line 10719) | function ValueHandler(propertyDesc, element) {
function BaseElementHandler (line 10742) | function BaseElementHandler() {}
function ElementHandler (line 10765) | function ElementHandler(model, typeName, context) {
function RootElementHandler (line 11023) | function RootElementHandler(model, typeName, context) {
function GenericElementHandler (line 11050) | function GenericElementHandler(model, typeName, context) {
function Reader (line 11100) | function Reader(options) {
function handleError (line 11182) | function handleError(err, getContext, lax) {
function handleWarning (line 11215) | function handleWarning(err, getContext) {
function resolveReferences (line 11224) | function resolveReferences() {
function handleClose (line 11270) | function handleClose() {
function handleQuestion (line 11280) | function handleQuestion(question) {
function handleOpen (line 11300) | function handleOpen(node, getContext) {
function handleCData (line 11313) | function handleCData(text, getContext) {
function handleText (line 11322) | function handleText(text, getContext) {
function createStack (line 11421) | function createStack() {
function Namespaces (line 11439) | function Namespaces(parent) {
function lower (line 11511) | function lower(string) {
function nameToAlias (line 11515) | function nameToAlias(name, pkg) {
function inherits (line 11523) | function inherits(ctor, superCtor) {
function nsName (line 11535) | function nsName(ns) {
function getNsAttrs (line 11543) | function getNsAttrs(namespaces) {
function getElementNs (line 11556) | function getElementNs(ns, descriptor) {
function getPropertyNs (line 11564) | function getPropertyNs(ns, descriptor) {
function getSerializableProperties (line 11568) | function getSerializableProperties(element) {
function escape (line 11615) | function escape(str, charPattern, replaceMap) {
function escapeAttr (line 11631) | function escapeAttr(str) {
function escapeBody (line 11635) | function escapeBody(str) {
function filterAttributes (line 11639) | function filterAttributes(props) {
function filterContained (line 11643) | function filterContained(props) {
function ReferenceSerializer (line 11648) | function ReferenceSerializer(tagName) {
function BodySerializer (line 11664) | function BodySerializer() {}
function ValueSerializer (line 11685) | function ValueSerializer(tagName) {
function ElementSerializer (line 11704) | function ElementSerializer(parent, propertyDescriptor) {
function TypeSerializer (line 12178) | function TypeSerializer(parent, propertyDescriptor) {
function SavingWriter (line 12217) | function SavingWriter() {
function FormatingWriter (line 12225) | function FormatingWriter(out, format) {
function Writer (line 12267) | function Writer(options) {
function BpmnModdle (line 12300) | function BpmnModdle(packages, options) {
function simple (line 16027) | function simple(additionalPackages, options) {
function elementToString (line 16033) | function elementToString(e) {
function wrapForCompatibility (line 16059) | function wrapForCompatibility(api) {
function ensureCompatDiRef (line 16111) | function ensureCompatDiRef(businessObject) {
function is$2 (line 16138) | function is$2(element, type) {
function findDisplayCandidate (line 16151) | function findDisplayCandidate(definitions) {
function BpmnTreeWalker (line 16161) | function BpmnTreeWalker(handler, translate) {
function is$1 (line 16589) | function is$1(element, type) {
function isAny (line 16604) | function isAny(element, types) {
function getBusinessObject (line 16617) | function getBusinessObject(element) {
function getDi (line 16628) | function getDi(element) {
function importBpmnDiagram (line 16654) | function importBpmnDiagram(diagram, definitions, bpmnDiagram) {
function getDiagramsToImport (line 16749) | function getDiagramsToImport(definitions, bpmnDiagram) {
function selfAndAllFlowElements (line 16813) | function selfAndAllFlowElements(elements) {
function findRootProcess (line 16829) | function findRootProcess(element) {
function createLightbox (line 16908) | function createLightbox() {
function open (line 16921) | function open() {
function BaseViewer (line 17034) | function BaseViewer(options) {
function ParseCompleteEvent (line 17097) | function ParseCompleteEvent(data) {
function addWarningsToError (line 17676) | function addWarningsToError(err, warningsAry) {
function checkValidationError (line 17681) | function checkValidationError(err) {
function ensureUnit (line 17708) | function ensureUnit(val) {
function findBPMNDiagram (line 17721) | function findBPMNDiagram(definitions, diagramId) {
function addProjectLogo (line 17739) | function addProjectLogo(container) {
function BaseModeler (line 17786) | function BaseModeler(options) {
function isExpanded (line 17852) | function isExpanded(element, di) {
function isInterrupting (line 17880) | function isInterrupting(element) {
function isEventSubProcess (line 17889) | function isEventSubProcess(element) {
function hasEventDefinition$2 (line 17899) | function hasEventDefinition$2(element, eventType) {
function hasErrorEventDefinition (line 17912) | function hasErrorEventDefinition(element) {
function hasEscalationEventDefinition (line 17921) | function hasEscalationEventDefinition(element) {
function hasCompensateEventDefinition (line 17930) | function hasCompensateEventDefinition(element) {
function isLabelExternal (line 17957) | function isLabelExternal(semantic) {
function hasExternalLabel (line 17976) | function hasExternalLabel(element) {
function getFlowLabelPosition (line 17987) | function getFlowLabelPosition(waypoints) {
function getWaypointsMid (line 18021) | function getWaypointsMid(waypoints) {
function getExternalLabelMid (line 18041) | function getExternalLabelMid(element) {
function getExternalLabelBounds (line 18068) | function getExternalLabelBounds(di, element) {
function getLabelAttr (line 18105) | function getLabelAttr(semantic) {
function getCategoryValue (line 18132) | function getCategoryValue(semantic) {
function getLabel (line 18148) | function getLabel(element) {
function setLabel (line 18170) | function setLabel(element, text) {
function isTypedEvent (line 18199) | function isTypedEvent(event, eventDefinitionType) {
function isThrowEvent (line 18212) | function isThrowEvent(event) {
function isCollection (line 18223) | function isCollection(element) {
function getFillColor (line 18238) | function getFillColor(element, defaultColor) {
function getStrokeColor$1 (line 18250) | function getStrokeColor$1(element, defaultColor) {
function getLabelColor (line 18263) | function getLabelColor(element, defaultColor, defaultStrokeColor) {
function getCirclePath (line 18278) | function getCirclePath(shape) {
function getRoundRectPath (line 18301) | function getRoundRectPath(shape, borderRadius) {
function getDiamondPath (line 18329) | function getDiamondPath(shape) {
function getRectPath (line 18354) | function getRectPath(shape) {
function BpmnRenderer (line 18404) | function BpmnRenderer(
function parseAlign (line 20354) | function parseAlign(align) {
function parsePadding (line 20369) | function parsePadding(padding) {
function getTextBBox (line 20389) | function getTextBBox(text, fakeText) {
function layoutNext (line 20436) | function layoutNext(lines, maxWidth, fakeText) {
function fit (line 20465) | function fit(lines, fitLine, originalLine, textBBox) {
function semanticShorten (line 20491) | function semanticShorten(line, maxLength) {
function shortenLine (line 20535) | function shortenLine(line, width, maxWidth) {
function getHelperSvg (line 20554) | function getHelperSvg() {
function Text (line 20583) | function Text(config) {
function getLineHeight (line 20731) | function getLineHeight(style) {
function TextRenderer (line 20766) | function TextRenderer(config) {
function PathMap (line 20874) | function PathMap() {
function replacer (line 21328) | function replacer(all, key, obj) {
function format (line 21344) | function format(str, obj) {
function translate$1 (line 21383) | function translate$1(template, replacements) {
function elementData (line 21423) | function elementData(semantic, di, attrs) {
function getWaypoints (line 21432) | function getWaypoints(di, source, target) {
function notYetDrawn (line 21445) | function notYetDrawn(translate, semantic, refSemantic, property) {
function BpmnImporter (line 21464) | function BpmnImporter(
function isPointInsideBBox$1 (line 21737) | function isPointInsideBBox$1(bbox, point) {
function isFrameElement (line 21747) | function isFrameElement(semantic) {
function __stopPropagation (line 21769) | function __stopPropagation(event) {
function getOriginal$1 (line 21782) | function getOriginal$1(event) {
function stopPropagation$1 (line 21789) | function stopPropagation$1(event) {
function toPoint (line 21799) | function toPoint(event) {
function isMac (line 21815) | function isMac() {
function isButton (line 21825) | function isButton(event, button) {
function isPrimaryButton (line 21834) | function isPrimaryButton(event) {
function isAuxiliaryButton (line 21845) | function isAuxiliaryButton(event) {
function hasPrimaryModifier (line 21856) | function hasPrimaryModifier(event) {
function hasSecondaryModifier (line 21876) | function hasSecondaryModifier(event) {
function allowAll (line 21892) | function allowAll(event) { return true; }
function allowPrimaryAndAuxiliary (line 21894) | function allowPrimaryAndAuxiliary(event) {
function InteractionEvents (line 21924) | function InteractionEvents(eventBus, elementRegistry, styles) {
function Outline (line 22401) | function Outline(eventBus, styles) {
function Selection (line 22517) | function Selection(eventBus, canvas) {
function SelectionVisuals (line 22649) | function SelectionVisuals(canvas, eventBus, selection) {
function addSelectionOutlinePadding (line 22744) | function addSelectionOutlinePadding(bBox) {
function SelectionBehavior (line 22766) | function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {
function isShown (line 22868) | function isShown(element) {
function IdGenerator (line 22896) | function IdGenerator(prefix) {
function Overlays (line 23039) | function Overlays(config, eventBus, canvas, elementRegistry) {
function updateViewbox (line 23505) | function updateViewbox(viewbox) {
function createRoot$1 (line 23583) | function createRoot$1(parentNode) {
function setPosition$1 (line 23599) | function setPosition$1(el, x, y) {
function setVisible$1 (line 23609) | function setVisible$1(el, visible) {
function setTransform (line 23613) | function setTransform(el, transform) {
function ChangeSupport (line 23649) | function ChangeSupport(
function CommandInterceptor (line 23745) | function CommandInterceptor(eventBus) {
function unwrapEvent (line 23755) | function unwrapEvent(fn, that) {
function createHook (line 23925) | function createHook(hook) {
function RootElementsBehavior (line 23965) | function RootElementsBehavior(canvas, injector) {
function escapeCSS (line 24005) | function escapeCSS(str) {
function escapeHTML (line 24022) | function escapeHTML(str) {
function getShapeIdFromPlane (line 24044) | function getShapeIdFromPlane(element) {
function getPlaneIdFromShape (line 24057) | function getPlaneIdFromShape(element) {
function toPlaneId (line 24074) | function toPlaneId(id) {
function isPlane (line 24085) | function isPlane(element) {
function addPlaneSuffix (line 24091) | function addPlaneSuffix(id) {
function removePlaneSuffix (line 24095) | function removePlaneSuffix(id) {
function DrilldownBreadcrumbs (line 24118) | function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {
function getBusinessObjectParentChain (line 24209) | function getBusinessObjectParentChain(child) {
function DrilldownCentering (line 24236) | function DrilldownCentering(eventBus, canvas) {
function Map$1 (line 24289) | function Map$1() {
function SubprocessCompatibility (line 24369) | function SubprocessCompatibility(eventBus, moddle) {
function findRootDiagram (line 24552) | function findRootDiagram(element) {
function getPlaneBounds (line 24565) | function getPlaneBounds(plane) {
function shouldMoveToPlane (line 24593) | function shouldMoveToPlane(businessObject, plane) {
function DrilldownOverlayBehavior (line 24632) | function DrilldownOverlayBehavior(
function Viewer (line 24869) | function Viewer(options) {
function hasModifier (line 24896) | function hasModifier(event) {
function isCmd (line 24904) | function isCmd(event) {
function isKey (line 24922) | function isKey(keys, event) {
function isShift (line 24931) | function isShift(event) {
function isCopy (line 24938) | function isCopy(event) {
function isPaste (line 24945) | function isPaste(event) {
function isUndo (line 24952) | function isUndo(event) {
function isRedo (line 24959) | function isRedo(event) {
function Keyboard (line 25005) | function Keyboard(config, eventBus) {
function isInput (line 25179) | function isInput(target) {
function KeyboardBindings (line 25195) | function KeyboardBindings(eventBus, keyboard) {
function addListener (line 25228) | function addListener(action, fn) {
function KeyboardMove (line 25373) | function KeyboardMove(
function set (line 25498) | function set(mode) {
function unset (line 25508) | function unset() {
function install (line 25526) | function install(eventBus, eventName) {
function center (line 25550) | function center(bounds) {
function delta (line 25563) | function delta(a, b) {
function MoveCanvas (line 25584) | function MoveCanvas(eventBus, canvas) {
function length (line 25684) | function length(point) {
function log10 (line 25701) | function log10(x) {
function getStepSize (line 25713) | function getStepSize(range, steps) {
function cap (line 25729) | function cap(range, scale) {
function ZoomScroll (line 25764) | function ZoomScroll(config, eventBus, canvas) {
function NavigatedViewer (line 25981) | function NavigatedViewer(options) {
function setTimeoutContext (line 26026) | function setTimeoutContext(fn, timeout, context) {
function invokeArrayArg (line 26039) | function invokeArrayArg(arg, fn, context) {
function each (line 26053) | function each(obj, iterator, context) {
function deprecate (line 26082) | function deprecate(method, name, message) {
function inherit (line 26166) | function inherit(child, base, properties) {
function bindFn (line 26185) | function bindFn(fn, context) {
function boolOrFn (line 26198) | function boolOrFn(val, args) {
function ifUndefined (line 26211) | function ifUndefined(val1, val2) {
function addEventListeners (line 26221) | function addEventListeners(target, types, handler) {
function removeEventListeners (line 26233) | function removeEventListeners(target, types, handler) {
function hasParent (line 26246) | function hasParent(node, parent) {
function inStr (line 26262) | function inStr(str, find) {
function splitStr (line 26271) | function splitStr(str) {
function inArray (line 26282) | function inArray(src, find, findByKey) {
function toArray (line 26302) | function toArray(obj) {
function uniqueArray (line 26313) | function uniqueArray(src, key, sort) {
function prefixed (line 26346) | function prefixed(obj, property) {
function uniqueId (line 26368) | function uniqueId() {
function getWindowForElement (line 26377) | function getWindowForElement(element) {
function Input (line 26420) | function Input(manager, callback) {
function createInputInstance (line 26471) | function createInputInstance(manager) {
function inputHandler (line 26495) | function inputHandler(manager, eventType, input) {
function computeInputData (line 26527) | function computeInputData(manager, input) {
function computeDeltaXY (line 26579) | function computeDeltaXY(session, input) {
function computeIntervalInputData (line 26606) | function computeIntervalInputData(session, input) {
function simpleCloneInputData (line 26641) | function simpleCloneInputData(input) {
function getCenter (line 26668) | function getCenter(pointers) {
function getVelocity (line 26699) | function getVelocity(deltaTime, x, y) {
function getDirection (line 26712) | function getDirection(x, y) {
function getDistance (line 26730) | function getDistance(p1, p2, props) {
function getAngle (line 26747) | function getAngle(p1, p2, props) {
function getRotation (line 26762) | function getRotation(start, end) {
function getScale (line 26773) | function getScale(start, end) {
function MouseInput (line 26791) | function MouseInput() {
function PointerEventInput (line 26865) | function PointerEventInput() {
function SingleTouchInput (line 26939) | function SingleTouchInput() {
function normalizeSingleTouches (line 26982) | function normalizeSingleTouches(ev, type) {
function TouchInput (line 27007) | function TouchInput() {
function getTouches (line 27037) | function getTouches(ev, type) {
function TouchMouseInput (line 27105) | function TouchMouseInput() {
function recordTouches (line 27150) | function recordTouches(eventType, eventData) {
function setLastTouch (line 27159) | function setLastTouch(eventData) {
function isSyntheticEvent (line 27176) | function isSyntheticEvent(eventData) {
function TouchAction (line 27207) | function TouchAction(manager, value) {
function cleanTouchActions (line 27308) | function cleanTouchActions(actions) {
function getTouchActionProps (line 27338) | function getTouchActionProps() {
function Recognizer (line 27394) | function Recognizer(options) {
function emit (line 27527) | function emit(event) {
function stateStr (line 27636) | function stateStr(state) {
function directionStr (line 27654) | function directionStr(direction) {
function getRecognizerByNameIfManager (line 27673) | function getRecognizerByNameIfManager(otherRecognizer, recognizer) {
function AttrRecognizer (line 27686) | function AttrRecognizer() {
function PanRecognizer (line 27748) | function PanRecognizer() {
function PinchRecognizer (line 27828) | function PinchRecognizer() {
function PressRecognizer (line 27867) | function PressRecognizer() {
function RotateRecognizer (line 27938) | function RotateRecognizer() {
function SwipeRecognizer (line 27969) | function SwipeRecognizer() {
function TapRecognizer (line 28029) | function TapRecognizer() {
function Hammer (line 28140) | function Hammer(element, options) {
function Manager (line 28272) | function Manager(element, options) {
function toggleCssProps (line 28544) | function toggleCssProps(manager, add) {
function triggerDomEvent (line 28569) | function triggerDomEvent(event, data) {
function get (line 28671) | function get(service, injector) {
function stopEvent (line 28675) | function stopEvent(event) {
function createTouchRecognizer (line 28693) | function createTouchRecognizer(node) {
function TouchInteractionEvents (line 28776) | function TouchInteractionEvents(
function TouchFix (line 28990) | function TouchFix(eventBus) {
function last (line 29072) | function last(arr) {
function sortTopOrMiddle (line 29076) | function sortTopOrMiddle(element) {
function sortLeftOrCenter (line 29080) | function sortLeftOrCenter(element) {
function AlignElements$1 (line 29106) | function AlignElements$1(modeling, rules) {
function getMiddleOrTop (line 29163) | function getMiddleOrTop(first, last) {
function ContextPad (line 29304) | function ContextPad(canvas, config, eventBus, overlays) {
function addClasses$1 (line 29741) | function addClasses$1(element, classNames) {
function includes$8 (line 29757) | function includes$8(array, item) {
function s$1 (line 29772) | function s$1(n,l){for(var u in l)n[u]=l[u];return n}
function a$1 (line 29772) | function a$1(n){var l=n.parentNode;l&&l.removeChild(n);}
function h$1 (line 29772) | function h$1(l,u,i){var t,o,r,f={};for(r in u)"key"==r?t=u[r]:"ref"==r?o...
function v$1 (line 29772) | function v$1(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:nu...
function p$1 (line 29772) | function p$1(n){return n.children}
function d$1 (line 29772) | function d$1(n,l){this.props=n,this.context=l;}
function _$1 (line 29772) | function _$1(n,l){if(null==l)return n.__?_$1(n.__,n.__.__k.indexOf(n)+1)...
function k$1 (line 29772) | function k$1(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c....
function b$1 (line 29772) | function b$1(n){(!n.__d&&(n.__d=!0)&&t$2.push(n)&&!g$1.__r++||o$1!==l$1....
function g$1 (line 29772) | function g$1(){for(var n;g$1.__r=t$2.length;)n=t$2.sort(function(n,l){re...
function w$1 (line 29772) | function w$1(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e$2,C=x....
function m$2 (line 29772) | function m$2(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i...
function A (line 29772) | function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0...
function C (line 29772) | function C(n,l,u,i,t){var o;for(o in u)"children"===o||"key"===o||o in l...
function $ (line 29772) | function $(n,l,u){"-"===l[0]?n.setProperty(l,u):n[l]=null==u?"":"number"...
function H (line 29772) | function H(n,l,u,i,t){var o;n:if("style"===l)if("string"==typeof u)n.sty...
function I (line 29772) | function I(n){this.l[n.type+!1](l$1.event?l$1.event(n):n);}
function T$1 (line 29772) | function T$1(n){this.l[n.type+!0](l$1.event?l$1.event(n):n);}
function j$1 (line 29772) | function j$1(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H,I,T=u.ty...
function z$1 (line 29772) | function z$1(n,u){l$1.__c&&l$1.__c(u,n),n.some(function(u){try{n=u.__h,u...
function L (line 29772) | function L(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;i...
function M (line 29772) | function M(n,u,i){try{"function"==typeof n?n(u):n.current=u;}catch(n){l$...
function N (line 29772) | function N(n,u,i){var t,o;if(l$1.unmount&&l$1.unmount(n),(t=n.ref)&&(t.c...
function O (line 29772) | function O(n,l,u){return this.constructor(n,u)}
function P (line 29772) | function P(u,i,t){var o,r,e;l$1.__&&l$1.__(u,i),r=(o="function"==typeof ...
function e$1 (line 29774) | function e$1(s){var r=t$1.get(this);return r||(r=new Map,t$1.set(this,r)...
function d (line 29778) | function d(t,u){l$1.__h&&l$1.__h(r$1,t,o||u),o=0;var i=r$1.__H||(r$1.__H...
function p (line 29778) | function p(n){return o=1,y(B,n)}
function y (line 29778) | function y(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B(void 0...
function h (line 29778) | function h(u,i){var o=d(t++,3);!l$1.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r$1._...
function s (line 29778) | function s(u,i){var o=d(t++,4);!l$1.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r$1._...
function _ (line 29778) | function _(n){return o=5,F(function(){return {current:n}},[])}
function F (line 29778) | function F(n,r){var u=d(t++,7);return z(u.__H,r)?(u.__V=n(),u.i=r,u.__h=...
function T (line 29778) | function T(n,t){return o=8,F(function(){return n},t)}
function b (line 29778) | function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEac...
function j (line 29778) | function j(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame...
function k (line 29778) | function k(n){var t=r$1,u=n.__c;"function"==typeof u&&(n.__c=void 0,u())...
function w (line 29778) | function w(n){var t=r$1;n.__c=n.__(),r$1=t;}
function z (line 29778) | function z(n,t){return !n||n.length!==t.length||t.some(function(t,r){ret...
function B (line 29778) | function B(n,t){return "function"==typeof t?t(n):t}
function r (line 29780) | function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=...
function clsx (line 29780) | function clsx(){for(var e,t,f=0,n="";f<arguments.length;)(e=arguments[f+...
function PopupMenuItem (line 29797) | function PopupMenuItem(props) {
function PopupMenuList (line 29870) | function PopupMenuList(props) {
function groupEntries (line 29923) | function groupEntries(entries) {
function scrollIntoView (line 29951) | function scrollIntoView(el) {
function PopupMenuComponent (line 29983) | function PopupMenuComponent(props) {
function PopupMenuWrapper (line 30200) | function PopupMenuWrapper(props) {
function getPopupStyle (line 30261) | function getPopupStyle(props) {
function getHeaderClasses (line 30268) | function getHeaderClasses(entry, selected) {
function PopupMenu (line 30319) | function PopupMenu(config, eventBus, canvas) {
function AlignElementsContextPadProvider (line 30905) | function AlignElementsContextPadProvider(contextPad, popupMenu, translat...
function AlignElementsMenuProvider (line 31012) | function AlignElementsMenuProvider(popupMenu, alignElements, translate, ...
function RuleProvider (line 31090) | function RuleProvider(eventBus) {
function BpmnAlignElements (line 31177) | function BpmnAlignElements(eventBus) {
function findFreePosition (line 31247) | function findFreePosition(source, element, position, getNextPosition) {
function generateGetNextPosition (line 31266) | function generateGetNextPosition(nextPositionDirection) {
function getConnectedAtPosition (line 31309) | function getConnectedAtPosition(source, position, element) {
function getConnectedDistance (line 31347) | function getConnectedDistance(source, hints) {
function getAutoPlaceClosure (line 31479) | function getAutoPlaceClosure(source) {
function getConnected (line 31496) | function getConnected(element) {
function getSources (line 31500) | function getSources(shape) {
function getTargets (line 31506) | function getTargets(shape) {
function noneFilter (line 31512) | function noneFilter() {
function AutoPlace$1 (line 31537) | function AutoPlace$1(eventBus, modeling, canvas) {
function getNewShapePosition$1 (line 31602) | function getNewShapePosition$1(source, element, hints) {
function AutoPlaceSelectionBehavior (line 31630) | function AutoPlaceSelectionBehavior(eventBus, selection) {
function getParent (line 31664) | function getParent(element, anyType) {
function getNewShapePosition (line 31695) | function getNewShapePosition(source, element) {
function getFlowNodePosition (line 31719) | function getFlowNodePosition(source, element) {
function getVerticalDistance (line 31763) | function getVerticalDistance(orientation, minDistance) {
function getTextAnnotationPosition (line 31783) | function getTextAnnotationPosition(source, element) {
function getDataElementPosition (line 31818) | function getDataElementPosition(source, element) {
function AutoPlace (line 31846) | function AutoPlace(eventBus) {
function AutoResize (line 31886) | function AutoResize(eventBus, elementRegistry, modeling, rules) {
function boundsChanged$1 (line 32102) | function boundsChanged$1(newBounds, oldBounds) {
function getResizeDirections (line 32119) | function getResizeDirections(oldBounds, newBounds) {
function BpmnAutoResize (line 32157) | function BpmnAutoResize(injector) {
function AutoResizeProvider (line 32196) | function AutoResizeProvider(eventBus) {
function BpmnAutoResizeProvider (line 32236) | function BpmnAutoResizeProvider(eventBus, modeling) {
function HoverFix (line 32317) | function HoverFix(elementRegistry, eventBus, injector) {
function getGfx (line 32448) | function getGfx(target) {
function preventDefault$1 (line 32476) | function preventDefault$1(event) {
function isTouchEvent (line 32480) | function isTouchEvent(event) {
function getLength (line 32487) | function getLength(point) {
function Dragging (line 32576) | function Dragging(eventBus, canvas, selection, elementRegistry) {
function AutoScroll (line 33049) | function AutoScroll(config, eventBus, canvas) {
function between (line 33129) | function between(val, start, end) {
function Rules (line 33202) | function Rules(injector) {
function circlePath (line 33257) | function circlePath(center, r) {
function linePath (line 33270) | function linePath(points) {
function getBendpointIntersection (line 33289) | function getBendpointIntersection(waypoints, reference) {
function getPathIntersection (line 33313) | function getPathIntersection(waypoints, reference) {
function getApproxIntersection (line 33369) | function getApproxIntersection(waypoints, reference) {
function vectorLength (line 33385) | function vectorLength(vector) {
function getAngle (line 33397) | function getAngle(line) {
function rotateVector (line 33413) | function rotateVector(vector, angle) {
function solveLambaSystem (line 33431) | function solveLambaSystem(a, b, c) {
function perpendicularFoot (line 33455) | function perpendicularFoot(point, line) {
function getDistancePointLine (line 33477) | function getDistancePointLine(point, line) {
function getDistancePointPoint (line 33499) | function getDistancePointPoint(point1, point2) {
function toCanvasCoordinates (line 33516) | function toCanvasCoordinates(canvas, event) {
function getConnectionIntersection (line 33539) | function getConnectionIntersection(canvas, waypoints, event) {
function addBendpoint (line 33546) | function addBendpoint(parentGfx, cls) {
function createParallelDragger (line 33579) | function createParallelDragger(parentGfx, segmentStart, segmentEnd, alig...
function addSegmentDragger (line 33618) | function addSegmentDragger(parentGfx, segmentStart, segmentEnd) {
function calculateSegmentMoveRegion (line 33642) | function calculateSegmentMoveRegion(segmentLength) {
function getClosestPointOnConnection (line 33653) | function getClosestPointOnConnection(position, connection) {
function calculateHitWidth (line 33662) | function calculateHitWidth(segmentStart, segmentEnd, alignment) {
function getClosestSegment (line 33671) | function getClosestSegment(position, connection) {
function Bendpoints (line 33708) | function Bendpoints(
function getDraggerVisual (line 34072) | function getDraggerVisual(draggerGfx) {
function BendpointMove (line 34103) | function BendpointMove(injector, eventBus, canvas, dragging, rules, mode...
function isReverse$2 (line 34317) | function isReverse$2(context) {
function BendpointMovePreview (line 34360) | function BendpointMovePreview(bendpointMove, injector, eventBus, canvas) {
function axisAdd (line 34556) | function axisAdd(point, axis, delta) {
function axisSet (line 34560) | function axisSet(point, axis, value) {
function axisFenced (line 34567) | function axisFenced(position, segmentStart, segmentEnd, axis) {
function flipAxis (line 34579) | function flipAxis(axis) {
function getDocking$2 (line 34594) | function getDocking$2(point, referenceElement, moveAxis) {
function ConnectionSegmentMove (line 34619) | function ConnectionSegmentMove(
function snapTo (line 34984) | function snapTo(value, values, tolerance) {
function topLeft (line 34999) | function topLeft(bounds) {
function bottomRight (line 35006) | function bottomRight(bounds) {
function mid$2 (line 35013) | function mid$2(bounds, defaultValue) {
function isSnapped (line 35035) | function isSnapped(event, axis) {
function setSnapped (line 35062) | function setSnapped(event, axis, value) {
function getChildren (line 35098) | function getChildren(parent) {
function BendpointSnapping (line 35113) | function BendpointSnapping(eventBus) {
function Connect (line 35373) | function Connect(eventBus, dragging, modeling, rules) {
function isReverse$1 (line 35505) | function isReverse$1(context) {
function ConnectPreview (line 35533) | function ConnectPreview(injector, eventBus, canvas) {
function ConnectionPreview (line 35642) | function ConnectionPreview(
function cacheReturnValues (line 35866) | function cacheReturnValues(fn) {
function ensureConnectionAttrs (line 35894) | function ensureConnectionAttrs(canConnect) {
function preventDefault (line 35913) | function preventDefault(e) {
function stopPropagation (line 35917) | function stopPropagation(e) {
function isTextNode (line 35921) | function isTextNode(node) {
function toArray (line 35925) | function toArray(nodeList) {
function TextBox (line 35944) | function TextBox(options) {
function normalizeEndOfLineSequences (line 36355) | function normalizeEndOfLineSequences(string) {
function DirectEditing (line 36365) | function DirectEditing(eventBus, canvas) {
function PreviewSupport (line 36587) | function PreviewSupport(elementRegistry, eventBus, canvas, styles) {
function getMarker (line 36757) | function getMarker(node, markerType, parentNode) {
function referenceToId (line 36771) | function referenceToId(reference) {
function idToReference (line 36782) | function idToReference(id) {
function canHaveMarker (line 36793) | function canHaveMarker(node) {
function Create (line 36837) | function Create(
function ensureConstraints$2 (line 37137) | function ensureConstraints$2(event) {
function isSingleShape (line 37162) | function isSingleShape(elements) {
function CreatePreview (line 37183) | function CreatePreview(
function Clipboard (line 37291) | function Clipboard() {}
function Mouse (line 37328) | function Mouse(eventBus) {
function createMoveEvent (line 37358) | function createMoveEvent(x, y) {
function CopyPaste (line 37449) | function CopyPaste(
function canCopy (line 37811) | function canCopy(element, elements) {
function addElementData (line 37818) | function addElementData(element, depth) {
function removeElementData (line 37846) | function removeElementData(elementData, elementsData) {
function addRelatedElements (line 37869) | function addRelatedElements(elements) {
function isAttacher$2 (line 37954) | function isAttacher$2(element) {
function copyWaypoints$1 (line 37958) | function copyWaypoints$1(element) {
function copyWaypoint$1 (line 37971) | function copyWaypoint$1(waypoint) {
function removeElement (line 37975) | function removeElement(element, elements) {
function copyProperties$1 (line 38005) | function copyProperties$1(source, target, properties) {
function BpmnCopyPaste (line 38026) | function BpmnCopyPaste(bpmnFactory, eventBus, moddleCopy) {
function ModdleCopy (line 38204) | function ModdleCopy(eventBus, bpmnFactory, moddle) {
function getPropertyNames (line 38426) | function getPropertyNames(descriptor, keepDefaultProperties) {
function is (line 38437) | function is(element, type) {
function Replace (line 38465) | function Replace(modeling, eventBus) {
function ReplaceSelectionBehavior (line 38536) | function ReplaceSelectionBehavior(selection, eventBus) {
function copyProperties (line 38595) | function copyProperties(source, target, properties) {
function shouldToggleCollapsed (line 38619) | function shouldToggleCollapsed(element, targetElement) {
function BpmnReplace (line 38657) | function BpmnReplace(
function isSubProcess (line 38881) | function isSubProcess(businessObject) {
function hasEventDefinition$1 (line 38891) | function hasEventDefinition$1(element, type) {
function intersection (line 38907) | function intersection(a, b) {
function isDifferentType (line 38938) | function isDifferentType(element) {
function ReplaceMenuProvider (line 39906) | function ReplaceMenuProvider(
function toggleLoopEntry (line 40311) | function toggleLoopEntry(event, entry) {
function toggleIsCollection (line 40392) | function toggleIsCollection(event, entry) {
function toggleParticipantMultiplicity (line 40424) | function toggleParticipantMultiplicity(event, entry) {
function substractTRBL (line 40521) | function substractTRBL(trblA, trblB) {
function resizeBounds$1 (line 40539) | function resizeBounds$1(bounds, direction, delta) {
function resizeTRBL (line 40577) | function resizeTRBL(bounds, resize) {
function applyConstraints (line 40587) | function applyConstraints(attr, trbl, resizeConstraints) {
function ensureConstraints$1 (line 40604) | function ensureConstraints$1(currentBounds, resizeConstraints) {
function getMinResizeBounds (line 40621) | function getMinResizeBounds(direction, currentBounds, minDimensions, chi...
function asPadding (line 40644) | function asPadding(mayBePadding, defaultValue) {
function addPadding$1 (line 40652) | function addPadding$1(bbox, padding) {
function isBBoxChild (line 40682) | function isBBoxChild(element) {
function computeChildrenBBox (line 40706) | function computeChildrenBBox(shapeOrChildren, padding) {
function getTRBLResize (line 40735) | function getTRBLResize(oldBounds, newBounds) {
function collectLanes (line 40757) | function collectLanes(shape, collectedShapes) {
function getChildLanes (line 40780) | function getChildLanes(shape) {
function getLanesRoot (line 40794) | function getLanesRoot(shape) {
function computeLanesResize (line 40812) | function computeLanesResize(shape, newBounds) {
function ContextPadProvider (line 40916) | function ContextPadProvider(
function startConnect (line 41046) | function startConnect(event, element) {
function removeElement (line 41050) | function removeElement(e, element) {
function getReplaceMenuPosition (line 41054) | function getReplaceMenuPosition(element) {
function appendAction (line 41080) | function appendAction(type, className, title, options) {
function splitLaneHandler (line 41114) | function splitLaneHandler(count) {
function isEventType (line 41407) | function isEventType(businessObject, type, eventDefinitionType) {
function includes$7 (line 41422) | function includes$7(array, item) {
function DistributeElements$1 (line 41474) | function DistributeElements$1(modeling, rules) {
function BpmnDistributeElements (line 41677) | function BpmnDistributeElements(eventBus) {
function DistributeElementsMenuProvider (line 41757) | function DistributeElementsMenuProvider(
function EditorActions (line 41866) | function EditorActions(eventBus, injector) {
function error (line 42095) | function error(action, message) {
function BpmnEditorActions (line 42116) | function BpmnEditorActions(injector) {
function BpmnGridSnapping (line 42297) | function BpmnGridSnapping(eventBus) {
function quantize (line 42323) | function quantize(value, quantum, fn) {
function GridSnapping (line 42347) | function GridSnapping(elementRegistry, eventBus, config) {
function getSnapConstraints (line 42513) | function getSnapConstraints(event, axis) {
function getSnapOffset (line 42603) | function getSnapOffset(event, axis, elementRegistry) {
function isHorizontal$3 (line 42657) | function isHorizontal$3(axis) {
function isNorth (line 42661) | function isNorth(direction) {
function isWest (line 42665) | function isWest(direction) {
function ResizeBehavior$1 (line 42684) | function ResizeBehavior$1(eventBus, gridSnapping) {
function SpaceToolBehavior$1 (line 42865) | function SpaceToolBehavior$1(eventBus, gridSnapping) {
function GridSnappingAutoPlaceBehavior (line 42934) | function GridSnappingAutoPlaceBehavior(eventBus, gridSnapping) {
function isHorizontal$2 (line 42987) | function isHorizontal$2(axis) {
function GridSnappingParticipantBehavior (line 43004) | function GridSnappingParticipantBehavior(canvas, eventBus, gridSnapping) {
function GridSnappingLayoutConnectionBehavior (line 43054) | function GridSnappingLayoutConnectionBehavior(eventBus, gridSnapping, mo...
function hasMiddleSegments (line 43124) | function hasMiddleSegments(waypoints) {
function horizontallyAligned (line 43135) | function horizontallyAligned(aligned) {
function verticallyAligned (line 43146) | function verticallyAligned(aligned) {
function snapSegment (line 43157) | function snapSegment(gridSnapping, segmentStart, segmentEnd) {
function BpmnInteractionEvents (line 43221) | function BpmnInteractionEvents(eventBus, interactionEvents) {
function BpmnKeyboardBindings (line 43359) | function BpmnKeyboardBindings(injector) {
function addListener (line 43388) | function addListener(action, fn) {
function KeyboardMoveSelection (line 43604) | function KeyboardMoveSelection(
function Resize (line 43751) | function Resize(eventBus, rules, modeling, dragging) {
function boundsChanged (line 43932) | function boundsChanged(shape, newBounds) {
function getReferencePoint$1 (line 43939) | function getReferencePoint$1(shape, direction) {
function getCursor (line 43963) | function getCursor(direction) {
function ResizePreview (line 43995) | function ResizePreview(eventBus, canvas, previewSupport) {
function ResizeHandles (line 44089) | function ResizeHandles(eventBus, canvas, selection, resize) {
function startResize (line 44123) | function startResize(event) {
function getHandleOffset (line 44229) | function getHandleOffset(direction) {
function LabelEditingProvider (line 44304) | function LabelEditingProvider(
function isCollapsedSubProcess (line 44691) | function isCollapsedSubProcess(element) {
function isExpandedSubProcess$1 (line 44695) | function isExpandedSubProcess$1(element) {
function isCollapsedPool (line 44699) | function isCollapsedPool(element) {
function isExpandedPool (line 44703) | function isExpandedPool(element) {
function isEmptyText$1 (line 44707) | function isEmptyText$1(label) {
function LabelEditingPreview (line 44725) | function LabelEditingPreview(eventBus, canvas, pathMap) {
function getStrokeColor (line 44835) | function getStrokeColor(element, defaultColor) {
function AdaptiveLabelPositioningBehavior (line 44882) | function AdaptiveLabelPositioningBehavior(eventBus, modeling) {
function getTakenHostAlignments (line 45024) | function getTakenHostAlignments(element) {
function getTakenConnectionAlignments (line 45055) | function getTakenConnectionAlignments(element) {
function getOptimalPosition (line 45081) | function getOptimalPosition(element) {
function getApproximateOrientation (line 45114) | function getApproximateOrientation(p0, p1) {
function isAligned (line 45118) | function isAligned(orientation) {
function AppendBehavior (line 45126) | function AppendBehavior(eventBus) {
function AssociationBehavior (line 45169) | function AssociationBehavior(injector, modeling) {
function AttachEventBehavior (line 45207) | function AttachEventBehavior(bpmnReplace, injector) {
function getEventDefinition$1 (line 45278) | function getEventDefinition$1(element) {
function shouldReplace$1 (line 45285) | function shouldReplace$1(shape, host) {
function BoundaryEventBehavior (line 45301) | function BoundaryEventBehavior(eventBus, modeling) {
function CreateBehavior (line 45362) | function CreateBehavior(injector) {
function CreateDataObjectBehavior (line 45393) | function CreateDataObjectBehavior(eventBus, bpmnFactory) {
function CreateParticipantBehavior (line 45442) | function CreateParticipantBehavior(canvas, eventBus, modeling) {
function getParticipantBounds (line 45607) | function getParticipantBounds(shape, childrenBBox) {
function getParticipantCreateConstraints (line 45624) | function getParticipantCreateConstraints(shape, childrenBBox) {
function findParticipant (line 45635) | function findParticipant(elements) {
function DataInputAssociationBehavior (line 45661) | function DataInputAssociationBehavior(eventBus, bpmnFactory) {
function ifDataInputAssociation (line 45776) | function ifDataInputAssociation(fn) {
function UpdateSemanticParentHandler (line 45799) | function UpdateSemanticParentHandler(bpmnUpdater) {
function DataStoreBehavior (line 45854) | function DataStoreBehavior(
function isDescendant (line 46023) | function isDescendant(descendant, ancestor) {
function getAncestor (line 46038) | function getAncestor(element, type) {
function DeleteLaneBehavior (line 46063) | function DeleteLaneBehavior(eventBus, spaceTool) {
function DetachEventBehavior (line 46168) | function DetachEventBehavior(bpmnReplace, injector) {
function getEventDefinition (line 46231) | function getEventDefinition(element) {
function shouldReplace (line 46238) | function shouldReplace(shape, host) {
function includes$6 (line 46242) | function includes$6(array, item) {
function DropOnFlowBehavior (line 46257) | function DropOnFlowBehavior(eventBus, bpmnRules, modeling) {
function isPointInsideBBox (line 46436) | function isPointInsideBBox(bbox, point) {
function copy (line 46446) | function copy(obj) {
function EventBasedGatewayBehavior (line 46459) | function EventBasedGatewayBehavior(eventBus, modeling) {
function isSequenceFlow (line 46546) | function isSequenceFlow(connection) {
function FixHoverBehavior (line 46567) | function FixHoverBehavior(elementRegistry, eventBus, canvas) {
function createCategory (line 46681) | function createCategory(bpmnFactory) {
function createCategoryValue (line 46692) | function createCategoryValue(bpmnFactory) {
function linkCategoryValue (line 46705) | function linkCategoryValue(categoryValue, category, definitions) {
function unlinkCategoryValue (line 46722) | function unlinkCategoryValue(categoryValue) {
function unlinkCategory (line 46740) | function unlinkCategory(category) {
function GroupBehavior (line 46778) | function GroupBehavior(
function lineIntersect (line 47082) | function lineIntersect(l1s, l1e, l2s, l2e) {
function ImportDockingFix (line 47118) | function ImportDockingFix(eventBus) {
function getDistance$1 (line 47184) | function getDistance$1(p1, p2) {
function IsHorizontalFix (line 47198) | function IsHorizontalFix(eventBus) {
function sq (line 47249) | function sq(n) {
function getDistance (line 47261) | function getDistance(p1, p2) {
function getAttachment (line 47291) | function getAttachment(point, line) {
function getCircleSegmentIntersections (line 47370) | function getCircleSegmentIntersections(s1, s2, cc, cr) {
function isPointInSegment (line 47423) | function isPointInSegment(p, segmentStart, segmentEnd) {
function fenced (line 47430) | function fenced(n, rangeStart, rangeEnd) {
function mid$1 (line 47449) | function mid$1(p1, p2) {
function pointsEqual (line 47459) | function pointsEqual(p1, p2) {
function findNewLineStartIndex (line 47499) | function findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, h...
function getAnchorPointAdjustment (line 47590) | function getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, ...
function relativePositionMidWaypoint (line 47685) | function relativePositionMidWaypoint(waypoints, idx) {
function getAngleDelta (line 47695) | function getAngleDelta(l1, l2) {
function getLine (line 47701) | function getLine(waypoints, idx) {
function getRelativeFootPosition (line 47705) | function getRelativeFootPosition(line, foot) {
function getLabelAdjustment (line 47724) | function getLabelAdjustment(label, newWaypoints, oldWaypoints, hints) {
function getNewAttachPoint (line 47746) | function getNewAttachPoint(point, oldBounds, newBounds) {
function getNewAttachShapeDelta (line 47773) | function getNewAttachShapeDelta(shape, oldBounds, newBounds) {
function getStickyPositionDelta (line 47801) | function getStickyPositionDelta(oldShapeCenter, oldBounds, newBounds) {
function isMoved (line 47856) | function isMoved(oldTRBL, newTRBL) {
function isHorizontallyMoved (line 47860) | function isHorizontallyMoved(oldTRBL, newTRBL) {
function isVerticallyMoved (line 47864) | function isVerticallyMoved(oldTRBL, newTRBL) {
function LabelBehavior (line 47893) | function LabelBehavior(
function getReferencePointDelta (line 48087) | function getReferencePointDelta(referencePoint, oldBounds, newBounds) {
function getReferencePoint (line 48103) | function getReferencePoint(point, lines) {
function asEdges (line 48121) | function asEdges(bounds) {
function getNearestLine (line 48173) | function getNearestLine(point, lines) {
function getConnectionAdjustment (line 48203) | function getConnectionAdjustment(position, newWaypoints, oldWaypoints, h...
function LayoutConnectionBehavior (line 48219) | function LayoutConnectionBehavior(eventBus, modeling) {
function getResizedSourceAnchor (line 48333) | function getResizedSourceAnchor(connection, shape, oldBounds) {
function getResizedTargetAnchor (line 48348) | function getResizedTargetAnchor(connection, shape, oldBounds) {
function getMovedSourceAnchor (line 48363) | function getMovedSourceAnchor(connection, source, moveDelta) {
function getMovedTargetAnchor (line 48373) | function getMovedTargetAnchor(connection, target, moveDelta) {
function subtract (line 48385) | function subtract(bounds, delta) {
function safeGetWaypoints (line 48402) | function safeGetWaypoints(connection) {
function getWaypointsInsideBounds (line 48413) | function getWaypointsInsideBounds(waypoints, bounds) {
function isInsideBounds (line 48427) | function isInsideBounds(point, bounds) {
function getOriginal (line 48431) | function getOriginal(point) {
function MessageFlowBehavior (line 48446) | function MessageFlowBehavior(eventBus, modeling) {
function isParticipantCollapse (line 48481) | function isParticipantCollapse(oldShape, newShape) {
function getMessageFlows (line 48488) | function getMessageFlows(parent) {
function ModelingFeedback (line 48531) | function ModelingFeedback(eventBus, tooltips, translate) {
function RemoveEmbeddedLabelBoundsBehavior (line 48575) | function RemoveEmbeddedLabelBoundsBehavior(eventBus, modeling) {
function RemoveElementBehavior (line 48611) | function RemoveElementBehavior(eventBus, bpmnRules, modeling) {
function getDocking$1 (line 48659) | function getDocking$1(point) {
function getNewWaypoints (line 48664) | function getNewWaypoints(inWaypoints, outWaypoints) {
function RemoveParticipantBehavior (line 48696) | function RemoveParticipantBehavior(eventBus, modeling) {
function ReplaceConnectionBehavior (line 48748) | function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules, inject...
function ReplaceElementBehaviour (line 48939) | function ReplaceElementBehaviour(
function ResizeBehavior (line 49099) | function ResizeBehavior(eventBus) {
function addToTrbl (line 49132) | function addToTrbl(trbl, attr, value, choice) {
function addMin (line 49141) | function addMin(trbl, attr, value) {
function addMax (line 49145) | function addMax(trbl, attr, value) {
function getParticipantResizeConstraints (line 49164) | function getParticipantResizeConstraints(laneShape, resizeDirection, bal...
function ResizeLaneBehavior (line 49271) | function ResizeLaneBehavior(eventBus, modeling) {
function RootElementReferenceBehavior (line 49343) | function RootElementReferenceBehavior(
function hasAnyEventDefinition (line 49494) | function hasAnyEventDefinition(element, types) {
function SpaceToolBehavior (line 49515) | function SpaceToolBehavior(eventBus) {
function isHorizontal$1 (line 49559) | function isHorizontal$1(axis) {
function getParticipantMinHeight (line 49571) | function getParticipantMinHeight(participant, start) {
function hasChildLanes (line 49583) | function hasChildLanes(element) {
function getLanesMinHeight (line 49587) | function getLanesMinHeight(participant, resizeStart) {
function findResizedLane (line 49607) | function findResizedLane(lanes, resizeStart) {
function SubProcessPlaneBehavior (line 49662) | function SubProcessPlaneBehavior(
function SubProcessStartEventBehavior (line 50207) | function SubProcessStartEventBehavior(injector, modeling) {
function getStartEventPosition (line 50237) | function getStartEventPosition(shape) {
function ToggleCollapseConnectionBehaviour (line 50258) | function ToggleCollapseConnectionBehaviour(
function ToggleElementCollapseBehaviour (line 50329) | function ToggleElementCollapseBehaviour(
function filterVisible (line 50455) | function filterVisible(elements) {
function UnclaimIdBehavior (line 50477) | function UnclaimIdBehavior(canvas, injector, moddle, modeling) {
function DeleteSequenceFlowBehavior (line 50531) | function DeleteSequenceFlowBehavior(eventBus, modeling) {
function isDefaultFlow (line 50559) | function isDefaultFlow(connection, source) {
function UpdateFlowNodeRefsBehavior (line 50588) | function UpdateFlowNodeRefsBehavior(eventBus, modeling, translate) {
function UpdateContext (line 50699) | function UpdateContext() {
function getBoundaryAttachment (line 50821) | function getBoundaryAttachment(position, targetBounds) {
function BpmnRules (line 50859) | function BpmnRules(eventBus) {
function canStartConnection (line 51027) | function canStartConnection(element) {
function nonExistingOrLabel (line 51047) | function nonExistingOrLabel(element) {
function isSame$1 (line 51051) | function isSame$1(a, b) {
function getOrganizationalParent (line 51060) | function getOrganizationalParent(element) {
function isTextAnnotation (line 51082) | function isTextAnnotation(element) {
function isGroup (line 51091) | function isGroup(element) {
function isCompensationBoundary (line 51100) | function isCompensationBoundary(element) {
function isForCompensation (line 51110) | function isForCompensation(element) {
function isSameOrganization (line 51120) | function isSameOrganization(a, b) {
function isMessageFlowSource (line 51132) | function isMessageFlowSource(element) {
function isMessageFlowTarget (line 51149) | function isMessageFlowTarget(element) {
function getScopeParent (line 51169) | function getScopeParent(element) {
function isSameScope (line 51193) | function isSameScope(a, b) {
function hasEventDefinition (line 51206) | function hasEventDefinition(element, eventDefinition) {
function hasEventDefinitionOrNone (line 51220) | function hasEventDefinitionOrNone(element, eventDefinition) {
function isSequenceFlowSource (line 51233) | function isSequenceFlowSource(element) {
function isSequenceFlowTarget (line 51251) | function isSequenceFlowTarget(element) {
function isEventBasedTarget (line 51269) | function isEventBasedTarget(element) {
function getParents (line 51287) | function getParents(element) {
function isParent (line 51308) | function isParent(possibleParent, element) {
function canConnect (line 51321) | function canConnect(source, target, connection) {
function canDrop (line 51369) | function canDrop(element, target) {
function isDroppableBoundaryEvent (line 51450) | function isDroppableBoundaryEvent(event) {
function isBoundaryEvent (line 51461) | function isBoundaryEvent(element) {
function isLane (line 51470) | function isLane(element) {
function isBoundaryCandidate (line 51481) | function isBoundaryCandidate(element) {
function hasNoEventDefinition (line 51501) | function hasNoEventDefinition(element) {
function hasCommonBoundaryIntermediateEventDefinition (line 51512) | function hasCommonBoundaryIntermediateEventDefinition(element) {
function hasOneOfEventDefinitions (line 51527) | function hasOneOfEventDefinitions(element, eventDefinitions) {
function isReceiveTaskAfterEventBasedGateway (line 51538) | function isReceiveTaskAfterEventBasedGateway(element) {
function canAttach (line 51557) | function canAttach(elements, target, source, position) {
function canReplace (line 51626) | function canReplace(elements, target, position) {
function canMove (line 51712) | function canMove(elements, target) {
function canCreate (line 51737) | function canCreate(shape, target, source, position) {
function canResize (line 51766) | function canResize(shape, newBounds) {
function isOneTextAnnotation (line 51802) | function isOneTextAnnotation(source, target) {
function canConnectAssociation (line 51819) | function canConnectAssociation(source, target) {
function canConnectMessageFlow (line 51847) | function canConnectMessageFlow(source, target) {
function canConnectSequenceFlow (line 51868) | function canConnectSequenceFlow(source, target) {
function canConnectDataAssociation (line 51881) | function canConnectDataAssociation(source, target) {
function canInsert (line 51903) | function canInsert(shape, connection, position) {
function includes$5 (line 51936) | function includes$5(elements, element) {
function canCopy (line 51946) | function canCopy(elements, element) {
function getRootElement (line 51963) | function getRootElement(element) {
function BpmnDiOrdering (line 51986) | function BpmnDiOrdering(eventBus, canvas) {
function OrderingProvider (line 52057) | function OrderingProvider(eventBus) {
function BpmnOrderingProvider (line 52132) | function BpmnOrderingProvider(eventBus, canvas, translate) {
function ToolManager (line 52318) | function ToolManager(eventBus, dragging) {
function isPaletteClick (line 52422) | function isPaletteClick(event) {
function getDirection (line 52457) | function getDirection(axis, delta) {
function getWaypointsUpdatingConnections (line 52491) | function getWaypointsUpdatingConnections(movingShapes, resizingShapes) {
function includes$4 (line 52517) | function includes$4(array, item) {
function resizeBounds (line 52530) | function resizeBounds(bounds, direction, delta) {
function SpaceTool (line 52628) | function SpaceTool(
function moveShape (line 52835) | function moveShape(shape) {
function resizeShape (line 52848) | function resizeShape(shape) {
function addPadding (line 52963) | function addPadding(trbl) {
function ensureConstraints (line 52972) | function ensureConstraints(event) {
function getSpaceToolConstraints (line 53011) | function getSpaceToolConstraints(elements, axis, direction, start, minDi...
function includes$3 (line 53165) | function includes$3(array, item) {
function isAttacher$1 (line 53169) | function isAttacher$1(element) {
function SpaceToolPreview (line 53196) | function SpaceToolPreview(
function BpmnSpaceTool (line 53489) | function BpmnSpaceTool(injector) {
function CommandStack (line 53627) | function CommandStack(eventBus, injector) {
function createRoot (line 54102) | function createRoot(parentNode) {
function setPosition (line 54119) | function setPosition(el, x, y) {
function setVisible (line 54123) | function setVisible(el, visible) {
function Tooltips (line 54169) | function Tooltips(eventBus, canvas) {
function updateViewbox (line 54444) | function updateViewbox(viewbox) {
function saveClear (line 54484) | function saveClear(collection, removeFn) {
function LabelSupport (line 54523) | function LabelSupport(injector, eventBus, modeling) {
function removeLabels (line 54656) | function removeLabels(elements) {
function AttachSupport (line 54706) | function AttachSupport(injector, eventBus, canvas, rules, modeling) {
function getAttachers (line 54946) | function getAttachers(shapes) {
function addAttached (line 54959) | function addAttached(elements) {
function removeAttached (line 54974) | function removeAttached(elements) {
function isAttacher (line 54993) | function isAttacher(shape) {
function includes$2 (line 54997) | function includes$2(array, item) {
function BpmnFactory (line 55024) | function BpmnFactory(moddle) {
function BpmnUpdater (line 55201) | function BpmnUpdater(
function getDefinitions (line 55656) | function getDefinitions(element) {
function ifBpmn (line 55959) | function ifBpmn(fn) {
function getEmbeddedLabelBounds (line 55979) | function getEmbeddedLabelBounds(shape) {
function ElementFactory (line 56030) | function ElementFactory(bpmnFactory, moddle, translate) {
function applyAttributes (line 56324) | function applyAttributes(element, attrs, attributeNames) {
function applyAttribute (line 56342) | function applyAttribute(element, attrs, attributeName) {
function isModdleDi (line 56357) | function isModdleDi(element) {
function AlignElements (line 56377) | function AlignElements(modeling, canvas) {
function AppendShapeHandler (line 56441) | function AppendShapeHandler(modeling) {
function existsConnection (line 56496) | function existsConnection(source, target) {
function CreateConnectionHandler (line 56518) | function CreateConnectionHandler(canvas, layouter) {
function CreateElementsHandler (line 56590) | function CreateElementsHandler(modeling) {
function CreateShapeHandler (line 56711) | function CreateShapeHandler(canvas) {
function CreateLabelHandler (line 56789) | function CreateLabelHandler(canvas) {
function ensureValidDimensions (line 56838) | function ensureValidDimensions(label) {
function DeleteConnectionHandler (line 56856) | function DeleteConnectionHandler(canvas, modeling) {
function DeleteElementsHandler (line 56941) | function DeleteElementsHandler(modeling, elementRegistry) {
function DeleteShapeHandler (line 56985) | function DeleteShapeHandler(canvas, modeling) {
function DistributeElements (line 57074) | function DistributeElements(modeling) {
function updateRange (line 57092) | function updateRange(group, element) {
function center (line 57097) | function center(element) {
function lastIdx (line 57101) | function lastIdx(arr) {
function rangeDiff (line 57105) | function rangeDiff(range) {
function centerElement (line 57109) | function centerElement(refCenter, element) {
function LayoutConnectionHandler (line 57231) | function LayoutConnectionHandler(layouter, canvas) {
function MoveConnectionHandler (line 57268) | function MoveConnectionHandler() { }
function MoveClosure (line 57341) | function MoveClosure() {
function MoveHelper (line 57409) | function MoveHelper(modeling) {
function MoveElementsHandler (line 57503) | function MoveElementsHandler(modeling) {
function MoveShapeHandler (line 57541) | function MoveShapeHandler(modeling) {
function ReconnectConnectionHandler (line 57646) | function ReconnectConnectionHandler(modeling) {
function getDocking (line 57743) | function getDocking(point) {
function ReplaceShapeHandler (line 57764) | function ReplaceShapeHandler(modeling, rules) {
function canReconnect (line 57793) | function canReconnect(source, target, connection) {
function ResizeShapeHandler (line 57903) | function ResizeShapeHandler(modeling) {
function SpaceToolHandler (line 58008) | function SpaceToolHandler(modeling) {
function copyWaypoint (line 58145) | function copyWaypoint(waypoint) {
function copyWaypoints (line 58149) | function copyWaypoints(connection) {
function getAxisFromDirection (line 58162) | function getAxisFromDirection(direction) {
function shouldMoveWaypoint (line 58175) | function shouldMoveWaypoint(waypoint, start, direction) {
function includes$1 (line 58185) | function includes$1(array, item) {
function getBounds (line 58189) | function getBounds(shape) {
function ToggleShapeCollapseHandler (line 58210) | function ToggleShapeCollapseHandler(modeling) {
function getElementsVisibilityRecursive (line 58261) | function getElementsVisibilityRecursive(elements) {
function setHiddenRecursive (line 58277) | function setHiddenRecursive(elements, newHidden) {
function restoreVisibilityRecursive (line 58292) | function restoreVisibilityRecursive(elements, lastState) {
function UpdateAttachmentHandler (line 58316) | function UpdateAttachmentHandler(modeling) {
function removeAttacher (line 58360) | function removeAttacher(host, attacher) {
function addAttacher (line 58366) | function addAttacher(host, attacher, idx) {
function UpdateWaypointsHandler (line 58381) | function UpdateWaypointsHandler() { }
function Modeling$1 (line 58474) | function Modeling$1(eventBus, elementFactory, commandStack) {
function UpdateModdlePropertiesHandler (line 59132) | function UpdateModdlePropertiesHandler(elementRegistry) {
function getModdleProperties (line 59193) | function getModdleProperties(moddleElement, propertyNames) {
function setModdleProperties (line 59200) | function setModdleProperties(moddleElement, properties) {
function getAllDataObjectReferences (line 59206) | function getAllDataObjectReferences(dataObject, elementRegistry) {
function UpdatePropertiesHandler (line 59254) | function UpdatePropertiesHandler(
function isIdChange (line 59387) | function isIdChange(properties, businessObject) {
function getProperties (line 59392) | function getProperties(element, properties) {
function getDiProperties (line 59412) | function getDiProperties(di, propertyNames) {
function setProperties (line 59421) | function setProperties(element, properties) {
function setDiProperties (line 59440) | function setDiProperties(di, properties) {
function unwrapBusinessObjects (line 59457) | function unwrapBusinessObjects(properties) {
function UpdateCanvasRootHandler (line 59483) | function UpdateCanvasRootHandler(canvas, modeling) {
function AddLaneHandler (line 59580) | function AddLaneHandler(modeling, spaceTool) {
function SplitLaneHandler (line 59676) | function SplitLaneHandler(modeling, translate) {
function ResizeLaneHandler (line 59769) | function ResizeLaneHandler(modeling, spaceTool) {
function UpdateFlowNodeRefsHandler (line 59898) | function UpdateFlowNodeRefsHandler(elementRegistry) {
function isInLaneShape (line 59926) | function isInLaneShape(element, laneShape) {
function addFlowNodeShape (line 59941) | function addFlowNodeShape(flowNodeShape) {
function getAllLaneShapes (line 59948) | function getAllLaneShapes(flowNodeShape) {
function getNewLanes (line 59959) | function getNewLanes(flowNodeShape) {
function IdClaimHandler (line 60091) | function IdClaimHandler(moddle) {
function SetColorHandler (line 60149) | function SetColorHandler(commandStack) {
function colorToHex (line 60248) | function colorToHex(color) {
function ensureLegacySupport (line 60266) | function ensureLegacySupport(di) {
function UpdateLabelHandler (line 60296) | function UpdateLabelHandler(modeling, textRenderer, bpmnFactory) {
function isEmptyText (line 60407) | function isEmptyText(label) {
function Modeling (line 60452) | function Modeling(
function BaseLayouter (line 60723) | function BaseLayouter() {}
function needsTurn (line 60765) | function needsTurn(orientation, startDirection) {
function canLayoutStraight (line 60776) | function canLayoutStraight(direction, targetOrientation) {
function getSegmentBendpoints (line 60787) | function getSegmentBendpoints(a, b, directions) {
function getStartSegment (line 60845) | function getStartSegment(a, b, directions) {
function getEndSegment (line 60849) | function getEndSegment(a, b, directions) {
function getMidSegment (line 60859) | function getMidSegment(startSegment, endSegment) {
function invertDirections (line 60886) | function invertDirections(directions) {
function getSimpleBendpoints (line 60893) | function getSimpleBendpoints(a, b, directions) {
function getBendpoints (line 60955) | function getBendpoints(a, b, directions) {
function connectPoints (line 60996) | function connectPoints(a, b, directions) {
function connectRectangles (line 61022) | function connectRectangles(source, target, start, end, hints) {
function repairConnection (line 61064) | function repairConnection(source, target, start, end, waypoints, hints) {
function inRange (line 61115) | function inRange(a, start, end) {
function isInRange (line 61119) | function isInRange(axis, a, b) {
function tryLayoutStraight (line 61140) | function tryLayoutStraight(source, target, start, end, hints) {
function tryRepairConnectionStart (line 61220) | function tryRepairConnectionStart(moved, other, newDocking, points) {
function tryRepairConnectionEnd (line 61234) | function tryRepairConnectionEnd(moved, other, newDocking, points) {
function _tryRepairConnectionSide (line 61252) | function _tryRepairConnectionSide(moved, other, newDocking, points) {
function getDirections (line 61365) | function getDirections(orientation, defaultLayout) {
function isValidDirections (line 61393) | function isValidDirections(directions) {
function isExplicitDirections (line 61397) | function isExplicitDirections(directions) {
function invertOrientation (line 61401) | function invertOrientation(orientation) {
function getDockingPoint (line 61414) | function getDockingPoint(point, rectangle, dockingDirection, targetOrien...
function withoutRedundantPoints (line 61468) | function withoutRedundantPoints(waypoints) {
function BpmnLayouter (line 61520) | function BpmnLayouter() {}
function getAttachOrientation (line 61617) | function getAttachOrientation(attachedElement) {
function getMessageFlowManhattanOptions (line 61623) | function getMessageFlowManhattanOptions(source, target) {
function getMessageFlowPreserveDocking (line 61630) | function getMessageFlowPreserveDocking(source, target) {
function getSubProcessManhattanOptions (line 61662) | function getSubProcessManhattanOptions(source) {
function getSubProcessPreserveDocking (line 61669) | function getSubProcessPreserveDocking(source) {
function getConnectionDocking (line 61673) | function getConnectionDocking(point, shape) {
function isCompensationAssociation (line 61677) | function isCompensationAssociation(source, target) {
function isExpandedSubProcess (line 61683) | function isExpandedSubProcess(element) {
function isSame (line 61687) | function isSame(a, b) {
function isAnyOrientation (line 61691) | function isAnyOrientation(orientation, orientations) {
function getHorizontalOrientation (line 61695) | function getHorizontalOrientation(orientation) {
function getVerticalOrientation (line 61701) | function getVerticalOrientation(orientation) {
function isOppositeOrientation (line 61707) | function isOppositeOrientation(a, b) {
function isOppositeHorizontalOrientation (line 61711) | function isOppositeHorizontalOrientation(a, b) {
function isOppositeVerticalOrientation (line 61719) | function isOppositeVerticalOrientation(a, b) {
function isHorizontalOrientation (line 61727) | function isHorizontalOrientation(orientation) {
function getLoopPreferredLayout (line 61731) | function getLoopPreferredLayout(source, connection) {
function getBoundaryEventPreferredLayouts (line 61747) | function getBoundaryEventPreferredLayouts(source, target, end) {
function getBoundaryEventLoopLayout (line 61776) | function getBoundaryEventLoopLayout(attachOrientation, attachedToSide, s...
function shouldConnectToSameSide (line 61794) | function shouldConnectToSameSide(axis, source, target, end) {
function areCloseOnAxis (line 61807) | function areCloseOnAxis(axis, a, b, threshold) {
function getBoundaryEventSourceLayout (line 61811) | function getBoundaryEventSourceLayout(attachOrientation, targetOrientati...
function getBoundaryEventTargetLayout (line 61833) | function getBoundaryEventTargetLayout(attachOrientation, targetOrientati...
function dockingToPoint (line 61886) | function dockingToPoint(docking) {
function CroppingConnectionDocking (line 61901) | function CroppingConnectionDocking(elementRegistry, graphicsFactory) {
function mid (line 62019) | function mid(element) {
function MoveEvents (line 62035) | function MoveEvents(
function removeNested (line 62246) | function removeNested(elements) {
function MovePreview (line 62289) | function MovePreview(
function removeEdges (line 62472) | function removeEdges(elements) {
function haveDifferentParents (line 62490) | function haveDifferentParents(elements) {
function Palette (line 62540) | function Palette(eventBus, canvas) {
function addClasses (line 62976) | function addClasses(element, classNames) {
function addPaletteEntries (line 62986) | function addPaletteEntries(entries, provider) {
function LassoTool (line 63030) | function LassoTool(
function toBBox (line 63213) | function toBBox(event) {
function HandTool (line 63309) | function HandTool(
function isSpace (line 63455) | function isSpace(keyEvent) {
function GlobalConnect (line 63498) | function GlobalConnect(
function PaletteProvider (line 63656) | function PaletteProvider(
function createAction (line 63698) | function createAction(type, group, className, title, options) {
function createSubprocess (line 63724) | function createSubprocess(event) {
function createParticipant (line 63746) | function createParticipant(event) {
function BpmnReplacePreview (line 63881) | function BpmnReplacePreview(
function BpmnConnectSnapping (line 64023) | function BpmnConnectSnapping(eventBus) {
function snapToShape (line 64107) | function snapToShape(event, target, padding) {
function snapToTargetMid (line 64125) | function snapToTargetMid(event, target) {
function snapBoundaryEventLoop (line 64140) | function snapBoundaryEventLoop(event) {
function snapToPosition (line 64181) | function snapToPosition(event, position) {
function isType (line 64186) | function isType(attrs, type) {
function isAnyType (line 64190) | function isAnyType(attrs, types) {
function getDimensionForAxis (line 64202) | function getDimensionForAxis(axis, element) {
function getTargetBoundsPadding (line 64211) | function getTargetBoundsPadding(target) {
function isMid (line 64226) | function isMid(event, target, axis) {
function isReverse (line 64231) | function isReverse(context) {
function SnapContext (line 64253) | function SnapContext() {
function SnapPoints (line 64363) | function SnapPoints() {
function CreateMoveSnapping (line 64453) | function CreateMoveSnapping(elementRegistry, eventBus, snapping) {
function isHidden$1 (line 64624) | function isHidden$1(element) {
function BpmnCreateMoveSnapping (line 64650) | function BpmnCreateMoveSnapping(eventBus, injector) {
function snapBoundaryEvent (line 64801) | function snapBoundaryEvent(event, target) {
function areAll (line 64836) | function areAll(elements, type) {
function isContainer (line 64845) | function isContainer(element) {
function setSnappedIfConstrained (line 64856) | function setSnappedIfConstrained(event) {
function includes (line 64878) | function includes(array, value) {
function getDockingSnapOrigin (line 64882) | function getDockingSnapOrigin(docking, isMove, event) {
function ResizeSnapping (line 64908) | function ResizeSnapping(eventBus, snapping) {
function getSnapOrigin (line 65006) | function getSnapOrigin(shape, direction) {
function isAttached (line 65030) | function isAttached(element, host) {
function isHidden (line 65034) | function isHidden(element) {
function isHorizontal (line 65038) | function isHorizontal(direction) {
function isVertical (line 65042) | function isVertical(direction) {
function Snapping (line 65064) | function Snapping(canvas) {
function SearchPad (line 65245) | function SearchPad(canvas, eventBus, overlays, selection) {
function listen (line 65282) | function listen(el, selector, type, fn) {
function constructOverlay (line 65661) | function constructOverlay(box) {
function createInnerTextNode (line 65694) | function createInnerTextNode(parentNode, tokens, template) {
function createHtmlText (line 65709) | function createHtmlText(tokens) {
function BpmnSearchProvider (line 65783) | function BpmnSearchProvider(elementRegistry, searchPad, canvas) {
function hasMatched (line 65841) | function hasMatched(tokens) {
function matchAndSplit (line 65855) | function matchAndSplit(text, pattern) {
function Modeler (line 65993) | function Modeler(options) {
FILE: easyflow-flow-bpmn/static/plugins/bpmnjs/bpmn-navigated-viewer.development.js
function e (line 19) | function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{co...
function isUndefined$2 (line 34) | function isUndefined$2(obj) {
function isDefined (line 38) | function isDefined(obj) {
function isArray$2 (line 42) | function isArray$2(obj) {
function isObject (line 46) | function isObject(obj) {
function isNumber (line 50) | function isNumber(obj) {
function isFunction (line 59) | function isFunction(obj) {
function isString (line 71) | function isString(obj) {
function has$1 (line 83) | function has$1(target, key) {
function find (line 147) | function find(collection, matcher) {
function findIndex (line 175) | function findIndex(collection, matcher) {
function filter (line 202) | function filter(collection, matcher) {
function forEach$1 (line 228) | function forEach$1(collection, iterator) {
function reduce (line 266) | function reduce(collection, iterator, result) {
function every (line 285) | function every(collection, matcher) {
function some (line 302) | function some(collection, matcher) {
function map$1 (line 317) | function map$1(collection, fn) {
function matchPattern (line 346) | function matchPattern(pattern) {
function toMatcher (line 364) | function toMatcher(matcher) {
function identity$1 (line 371) | function identity$1(arg) {
function toNum$1 (line 375) | function toNum$1(arg) {
function debounce (line 401) | function debounce(fn, timeout) {
function bind$2 (line 474) | function bind$2(fn, target) {
function assign$1 (line 486) | function assign$1(target, ...others) {
function pick (line 501) | function pick(target, properties) {
function omit (line 528) | function omit(target, properties) {
function BaseRenderer (line 560) | function BaseRenderer(eventBus, renderPriority) {
function is$1 (line 651) | function is$1(element, type) {
function isAny (line 666) | function isAny(element, types) {
function getBusinessObject (line 679) | function getBusinessObject(element) {
function getDi (line 690) | function getDi(element) {
function isExpanded (line 705) | function isExpanded(element, di) {
function isEventSubProcess (line 733) | function isEventSubProcess(element) {
function isConnection (line 744) | function isConnection(value) {
function isLabelExternal (line 771) | function isLabelExternal(semantic) {
function getFlowLabelPosition (line 790) | function getFlowLabelPosition(waypoints) {
function getWaypointsMid (line 824) | function getWaypointsMid(waypoints) {
function getExternalLabelMid (line 844) | function getExternalLabelMid(element) {
function getExternalLabelBounds (line 871) | function getExternalLabelBounds(di, element) {
function getLabelAttr (line 908) | function getLabelAttr(semantic) {
function getCategoryValue (line 935) | function getCategoryValue(semantic) {
function getLabel (line 951) | function getLabel(element) {
function ensureImported (line 966) | function ensureImported(element, target) {
function appendTo (line 994) | function appendTo(element, target) {
function append (line 1010) | function append(target, node) {
function getAttribute (line 1086) | function getAttribute(node, name) {
function setAttribute (line 1094) | function setAttribute(node, name, value) {
function setAttributes (line 1112) | function setAttributes(node, attrs) {
function attr$1 (line 1131) | function attr$1(node, name, value) {
function classes$1 (line 1165) | function classes$1(el) {
function ClassList$1 (line 1169) | function ClassList$1(el) {
function remove$2 (line 1274) | function remove$2(element) {
function clear$1 (line 1294) | function clear$1(element) {
function parse$1 (line 1314) | function parse$1(svg) {
function parseDocument (line 1347) | function parseDocument(svg) {
function create$1 (line 1371) | function create$1(name, attrs) {
function getNode (line 1395) | function getNode() {
function extend$1 (line 1403) | function extend$1(object, props) {
function createMatrix (line 1424) | function createMatrix(a, b, c, d, e, f) {
function createTransform (line 1444) | function createTransform(matrix) {
function escape$1 (line 1466) | function escape$1(str, pattern) {
function serialize (line 1475) | function serialize(node, output) {
function set$1 (line 1535) | function set$1(element, svg) {
function get (line 1561) | function get(element) {
function isFragment (line 1573) | function isFragment(node) {
function innerSVG (line 1577) | function innerSVG(element, svg) {
function slice$1 (line 1594) | function slice$1(arr) {
function wrapMatrix (line 1602) | function wrapMatrix(transformList, transform) {
function setTransforms (line 1611) | function setTransforms(transformList, transforms) {
function transform$1 (line 1629) | function transform$1(node, transforms) {
function componentsToPath (line 1655) | function componentsToPath(elements) {
function move (line 1664) | function move(point) {
function lineTo (line 1673) | function lineTo(point) {
function curveTo (line 1684) | function curveTo(p1, p2, p3) {
function drawPath (line 1693) | function drawPath(waypoints, cornerRadius) {
function getPointAtLength (line 1735) | function getPointAtLength(start, end, length) {
function vectorLength (line 1750) | function vectorLength(x, y) {
function createLine (line 1761) | function createLine(points, attrs, radius) {
function updateLine (line 1787) | function updateLine(gfx, points) {
function isTypedEvent (line 1810) | function isTypedEvent(event, eventDefinitionType) {
function isThrowEvent (line 1823) | function isThrowEvent(event) {
function isCollection (line 1834) | function isCollection(element) {
function getFillColor (line 1849) | function getFillColor(element, defaultColor) {
function getStrokeColor (line 1861) | function getStrokeColor(element, defaultColor) {
function getLabelColor (line 1874) | function getLabelColor(element, defaultColor, defaultStrokeColor) {
function getCirclePath (line 1889) | function getCirclePath(shape) {
function getRoundRectPath (line 1912) | function getRoundRectPath(shape, borderRadius) {
function getDiamondPath (line 1940) | function getDiamondPath(shape) {
function getRectPath (line 1965) | function getRectPath(shape) {
function _mergeNamespaces$1 (line 1982) | function _mergeNamespaces$1(n, m) {
function isUndefined$1 (line 2008) | function isUndefined$1(obj) {
function isArray$1 (line 2012) | function isArray$1(obj) {
function has (line 2024) | function has(target, key) {
function forEach (line 2038) | function forEach(collection, iterator) {
function identity (line 2064) | function identity(arg) {
function toNum (line 2068) | function toNum(arg) {
function assign (line 2080) | function assign(element, ...styleSources) {
function attr (line 2104) | function attr(el, name, val) {
function classes (line 2142) | function classes(el) {
function ClassList (line 2153) | function ClassList(el) {
function clear (line 2261) | function clear(el) {
function matches (line 2279) | function matches(element, selector) {
function closest (line 2290) | function closest(element, selector, checkYourSelf) {
function detect (line 2310) | function detect () {
function bind (line 2379) | function bind(el, selector, type, fn, capture) {
function unbind (line 2402) | function unbind(el, type, fn, capture) {
function parse (line 2483) | function parse(html, doc) {
function query (line 2529) | function query(selector, el) {
function all (line 2535) | function all(selector, el) {
function remove$1 (line 2541) | function remove$1(el) {
function transform (line 2552) | function transform(gfx, x, y, angle, amount) {
function translate$1 (line 2571) | function translate$1(gfx, x, y) {
function rotate (line 2583) | function rotate(gfx, angle) {
function createCommonjsModule (line 2590) | function createCommonjsModule(fn, module) {
function Ids (line 2667) | function Ids(seed) {
function BpmnRenderer (line 2786) | function BpmnRenderer(
function parseAlign (line 4736) | function parseAlign(align) {
function parsePadding (line 4751) | function parsePadding(padding) {
function getTextBBox (line 4771) | function getTextBBox(text, fakeText) {
function layoutNext (line 4818) | function layoutNext(lines, maxWidth, fakeText) {
function fit (line 4847) | function fit(lines, fitLine, originalLine, textBBox) {
function semanticShorten (line 4873) | function semanticShorten(line, maxLength) {
function shortenLine (line 4917) | function shortenLine(line, width, maxWidth) {
function getHelperSvg (line 4936) | function getHelperSvg() {
function Text (line 4965) | function Text(config) {
function getLineHeight (line 5113) | function getLineHeight(style) {
function TextRenderer (line 5148) | function TextRenderer(config) {
function PathMap (line 5256) | function PathMap() {
function replacer (line 5710) | function replacer(all, key, obj) {
function format (line 5726) | function format(str, obj) {
function translate (line 5765) | function translate(template, replacements) {
function getDefaultExportFromCjs (line 5781) | function getDefaultExportFromCjs (x) {
function roundPoint (line 5790) | function roundPoint(point) {
function asTRBL (line 5806) | function asTRBL(bounds) {
function asBounds (line 5823) | function asBounds(trbl) {
function getBoundsMid (line 5840) | function getBoundsMid(bounds) {
function getConnectionMid (line 5855) | function getConnectionMid(connection) {
function getMid (line 5914) | function getMid(element) {
function distance (line 5924) | function distance(a, b) {
function elementToString (line 5928) | function elementToString(e) {
function elementData (line 5960) | function elementData(semantic, di, attrs) {
function getWaypoints (line 5969) | function getWaypoints(di, source, target) {
function notYetDrawn (line 5982) | function notYetDrawn(translate, semantic, refSemantic, property) {
function BpmnImporter (line 6001) | function BpmnImporter(
function isPointInsideBBox (line 6274) | function isPointInsideBBox(bbox, point) {
function isFrameElement$1 (line 6284) | function isFrameElement$1(semantic) {
function getOriginal (line 6311) | function getOriginal(event) {
function toPoint (line 6320) | function toPoint(event) {
function isMac (line 6336) | function isMac() {
function isButton (line 6346) | function isButton(event, button) {
function isPrimaryButton (line 6355) | function isPrimaryButton(event) {
function isAuxiliaryButton (line 6366) | function isAuxiliaryButton(event) {
function hasPrimaryModifier (line 6377) | function hasPrimaryModifier(event) {
function hasSecondaryModifier (line 6397) | function hasSecondaryModifier(event) {
function allowAll (line 6413) | function allowAll(event) { return true; }
function allowPrimaryAndAuxiliary (line 6415) | function allowPrimaryAndAuxiliary(event) {
function InteractionEvents (line 6445) | function InteractionEvents(eventBus, elementRegistry, styles) {
function getBBox (line 6913) | function getBBox(elements, stopRecursion) {
function getType (line 6968) | function getType(element) {
function isFrameElement (line 6986) | function isFrameElement(element) {
function Outline (line 7008) | function Outline(eventBus, styles) {
function Selection (line 7124) | function Selection(eventBus, canvas) {
function SelectionVisuals (line 7256) | function SelectionVisuals(canvas, eventBus, selection) {
function addSelectionOutlinePadding (line 7351) | function addSelectionOutlinePadding(bBox) {
function SelectionBehavior (line 7373) | function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {
function isShown (line 7475) | function isShown(element) {
function IdGenerator (line 7503) | function IdGenerator(prefix) {
function Overlays (line 7646) | function Overlays(config, eventBus, canvas, elementRegistry) {
function updateViewbox (line 8112) | function updateViewbox(viewbox) {
function createRoot (line 8190) | function createRoot(parentNode) {
function setPosition (line 8206) | function setPosition(el, x, y) {
function setVisible (line 8216) | function setVisible(el, visible) {
function setTransform (line 8220) | function setTransform(el, transform) {
function ChangeSupport (line 8256) | function ChangeSupport(
function CommandInterceptor (line 8352) | function CommandInterceptor(eventBus) {
function unwrapEvent (line 8362) | function unwrapEvent(fn, that) {
function createHook (line 8532) | function createHook(hook) {
function RootElementsBehavior (line 8572) | function RootElementsBehavior(canvas, injector) {
function escapeHTML (line 8626) | function escapeHTML(str) {
function getPlaneIdFromShape (line 8648) | function getPlaneIdFromShape(element) {
function addPlaneSuffix (line 8658) | function addPlaneSuffix(id) {
function DrilldownBreadcrumbs (line 8681) | function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {
function getBusinessObjectParentChain (line 8772) | function getBusinessObjectParentChain(child) {
function DrilldownCentering (line 8799) | function DrilldownCentering(eventBus, canvas) {
function Map (line 8852) | function Map() {
function SubprocessCompatibility (line 8932) | function SubprocessCompatibility(eventBus, moddle) {
function findRootDiagram (line 9115) | function findRootDiagram(element) {
function getPlaneBounds (line 9128) | function getPlaneBounds(plane) {
function shouldMoveToPlane (line 9156) | function shouldMoveToPlane(businessObject, plane) {
function DrilldownOverlayBehavior (line 9195) | function DrilldownOverlayBehavior(
function isClass (line 9395) | function isClass(fn) {
function isArray (line 9404) | function isArray(obj) {
function hasOwnProp (line 9414) | function hasOwnProp(obj, prop) {
function annotate (line 9429) | function annotate(...args) {
function parseAnnotations (line 9467) | function parseAnnotations(fn) {
function Injector (line 9500) | function Injector(modules, parent) {
function arrayUnwrap (line 9843) | function arrayUnwrap(type, value) {
function DefaultRenderer (line 9866) | function DefaultRenderer(eventBus, styles) {
function Styles (line 9966) | function Styles() {
function remove (line 10060) | function remove(collection, element) {
function add (line 10083) | function add(collection, element, idx) {
function round (line 10166) | function round(number, resolution) {
function ensurePx (line 10170) | function ensurePx(number) {
function findRoot (line 10174) | function findRoot(element) {
function createContainer (line 10190) | function createContainer(options) {
function createGroup (line 10214) | function createGroup(parent, cls, childIndex) {
function Canvas (line 10252) | function Canvas(config, eventBus, graphicsFactory, elementRegistry) {
function setCTM (line 11436) | function setCTM(node, m) {
function ElementRegistry (line 11611) | function ElementRegistry(eventBus) {
function extend (line 11893) | function extend(collection, refs, property, target) {
function isExtended (line 11984) | function isExtended(collection) {
function hasOwnProperty$1 (line 11994) | function hasOwnProperty$1(e, property) {
function defineCollectionProperty (line 11998) | function defineCollectionProperty(ref, property, target) {
function defineProperty$1 (line 12016) | function defineProperty$1(ref, property, target) {
function Refs$1 (line 12099) | function Refs$1(a, b) {
function ElementImpl (line 12210) | function ElementImpl() {
function ShapeImpl (line 12288) | function ShapeImpl() {
function RootImpl (line 12330) | function RootImpl() {
function LabelImpl (line 12353) | function LabelImpl() {
function ConnectionImpl (line 12376) | function ConnectionImpl() {
function create (line 12500) | function create(type, attrs) {
function ElementFactory (line 12524) | function ElementFactory() {
function EventBus (line 12727) | function EventBus() {
function wrappedCallback (line 12818) | function wrappedCallback() {
function InternalEvent (line 13161) | function InternalEvent() { }
function invokeFunction (line 13184) | function invokeFunction(fn, args) {
function getVisual (line 13202) | function getVisual(gfx) {
function getChildren (line 13212) | function getChildren(gfx) {
function GraphicsFactory (line 13231) | function GraphicsFactory(eventBus, elementRegistry) {
function prependTo (line 13494) | function prependTo(newNode, parentNode, siblingNode) {
function bootstrap (line 13536) | function bootstrap(modules) {
function createInjector (line 13551) | function createInjector(options) {
function Diagram (line 13616) | function Diagram(options, injector) {
function Base (line 13692) | function Base() { }
function Factory (line 13708) | function Factory(model, properties) {
function ModdleElement (line 13736) | function ModdleElement(attrs) {
function coerceType (line 13781) | function coerceType(type, value) {
function isBuiltIn (line 13795) | function isBuiltIn(type) {
function isSimple (line 13802) | function isSimple(type) {
function parseName (line 13815) | function parseName(name, defaultPrefix) {
function DescriptorBuilder (line 13845) | function DescriptorBuilder(nameNs) {
function Registry (line 14070) | function Registry(packages, properties) {
function traverseTrait (line 14189) | function traverseTrait(cls) {
function traverseSuper (line 14199) | function traverseSuper(cls, trait) {
function ensureAvailable (line 14251) | function ensureAvailable(packageMap, pkg, identifierKey) {
function Properties (line 14265) | function Properties(model) {
function isUndefined (line 14381) | function isUndefined(val) {
function defineProperty (line 14385) | function defineProperty(target, property, value) {
function Moddle (line 14417) | function Moddle(packages) {
function replaceEntities (line 14623) | function replaceEntities(_, d, x, z) {
function decodeEntities (line 14655) | function decodeEntities(s) {
function error$1 (line 14669) | function error$1(msg) {
function missingNamespaceForPrefix (line 14673) | function missingNamespaceForPrefix(prefix) {
function getter (line 14677) | function getter(getFn) {
function cloneNsMatrix (line 14684) | function cloneNsMatrix(nsMatrix) {
function uriPrefix (line 14692) | function uriPrefix(prefix) {
function buildNsMatrix (line 14696) | function buildNsMatrix(nsUriToPrefix) {
function noopGetContext (line 14710) | function noopGetContext() {
function throwFunc (line 14714) | function throwFunc(err) {
function Parser (line 14725) | function Parser(options) {
function hasLowerCaseAlias (line 15684) | function hasLowerCaseAlias(pkg) {
function serializeFormat (line 15695) | function serializeFormat(element) {
function serializeAsType (line 15699) | function serializeAsType(element) {
function serializeAsProperty (line 15703) | function serializeAsProperty(element) {
function capitalize (line 15707) | function capitalize(str) {
function aliasToName (line 15711) | function aliasToName(aliasNs, pkg) {
function prefixedToName (line 15720) | function prefixedToName(nameNs, pkg) {
function normalizeXsiTypeName (line 15734) | function normalizeXsiTypeName(name, model) {
function error (line 15742) | function error(message) {
function getModdleDescriptor (line 15753) | function getModdleDescriptor(element) {
function Context (line 15767) | function Context(options) {
function BaseHandler (line 15841) | function BaseHandler() {}
function NoopHandler (line 15855) | function NoopHandler() { }
function BodyHandler (line 15863) | function BodyHandler() {}
function ReferenceHandler (line 15871) | function ReferenceHandler(property, context) {
function ValueHandler (line 15900) | function ValueHandler(propertyDesc, element) {
function BaseElementHandler (line 15923) | function BaseElementHandler() {}
function ElementHandler (line 15946) | function ElementHandler(model, typeName, context) {
function RootElementHandler (line 16204) | function RootElementHandler(model, typeName, context) {
function GenericElementHandler (line 16231) | function GenericElementHandler(model, typeName, context) {
function Reader (line 16281) | function Reader(options) {
function handleError (line 16363) | function handleError(err, getContext, lax) {
function handleWarning (line 16396) | function handleWarning(err, getContext) {
function resolveReferences (line 16405) | function resolveReferences() {
function handleClose (line 16451) | function handleClose() {
function handleQuestion (line 16461) | function handleQuestion(question) {
function handleOpen (line 16481) | function handleOpen(node, getContext) {
function handleCData (line 16494) | function handleCData(text, getContext) {
function handleText (line 16503) | function handleText(text, getContext) {
function createStack (line 16602) | function createStack() {
function Namespaces (line 16620) | function Namespaces(parent) {
function lower (line 16692) | function lower(string) {
function nameToAlias (line 16696) | function nameToAlias(name, pkg) {
function inherits (line 16704) | function inherits(ctor, superCtor) {
function nsName (line 16716) | function nsName(ns) {
function getNsAttrs (line 16724) | function getNsAttrs(namespaces) {
function getElementNs (line 16737) | function getElementNs(ns, descriptor) {
function getPropertyNs (line 16745) | function getPropertyNs(ns, descriptor) {
function getSerializableProperties (line 16749) | function getSerializableProperties(element) {
function escape (line 16796) | function escape(str, charPattern, replaceMap) {
function escapeAttr (line 16812) | function escapeAttr(str) {
function escapeBody (line 16816) | function escapeBody(str) {
function filterAttributes (line 16820) | function filterAttributes(props) {
function filterContained (line 16824) | function filterContained(props) {
function ReferenceSerializer (line 16829) | function ReferenceSerializer(tagName) {
function BodySerializer (line 16845) | function BodySerializer() {}
function ValueSerializer (line 16866) | function ValueSerializer(tagName) {
function ElementSerializer (line 16885) | function ElementSerializer(parent, propertyDescriptor) {
function TypeSerializer (line 17359) | function TypeSerializer(parent, propertyDescriptor) {
function SavingWriter (line 17398) | function SavingWriter() {
function FormatingWriter (line 17406) | function FormatingWriter(out, format) {
function Writer (line 17448) | function Writer(options) {
function BpmnModdle (line 17481) | function BpmnModdle(packages, options) {
function simple (line 21208) | function simple(additionalPackages, options) {
function wrapForCompatibility (line 21232) | function wrapForCompatibility(api) {
function ensureCompatDiRef (line 21284) | function ensureCompatDiRef(businessObject) {
function is (line 21311) | function is(element, type) {
function findDisplayCandidate (line 21324) | function findDisplayCandidate(definitions) {
function BpmnTreeWalker (line 21334) | function BpmnTreeWalker(handler, translate) {
function importBpmnDiagram (line 21771) | function importBpmnDiagram(diagram, definitions, bpmnDiagram) {
function getDiagramsToImport (line 21866) | function getDiagramsToImport(definitions, bpmnDiagram) {
function selfAndAllFlowElements (line 21930) | function selfAndAllFlowElements(elements) {
function findRootProcess (line 21946) | function findRootProcess(element) {
function createLightbox (line 22025) | function createLightbox() {
function open (line 22038) | function open() {
function BaseViewer (line 22151) | function BaseViewer(options) {
function ParseCompleteEvent (line 22214) | function ParseCompleteEvent(data) {
function addWarningsToError (line 22793) | function addWarningsToError(err, warningsAry) {
function checkValidationError (line 22798) | function checkValidationError(err) {
function ensureUnit (line 22825) | function ensureUnit(val) {
function findBPMNDiagram (line 22838) | function findBPMNDiagram(definitions, diagramId) {
function addProjectLogo (line 22856) | function addProjectLogo(container) {
function Viewer (line 22934) | function Viewer(options) {
function hasModifier (line 22961) | function hasModifier(event) {
function isCmd (line 22969) | function isCmd(event) {
function isKey (line 22987) | function isKey(keys, event) {
function isShift (line 22996) | function isShift(event) {
function isCopy (line 23003) | function isCopy(event) {
function isPaste (line 23010) | function isPaste(event) {
function isUndo (line 23017) | function isUndo(event) {
function isRedo (line 23024) | function isRedo(event) {
function Keyboard (line 23070) | function Keyboard(config, eventBus) {
function isInput (line 23244) | function isInput(target) {
function KeyboardBindings (line 23260) | function KeyboardBindings(eventBus, keyboard) {
function addListener (line 23293) | function addListener(action, fn) {
function KeyboardMove (line 23438) | function KeyboardMove(
function set (line 23563) | function set(mode) {
function unset (line 23573) | function unset() {
function install (line 23591) | function install(eventBus, eventName) {
function delta (line 23617) | function delta(a, b) {
function MoveCanvas (line 23638) | function MoveCanvas(eventBus, canvas) {
function length (line 23738) | function length(point) {
function log10 (line 23755) | function log10(x) {
function getStepSize (line 23767) | function getStepSize(range, steps) {
function cap (line 23783) | function cap(range, scale) {
function ZoomScroll (line 23818) | function ZoomScroll(config, eventBus, canvas) {
function NavigatedViewer (line 24035) | function NavigatedViewer(options) {
FILE: easyflow-flow-bpmn/static/plugins/bpmnjs/bpmn-viewer.development.js
function e (line 19) | function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{co...
function isUndefined$2 (line 34) | function isUndefined$2(obj) {
function isDefined (line 38) | function isDefined(obj) {
function isArray$2 (line 42) | function isArray$2(obj) {
function isObject (line 46) | function isObject(obj) {
function isNumber (line 50) | function isNumber(obj) {
function isFunction (line 59) | function isFunction(obj) {
function isString (line 71) | function isString(obj) {
function has$1 (line 83) | function has$1(target, key) {
function find (line 147) | function find(collection, matcher) {
function findIndex (line 175) | function findIndex(collection, matcher) {
function filter (line 202) | function filter(collection, matcher) {
function forEach$1 (line 228) | function forEach$1(collection, iterator) {
function reduce (line 266) | function reduce(collection, iterator, result) {
function every (line 285) | function every(collection, matcher) {
function some (line 302) | function some(collection, matcher) {
function map$1 (line 317) | function map$1(collection, fn) {
function matchPattern (line 346) | function matchPattern(pattern) {
function toMatcher (line 364) | function toMatcher(matcher) {
function identity$1 (line 371) | function identity$1(arg) {
function toNum$1 (line 375) | function toNum$1(arg) {
function debounce (line 401) | function debounce(fn, timeout) {
function bind$2 (line 474) | function bind$2(fn, target) {
function assign$1 (line 486) | function assign$1(target, ...others) {
function pick (line 501) | function pick(target, properties) {
function omit (line 528) | function omit(target, properties) {
function BaseRenderer (line 560) | function BaseRenderer(eventBus, renderPriority) {
function is$1 (line 651) | function is$1(element, type) {
function isAny (line 666) | function isAny(element, types) {
function getBusinessObject (line 679) | function getBusinessObject(element) {
function getDi (line 690) | function getDi(element) {
function isExpanded (line 705) | function isExpanded(element, di) {
function isEventSubProcess (line 733) | function isEventSubProcess(element) {
function isConnection (line 744) | function isConnection(value) {
function isLabelExternal (line 771) | function isLabelExternal(semantic) {
function getFlowLabelPosition (line 790) | function getFlowLabelPosition(waypoints) {
function getWaypointsMid (line 824) | function getWaypointsMid(waypoints) {
function getExternalLabelMid (line 844) | function getExternalLabelMid(element) {
function getExternalLabelBounds (line 871) | function getExternalLabelBounds(di, element) {
function getLabelAttr (line 908) | function getLabelAttr(semantic) {
function getCategoryValue (line 935) | function getCategoryValue(semantic) {
function getLabel (line 951) | function getLabel(element) {
function ensureImported (line 966) | function ensureImported(element, target) {
function appendTo (line 994) | function appendTo(element, target) {
function append (line 1010) | function append(target, node) {
function getAttribute (line 1086) | function getAttribute(node, name) {
function setAttribute (line 1094) | function setAttribute(node, name, value) {
function setAttributes (line 1112) | function setAttributes(node, attrs) {
function attr$1 (line 1131) | function attr$1(node, name, value) {
function classes$1 (line 1165) | function classes$1(el) {
function ClassList$1 (line 1169) | function ClassList$1(el) {
function remove$2 (line 1274) | function remove$2(element) {
function clear$1 (line 1294) | function clear$1(element) {
function parse$1 (line 1314) | function parse$1(svg) {
function parseDocument (line 1347) | function parseDocument(svg) {
function create$1 (line 1371) | function create$1(name, attrs) {
function getNode (line 1395) | function getNode() {
function extend$1 (line 1403) | function extend$1(object, props) {
function createMatrix (line 1424) | function createMatrix(a, b, c, d, e, f) {
function createTransform (line 1444) | function createTransform(matrix) {
function escape$1 (line 1466) | function escape$1(str, pattern) {
function serialize (line 1475) | function serialize(node, output) {
function set (line 1535) | function set(element, svg) {
function get (line 1561) | function get(element) {
function isFragment (line 1573) | function isFragment(node) {
function innerSVG (line 1577) | function innerSVG(element, svg) {
function slice$1 (line 1594) | function slice$1(arr) {
function wrapMatrix (line 1602) | function wrapMatrix(transformList, transform) {
function setTransforms (line 1611) | function setTransforms(transformList, transforms) {
function transform$1 (line 1629) | function transform$1(node, transforms) {
function componentsToPath (line 1655) | function componentsToPath(elements) {
function move (line 1664) | function move(point) {
function lineTo (line 1673) | function lineTo(point) {
function curveTo (line 1684) | function curveTo(p1, p2, p3) {
function drawPath (line 1693) | function drawPath(waypoints, cornerRadius) {
function getPointAtLength (line 1735) | function getPointAtLength(start, end, length) {
function vectorLength (line 1750) | function vectorLength(x, y) {
function createLine (line 1761) | function createLine(points, attrs, radius) {
function updateLine (line 1787) | function updateLine(gfx, points) {
function isTypedEvent (line 1810) | function isTypedEvent(event, eventDefinitionType) {
function isThrowEvent (line 1823) | function isThrowEvent(event) {
function isCollection (line 1834) | function isCollection(element) {
function getFillColor (line 1849) | function getFillColor(element, defaultColor) {
function getStrokeColor (line 1861) | function getStrokeColor(element, defaultColor) {
function getLabelColor (line 1874) | function getLabelColor(element, defaultColor, defaultStrokeColor) {
function getCirclePath (line 1889) | function getCirclePath(shape) {
function getRoundRectPath (line 1912) | function getRoundRectPath(shape, borderRadius) {
function getDiamondPath (line 1940) | function getDiamondPath(shape) {
function getRectPath (line 1965) | function getRectPath(shape) {
function _mergeNamespaces$1 (line 1982) | function _mergeNamespaces$1(n, m) {
function isUndefined$1 (line 2008) | function isUndefined$1(obj) {
function isArray$1 (line 2012) | function isArray$1(obj) {
function has (line 2024) | function has(target, key) {
function forEach (line 2038) | function forEach(collection, iterator) {
function identity (line 2064) | function identity(arg) {
function toNum (line 2068) | function toNum(arg) {
function assign (line 2080) | function assign(element, ...styleSources) {
function attr (line 2104) | function attr(el, name, val) {
function classes (line 2142) | function classes(el) {
function ClassList (line 2153) | function ClassList(el) {
function clear (line 2261) | function clear(el) {
function matches (line 2279) | function matches(element, selector) {
function closest (line 2290) | function closest(element, selector, checkYourSelf) {
function detect (line 2310) | function detect () {
function bind (line 2379) | function bind(el, selector, type, fn, capture) {
function unbind (line 2402) | function unbind(el, type, fn, capture) {
function parse (line 2483) | function parse(html, doc) {
function query (line 2529) | function query(selector, el) {
function all (line 2535) | function all(selector, el) {
function remove$1 (line 2541) | function remove$1(el) {
function transform (line 2552) | function transform(gfx, x, y, angle, amount) {
function translate$1 (line 2571) | function translate$1(gfx, x, y) {
function rotate (line 2583) | function rotate(gfx, angle) {
function createCommonjsModule (line 2590) | function createCommonjsModule(fn, module) {
function Ids (line 2667) | function Ids(seed) {
function BpmnRenderer (line 2786) | function BpmnRenderer(
function parseAlign (line 4736) | function parseAlign(align) {
function parsePadding (line 4751) | function parsePadding(padding) {
function getTextBBox (line 4771) | function getTextBBox(text, fakeText) {
function layoutNext (line 4818) | function layoutNext(lines, maxWidth, fakeText) {
function fit (line 4847) | function fit(lines, fitLine, originalLine, textBBox) {
function semanticShorten (line 4873) | function semanticShorten(line, maxLength) {
function shortenLine (line 4917) | function shortenLine(line, width, maxWidth) {
function getHelperSvg (line 4936) | function getHelperSvg() {
function Text (line 4965) | function Text(config) {
function getLineHeight (line 5113) | function getLineHeight(style) {
function TextRenderer (line 5148) | function TextRenderer(config) {
function PathMap (line 5256) | function PathMap() {
function replacer (line 5710) | function replacer(all, key, obj) {
function format (line 5726) | function format(str, obj) {
function translate (line 5765) | function translate(template, replacements) {
function getDefaultExportFromCjs (line 5781) | function getDefaultExportFromCjs (x) {
function roundPoint (line 5790) | function roundPoint(point) {
function asTRBL (line 5806) | function asTRBL(bounds) {
function asBounds (line 5823) | function asBounds(trbl) {
function getBoundsMid (line 5840) | function getBoundsMid(bounds) {
function getConnectionMid (line 5855) | function getConnectionMid(connection) {
function getMid (line 5914) | function getMid(element) {
function distance (line 5924) | function distance(a, b) {
function elementToString (line 5928) | function elementToString(e) {
function elementData (line 5960) | function elementData(semantic, di, attrs) {
function getWaypoints (line 5969) | function getWaypoints(di, source, target) {
function notYetDrawn (line 5982) | function notYetDrawn(translate, semantic, refSemantic, property) {
function BpmnImporter (line 6001) | function BpmnImporter(
function isPointInsideBBox (line 6274) | function isPointInsideBBox(bbox, point) {
function isFrameElement$1 (line 6284) | function isFrameElement$1(semantic) {
function getOriginal (line 6311) | function getOriginal(event) {
function isMac (line 6315) | function isMac() {
function isButton (line 6325) | function isButton(event, button) {
function isPrimaryButton (line 6334) | function isPrimaryButton(event) {
function isAuxiliaryButton (line 6345) | function isAuxiliaryButton(event) {
function hasPrimaryModifier (line 6356) | function hasPrimaryModifier(event) {
function hasSecondaryModifier (line 6376) | function hasSecondaryModifier(event) {
function allowAll (line 6392) | function allowAll(event) { return true; }
function allowPrimaryAndAuxiliary (line 6394) | function allowPrimaryAndAuxiliary(event) {
function InteractionEvents (line 6424) | function InteractionEvents(eventBus, elementRegistry, styles) {
function getBBox (line 6892) | function getBBox(elements, stopRecursion) {
function getType (line 6947) | function getType(element) {
function isFrameElement (line 6965) | function isFrameElement(element) {
function Outline (line 6987) | function Outline(eventBus, styles) {
function Selection (line 7103) | function Selection(eventBus, canvas) {
function SelectionVisuals (line 7235) | function SelectionVisuals(canvas, eventBus, selection) {
function addSelectionOutlinePadding (line 7330) | function addSelectionOutlinePadding(bBox) {
function SelectionBehavior (line 7352) | function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {
function isShown (line 7454) | function isShown(element) {
function IdGenerator (line 7482) | function IdGenerator(prefix) {
function Overlays (line 7625) | function Overlays(config, eventBus, canvas, elementRegistry) {
function updateViewbox (line 8091) | function updateViewbox(viewbox) {
function createRoot (line 8169) | function createRoot(parentNode) {
function setPosition (line 8185) | function setPosition(el, x, y) {
function setVisible (line 8195) | function setVisible(el, visible) {
function setTransform (line 8199) | function setTransform(el, transform) {
function ChangeSupport (line 8235) | function ChangeSupport(
function CommandInterceptor (line 8331) | function CommandInterceptor(eventBus) {
function unwrapEvent (line 8341) | function unwrapEvent(fn, that) {
function createHook (line 8511) | function createHook(hook) {
function RootElementsBehavior (line 8551) | function RootElementsBehavior(canvas, injector) {
function escapeHTML (line 8605) | function escapeHTML(str) {
function getPlaneIdFromShape (line 8627) | function getPlaneIdFromShape(element) {
function addPlaneSuffix (line 8637) | function addPlaneSuffix(id) {
function DrilldownBreadcrumbs (line 8660) | function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {
function getBusinessObjectParentChain (line 8751) | function getBusinessObjectParentChain(child) {
function DrilldownCentering (line 8778) | function DrilldownCentering(eventBus, canvas) {
function Map (line 8831) | function Map() {
function SubprocessCompatibility (line 8911) | function SubprocessCompatibility(eventBus, moddle) {
function findRootDiagram (line 9094) | function findRootDiagram(element) {
function getPlaneBounds (line 9107) | function getPlaneBounds(plane) {
function shouldMoveToPlane (line 9135) | function shouldMoveToPlane(businessObject, plane) {
function DrilldownOverlayBehavior (line 9174) | function DrilldownOverlayBehavior(
function isClass (line 9374) | function isClass(fn) {
function isArray (line 9383) | function isArray(obj) {
function hasOwnProp (line 9393) | function hasOwnProp(obj, prop) {
function annotate (line 9408) | function annotate(...args) {
function parseAnnotations (line 9446) | function parseAnnotations(fn) {
function Injector (line 9479) | function Injector(modules, parent) {
function arrayUnwrap (line 9822) | function arrayUnwrap(type, value) {
function DefaultRenderer (line 9845) | function DefaultRenderer(eventBus, styles) {
function Styles (line 9945) | function Styles() {
function remove (line 10039) | function remove(collection, element) {
function add (line 10062) | function add(collection, element, idx) {
function round (line 10145) | function round(number, resolution) {
function ensurePx (line 10149) | function ensurePx(number) {
function findRoot (line 10153) | function findRoot(element) {
function createContainer (line 10169) | function createContainer(options) {
function createGroup (line 10193) | function createGroup(parent, cls, childIndex) {
function Canvas (line 10231) | function Canvas(config, eventBus, graphicsFactory, elementRegistry) {
function setCTM (line 11415) | function setCTM(node, m) {
function ElementRegistry (line 11590) | function ElementRegistry(eventBus) {
function extend (line 11872) | function extend(collection, refs, property, target) {
function isExtended (line 11963) | function isExtended(collection) {
function hasOwnProperty$1 (line 11973) | function hasOwnProperty$1(e, property) {
function defineCollectionProperty (line 11977) | function defineCollectionProperty(ref, property, target) {
function defineProperty$1 (line 11995) | function defineProperty$1(ref, property, target) {
function Refs$1 (line 12078) | function Refs$1(a, b) {
function ElementImpl (line 12189) | function ElementImpl() {
function ShapeImpl (line 12267) | function ShapeImpl() {
function RootImpl (line 12309) | function RootImpl() {
function LabelImpl (line 12332) | function LabelImpl() {
function ConnectionImpl (line 12355) | function ConnectionImpl() {
function create (line 12479) | function create(type, attrs) {
function ElementFactory (line 12503) | function ElementFactory() {
function EventBus (line 12706) | function EventBus() {
function wrappedCallback (line 12797) | function wrappedCallback() {
function InternalEvent (line 13140) | function InternalEvent() { }
function invokeFunction (line 13163) | function invokeFunction(fn, args) {
function getVisual (line 13181) | function getVisual(gfx) {
function getChildren (line 13191) | function getChildren(gfx) {
function GraphicsFactory (line 13210) | function GraphicsFactory(eventBus, elementRegistry) {
function prependTo (line 13473) | function prependTo(newNode, parentNode, siblingNode) {
function bootstrap (line 13515) | function bootstrap(modules) {
function createInjector (line 13530) | function createInjector(options) {
function Diagram (line 13595) | function Diagram(options, injector) {
function Base (line 13671) | function Base() { }
function Factory (line 13687) | function Factory(model, properties) {
function ModdleElement (line 13715) | function ModdleElement(attrs) {
function coerceType (line 13760) | function coerceType(type, value) {
function isBuiltIn (line 13774) | function isBuiltIn(type) {
function isSimple (line 13781) | function isSimple(type) {
function parseName (line 13794) | function parseName(name, defaultPrefix) {
function DescriptorBuilder (line 13824) | function DescriptorBuilder(nameNs) {
function Registry (line 14049) | function Registry(packages, properties) {
function traverseTrait (line 14168) | function traverseTrait(cls) {
function traverseSuper (line 14178) | function traverseSuper(cls, trait) {
function ensureAvailable (line 14230) | function ensureAvailable(packageMap, pkg, identifierKey) {
function Properties (line 14244) | function Properties(model) {
function isUndefined (line 14360) | function isUndefined(val) {
function defineProperty (line 14364) | function defineProperty(target, property, value) {
function Moddle (line 14396) | function Moddle(packages) {
function replaceEntities (line 14602) | function replaceEntities(_, d, x, z) {
function decodeEntities (line 14634) | function decodeEntities(s) {
function error$1 (line 14648) | function error$1(msg) {
function missingNamespaceForPrefix (line 14652) | function missingNamespaceForPrefix(prefix) {
function getter (line 14656) | function getter(getFn) {
function cloneNsMatrix (line 14663) | function cloneNsMatrix(nsMatrix) {
function uriPrefix (line 14671) | function uriPrefix(prefix) {
function buildNsMatrix (line 14675) | function buildNsMatrix(nsUriToPrefix) {
function noopGetContext (line 14689) | function noopGetContext() {
function throwFunc (line 14693) | function throwFunc(err) {
function Parser (line 14704) | function Parser(options) {
function hasLowerCaseAlias (line 15663) | function hasLowerCaseAlias(pkg) {
function serializeFormat (line 15674) | function serializeFormat(element) {
function serializeAsType (line 15678) | function serializeAsType(element) {
function serializeAsProperty (line 15682) | function serializeAsProperty(element) {
function capitalize (line 15686) | function capitalize(str) {
function aliasToName (line 15690) | function aliasToName(aliasNs, pkg) {
function prefixedToName (line 15699) | function prefixedToName(nameNs, pkg) {
function normalizeXsiTypeName (line 15713) | function normalizeXsiTypeName(name, model) {
function error (line 15721) | function error(message) {
function getModdleDescriptor (line 15732) | function getModdleDescriptor(element) {
function Context (line 15746) | function Context(options) {
function BaseHandler (line 15820) | function BaseHandler() {}
function NoopHandler (line 15834) | function NoopHandler() { }
function BodyHandler (line 15842) | function BodyHandler() {}
function ReferenceHandler (line 15850) | function ReferenceHandler(property, context) {
function ValueHandler (line 15879) | function ValueHandler(propertyDesc, element) {
function BaseElementHandler (line 15902) | function BaseElementHandler() {}
function ElementHandler (line 15925) | function ElementHandler(model, typeName, context) {
function RootElementHandler (line 16183) | function RootElementHandler(model, typeName, context) {
function GenericElementHandler (line 16210) | function GenericElementHandler(model, typeName, context) {
function Reader (line 16260) | function Reader(options) {
function handleError (line 16342) | function handleError(err, getContext, lax) {
function handleWarning (line 16375) | function handleWarning(err, getContext) {
function resolveReferences (line 16384) | function resolveReferences() {
function handleClose (line 16430) | function handleClose() {
function handleQuestion (line 16440) | function handleQuestion(question) {
function handleOpen (line 16460) | function handleOpen(node, getContext) {
function handleCData (line 16473) | function handleCData(text, getContext) {
function handleText (line 16482) | function handleText(text, getContext) {
function createStack (line 16581) | function createStack() {
function Namespaces (line 16599) | function Namespaces(parent) {
function lower (line 16671) | function lower(string) {
function nameToAlias (line 16675) | function nameToAlias(name, pkg) {
function inherits (line 16683) | function inherits(ctor, superCtor) {
function nsName (line 16695) | function nsName(ns) {
function getNsAttrs (line 16703) | function getNsAttrs(namespaces) {
function getElementNs (line 16716) | function getElementNs(ns, descriptor) {
function getPropertyNs (line 16724) | function getPropertyNs(ns, descriptor) {
function getSerializableProperties (line 16728) | function getSerializableProperties(element) {
function escape (line 16775) | function escape(str, charPattern, replaceMap) {
function escapeAttr (line 16791) | function escapeAttr(str) {
function escapeBody (line 16795) | function escapeBody(str) {
function filterAttributes (line 16799) | function filterAttributes(props) {
function filterContained (line 16803) | function filterContained(props) {
function ReferenceSerializer (line 16808) | function ReferenceSerializer(tagName) {
function BodySerializer (line 16824) | function BodySerializer() {}
function ValueSerializer (line 16845) | function ValueSerializer(tagName) {
function ElementSerializer (line 16864) | function ElementSerializer(parent, propertyDescriptor) {
function TypeSerializer (line 17338) | function TypeSerializer(parent, propertyDescriptor) {
function SavingWriter (line 17377) | function SavingWriter() {
function FormatingWriter (line 17385) | function FormatingWriter(out, format) {
function Writer (line 17427) | function Writer(options) {
function BpmnModdle (line 17460) | function BpmnModdle(packages, options) {
function simple (line 21187) | function simple(additionalPackages, options) {
function wrapForCompatibility (line 21211) | function wrapForCompatibility(api) {
function ensureCompatDiRef (line 21263) | function ensureCompatDiRef(businessObject) {
function is (line 21290) | function is(element, type) {
function findDisplayCandidate (line 21303) | function findDisplayCandidate(definitions) {
function BpmnTreeWalker (line 21313) | function BpmnTreeWalker(handler, translate) {
function importBpmnDiagram (line 21750) | function importBpmnDiagram(diagram, definitions, bpmnDiagram) {
function getDiagramsToImport (line 21845) | function getDiagramsToImport(definitions, bpmnDiagram) {
function selfAndAllFlowElements (line 21909) | function selfAndAllFlowElements(elements) {
function findRootProcess (line 21925) | function findRootProcess(element) {
function createLightbox (line 22004) | function createLightbox() {
function open (line 22017) | function open() {
function BaseViewer (line 22130) | function BaseViewer(options) {
function ParseCompleteEvent (line 22193) | function ParseCompleteEvent(data) {
function addWarningsToError (line 22772) | function addWarningsToError(err, warningsAry) {
function checkValidationError (line 22777) | function checkValidationError(err) {
function ensureUnit (line 22804) | function ensureUnit(val) {
function findBPMNDiagram (line 22817) | function findBPMNDiagram(definitions, diagramId) {
function addProjectLogo (line 22835) | function addProjectLogo(container) {
function Viewer (line 22913) | function Viewer(options) {
FILE: easyflow-flow-bpmn/static/plugins/bpmnjs/changeForEasyflow/rollup.config.js
function banner (line 76) | function banner(bundleName, minified) {
function pgl (line 97) | function pgl(plugins = [], env = 'production') {
function pad (line 110) | function pad(n) {
function today (line 118) | function today() {
function processTemplate (line 128) | function processTemplate(str, args) {
FILE: easyflow-flow-bpmn/static/plugins/flow/bpmn.js
class EasyFlowContextPad (line 5) | class EasyFlowContextPad {
method constructor (line 6) | constructor(config, contextPad, create, elementFactory, injector, tran...
method getContextPadEntries (line 18) | getContextPadEntries(element) {
class EasyFlowPalette (line 80) | class EasyFlowPalette {
method constructor (line 81) | constructor(create, elementFactory, palette, translate) {
method getPaletteEntries (line 89) | getPaletteEntries(element) {
function EasyFlowReplaceMenuProvider (line 139) | function EasyFlowReplaceMenuProvider(
function _findProcessElement (line 1486) | function _findProcessElement(bpmnModeler) {
function getExtensionElement (line 1510) | function getExtensionElement(element, type) {
function getExtensionBody (line 1519) | function getExtensionBody(bo, type) {
function updateExtensionBody (line 1527) | function updateExtensionBody(bpmnModeler, bo, type, value) {
function easyFlowTranslate (line 1784) | function easyFlowTranslate(template, replacements) {
FILE: easyflow-flow-bpmn/static/plugins/jquery-validation/jquery.validate.js
function handle (line 69) | function handle() {
function delegate (line 400) | function delegate( event ) {
FILE: easyflow-flow-bpmn/static/plugins/jquery/jquery-3.6.0.js
function DOMEval (line 107) | function DOMEval( code, node, doc ) {
function toType (line 137) | function toType( obj ) {
function isArrayLike (line 507) | function isArrayLike( obj ) {
function Sizzle (line 759) | function Sizzle( selector, context, results, seed ) {
function createCache (line 907) | function createCache() {
function markFunction (line 927) | function markFunction( fn ) {
function assert (line 936) | function assert( fn ) {
function addHandle (line 960) | function addHandle( attrs, handler ) {
function siblingCheck (line 975) | function siblingCheck( a, b ) {
function createInputPseudo (line 1001) | function createInputPseudo( type ) {
function createButtonPseudo (line 1012) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 1023) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1079) | function createPositionalPseudo( fn ) {
function testContext (line 1102) | function testContext( context ) {
function setFilters (line 2313) | function setFilters() {}
function toSelector (line 2387) | function toSelector( tokens ) {
function addCombinator (line 2397) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2464) | function elementMatcher( matchers ) {
function multipleContexts (line 2478) | function multipleContexts( selector, contexts, results ) {
function condense (line 2487) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2508) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2608) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2671) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function nodeName (line 3029) | function nodeName( elem, name ) {
function winnow (line 3039) | function winnow( elements, qualifier, not ) {
function sibling (line 3334) | function sibling( cur, dir ) {
function createOptions (line 3427) | function createOptions( options ) {
function Identity (line 3652) | function Identity( v ) {
function Thrower (line 3655) | function Thrower( ex ) {
function adoptValue (line 3659) | function adoptValue( value, resolve, reject, noValue ) {
function resolve (line 3752) | function resolve( depth, deferred, handler, special ) {
function completed (line 4117) | function completed() {
function fcamelCase (line 4212) | function fcamelCase( _all, letter ) {
function camelCase (line 4219) | function camelCase( string ) {
function Data (line 4236) | function Data() {
function getData (line 4405) | function getData( data ) {
function dataAttr (line 4430) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4742) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4810) | function getDefaultDisplay( elem ) {
function showHide (line 4833) | function showHide( elements, show ) {
function getAll (line 4965) | function getAll( context, tag ) {
function setGlobalEval (line 4990) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 5006) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 5098) | function returnTrue() {
function returnFalse (line 5102) | function returnFalse() {
function expectSync (line 5112) | function expectSync( elem, type ) {
function safeActiveElement (line 5119) | function safeActiveElement() {
function on (line 5125) | function on( elem, types, selector, data, fn, one ) {
function leverageNative (line 5613) | function leverageNative( el, type, expectSync ) {
function manipulationTarget (line 5962) | function manipulationTarget( elem, content ) {
function disableScript (line 5973) | function disableScript( elem ) {
function restoreScript (line 5977) | function restoreScript( elem ) {
function cloneCopyEvent (line 5987) | function cloneCopyEvent( src, dest ) {
function fixInput (line 6020) | function fixInput( src, dest ) {
function domManip (line 6033) | function domManip( collection, args, callback, ignored ) {
function remove (line 6125) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 6439) | function computeStyleTests() {
function roundPixelMeasures (line 6483) | function roundPixelMeasures( measure ) {
function curCSS (line 6576) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6629) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6654) | function vendorPropName( name ) {
function finalPropName (line 6669) | function finalPropName( name ) {
function setPositiveNumber (line 6695) | function setPositiveNumber( _elem, value, subtract ) {
function boxModelAdjustment (line 6707) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
function getWidthOrHeight (line 6775) | function getWidthOrHeight( elem, dimension, extra ) {
function Tween (line 7151) | function Tween( elem, options, prop, end, easing ) {
function schedule (line 7274) | function schedule() {
function createFxNow (line 7287) | function createFxNow() {
function genFx (line 7295) | function genFx( type, includeWidth ) {
function createTween (line 7315) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 7329) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 7501) | function propFilter( props, specialEasing ) {
function Animation (line 7538) | function Animation( elem, properties, options ) {
function stripAndCollapse (line 8254) | function stripAndCollapse( value ) {
function getClass (line 8260) | function getClass( elem ) {
function classesToArray (line 8264) | function classesToArray( value ) {
function buildParams (line 8894) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 9047) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 9081) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 9110) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 9130) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 9188) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 9704) | function done( status, nativeStatusText, responses, headers ) {
FILE: easyflow-flow-bpmn/static/plugins/std-common/common.js
function timestampToTime (line 896) | function timestampToTime(timestampMs) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/BaseChainPlugin.java
class BaseChainPlugin (line 17) | public abstract class BaseChainPlugin implements NodeAction {
method execute (line 24) | @Override
method preHandle (line 64) | public abstract boolean preHandle(NodeContext nodeContext, FlowContext...
method postHandle (line 72) | public void postHandle(NodeContext nodeContext, FlowContext context) {
method postHandleNormal (line 87) | public void postHandleNormal(NodeContext nodeContext, FlowContext cont...
method postHandleException (line 98) | public void postHandleException(Throwable t, NodeContext nodeContext, ...
method clearException (line 108) | public void clearException(NodeContext nodeContext, FlowContext contex...
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/ChainConstants.java
class ChainConstants (line 8) | public class ChainConstants {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/ChainInvoker.java
class ChainInvoker (line 19) | public class ChainInvoker {
method invoke (line 23) | public <T, R>R invoke(String chainFlowId, T param, Function<T, R> targ...
method getFlowEngine (line 43) | public FlowEngine getFlowEngine() {
method setFlowEngine (line 47) | public void setFlowEngine(FlowEngine flowEngine) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/TargetAction.java
class TargetAction (line 15) | public class TargetAction extends ParamExecutorNodeAction {
method execute (line 19) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/CheckErrorItem.java
class CheckErrorItem (line 8) | public class CheckErrorItem {
method CheckErrorItem (line 16) | public CheckErrorItem() {
method CheckErrorItem (line 20) | public CheckErrorItem(String errorType, String errorMessage, String fl...
method getErrorType (line 28) | public String getErrorType() {
method setErrorType (line 31) | public void setErrorType(String errorType) {
method getErrorMessage (line 34) | public String getErrorMessage() {
method setErrorMessage (line 37) | public void setErrorMessage(String errorMessage) {
method getFlowId (line 40) | public String getFlowId() {
method setFlowId (line 43) | public void setFlowId(String flowId) {
method getNodeId (line 46) | public String getNodeId() {
method setNodeId (line 49) | public void setNodeId(String nodeId) {
method getFlow (line 53) | public Flow getFlow() {
method setFlow (line 57) | public void setFlow(Flow flow) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/CheckParam.java
class CheckParam (line 8) | public class CheckParam {
method getFlow (line 14) | public Flow getFlow() {
method setFlow (line 18) | public void setFlow(Flow flow) {
method getConfig (line 22) | public Object getConfig() {
method setConfig (line 26) | public void setConfig(Object config) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/CheckResult.java
class CheckResult (line 9) | public class CheckResult {
method addErrorItem (line 13) | public void addErrorItem(CheckErrorItem errorItem) {
method getErrorItemList (line 17) | public List<CheckErrorItem> getErrorItemList() {
method setErrorItemList (line 21) | public void setErrorItemList(List<CheckErrorItem> errorItemList) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/FlowChecker.java
type FlowChecker (line 6) | public interface FlowChecker {
method check (line 8) | public CheckResult check(CheckParam param);
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/AllFlowNodeLinkChecker.java
class AllFlowNodeLinkChecker (line 22) | public class AllFlowNodeLinkChecker implements SmartLifecycle {
method check (line 54) | public void check() {
method doCheck (line 95) | public List<CheckErrorItem> doCheck() {
method doCheck (line 100) | public List<CheckErrorItem> doCheck(List<Flow> allFlowList) {
method getAllFlowList (line 129) | protected List<Flow> getAllFlowList() {
method start (line 141) | @Override
method stop (line 147) | @Override
method isAutoStartup (line 152) | @Override
method stop (line 157) | @Override
method isRunning (line 163) | @Override
method getPhase (line 168) | @Override
method setPhase (line 173) | public void setPhase(int phase) {
method setAutoStartup (line 177) | public void setAutoStartup(boolean autoStartup) {
method isCheck (line 182) | public boolean isCheck() {
method setCheck (line 187) | public void setCheck(boolean check) {
method getCheckNodeIsolatedPolicy (line 192) | public int getCheckNodeIsolatedPolicy() {
method setCheckNodeIsolatedPolicy (line 197) | public void setCheckNodeIsolatedPolicy(int checkNodeIsolatedPolicy) {
method getCheckNextNodesNotExistsPolicy (line 202) | public int getCheckNextNodesNotExistsPolicy() {
method setCheckNextNodesNotExistsPolicy (line 207) | public void setCheckNextNodesNotExistsPolicy(int checkNextNodesNotExis...
method getCheckPreCheckNodesNotExistsPolicy (line 212) | public int getCheckPreCheckNodesNotExistsPolicy() {
method setCheckPreCheckNodesNotExistsPolicy (line 217) | public void setCheckPreCheckNodesNotExistsPolicy(int checkPreCheckNode...
method getCheckNonStartNodeNoPreviousPolicy (line 222) | public int getCheckNonStartNodeNoPreviousPolicy() {
method setCheckNonStartNodeNoPreviousPolicy (line 227) | public void setCheckNonStartNodeNoPreviousPolicy(int checkNonStartNode...
method getCheckNonEndNodeNoNextPolicy (line 232) | public int getCheckNonEndNodeNoNextPolicy() {
method setCheckNonEndNodeNoNextPolicy (line 237) | public void setCheckNonEndNodeNoNextPolicy(int checkNonEndNodeNoNextPo...
method getChecker (line 242) | public FlowNodeLinkChecker getChecker() {
method setChecker (line 247) | public void setChecker(FlowNodeLinkChecker checker) {
method getFlowWhitelist (line 252) | public Set<String> getFlowWhitelist() {
method setFlowWhitelist (line 257) | public void setFlowWhitelist(Set<String> flowWhitelist) {
method getFlowEngine (line 261) | public CoreFlowEngine getFlowEngine() {
method setFlowEngine (line 265) | public void setFlowEngine(CoreFlowEngine flowEngine) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/ExpNodeActionDotCheckFlowParseListener.java
class ExpNodeActionDotCheckFlowParseListener (line 25) | public class ExpNodeActionDotCheckFlowParseListener implements FlowParse...
method on (line 34) | @Override
method validateNodeActionExp (line 70) | private void validateNodeActionExp(ExpNodeAction expNodeAction, Flow f...
method getNodeActionExpNoDotPolicy (line 81) | public String getNodeActionExpNoDotPolicy() {
method setNodeActionExpNoDotPolicy (line 85) | public void setNodeActionExpNoDotPolicy(String nodeActionExpNoDotPolic...
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/FlowNodeLinkCheckConfig.java
class FlowNodeLinkCheckConfig (line 6) | public class FlowNodeLinkCheckConfig {
method isCheckNodeIsolated (line 19) | public boolean isCheckNodeIsolated() {
method setCheckNodeIsolated (line 23) | public void setCheckNodeIsolated(boolean checkNodeIsolated) {
method isCheckNextNodesNotExists (line 27) | public boolean isCheckNextNodesNotExists() {
method setCheckNextNodesNotExists (line 31) | public void setCheckNextNodesNotExists(boolean checkNextNodesNotExists) {
method isCheckPreCheckNodesNotExists (line 35) | public boolean isCheckPreCheckNodesNotExists() {
method setCheckPreCheckNodesNotExists (line 39) | public void setCheckPreCheckNodesNotExists(boolean checkPreCheckNodesN...
method isCheckNonStartNodeNoPrevious (line 43) | public boolean isCheckNonStartNodeNoPrevious() {
method setCheckNonStartNodeNoPrevious (line 47) | public void setCheckNonStartNodeNoPrevious(boolean checkNonStartNodeNo...
method isCheckNonEndNodeNoNext (line 51) | public boolean isCheckNonEndNodeNoNext() {
method setCheckNonEndNodeNoNext (line 55) | public void setCheckNonEndNodeNoNext(boolean checkNonEndNodeNoNext) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/FlowNodeLinkCheckFlowParseListener.java
class FlowNodeLinkCheckFlowParseListener (line 19) | public class FlowNodeLinkCheckFlowParseListener implements FlowParseEven...
method on (line 41) | @Override
method isCheck (line 104) | public boolean isCheck() {
method setCheck (line 108) | public void setCheck(boolean check) {
method getCheckNodeIsolatedPolicy (line 112) | public int getCheckNodeIsolatedPolicy() {
method setCheckNodeIsolatedPolicy (line 116) | public void setCheckNodeIsolatedPolicy(int checkNodeIsolatedPolicy) {
method getCheckNextNodesNotExistsPolicy (line 120) | public int getCheckNextNodesNotExistsPolicy() {
method setCheckNextNodesNotExistsPolicy (line 124) | public void setCheckNextNodesNotExistsPolicy(int checkNextNodesNotExis...
method getCheckPreCheckNodesNotExistsPolicy (line 128) | public int getCheckPreCheckNodesNotExistsPolicy() {
method setCheckPreCheckNodesNotExistsPolicy (line 132) | public void setCheckPreCheckNodesNotExistsPolicy(int checkPreCheckNode...
method getCheckNonStartNodeNoPreviousPolicy (line 136) | public int getCheckNonStartNodeNoPreviousPolicy() {
method setCheckNonStartNodeNoPreviousPolicy (line 140) | public void setCheckNonStartNodeNoPreviousPolicy(int checkNonStartNode...
method getCheckNonEndNodeNoNextPolicy (line 145) | public int getCheckNonEndNodeNoNextPolicy() {
method setCheckNonEndNodeNoNextPolicy (line 149) | public void setCheckNonEndNodeNoNextPolicy(int checkNonEndNodeNoNextPo...
method getFlowWhitelist (line 153) | public Set<String> getFlowWhitelist() {
method setFlowWhitelist (line 157) | public void setFlowWhitelist(Set<String> flowWhitelist) {
method getChecker (line 161) | public FlowNodeLinkChecker getChecker() {
method setChecker (line 165) | public void setChecker(FlowNodeLinkChecker checker) {
method isCheckOnlyParseEl (line 169) | public boolean isCheckOnlyParseEl() {
method setCheckOnlyParseEl (line 173) | public void setCheckOnlyParseEl(boolean checkOnlyParseEl) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/FlowNodeLinkChecker.java
class FlowNodeLinkChecker (line 16) | public class FlowNodeLinkChecker implements FlowChecker {
method check (line 24) | public CheckResult check(CheckParam param) {
method arrayContains (line 77) | private static boolean arrayContains(String[] array, String element) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/InfiniteLoopCheckFlowParseListener.java
class InfiniteLoopCheckFlowParseListener (line 19) | public class InfiniteLoopCheckFlowParseListener implements FlowParseEven...
method on (line 26) | @Override
method getFlowWhitelist (line 49) | public Set<String> getFlowWhitelist() {
method setFlowWhitelist (line 54) | public void setFlowWhitelist(Set<String> flowWhitelist) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/SubFlowCheckFlowParseListener.java
class SubFlowCheckFlowParseListener (line 26) | public class SubFlowCheckFlowParseListener implements FlowParseEventList...
method on (line 30) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallConstants.java
class FunCallConstants (line 8) | public class FunCallConstants {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallEventListener.java
class FunCallEventListener (line 21) | public class FunCallEventListener extends BaseFlowEventListener {
method FunCallEventListener (line 30) | public FunCallEventListener(Map<String, Object> conf) {
method on (line 38) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallFlowPostHandler.java
class FunCallFlowPostHandler (line 16) | public class FunCallFlowPostHandler implements FlowPostHandler {
method FunCallFlowPostHandler (line 20) | public FunCallFlowPostHandler(Map<String, Object> conf) {
method postHandle (line 24) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallFlowPreHandler.java
class FunCallFlowPreHandler (line 16) | public class FunCallFlowPreHandler implements FlowPreHandler {
method FunCallFlowPreHandler (line 20) | public FunCallFlowPreHandler(Map<String, Object> conf) {
method preHandle (line 24) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallNodeAction.java
class FunCallNodeAction (line 29) | public class FunCallNodeAction implements NodeAction, ApplicationContext...
method create (line 45) | public void create(Map<String, Object> actionConf, FlowNode node) thro...
method FunCallNodeAction (line 51) | public FunCallNodeAction() {
method FunCallNodeAction (line 55) | public FunCallNodeAction(Map<String, Object> actionConf, FlowNode node...
method init (line 59) | public void init(Map<String, Object> actionConf, FlowNode node) throws...
method execute (line 87) | @Override
method setApplicationContext (line 148) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtInterruptNodeAction.java
class ExtInterruptNodeAction (line 18) | public class ExtInterruptNodeAction extends InterruptNodeAction {
method init (line 20) | @Override
method initFlowFilter (line 26) | private void initFlowFilter(InitContext initContext, Object flowNode) {
method initNodeFilter (line 45) | private void initNodeFilter(InitContext initContext, Object flowNode) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadHolder.java
class ExtNodeThreadHolder (line 8) | class ExtNodeThreadHolder {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadInterruptFlowFilter.java
class ExtNodeThreadInterruptFlowFilter (line 18) | public class ExtNodeThreadInterruptFlowFilter extends BaseFlowFilter {
method ExtNodeThreadInterruptFlowFilter (line 22) | public ExtNodeThreadInterruptFlowFilter() {}
method ExtNodeThreadInterruptFlowFilter (line 24) | public ExtNodeThreadInterruptFlowFilter(int order) {
method doFilter (line 28) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadInterruptHelper.java
class ExtNodeThreadInterruptHelper (line 6) | class ExtNodeThreadInterruptHelper {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadInterruptNodeFilter.java
class ExtNodeThreadInterruptNodeFilter (line 15) | public class ExtNodeThreadInterruptNodeFilter extends BaseNodeFilter {
method ExtNodeThreadInterruptNodeFilter (line 17) | public ExtNodeThreadInterruptNodeFilter() {}
method ExtNodeThreadInterruptNodeFilter (line 19) | public ExtNodeThreadInterruptNodeFilter(int order) {
method doFilter (line 23) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/model/action/JavaScriptNodeAction.java
class JavaScriptNodeAction (line 21) | public class JavaScriptNodeAction implements NodeAction {
method execute (line 25) | @Override
method init (line 41) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/model/action/ShellNodeAction.java
class ShellNodeAction (line 19) | public class ShellNodeAction implements NodeAction {
method execute (line 29) | @Override
method init (line 57) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamAssembleData.java
class FlowParamAssembleData (line 9) | public class FlowParamAssembleData {
method getFlowContext (line 15) | public FlowContext getFlowContext() {
method setFlowContext (line 19) | public void setFlowContext(FlowContext flowContext) {
method getNodeContext (line 23) | public NodeContext getNodeContext() {
method setNodeContext (line 27) | public void setNodeContext(NodeContext nodeContext) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamAssembleManager.java
class FlowParamAssembleManager (line 12) | public class FlowParamAssembleManager {
method getInstance (line 16) | public static FlowParamAssembleManager getInstance() {
method getAssembler (line 22) | public FlowParamAssembler getAssembler(String className) {
method assemble (line 32) | public FlowParam assemble(String assemblerClass, FlowParamAssembleData...
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamAssembler.java
type FlowParamAssembler (line 7) | public interface FlowParamAssembler {
method assemble (line 9) | public FlowParam assemble(FlowParamAssembleData data, Map<String, Obje...
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamSerializeManager.java
class FlowParamSerializeManager (line 12) | public class FlowParamSerializeManager {
method getInstance (line 19) | public static FlowParamSerializeManager getInstance() {
method getSerializer (line 23) | public FlowParamSerializer getSerializer(String className) {
method serialize (line 33) | public String serialize(String className, FlowParam param, Map<String,...
method deserialize (line 39) | public FlowParam deserialize(String className, String s, Map<String, O...
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamSerializer.java
type FlowParamSerializer (line 10) | public interface FlowParamSerializer {
method serialize (line 12) | public String serialize(FlowParam flowParam, Map<String, Object> config);
method deserialize (line 14) | public FlowParam deserialize(String s, Map<String, Object> config);
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/BaseFlowParamSerializer.java
class BaseFlowParamSerializer (line 13) | public abstract class BaseFlowParamSerializer implements FlowParamSerial...
method createFlowParamToSerialize (line 15) | protected FlowParam createFlowParamToSerialize(FlowParam flowParam, Ma...
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/DefaultFlowParamAssembler.java
class DefaultFlowParamAssembler (line 13) | public class DefaultFlowParamAssembler implements FlowParamAssembler {
method assemble (line 15) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/JavaFlowParamSerializer.java
class JavaFlowParamSerializer (line 17) | public class JavaFlowParamSerializer extends BaseFlowParamSerializer {
method serialize (line 19) | @Override
method deserialize (line 33) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/JsonFlowParamSerializer.java
class JsonFlowParamSerializer (line 17) | public class JsonFlowParamSerializer extends BaseFlowParamSerializer {
method serialize (line 27) | @Override
method deserialize (line 38) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/FlowSession.java
type FlowSession (line 9) | public interface FlowSession {
method getId (line 11) | String getId();
method put (line 13) | void put(String key, Object value);
method get (line 15) | <T> T get(String key);
method remove (line 17) | Object remove(String key);
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/FlowSessionConstants.java
class FlowSessionConstants (line 8) | public class FlowSessionConstants {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/FlowSessionImpl.java
class FlowSessionImpl (line 12) | public class FlowSessionImpl implements FlowSession {
method FlowSessionImpl (line 20) | public FlowSessionImpl() {
method put (line 24) | @Override
method get (line 33) | @Override
method remove (line 38) | public Object remove(String key) {
method getId (line 42) | public String getId() {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/SessionMultiCheckPreHandler.java
class SessionMultiCheckPreHandler (line 22) | public class SessionMultiCheckPreHandler implements NodePreHandler {
method SessionMultiCheckPreHandler (line 28) | public SessionMultiCheckPreHandler() {
method SessionMultiCheckPreHandler (line 32) | public SessionMultiCheckPreHandler(List<String> preNodes) {
method preHandle (line 40) | @Override
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/timeout/TimeoutFlowFilter.java
class TimeoutFlowFilter (line 23) | public class TimeoutFlowFilter extends BaseFilter<FlowContext, FlowResul...
method TimeoutFlowFilter (line 34) | public TimeoutFlowFilter() {
method TimeoutFlowFilter (line 38) | public TimeoutFlowFilter(ExecutorService defaultExecutorService) {
method init (line 42) | @Override
method doFilter (line 49) | @Override
method getExecutorService (line 93) | public ExecutorService getExecutorService(String executorServiceKey, N...
method getDefaultExecutorService (line 103) | public ExecutorService getDefaultExecutorService() {
method setDefaultExecutorService (line 107) | public void setDefaultExecutorService(ExecutorService defaultExecutorS...
method getExecutorServiceMap (line 111) | public Map<String, ExecutorService> getExecutorServiceMap() {
method setExecutorServiceMap (line 115) | public void setExecutorServiceMap(Map<String, ExecutorService> executo...
method getTimeoutTemplate (line 119) | public TimeoutTemplate getTimeoutTemplate() {
method setTimeoutTemplate (line 123) | public void setTimeoutTemplate(TimeoutTemplate timeoutTemplate) {
FILE: easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/timeout/TimeoutNodeActionFilter.java
class TimeoutNodeActionFilter (line 25) | public class TimeoutNodeActionFilter extends BaseFilter<Pair<NodeContext...
method TimeoutNodeActionFilter (line 36) | public TimeoutNodeActionFilter() {
method TimeoutNodeActionFilter (line 40) | public TimeoutNodeActionFilter(ExecutorService defaultExecutorService) {
method init (line 44) | @Override
method doFilter (line 51) | @Override
method getExecutorService (line 93) | public ExecutorService getExecutorService(String executorServiceKey, N...
method getDefaultExecutorService (line 103) | public ExecutorService getDefaultExecutorService() {
method setDefaultExecutorService (line 107) | public void setDefaultExecutorService(ExecutorService defaultExecutorS...
method getExecutorServiceMap (line 111) | public Map<String, ExecutorService> getExecutorServiceMap() {
method setExecutorServiceMap (line 115) | public void setExecutorServiceMap(Map<String, ExecutorService> executo...
method getTimeoutTemplate (line 119) | public TimeoutTemplate getTimeoutTemplate() {
method setTimeoutTempl
Copy disabled (too large)
Download .json
Condensed preview — 1205 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (17,840K chars).
[
{
"path": ".gitignore",
"chars": 388,
"preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**\n!**/src/test/**\n\n### STS ###\n.apt_generated\n.classpath\n."
},
{
"path": "LICENSE.txt",
"chars": 10595,
"preview": " Copyright 2021-2022 Jingdong Technology Holding Co. LTD.\n\n Licensed under the Apache License, Version 2.0 (the \"Lic"
},
{
"path": "NOTICE.txt",
"chars": 2704,
"preview": "1.JDEasyflow use bpmn-js(https://bpmn.io/) component to render bpmn diagram. You should obey \ntheir license rule(https:/"
},
{
"path": "README-zh.md",
"chars": 3321,
"preview": "# JDEasyFlow\n\n### 介绍\nJDEasyFlow是一款通用流程编排组件, 适用于服务编排、工作流、任务审批等场景。它的特点是简单、灵活、易扩展。开发人员30分钟可入门上手,半天可掌握其原理。\n\n### 软件架构\nJDEasyF"
},
{
"path": "README.md",
"chars": 4679,
"preview": "# JDEasyFlow\n\n### Introduce\nJDEasyFlow is a general flow orchestration component, suitable for service orchestration, wo"
},
{
"path": "easyflow-flow/pom.xml",
"chars": 1384,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/common/FlowExecutor.java",
"chars": 326,
"preview": "package com.jd.easyflow.flow.common;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElEvaluator.java",
"chars": 934,
"preview": "package com.jd.easyflow.flow.el;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.e"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElFactory.java",
"chars": 486,
"preview": "package com.jd.easyflow.flow.el;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ElFactory {\n \n private static "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElRootMap.java",
"chars": 4957,
"preview": "package com.jd.easyflow.flow.el;\n\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Set;\n\nimport com.j"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/SpelEvaluator.java",
"chars": 8800,
"preview": "package com.jd.easyflow.flow.el;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.Concurrent"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowContext.java",
"chars": 3222,
"preview": "package com.jd.easyflow.flow.engine;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\n\nimport "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowEngine.java",
"chars": 922,
"preview": "package com.jd.easyflow.flow.engine;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.e"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowParam.java",
"chars": 4986,
"preview": "package com.jd.easyflow.flow.engine;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\nimport j"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowResult.java",
"chars": 2446,
"preview": "package com.jd.easyflow.flow.engine;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\nim"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowRunner.java",
"chars": 309,
"preview": "package com.jd.easyflow.flow.engine;\n\nimport com.jd.easyflow.flow.model.FlowLifeCycle;\n\n/**\n * Flow runner. \n * @author "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/builder/FlowParamBuilder.java",
"chars": 2299,
"preview": "package com.jd.easyflow.flow.engine.builder;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Hash"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/BaseFlowEventListener.java",
"chars": 1297,
"preview": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.ut"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/ExpFlowEventListener.java",
"chars": 1305,
"preview": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEvent.java",
"chars": 1081,
"preview": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.en"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEventListener.java",
"chars": 772,
"preview": "package com.jd.easyflow.flow.engine.event;\n\nimport com.jd.easyflow.flow.model.FlowLifeCycle;\nimport com.jd.easyflow.flow"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEventTrigger.java",
"chars": 5403,
"preview": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.Ha"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/impl/EventFlowListener.java",
"chars": 2034,
"preview": "package com.jd.easyflow.flow.engine.event.impl;\n\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.Logge"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/impl/InterruptFlowListener.java",
"chars": 2383,
"preview": "package com.jd.easyflow.flow.engine.event.impl;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/FlowEngineFilter.java",
"chars": 393,
"preview": "package com.jd.easyflow.flow.engine.filter;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/FlowEngineFilterManager.java",
"chars": 3697,
"preview": "package com.jd.easyflow.flow.engine.filter;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.functio"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/impl/BaseFlowEngineFilter.java",
"chars": 503,
"preview": "package com.jd.easyflow.flow.engine.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/BaseFlowRunner.java",
"chars": 8166,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.slf4"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/CoreFlowEngine.java",
"chars": 14925,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Arra"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/ExpFlowRunner.java",
"chars": 510,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.e"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/FlowContextImpl.java",
"chars": 6179,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Deq"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/FlowEngineImpl.java",
"chars": 3535,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\nimport org.slf4j.Log"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/MultipleThreadFlowRunner.java",
"chars": 6888,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurren"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/ReusableThreadFlowRunner.java",
"chars": 3440,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport jav"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/SingleThreadFlowRunner.java",
"chars": 1047,
"preview": "package com.jd.easyflow.flow.engine.impl;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyf"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/exception/FlowException.java",
"chars": 437,
"preview": "package com.jd.easyflow.flow.exception;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowException extends Runtime"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/BaseFilter.java",
"chars": 631,
"preview": "package com.jd.easyflow.flow.filter;\n\nimport java.util.Map;\n\n/**\n * \n */\npublic abstract class BaseFilter<T, R> implemen"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/ExpFilter.java",
"chars": 2723,
"preview": "package com.jd.easyflow.flow.filter;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport o"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/Filter.java",
"chars": 655,
"preview": "package com.jd.easyflow.flow.filter;\n\nimport com.jd.easyflow.flow.model.FlowLifeCycle;\n\n/**\n * \n * @author liyuliang5\n *"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/FilterChain.java",
"chars": 168,
"preview": "package com.jd.easyflow.flow.filter;\n\n/**\n * @author liyuliang5\n * @param <T>\n * @param <R>\n */\npublic interface FilterC"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/FilterChainImpl.java",
"chars": 685,
"preview": "package com.jd.easyflow.flow.filter;\n\nimport java.util.List;\nimport java.util.function.Function;\n\n/**\n * \n * @author liy"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/Flow.java",
"chars": 7442,
"preview": "package com.jd.easyflow.flow.model;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowLifeCycle.java",
"chars": 827,
"preview": "package com.jd.easyflow.flow.model;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic interface FlowLifeC"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowNode.java",
"chars": 1326,
"preview": "package com.jd.easyflow.flow.model;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowPostHandler.java",
"chars": 230,
"preview": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowPreHandler.java",
"chars": 231,
"preview": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/InitContext.java",
"chars": 1269,
"preview": "package com.jd.easyflow.flow.model;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.model.par"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeAction.java",
"chars": 376,
"preview": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeContext.java",
"chars": 3324,
"preview": "package com.jd.easyflow.flow.model;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport java.util.concurrent.Conc"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeContextAccessor.java",
"chars": 1302,
"preview": "package com.jd.easyflow.flow.model;\n\nimport java.util.Map;\n\n/**\n * @author liyuliang5.\n * Using separate setter to avoid"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeExecutor.java",
"chars": 375,
"preview": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * Executor of node and subcom"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodePostHandler.java",
"chars": 405,
"preview": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * Node post handler.\n * @auth"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodePreHandler.java",
"chars": 349,
"preview": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ActionResultEl.java",
"chars": 1401,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/CompensateNodeAction.java",
"chars": 3215,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.f"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/EventNodeAction.java",
"chars": 5530,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimpor"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ExecutorNodeAction.java",
"chars": 789,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ExpNodeAction.java",
"chars": 839,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easy"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/FlowNodeAction.java",
"chars": 5610,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.en"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/InterruptNodeAction.java",
"chars": 432,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/LoopNodeAction.java",
"chars": 7834,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFacto"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ParamExecutorNodeAction.java",
"chars": 669,
"preview": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateAction.java",
"chars": 303,
"preview": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.eas"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateFlowFilter.java",
"chars": 2989,
"preview": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateFlowParseEventListener.java",
"chars": 2467,
"preview": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateHelper.java",
"chars": 1691,
"preview": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.eas"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateNodeFilter.java",
"chars": 8835,
"preview": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateNodePreHandlerFilter.java",
"chars": 1310,
"preview": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/FlowCompensateAction.java",
"chars": 811,
"preview": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.eas"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/builder/FlowBuilder.java",
"chars": 2698,
"preview": "package com.jd.easyflow.flow.model.builder;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.F"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/definition/DefConstants.java",
"chars": 3680,
"preview": "package com.jd.easyflow.flow.model.definition;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class DefConstants {\n\n pu"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowFilter.java",
"chars": 290,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowFilterManager.java",
"chars": 25580,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowPostHandlerFilter.java",
"chars": 244,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowPreHandlerFilter.java",
"chars": 246,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodeActionFilter.java",
"chars": 346,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodeFilter.java",
"chars": 403,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodePostHandlerFilter.java",
"chars": 358,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodePreHandlerFilter.java",
"chars": 351,
"preview": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseFlowFilter.java",
"chars": 383,
"preview": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseFlowPostHandlerFilter.java",
"chars": 344,
"preview": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseFlowPreHandlerFilter.java",
"chars": 364,
"preview": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodeActionFilter.java",
"chars": 455,
"preview": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodeFilter.java",
"chars": 500,
"preview": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodePostHandlerFilter.java",
"chars": 477,
"preview": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodePreHandlerFilter.java",
"chars": 472,
"preview": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/flow/post/ExpFlowPostHandler.java",
"chars": 946,
"preview": "package com.jd.easyflow.flow.model.flow.post;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.e"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/flow/pre/ExpFlowPreHandler.java",
"chars": 965,
"preview": "package com.jd.easyflow.flow.model.flow.pre;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.ea"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/node/NodeImpl.java",
"chars": 8523,
"preview": "package com.jd.easyflow.flow.model.node;\n\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent."
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/FlowParser.java",
"chars": 2118,
"preview": "package com.jd.easyflow.flow.model.parser;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.el"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/FlowParserImpl.java",
"chars": 43835,
"preview": "package com.jd.easyflow.flow.model.parser;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMa"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/ExpFlowParseEventListener.java",
"chars": 627,
"preview": "package com.jd.easyflow.flow.model.parser.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * \n * @author li"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/FlowParseEvent.java",
"chars": 1347,
"preview": "package com.jd.easyflow.flow.model.parser.event;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/FlowParseEventListener.java",
"chars": 302,
"preview": "package com.jd.easyflow.flow.model.parser.event;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic int"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/FlowParseEventTypes.java",
"chars": 403,
"preview": "package com.jd.easyflow.flow.model.parser.event;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowParseEventTypes "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/ActionParseParam.java",
"chars": 1502,
"preview": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/FlowParseParam.java",
"chars": 1401,
"preview": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic cla"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/PostParseParam.java",
"chars": 1426,
"preview": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/PreParseParam.java",
"chars": 1427,
"preview": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/AbstractNodePostHandler.java",
"chars": 9489,
"preview": "package com.jd.easyflow.flow.model.post;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\ni"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/ConditionalNodePostHandler.java",
"chars": 7137,
"preview": "package com.jd.easyflow.flow.model.post;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/EventPostHandler.java",
"chars": 4773,
"preview": "package com.jd.easyflow.flow.model.post;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimpor"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/ExecutorNodePostHandler.java",
"chars": 672,
"preview": "package com.jd.easyflow.flow.model.post;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.mo"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/ExpNodePostHandler.java",
"chars": 864,
"preview": "package com.jd.easyflow.flow.model.post;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyfl"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/FixedNodePostHandler.java",
"chars": 949,
"preview": "package com.jd.easyflow.flow.model.post;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.mo"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/ExpNodePreHandler.java",
"chars": 1069,
"preview": "package com.jd.easyflow.flow.model.pre;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflo"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/InclusiveCheckPreHandler.java",
"chars": 14425,
"preview": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collectio"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/MultiCheckPreHandler.java",
"chars": 4049,
"preview": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.slf4j.Logger;\nim"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/NodePreHandlerHelper.java",
"chars": 1854,
"preview": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nim"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/NodePrePropertyGetter.java",
"chars": 740,
"preview": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/ExceptionUtil.java",
"chars": 409,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExceptionUtil {\n\n public static"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowConstants.java",
"chars": 3489,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowConstants {\n \n public st"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowEventTypes.java",
"chars": 1683,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * Flow event types.\n * @author liyuliang5\n *\n */\npublic class FlowEventTypes {\n"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowIOUtil.java",
"chars": 654,
"preview": "package com.jd.easyflow.flow.util;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.Inp"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowNodeLinkUtil.java",
"chars": 13304,
"preview": "package com.jd.easyflow.flow.util;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimpor"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowStringUtil.java",
"chars": 616,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class FlowStringUtil {\n \n public stat"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowUtil.java",
"chars": 2623,
"preview": "package com.jd.easyflow.flow.util;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engi"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonFacade.java",
"chars": 200,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * @author liyuliang5\n */\npublic interface JsonFacade {\n\n\n public String toJs"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonFacadeJacksonImpl.java",
"chars": 1177,
"preview": "package com.jd.easyflow.flow.util;\n\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport com.fasterxml.ja"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonPrettyHelper.java",
"chars": 8708,
"preview": "package com.jd.easyflow.flow.util;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimpor"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonUtil.java",
"chars": 766,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * JSON Util.\n * \n * @author liyuliang5\n *\n */\npublic class JsonUtil {\n\n priv"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/LockUtil.java",
"chars": 1131,
"preview": "package com.jd.easyflow.flow.util;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.No"
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/Pair.java",
"chars": 714,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class Pair<L, R> {\n\n private L left;\n\n "
},
{
"path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/Triple.java",
"chars": 980,
"preview": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class Triple<L, M, R> {\n\n private L left"
},
{
"path": "easyflow-flow/src/main/resources/pretty/pretty-flow.json",
"chars": 15588,
"preview": "{\n \"endNewLine\": true,\n \"subList\": [\n {\n \"newLine\": true,\n \"subList\":[\n\n {\n "
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/FlowTestSuite.java",
"chars": 2542,
"preview": "package com.jd.easyflow.flow;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/ActionTest.java",
"chars": 893,
"preview": "package com.jd.easyflow.flow.cases.action;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFacto"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/CompensateTest.java",
"chars": 4464,
"preview": "package com.jd.easyflow.flow.cases.action;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.ArrayList;\nim"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/LoopNodeActionTest.java",
"chars": 800,
"preview": "package com.jd.easyflow.flow.cases.action;\n\nimport java.util.Arrays;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flo"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MockActionClass.java",
"chars": 616,
"preview": "package com.jd.easyflow.flow.cases.action;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * \n * @author liyulian"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MockClassMethodAction.java",
"chars": 3050,
"preview": "package com.jd.easyflow.flow.cases.action;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MockInputOutputEventListener.java",
"chars": 2754,
"preview": "package com.jd.easyflow.flow.cases.action;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimpor"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MultipleActionTest.java",
"chars": 2240,
"preview": "package com.jd.easyflow.flow.cases.action;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimpo"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/common/TestNodeExecutor.java",
"chars": 508,
"preview": "package com.jd.easyflow.flow.cases.common;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow."
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/event/EventFlowTest.java",
"chars": 3867,
"preview": "package com.jd.easyflow.flow.cases.event;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport o"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/event/TestEventNodeAction.java",
"chars": 786,
"preview": "package com.jd.easyflow.flow.cases.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimp"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/filter/FilterTest.java",
"chars": 9436,
"preview": "package com.jd.easyflow.flow.cases.filter;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert."
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/flowengine/FlowEngineImplTest.java",
"chars": 2637,
"preview": "package com.jd.easyflow.flow.cases.flowengine;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Arrays;\n\n"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/flowengine/PocFlowEngineImpl.java",
"chars": 2110,
"preview": "package com.jd.easyflow.flow.cases.flowengine;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nim"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/flowengine/PocNodeImpl.java",
"chars": 1486,
"preview": "package com.jd.easyflow.flow.cases.flowengine;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.f"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/inclusive/InclusiveTest.java",
"chars": 7276,
"preview": "package com.jd.easyflow.flow.cases.inclusive;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Asse"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/interrupt/InterruptTest.java",
"chars": 3738,
"preview": "package com.jd.easyflow.flow.cases.interrupt;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concur"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/listener/InterruptFlowListenerTest.java",
"chars": 2060,
"preview": "package com.jd.easyflow.flow.cases.listener;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.slf4j.Logger;\ni"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/logflag/LogFlagTest.java",
"chars": 853,
"preview": "package com.jd.easyflow.flow.cases.logflag;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFact"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/CheckBiz.java",
"chars": 583,
"preview": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.eas"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/LimitBiz.java",
"chars": 254,
"preview": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport java.math.BigDecimal;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic c"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/LoanBiz.java",
"chars": 329,
"preview": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * \n * @autho"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/LoanContractSignBiz.java",
"chars": 298,
"preview": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class Loan"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/MockFlowListener.java",
"chars": 919,
"preview": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.eas"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/MockLoanTest.java",
"chars": 1046,
"preview": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport java.math.BigDecimal;\nimport java.util.HashMap;\nimport java.util.Map"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parallel/ParallelTest.java",
"chars": 1149,
"preview": "package com.jd.easyflow.flow.cases.parallel;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.List;\n\nimpo"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/FlowParserTest.java",
"chars": 5188,
"preview": "package com.jd.easyflow.flow.cases.parser;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert."
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestAddFilterParseListener.java",
"chars": 649,
"preview": "package com.jd.easyflow.flow.cases.parser;\n\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestFlowParamAndResultPrintFilter.java",
"chars": 850,
"preview": "package com.jd.easyflow.flow.cases.parser;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easy"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestFlowParseListener.java",
"chars": 1130,
"preview": "package com.jd.easyflow.flow.cases.parser;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.mo"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestFlowParserImpl.java",
"chars": 781,
"preview": "package com.jd.easyflow.flow.cases.parser;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\nim"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/EmptyStepAction.java",
"chars": 432,
"preview": "package com.jd.easyflow.flow.cases.performance;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/LoopStepAction.java",
"chars": 714,
"preview": "package com.jd.easyflow.flow.cases.performance;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/MemoryTest.java",
"chars": 1187,
"preview": "package com.jd.easyflow.flow.cases.performance;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/PerformanceTest.java",
"chars": 7852,
"preview": "package com.jd.easyflow.flow.cases.performance;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.Logger"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/ConditionalPostHandlerTest.java",
"chars": 2171,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Arrays;\n"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/FlowIndexTest.java",
"chars": 1189,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.math.BigDecim"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/NodePostHandlerTest.java",
"chars": 2606,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.As"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostHandlerFilterTest.java",
"chars": 1132,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nim"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostParamNode1Action.java",
"chars": 448,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow."
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostParamNode2Action.java",
"chars": 810,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostParamNode3Action.java",
"chars": 651,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/TestPostHandlerFilter.java",
"chars": 1209,
"preview": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/prehandler/PreHandlerTest.java",
"chars": 942,
"preview": "package com.jd.easyflow.flow.cases.prehandler;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerF"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/pretty/FlowDefPrettyHelperTest.java",
"chars": 3059,
"preview": "package com.jd.easyflow.flow.cases.pretty;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.lang.reflect.Metho"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/MultiThreadTest.java",
"chars": 3058,
"preview": "package com.jd.easyflow.flow.cases.runner;\n\nimport static org.junit.Assert.assertFalse;\n\nimport org.junit.Test;\nimport o"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/ReusableThreadTest.java",
"chars": 2592,
"preview": "package com.jd.easyflow.flow.cases.runner;\n\nimport static org.junit.Assert.assertFalse;\n\nimport org.junit.Test;\nimport o"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/TestInterruptNodeAction.java",
"chars": 1079,
"preview": "package com.jd.easyflow.flow.cases.runner;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easy"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/TestMultiRunner.java",
"chars": 1342,
"preview": "package com.jd.easyflow.flow.cases.runner;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Synchrono"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/TestReusableThreadRunner.java",
"chars": 994,
"preview": "package com.jd.easyflow.flow.cases.runner;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Synchrono"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/share/nodeaction/TestStepAction.java",
"chars": 1192,
"preview": "package com.jd.easyflow.flow.cases.share.nodeaction;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport c"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/spring/SpringFlowTest.java",
"chars": 2983,
"preview": "package com.jd.easyflow.flow.cases.spring;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport "
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/subflow/SubFlowTest.java",
"chars": 2383,
"preview": "package com.jd.easyflow.flow.cases.subflow;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/subflow/TestInvokeSubFlowNodeAction.java",
"chars": 665,
"preview": "package com.jd.easyflow.flow.cases.subflow;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStart001Node01Action.java",
"chars": 605,
"preview": "package com.jd.easyflow.flow.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyfl"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStart002Node01Action.java",
"chars": 605,
"preview": "package com.jd.easyflow.flow.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyfl"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStart003Node01Action.java",
"chars": 605,
"preview": "package com.jd.easyflow.flow.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyfl"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStartTest.java",
"chars": 1015,
"preview": "package com.jd.easyflow.flow.quickstart;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport or"
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/unit/util/JsonTest.java",
"chars": 1898,
"preview": "package com.jd.easyflow.flow.unit.util;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport "
},
{
"path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/unit/util/TreeMapTest.java",
"chars": 1349,
"preview": "package com.jd.easyflow.flow.unit.util;\n\nimport java.util.Comparator;\nimport java.util.TreeMap;\n\nimport org.junit.Test;\n"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/action/action_interrupt_001.json",
"chars": 398,
"preview": "{ \"id\": \"action_interrupt_test_001\",\n \"name\": \"Action Interrupt Test 001\",\n \"nodes\": [\n {\"id\": \"node001\""
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/action/compensate_001.json",
"chars": 463,
"preview": "{\n\t\"id\":\"compensate_001\",\n\t\"nodes\":[\n\t\t{\"id\":\"node001\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.ca"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/action/compensate_002.json",
"chars": 819,
"preview": "{\n\t\"id\":\"compensate_002\",\n\t\"nodes\":[\n\t\t{\"id\":\"node001\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.ca"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/action/compensate_flow_001.json",
"chars": 692,
"preview": "{\n\t\"id\":\"compensate_flow_001\",\n\t\"nodes\":[\n\t\t{\"id\":\"node001\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.fl"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/action/loop_test_001.json",
"chars": 643,
"preview": "{\n \"id\": \"loop_test_001\",\n \"name\": \"Loop Test 001\",\n \"nodes\": [\n {\n \"id\": \"node001\",\n "
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/action/multiple_action_001.json",
"chars": 266,
"preview": "{\"id\":\"multi_action_001\", \n\"nodes\":[\n\t{\"id\":\"node1\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_001.json",
"chars": 921,
"preview": "{\n \"id\": \"flow_event_001\",\"name\": \"Flow event 001\",\n \"nodes\": [\n {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty "
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_002.json",
"chars": 945,
"preview": "{\n \"id\": \"flow_event_002\",\"name\": \"Flow event 002\",\n \"nodes\": [\n {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty "
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_003.json",
"chars": 812,
"preview": "{\n \"id\": \"flow_event_003\",\"name\": \"Flow event 003\",\n \"nodes\": [\n {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty "
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_nolistener_001.json",
"chars": 472,
"preview": "{\n \"id\": \"flow_event_nolistener_001\",\n \"nodes\": [\n {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty Node1\",\"action"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/filter/inner_flow_engine_filter_001.json",
"chars": 77,
"preview": "{\n\"id\":\"innerFlowEngineFilter001\",\n\"nodes\":[\n\t{\"id\":\"001\", \"start\":true}\n]\n}\n"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/filter/inner_flow_filter_001.json",
"chars": 373,
"preview": "{\n\"id\":\"innerFlowFilter001\",\n\"nodes\":[\n{\"id\":\"node001\", \"start\":true, \"action\":\"0\", \"post\":{\"when\":\"actionResult>0\", \"to"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/filter/inner_node_action_filter_001.json",
"chars": 285,
"preview": "{\n\"id\":\"innerNodeActionFilter001\",\n\"nodes\":[\n{\"id\":\"node001\", \"start\":true, \"action\":\"0\", \"post\":{\"when\":\"actionResult>0"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/inclusive/flow_inclusive201.json",
"chars": 1182,
"preview": "{\n \"id\": \"flow_inclusive201\",\"name\": \"Inclusive nodes 001\",\n \"nodes\": [\n {\"id\": \"START_NODE\", \"start\":true,"
},
{
"path": "easyflow-flow/src/test/resources/flow/cases/inclusive/flow_inclusive202.json",
"chars": 1481,
"preview": "{\n \"id\": \"flow_inclusive202\",\"name\": \"Inclusive nodes 001\",\n \"nodes\": [\n {\"id\": \"START_NODE\", \"start\":true,"
}
]
// ... and 1005 more files (download for full content)
About this extraction
This page contains the full source code of the JDEasyFlow/jd-easyflow GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1205 files (16.1 MB), approximately 4.3M tokens, and a symbol index with 14062 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.