package com.mossle.bpm.cmd; import com.mossle.spi.process.FirstTaskForm; import org.activiti.engine.delegate.Expression; import org.activiti.engine.impl.bpmn.parser.BpmnParse; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.form.DefaultFormHandler; import org.activiti.engine.impl.interceptor.Command; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.impl.pvm.PvmActivity; import org.activiti.engine.impl.pvm.PvmTransition; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.impl.task.TaskDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FindFirstTaskFormCmd implements Command<FirstTaskForm> { private static Logger logger = LoggerFactory .getLogger(FindFirstTaskFormCmd.class); private String processDefinitionId; public FindFirstTaskFormCmd(String processDefinitionId) { this.processDefinitionId = processDefinitionId; } public FirstTaskForm execute(CommandContext commandContext) { ProcessDefinitionEntity processDefinitionEntity = Context .getProcessEngineConfiguration().getDeploymentManager() .findDeployedProcessDefinitionById(processDefinitionId); if (processDefinitionEntity == null) { throw new IllegalArgumentException( "cannot find processDefinition : " + processDefinitionId); } if (processDefinitionEntity.hasStartFormKey()) { return this.findStartEventForm(processDefinitionEntity); } ActivityImpl startActivity = processDefinitionEntity.getInitial(); if (startActivity.getOutgoingTransitions().size() != 1) { throw new IllegalStateException( "start activity outgoing transitions cannot more than 1, now is : " + startActivity.getOutgoingTransitions().size()); } PvmTransition pvmTransition = startActivity.getOutgoingTransitions() .get(0); PvmActivity targetActivity = pvmTransition.getDestination(); if (!"userTask".equals(targetActivity.getProperty("type"))) { logger.info("first activity is not userTask, just skip"); return new FirstTaskForm(); } FirstTaskForm firstTaskForm = new FirstTaskForm(); firstTaskForm.setProcessDefinitionId(processDefinitionId); firstTaskForm.setExists(true); firstTaskForm.setTaskForm(true); String taskDefinitionKey = targetActivity.getId(); logger.debug("activityId : {}", targetActivity.getId()); firstTaskForm.setActivityId(taskDefinitionKey); TaskDefinition taskDefinition = processDefinitionEntity .getTaskDefinitions().get(taskDefinitionKey); Expression expression = taskDefinition.getAssigneeExpression(); if (expression != null) { String expressionText = expression.getExpressionText(); logger.debug("{}", expressionText); logger.debug("{}", startActivity.getProperties()); logger.debug("{}", processDefinitionEntity.getProperties()); firstTaskForm.setAssignee(expressionText); } else { logger.info("cannot find expression : {}, {}", processDefinitionId, taskDefinitionKey); } String initiatorVariableName = (String) processDefinitionEntity .getProperty(BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME); firstTaskForm.setInitiatorName(initiatorVariableName); DefaultFormHandler formHandler = (DefaultFormHandler) taskDefinition .getTaskFormHandler(); if (formHandler.getFormKey() != null) { String formKey = formHandler.getFormKey().getExpressionText(); firstTaskForm.setFormKey(formKey); } else { logger.info("cannot find formKey from xml : {}, {}", processDefinitionId, taskDefinitionKey); } return firstTaskForm; } public FirstTaskForm findStartEventForm( ProcessDefinitionEntity processDefinitionEntity) { FirstTaskForm firstTaskForm = new FirstTaskForm(); firstTaskForm.setExists(true); firstTaskForm.setProcessDefinitionId(processDefinitionId); firstTaskForm.setTaskForm(false); DefaultFormHandler formHandler = (DefaultFormHandler) processDefinitionEntity .getStartFormHandler(); if (formHandler.getFormKey() != null) { String formKey = formHandler.getFormKey().getExpressionText(); firstTaskForm.setFormKey(formKey); firstTaskForm.setActivityId(processDefinitionEntity.getInitial() .getId()); } return firstTaskForm; } }