Flowable源码地址:https://github.com/flowable/flowable-engine
Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated
BPMN解析处理器模板类,包路径:org.flowable.engine.impl.bpmn.parser.handler
BpmnParseHandler BPMN解析处理器接口
package org.flowable.engine.parse;
import java.util.Collection;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
import org.flowable.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
/**
* BPMN解析处理器
* 允许在解析BPMN 2.0进程期间连接到一个或多个元素的解析中。有关更多详细信息,请参阅关于bpmn解析处理程序的userguide部分。
*
* 此类的实例可以注入{@link ProcessEngineConfigurationImpl}。然后,每当解析出与BPMN返回的类型匹配的BPMN 2.0元素时,就会调用该处理程序
* {@link#getHandledTypes()}方法。
*
* @see AbstractBpmnParseHandler
*
* @author Joram Barrez
*/
public interface BpmnParseHandler {
/**
* 在流程解析期间必须调用此处理程序的类型。
*/
Collection<Class<? extends BaseElement>> getHandledTypes();
/**
* 实际的委派方法。解析器将在匹配{@link#getHandledTypes()}返回值时调用此方法。
*
* @param bpmnParse
* {@link BpmnParse}实例,充当解析过程中生成的所有内容的容器。
*/
void parse(BpmnParse bpmnParse, BaseElement element);
}
AbstractBpmnParseHandler BPMN解析处理器模板类
package org.flowable.engine.impl.bpmn.parser.handler;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.flowable.bpmn.model.Artifact;
import org.flowable.bpmn.model.Association;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.EventGateway;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.FlowableListener;
import org.flowable.bpmn.model.ImplementationType;
import org.flowable.bpmn.model.IntermediateCatchEvent;
import org.flowable.bpmn.model.SequenceFlow;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
import org.flowable.engine.parse.BpmnParseHandler;
/**
* BPMN解析处理器模板类
* 完成两大功能:
* 1、对BaseElement实例对象进行解析
* 2、将BaseElement的解析结果添加执行监听器
*
* @author Joram Barrez
*/
public abstract class AbstractBpmnParseHandler<T extends BaseElement> implements BpmnParseHandler {
public static final String PROPERTYNAME_EVENT_SUBSCRIPTION_DECLARATION = "eventDefinitions";
public static final String PROPERTYNAME_ERROR_EVENT_DEFINITIONS = "errorEventDefinitions";
public static final String PROPERTYNAME_TIMER_DECLARATION = "timerDeclarations";
@Override
public Set<Class<? extends BaseElement>> getHandledTypes() {
Set<Class<? extends BaseElement>> types = new HashSet<>();
types.add(getHandledType());
return types;
}
protected abstract Class<? extends BaseElement> getHandledType();
@SuppressWarnings("unchecked")
@Override
public void parse(BpmnParse bpmnParse, BaseElement element) {
T baseElement = (T) element;
executeParse(bpmnParse, baseElement);
}
protected abstract void executeParse(BpmnParse bpmnParse, T element);
protected ExecutionListener createExecutionListener(BpmnParse bpmnParse, FlowableListener listener) {
ExecutionListener executionListener = null;
if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equalsIgnoreCase(listener.getImplementationType())) {
executionListener = bpmnParse.getListenerFactory().createClassDelegateExecutionListener(listener);
} else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equalsIgnoreCase(listener.getImplementationType())) {
executionListener = bpmnParse.getListenerFactory().createExpressionExecutionListener(listener);
} else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equalsIgnoreCase(listener.getImplementationType())) {
executionListener = bpmnParse.getListenerFactory().createDelegateExpressionExecutionListener(listener);
}
return executionListener;
}
protected String getPrecedingEventBasedGateway(BpmnParse bpmnParse, IntermediateCatchEvent event) {
String eventBasedGatewayId = null;
for (SequenceFlow sequenceFlow : event.getIncomingFlows()) {
FlowElement sourceElement = bpmnParse.getBpmnModel().getFlowElement(sequenceFlow.getSourceRef());
if (sourceElement instanceof EventGateway) {
eventBasedGatewayId = sourceElement.getId();
break;
}
}
return eventBasedGatewayId;
}
protected void processArtifacts(BpmnParse bpmnParse, Collection<Artifact> artifacts) {
// 联系
for (Artifact artifact : artifacts) {
if (artifact instanceof Association) {
createAssociation(bpmnParse, (Association) artifact);
}
}
}
protected void createAssociation(BpmnParse bpmnParse, Association association) {
BpmnModel bpmnModel = bpmnParse.getBpmnModel();
if (bpmnModel.getArtifact(association.getSourceRef()) != null || bpmnModel.getArtifact(association.getTargetRef()) != null) {
// 已连接到文本批注,因此跳过它
}
// ActivityImpl sourceActivity =
// parentScope.findActivity(association.getSourceRef());
// ActivityImpl targetActivity =
// parentScope.findActivity(association.getTargetRef());
// an association may reference elements that are not parsed as
// activities (like for instance
// text annotations so do not throw an exception if sourceActivity or
// targetActivity are null)
// However, we make sure they reference 'something':
// if (sourceActivity == null) {
// bpmnModel.addProblem("Invalid reference sourceRef '" +
// association.getSourceRef() + "' of association element ",
// association.getId());
// } else if (targetActivity == null) {
// bpmnModel.addProblem("Invalid reference targetRef '" +
// association.getTargetRef() + "' of association element ",
// association.getId());
/*
* } else { if (sourceActivity.getProperty("type").equals("compensationBoundaryCatch" )) { Object isForCompensation = targetActivity.getProperty(PROPERTYNAME_IS_FOR_COMPENSATION); if
* (isForCompensation == null || !(Boolean) isForCompensation) { LOGGER.warn( "compensation boundary catch must be connected to element with isForCompensation=true" ); } else { ActivityImpl
* compensatedActivity = sourceActivity.getParentActivity(); compensatedActivity.setProperty(BpmnParse .PROPERTYNAME_COMPENSATION_HANDLER_ID, targetActivity.getId()); } } }
*/
}
}