package org.activiti.engine.impl.bpmn.parser; import org.activiti.engine.impl.form.StartFormHandler; import org.activiti.engine.impl.form.TaskFormHandler; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.impl.pvm.process.ScopeImpl; import org.activiti.engine.impl.task.TaskDefinition; import org.activiti.engine.impl.util.ReflectUtil; import org.activiti.engine.impl.util.xml.Element; import org.apache.commons.lang.StringUtils; import ru.codeinside.gses.activiti.behavior.SmevTaskBehavior; import ru.codeinside.gses.activiti.behavior.SmevTaskConfig; import ru.codeinside.gses.activiti.forms.CustomStartFormHandler; import ru.codeinside.gses.activiti.forms.CustomTaskFormHandler; import ru.codeinside.gses.activiti.forms.api.definitions.SandboxAware; import java.util.List; /** * Расширения стуктурного анализа BPMN. */ final public class CustomBpmnParse extends BpmnParse implements SandboxAware { private final boolean sandbox; CustomBpmnParse(BpmnParser parser, boolean sandbox) { super(parser); this.sandbox = sandbox; } @Override protected void parseStartFormHandlers(List<Element> startEventElements, ProcessDefinitionEntity processDefinition) { if (processDefinition.getInitial() != null) { for (Element startEventElement : startEventElements) { if (startEventElement.attribute("id").equals(processDefinition.getInitial().getId())) { StartFormHandler startFormHandler; String startFormHandlerClassName = startEventElement.attributeNS(BpmnParser.ACTIVITI_BPMN_EXTENSIONS_NS, "formHandlerClass"); if (startFormHandlerClassName != null) { startFormHandler = (StartFormHandler) ReflectUtil.instantiate(startFormHandlerClassName); } else { // замена обработчика: startFormHandler = new CustomStartFormHandler(); } startFormHandler.parseConfiguration(startEventElement, deployment, processDefinition, this); processDefinition.setStartFormHandler(startFormHandler); } } } } public TaskDefinition parseTaskDefinition(Element taskElement, String taskDefinitionKey, ProcessDefinitionEntity processDefinition) { TaskFormHandler taskFormHandler; String taskFormHandlerClassName = taskElement.attributeNS(BpmnParser.ACTIVITI_BPMN_EXTENSIONS_NS, "formHandlerClass"); if (taskFormHandlerClassName != null) { taskFormHandler = (TaskFormHandler) ReflectUtil.instantiate(taskFormHandlerClassName); } else { // замена обработчика: taskFormHandler = new CustomTaskFormHandler(); } taskFormHandler.parseConfiguration(taskElement, deployment, processDefinition, this); TaskDefinition taskDefinition = new TaskDefinition(taskFormHandler); taskDefinition.setKey(taskDefinitionKey); processDefinition.getTaskDefinitions().put(taskDefinitionKey, taskDefinition); String name = taskElement.attribute("name"); if (name != null) { taskDefinition.setNameExpression(expressionManager.createExpression(name)); } String descriptionStr = parseDocumentation(taskElement); if (descriptionStr != null) { taskDefinition.setDescriptionExpression(expressionManager.createExpression(descriptionStr)); } parseHumanPerformer(taskElement, taskDefinition); parsePotentialOwner(taskElement, taskDefinition); // Activiti custom extension parseUserTaskCustomExtensions(taskElement, taskDefinition); return taskDefinition; } @Override public ActivityImpl parseServiceTask(Element serviceTaskElement, ScopeImpl scope) { String delegateExpression = StringUtils.trimToNull(serviceTaskElement.attributeNS(BpmnParser.ACTIVITI_BPMN_EXTENSIONS_NS, "delegateExpression")); if (!"СМЭВ".equalsIgnoreCase(delegateExpression)) { return super.parseServiceTask(serviceTaskElement, scope); } ActivityImpl activity = createActivityOnScope(serviceTaskElement, scope); try { SmevTaskConfig config = new SmevTaskConfig(parseFieldDeclarations(serviceTaskElement)); activity.setActivityBehavior(new SmevTaskBehavior(config)); } catch (IllegalArgumentException e) { addError("Блок {" + activity.getId() + "}: " + e.getMessage(), serviceTaskElement); } parseExecutionListenersOnScope(serviceTaskElement, activity); for (BpmnParseListener parseListener : parseListeners) { parseListener.parseServiceTask(serviceTaskElement, scope, activity); } return activity; } @Override protected void parseRootElement() { super.parseRootElement(); for (ProcessDefinitionEntity processDefinition : getProcessDefinitions()) { for (ActivityImpl activity : processDefinition.getActivities()) { if (activity.getActivityBehavior() instanceof SmevTaskBehavior) { SmevTaskBehavior behavior = (SmevTaskBehavior) activity.getActivityBehavior(); behavior.validateTransitions(activity, this); } } } } @Override public boolean isSandbox() { return sandbox; } }