概述
Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated
ChildTaskActivityBehavior 子任务活动行为类
/**
* 子任务活动行为类
*
* @author Tijs Rademakers
* @author Joram Barrez
*/
public abstract class ChildTaskActivityBehavior extends CoreCmmnTriggerableActivityBehavior {
private static final Logger LOGGER = LoggerFactory.getLogger(ChildTaskActivityBehavior.class);
protected boolean isBlocking;
protected String isBlockingExpression;
protected List<IOParameter> inParameters;
protected List<IOParameter> outParameters;
public ChildTaskActivityBehavior(boolean isBlocking, String isBlockingExpression) {
this.isBlocking = isBlocking;
this.isBlockingExpression = isBlockingExpression;
}
public ChildTaskActivityBehavior(boolean isBlocking, String isBlockingExpression, List<IOParameter> inParameters, List<IOParameter> outParameters) {
this(isBlocking, isBlockingExpression);
this.inParameters = inParameters;
this.outParameters = outParameters;
}
@Override
public void execute(CommandContext commandContext, PlanItemInstanceEntity planItemInstanceEntity) {
execute(commandContext, planItemInstanceEntity, null);
}
public abstract void execute(CommandContext commandContext, PlanItemInstanceEntity planItemInstanceEntity, VariableInfo variableInfo);
protected boolean evaluateIsBlocking(DelegatePlanItemInstance planItemInstance) {
boolean blocking = isBlocking;
if (StringUtils.isNotEmpty(isBlockingExpression)) {
Expression expression = CommandContextUtil.getExpressionManager().createExpression(isBlockingExpression);
blocking = (Boolean) expression.getValue(planItemInstance);
}
return blocking;
}
@Override
public void trigger(CommandContext commandContext, PlanItemInstanceEntity planItemInstance) {
if (!PlanItemInstanceState.ACTIVE.equals(planItemInstance.getState())) {
throw new FlowableIllegalStateException("Can only trigger a plan item that is in the ACTIVE state");
}
CommandContextUtil.getAgenda(commandContext).planCompletePlanItemInstanceOperation(planItemInstance);
}
protected void handleInParameters(PlanItemInstanceEntity planItemInstanceEntity,
CmmnEngineConfiguration cmmnEngineConfiguration, Map<String, Object> inParametersMap,
ExpressionManager expressionManager) {
if (inParameters == null) {
return;
}
for (IOParameter inParameter : inParameters) {
String variableName = null;
if (StringUtils.isNotEmpty(inParameter.getTargetExpression())) {
Expression expression = cmmnEngineConfiguration.getExpressionManager().createExpression(inParameter.getTargetExpression());
Object variableNameValue = expression.getValue(planItemInstanceEntity);
if (variableNameValue != null) {
variableName = variableNameValue.toString();
} else {
LOGGER.warn("In parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error",
inParameter.getTargetExpression());
}
} else if (StringUtils.isNotEmpty(inParameter.getTarget())) {
variableName = inParameter.getTarget();
}
Object variableValue = null;
if (StringUtils.isNotEmpty(inParameter.getSourceExpression())) {
Expression expression = expressionManager.createExpression(inParameter.getSourceExpression());
variableValue = expression.getValue(planItemInstanceEntity);
} else if (StringUtils.isNotEmpty(inParameter.getSource())) {
variableValue = planItemInstanceEntity.getVariable(inParameter.getSource());
}
if (variableName != null) {
inParametersMap.put(variableName, variableValue);
}
}
}
protected String getBusinessKey(CmmnEngineConfiguration cmmnEngineConfiguration, PlanItemInstanceEntity planItemInstanceEntity, ChildTask childTask) {
String businessKey = null;
ExpressionManager expressionManager = cmmnEngineConfiguration.getExpressionManager();
CaseInstanceEntityManager caseInstanceEntityManager = cmmnEngineConfiguration.getCaseInstanceEntityManager();
if (!StringUtils.isEmpty(childTask.getBusinessKey())) {
Expression expression = expressionManager.createExpression(childTask.getBusinessKey());
businessKey = expression.getValue(planItemInstanceEntity).toString();
} else if (childTask.isInheritBusinessKey()) {
String caseInstanceId = planItemInstanceEntity.getCaseInstanceId();
CaseInstance caseInstance = caseInstanceEntityManager.findById(caseInstanceId);
businessKey = caseInstance.getBusinessKey();
}
return businessKey;
}
/**
* 在触发手动删除时调用(而不是在触发终止/完成时),
* 例如,当部署被删除,需要删除所有相关内容时。
*/
public abstract void deleteChildEntity(CommandContext commandContext, DelegatePlanItemInstance delegatePlanItemInstance, boolean cascade);
public static class VariableInfo {
protected Map<String, Object> variables;
protected Map<String, Object> formVariables;
protected String formOutcome;
protected FormInfo formInfo;
public VariableInfo(Map<String, Object> variables) {
this.variables = variables;
}
public VariableInfo(Map<String, Object> variables, Map<String, Object> formVariables, String formOutcome, FormInfo formInfo) {
this(variables);
this.formVariables = formVariables;
this.formOutcome = formOutcome;
this.formInfo = formInfo;
}
public Map<String, Object> getVariables() {
return variables;
}
public void setVariables(Map<String, Object> variables) {
this.variables = variables;
}
public Map<String, Object> getFormVariables() {
return formVariables;
}
public void setFormVariables(Map<String, Object> formVariables) {
this.formVariables = formVariables;
}
public String getFormOutcome() {
return formOutcome;
}
public void setFormOutcome(String formOutcome) {
this.formOutcome = formOutcome;
}
public FormInfo getFormInfo() {
return formInfo;
}
public void setFormInfo(FormInfo formInfo) {
this.formInfo = formInfo;
}
}
}
ProcessTaskActivityBehavior 流程任务活动行为类
扩展自子任务活动行为类
/**
* 流程任务活动行为类
* 扩展自子任务活动行为类
*
* @author Joram Barrez
*/
public class ProcessTaskActivityBehavior extends ChildTaskActivityBehavior implements PlanItemActivityBehavior {
private static final Logger LOGGER = LoggerFactory.getLogger(ProcessTaskActivityBehavior.class);
protected Process process;
protected Expression processRefExpression;
protected String processRef;
protected Boolean fallbackToDefaultTenant;
protected boolean sameDeployment;
protected ProcessTask processTask;
public ProcessTaskActivityBehavior(Process process, Expression processRefExpression, ProcessTask processTask) {
super(processTask.isBlocking(), processTask.getBlockingExpression(), processTask.getInParameters(), processTask.getOutParameters());
this.process = process;
this.processRefExpression = processRefExpression;
this.processRef = processTask.getProcessRef();
this.fallbackToDefaultTenant = processTask.getFallbackToDefaultTenant();
this.sameDeployment = processTask.isSameDeployment();
this.processTask = processTask;
}
@Override
public void execute(CommandContext commandContext, PlanItemInstanceEntity planItemInstanceEntity, ChildTaskActivityBehavior.VariableInfo variableInfo) {
CmmnEngineConfiguration cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration(commandContext);
ProcessInstanceService processInstanceService = cmmnEngineConfiguration.getProcessInstanceService();
if (processInstanceService == null) {
throw new FlowableException("Could not start process instance: no " + ProcessInstanceService.class + " implementation found");
}
String externalRef = null;
if (process != null) {
externalRef = process.getExternalRef();
} else if (processRefExpression != null) {
externalRef = processRefExpression.getValue(planItemInstanceEntity).toString();
} else if (processRef != null) {
externalRef = processRef;
}
if (StringUtils.isEmpty(externalRef)) {
throw new FlowableException("Could not start process instance: no externalRef defined");
}
Map<String, Object> inParametersMap = new HashMap<>();
handleInParameters(planItemInstanceEntity, cmmnEngineConfiguration, inParametersMap, cmmnEngineConfiguration.getExpressionManager());
FormInfo variableFormInfo = null;
Map<String, Object> variableFormVariables = null;
String variableFormOutcome = null;
if (variableInfo != null) {
variableFormInfo = variableInfo.formInfo;
variableFormVariables = variableInfo.formVariables;
variableFormOutcome = variableInfo.formOutcome;
if (variableInfo.variables != null && !variableInfo.variables.isEmpty()) {
inParametersMap.putAll(variableInfo.variables);
}
}
String processInstanceId = processInstanceService.generateNewProcessInstanceId();
if (StringUtils.isNotEmpty(processTask.getProcessInstanceIdVariableName())) {
Expression expression = cmmnEngineConfiguration.getExpressionManager().createExpression(processTask.getProcessInstanceIdVariableName());
String idVariableName = (String) expression.getValue(planItemInstanceEntity);
if (StringUtils.isNotEmpty(idVariableName)) {
planItemInstanceEntity.setVariable(idVariableName, processInstanceId);
}
}
planItemInstanceEntity.setReferenceType(ReferenceTypes.PLAN_ITEM_CHILD_PROCESS);
planItemInstanceEntity.setReferenceId(processInstanceId);
String businessKey = getBusinessKey(cmmnEngineConfiguration, planItemInstanceEntity, processTask);
boolean blocking = evaluateIsBlocking(planItemInstanceEntity);
String parentDeploymentId = getParentDeploymentIfSameDeployment(cmmnEngineConfiguration, planItemInstanceEntity);
if (blocking) {
if (CommandContextUtil.getCmmnEngineConfiguration(commandContext).isEnableEntityLinks()) {
EntityLinkUtil.createEntityLinks(planItemInstanceEntity.getCaseInstanceId(), planItemInstanceEntity.getId(),
planItemInstanceEntity.getPlanItemDefinitionId(), processInstanceId, ScopeTypes.BPMN, cmmnEngineConfiguration);
}
processInstanceService.startProcessInstanceByKey(externalRef, processInstanceId, planItemInstanceEntity.getId(), planItemInstanceEntity.getStageInstanceId(),
planItemInstanceEntity.getTenantId(), fallbackToDefaultTenant, parentDeploymentId, inParametersMap, businessKey, variableFormVariables, variableFormInfo, variableFormOutcome);
} else {
processInstanceService.startProcessInstanceByKey(externalRef, processInstanceId, planItemInstanceEntity.getStageInstanceId(),
planItemInstanceEntity.getTenantId(), fallbackToDefaultTenant, parentDeploymentId, inParametersMap, businessKey, variableFormVariables, variableFormInfo, variableFormOutcome);
}
if (!blocking) {
CommandContextUtil.getAgenda(commandContext).planCompletePlanItemInstanceOperation(planItemInstanceEntity);
}
}
@Override
public void trigger(CommandContext commandContext, PlanItemInstanceEntity planItemInstance) {
if (!PlanItemInstanceState.ACTIVE.equals(planItemInstance.getState())) {
// 只能触发处于活动状态的计划项
throw new FlowableIllegalStateException("Can only trigger a plan item that is in the ACTIVE state");
}
if (planItemInstance.getReferenceId() == null) {
// 无法触发流程任务计划项实例:未设置引用id
throw new FlowableIllegalStateException("Cannot trigger process task plan item instance : no reference id set");
}
if (!ReferenceTypes.PLAN_ITEM_CHILD_PROCESS.equals(planItemInstance.getReferenceType())) {
throw new FlowableException("Cannot trigger process task plan item instance : reference type '"
+ planItemInstance.getReferenceType() + "' not supported");
}
// 需要在规划完整的操作之前进行设置
CmmnEngineConfiguration cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration(commandContext);
CaseInstanceEntity caseInstance = cmmnEngineConfiguration.getCaseInstanceEntityManager().findById(planItemInstance.getCaseInstanceId());
handleOutParameters(planItemInstance, caseInstance, cmmnEngineConfiguration.getProcessInstanceService());
// 触发计划项(与常规完成相反)会终止流程实例
CommandContextUtil.getAgenda(commandContext).planCompletePlanItemInstanceOperation(planItemInstance);
deleteProcessInstance(commandContext, planItemInstance);
}
@Override
public void onStateTransition(CommandContext commandContext, DelegatePlanItemInstance planItemInstance, String transition) {
if (PlanItemInstanceState.ACTIVE.equals(planItemInstance.getState())) {
// 常规TerminatePlanItem操作将删除流程任务计划项
if (PlanItemTransition.TERMINATE.equals(transition) || PlanItemTransition.EXIT.equals(transition)) {
deleteProcessInstance(commandContext, planItemInstance);
}
}
}
protected void deleteProcessInstance(CommandContext commandContext, DelegatePlanItemInstance planItemInstance) {
ProcessInstanceService processInstanceService = CommandContextUtil.getCmmnEngineConfiguration(commandContext).getProcessInstanceService();
processInstanceService.deleteProcessInstance(planItemInstance.getReferenceId());
}
@Override
public void deleteChildEntity(CommandContext commandContext, DelegatePlanItemInstance delegatePlanItemInstance, boolean cascade) {
if (ReferenceTypes.PLAN_ITEM_CHILD_PROCESS.equals(delegatePlanItemInstance.getReferenceType())) {
delegatePlanItemInstance.setState(PlanItemInstanceState.TERMINATED); // This is not the regular termination, but the state still needs to be correct
deleteProcessInstance(commandContext, delegatePlanItemInstance);
} else {
throw new FlowableException("Can only delete a child entity for a plan item with reference type " + ReferenceTypes.PLAN_ITEM_CHILD_PROCESS);
}
}
protected void handleOutParameters(DelegatePlanItemInstance planItemInstance,
CaseInstanceEntity caseInstance,
ProcessInstanceService processInstanceService) {
if (outParameters == null) {
return;
}
for (IOParameter outParameter : outParameters) {
String variableName = null;
if (StringUtils.isNotEmpty(outParameter.getTarget())) {
variableName = outParameter.getTarget();
} else if (StringUtils.isNotEmpty(outParameter.getTargetExpression())) {
Object variableNameValue = processInstanceService.resolveExpression(planItemInstance.getReferenceId(), outParameter.getTargetExpression());
if (variableNameValue != null) {
variableName = variableNameValue.toString();
} else {
LOGGER.warn("Out parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error",
outParameter.getTargetExpression());
}
}
Object variableValue = null;
if (StringUtils.isNotEmpty(outParameter.getSourceExpression())) {
variableValue = processInstanceService.resolveExpression(planItemInstance.getReferenceId(), outParameter.getSourceExpression());
} else if (StringUtils.isNotEmpty(outParameter.getSource())) {
variableValue = processInstanceService.getVariable(planItemInstance.getReferenceId(), outParameter.getSource());
}
caseInstance.setVariable(variableName, variableValue);
}
}
protected String getParentDeploymentIfSameDeployment(CmmnEngineConfiguration cmmnEngineConfiguration, PlanItemInstanceEntity planItemInstanceEntity) {
if (!sameDeployment) {
// 如果不是同一部署,则返回null
// 那么就不应该考虑父部署
return null;
} else {
return CaseDefinitionUtil.getDefinitionDeploymentId(planItemInstanceEntity.getCaseDefinitionId(), cmmnEngineConfiguration);
}
}
}
最后
以上就是专一黄蜂为你收集整理的Flowable源码注释(七十二)子任务、流程任务活动行为的全部内容,希望文章能够帮你解决Flowable源码注释(七十二)子任务、流程任务活动行为所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复