提交 433623bc 编写于 作者: J Joram Barrez

Removed TaskDefinition: finally got rid of this bad idea of a class. Switched...

Removed TaskDefinition: finally got rid of this bad idea of a class. Switched the implementations using it to determine it at runtime (consitent with all the rest).
上级 10b8a1ba
......@@ -15,6 +15,7 @@ package org.activiti.bpmn.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* @author Tijs Rademakers
......@@ -34,7 +35,7 @@ public class Process extends BaseElement implements FlowElementsContainer, HasEx
protected List<String> candidateStarterUsers = new ArrayList<String>();
protected List<String> candidateStarterGroups = new ArrayList<String>();
protected List<EventListener> eventListeners = new ArrayList<EventListener>();
// Added during process definition parsing
protected FlowElement initialFlowElement;
......@@ -380,5 +381,5 @@ public class Process extends BaseElement implements FlowElementsContainer, HasEx
public void setInitialFlowElement(FlowElement initialFlowElement) {
this.initialFlowElement = initialFlowElement;
}
}
......@@ -45,8 +45,6 @@ import org.activiti.bpmn.model.UserTask;
import org.activiti.cdi.BusinessProcessEventType;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.parse.BpmnParseHandler;
......@@ -99,7 +97,7 @@ public class CdiEventSupportBpmnParseHandler implements BpmnParseHandler {
SequenceFlow sequenceFlow = (SequenceFlow) element;
CdiExecutionListener listener = new CdiExecutionListener(sequenceFlow.getId());
createActivitiListener(sequenceFlow, ExecutionListener.EVENTNAME_TAKE, listener);
addActivitiListenerToElement(sequenceFlow, ExecutionListener.EVENTNAME_TAKE, listener);
} else {
......@@ -126,52 +124,45 @@ public class CdiEventSupportBpmnParseHandler implements BpmnParseHandler {
}
private void addCompleteListener(UserTask userTask) {
UserTaskActivityBehavior behavior = getUserTaskActivityBehavior(userTask);
behavior.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_COMPLETE, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.COMPLETE_TASK));
addActivitiListenerToUserTask(userTask, TaskListener.EVENTNAME_COMPLETE, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.COMPLETE_TASK));
}
private void addAssignListener(UserTask userTask) {
UserTaskActivityBehavior behavior = getUserTaskActivityBehavior(userTask);
behavior.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_ASSIGNMENT, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.ASSIGN_TASK));
addActivitiListenerToUserTask(userTask, TaskListener.EVENTNAME_ASSIGNMENT, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.ASSIGN_TASK));
}
private void addCreateListener(UserTask userTask) {
UserTaskActivityBehavior behavior = getUserTaskActivityBehavior(userTask);
behavior.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_CREATE, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.CREATE_TASK));
addActivitiListenerToUserTask(userTask, TaskListener.EVENTNAME_CREATE, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.CREATE_TASK));
}
protected void addDeleteListener(UserTask userTask) {
UserTaskActivityBehavior behavior = getUserTaskActivityBehavior(userTask);
behavior.getTaskDefinition().addTaskListener(TaskListener.EVENTNAME_DELETE, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.DELETE_TASK));
addActivitiListenerToUserTask(userTask, TaskListener.EVENTNAME_DELETE, new CdiTaskListener(userTask.getId(), BusinessProcessEventType.DELETE_TASK));
}
protected void addStartEventListener(FlowElement flowElement) {
CdiExecutionListener listener = new CdiExecutionListener(flowElement.getId(), BusinessProcessEventType.START_ACTIVITY);
createActivitiListener(flowElement, ExecutionListener.EVENTNAME_START, listener);
addActivitiListenerToElement(flowElement, ExecutionListener.EVENTNAME_START, listener);
}
protected void addEndEventListener(FlowElement flowElement) {
CdiExecutionListener listener = new CdiExecutionListener(flowElement.getId(), BusinessProcessEventType.END_ACTIVITY);
createActivitiListener(flowElement, ExecutionListener.EVENTNAME_END, listener);
addActivitiListenerToElement(flowElement, ExecutionListener.EVENTNAME_END, listener);
}
private UserTaskActivityBehavior getUserTaskActivityBehavior(UserTask userTask) {
Object behavior = userTask.getBehavior();
if (behavior instanceof UserTaskActivityBehavior) {
return (UserTaskActivityBehavior) behavior;
} else if (behavior instanceof MultiInstanceActivityBehavior) {
return (UserTaskActivityBehavior) ((MultiInstanceActivityBehavior) behavior).getInnerActivityBehavior();
}
return null;
protected void addActivitiListenerToElement(FlowElement flowElement, String event, Object instance) {
ActivitiListener listener = new ActivitiListener();
listener.setEvent(event);
listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_INSTANCE);
listener.setInstance(instance);
flowElement.getExecutionListeners().add(listener);
}
protected void createActivitiListener(FlowElement flowElement, String event, Object instance) {
protected void addActivitiListenerToUserTask(UserTask userTask, String event, Object instance) {
ActivitiListener listener = new ActivitiListener();
listener.setEvent(event);
listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_INSTANCE);
listener.setInstance(instance);
flowElement.getExecutionListeners().add(listener);
userTask.getTaskListeners().add(listener);
}
}
......@@ -13,9 +13,10 @@ package org.activiti.crystalball.simulator.impl.bpmn.parser.handler;
* limitations under the License.
*/
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.UserTaskParseHandler;
......@@ -36,18 +37,14 @@ public class AddListenerUserTaskParseHandler extends UserTaskParseHandler {
protected void executeParse(BpmnParse bpmnParse, UserTask userTask) {
super.executeParse(bpmnParse, userTask);
// ScopeImpl scope = bpmnParse.getCurrentScope();
// ProcessDefinitionImpl processDefinition = scope.getProcessDefinition();
// ActivityImpl activity = processDefinition.findActivity(userTask.getId());
//
// SimulatorParserUtils.setSimulationBehavior(scope, userTask);
//
// UserTaskActivityBehavior userTaskActivity = (UserTaskActivityBehavior) activity.getActivityBehavior();
UserTaskActivityBehavior userTaskActivity = (UserTaskActivityBehavior) userTask.getBehavior();
ActivitiListener listener = new ActivitiListener();
listener.setEvent(eventName);
listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_INSTANCE);
listener.setInstance(taskListener);
userTask.getTaskListeners().add(listener);
userTaskActivity.getTaskDefinition().addTaskListener(eventName, taskListener);
}
}
......@@ -17,9 +17,8 @@ import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.delegate.DelegateExecution;
......@@ -31,11 +30,12 @@ import org.activiti.engine.impl.bpmn.helper.SkipExpressionUtil;
import org.activiti.engine.impl.calendar.BusinessCalendar;
import org.activiti.engine.impl.calendar.DueDateBusinessCalendar;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.el.ExpressionManager;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntityManager;
import org.activiti.engine.impl.task.TaskDefinition;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -49,42 +49,44 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = LoggerFactory.getLogger(UserTaskActivityBehavior.class);
protected ExpressionManager expressionManager;
protected UserTask userTask;
protected TaskDefinition taskDefinition;
public UserTaskActivityBehavior(TaskDefinition taskDefinition) {
this.taskDefinition = taskDefinition;
public UserTaskActivityBehavior(ExpressionManager expressionManager, UserTask userTask) {
this.expressionManager = expressionManager;
this.userTask = userTask;
}
public void execute(DelegateExecution execution) {
TaskEntity task = Context.getCommandContext().getTaskEntityManager().createAndInsert(execution);
task.setExecution((ExecutionEntity) execution);
task.setTaskDefinitionKey(taskDefinition.getKey());
task.setTaskDefinitionKey(userTask.getId());
if (taskDefinition.getNameExpression() != null) {
if (StringUtils.isNotEmpty(userTask.getName())) {
String name = null;
try {
name = (String) taskDefinition.getNameExpression().getValue(execution);
name = (String) expressionManager.createExpression(userTask.getName()).getValue(execution);
} catch (ActivitiException e) {
name = taskDefinition.getNameExpression().getExpressionText();
name = userTask.getName();
LOGGER.warn("property not found in task name expression " + e.getMessage());
}
task.setName(name);
}
if (taskDefinition.getDescriptionExpression() != null) {
if (StringUtils.isNotEmpty(userTask.getDocumentation())) {
String description = null;
try {
description = (String) taskDefinition.getDescriptionExpression().getValue(execution);
description = (String) expressionManager.createExpression(userTask.getDocumentation()).getValue(execution);
} catch (ActivitiException e) {
description = taskDefinition.getDescriptionExpression().getExpressionText();
description = userTask.getDocumentation();
LOGGER.warn("property not found in task description expression " + e.getMessage());
}
task.setDescription(description);
}
if (taskDefinition.getDueDateExpression() != null) {
Object dueDate = taskDefinition.getDueDateExpression().getValue(execution);
if (StringUtils.isNotEmpty(userTask.getDueDate())) {
Object dueDate = expressionManager.createExpression(userTask.getDueDate()).getValue(execution);
if (dueDate != null) {
if (dueDate instanceof Date) {
task.setDueDate((Date) dueDate);
......@@ -92,13 +94,13 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
BusinessCalendar businessCalendar = Context.getProcessEngineConfiguration().getBusinessCalendarManager().getBusinessCalendar(DueDateBusinessCalendar.NAME);
task.setDueDate(businessCalendar.resolveDuedate((String) dueDate));
} else {
throw new ActivitiIllegalArgumentException("Due date expression does not resolve to a Date or Date string: " + taskDefinition.getDueDateExpression().getExpressionText());
throw new ActivitiIllegalArgumentException("Due date expression does not resolve to a Date or Date string: " + userTask.getDueDate());
}
}
}
if (taskDefinition.getPriorityExpression() != null) {
final Object priority = taskDefinition.getPriorityExpression().getValue(execution);
if (StringUtils.isNotEmpty(userTask.getPriority())) {
final Object priority = expressionManager.createExpression(userTask.getPriority()).getValue(execution);
if (priority != null) {
if (priority instanceof String) {
try {
......@@ -109,29 +111,29 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
} else if (priority instanceof Number) {
task.setPriority(((Number) priority).intValue());
} else {
throw new ActivitiIllegalArgumentException("Priority expression does not resolve to a number: " + taskDefinition.getPriorityExpression().getExpressionText());
throw new ActivitiIllegalArgumentException("Priority expression does not resolve to a number: " + userTask.getPriority());
}
}
}
if (taskDefinition.getCategoryExpression() != null) {
final Object category = taskDefinition.getCategoryExpression().getValue(execution);
if (StringUtils.isNotEmpty(userTask.getCategory())) {
final Object category = expressionManager.createExpression(userTask.getCategory()).getValue(execution);
if (category != null) {
if (category instanceof String) {
task.setCategory((String) category);
} else {
throw new ActivitiIllegalArgumentException("Category expression does not resolve to a string: " + taskDefinition.getCategoryExpression().getExpressionText());
throw new ActivitiIllegalArgumentException("Category expression does not resolve to a string: " + userTask.getCategory());
}
}
}
if (taskDefinition.getFormKeyExpression() != null) {
final Object formKey = taskDefinition.getFormKeyExpression().getValue(execution);
if (StringUtils.isNotEmpty(userTask.getFormKey())) {
final Object formKey = expressionManager.createExpression(userTask.getFormKey()).getValue(execution);
if (formKey != null) {
if (formKey instanceof String) {
task.setFormKey((String) formKey);
} else {
throw new ActivitiIllegalArgumentException("FormKey expression does not resolve to a string: " + taskDefinition.getFormKeyExpression().getExpressionText());
throw new ActivitiIllegalArgumentException("FormKey expression does not resolve to a string: " + userTask.getFormKey());
}
}
}
......@@ -146,11 +148,13 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
Context.getCommandContext().getTaskEntityManager().update(task);
Context.getCommandContext().getTaskEntityManager().fireTaskListenerEvent(task, TaskListener.EVENTNAME_CREATE);
Expression skipExpression = taskDefinition.getSkipExpression();
if (SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression) && SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression)) {
CommandContext commandContext = Context.getCommandContext();
commandContext.getTaskEntityManager().deleteTask(task, TaskEntity.DELETE_REASON_COMPLETED, false, false);
leave(execution);
if (StringUtils.isNotEmpty(userTask.getSkipExpression())) {
Expression skipExpression = expressionManager.createExpression(userTask.getSkipExpression());
if (SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression) && SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression)) {
CommandContext commandContext = Context.getCommandContext();
commandContext.getTaskEntityManager().deleteTask(task, TaskEntity.DELETE_REASON_COMPLETED, false, false);
leave(execution);
}
}
}
......@@ -169,8 +173,9 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
@SuppressWarnings({ "unchecked", "rawtypes" })
protected void handleAssignments(TaskEntity task, DelegateExecution execution) {
if (taskDefinition.getAssigneeExpression() != null) {
Object assigneeExpressionValue = taskDefinition.getAssigneeExpression().getValue(execution);
if (StringUtils.isNotEmpty(userTask.getAssignee())) {
Object assigneeExpressionValue = expressionManager.createExpression(userTask.getAssignee()).getValue(execution);
String assigneeValue = null;
if (assigneeExpressionValue != null) {
assigneeValue = assigneeExpressionValue.toString();
......@@ -179,8 +184,8 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
Context.getCommandContext().getTaskEntityManager().update(task);
}
if (taskDefinition.getOwnerExpression() != null) {
Object ownerExpressionValue = taskDefinition.getOwnerExpression().getValue(execution);
if (StringUtils.isNotEmpty(userTask.getOwner())) {
Object ownerExpressionValue = expressionManager.createExpression(userTask.getOwner()).getValue(execution);
String ownerValue = null;
if (ownerExpressionValue != null) {
ownerValue = ownerExpressionValue.toString();
......@@ -189,8 +194,9 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
Context.getCommandContext().getTaskEntityManager().update(task);
}
if (!taskDefinition.getCandidateGroupIdExpressions().isEmpty()) {
for (Expression groupIdExpr : taskDefinition.getCandidateGroupIdExpressions()) {
if (userTask.getCandidateGroups() != null && !userTask.getCandidateGroups().isEmpty()) {
for (String candidateGroup : userTask.getCandidateGroups()) {
Expression groupIdExpr = expressionManager.createExpression(candidateGroup);
Object value = groupIdExpr.getValue(execution);
if (value instanceof String) {
List<String> candidates = extractCandidates((String) value);
......@@ -203,8 +209,9 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
}
}
if (!taskDefinition.getCandidateUserIdExpressions().isEmpty()) {
for (Expression userIdExpr : taskDefinition.getCandidateUserIdExpressions()) {
if (userTask.getCandidateUsers() != null && !userTask.getCandidateUsers().isEmpty()) {
for (String candidateUser : userTask.getCandidateUsers()) {
Expression userIdExpr = expressionManager.createExpression(candidateUser);
Object value = userIdExpr.getValue(execution);
if (value instanceof String) {
List<String> candidates = extractCandidates((String) value);
......@@ -216,50 +223,58 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
}
}
}
if (!taskDefinition.getCustomUserIdentityLinkExpressions().isEmpty()) {
Map<String, Set<Expression>> identityLinks = taskDefinition.getCustomUserIdentityLinkExpressions();
for (String identityLinkType : identityLinks.keySet()) {
for (Expression idExpression : identityLinks.get(identityLinkType)) {
if (userTask.getCustomUserIdentityLinks() != null && !userTask.getCustomUserIdentityLinks().isEmpty()) {
for (String customUserIdentityLinkType : userTask.getCustomUserIdentityLinks().keySet()) {
for (String userIdentityLink : userTask.getCustomUserIdentityLinks().get(customUserIdentityLinkType)) {
Expression idExpression = expressionManager.createExpression(userIdentityLink);
Object value = idExpression.getValue(execution);
if (value instanceof String) {
List<String> userIds = extractCandidates((String) value);
for (String userId : userIds) {
task.addUserIdentityLink(userId, identityLinkType);
task.addUserIdentityLink(userId, customUserIdentityLinkType);
}
} else if (value instanceof Collection) {
Iterator userIdSet = ((Collection) value).iterator();
while (userIdSet.hasNext()) {
task.addUserIdentityLink((String) userIdSet.next(), identityLinkType);
task.addUserIdentityLink((String) userIdSet.next(), customUserIdentityLinkType);
}
} else {
throw new ActivitiException("Expression did not resolve to a string or collection of strings");
}
}
}
}
if (!taskDefinition.getCustomGroupIdentityLinkExpressions().isEmpty()) {
Map<String, Set<Expression>> identityLinks = taskDefinition.getCustomGroupIdentityLinkExpressions();
for (String identityLinkType : identityLinks.keySet()) {
for (Expression idExpression : identityLinks.get(identityLinkType)) {
if (userTask.getCustomGroupIdentityLinks() != null && !userTask.getCustomGroupIdentityLinks().isEmpty()) {
for (String customGroupIdentityLinkType : userTask.getCustomGroupIdentityLinks().keySet()) {
for (String groupIdentityLink : userTask.getCustomGroupIdentityLinks().get(customGroupIdentityLinkType)) {
Expression idExpression = expressionManager.createExpression(groupIdentityLink);
Object value = idExpression.getValue(execution);
if (value instanceof String) {
List<String> groupIds = extractCandidates((String) value);
for (String groupId : groupIds) {
task.addGroupIdentityLink(groupId, identityLinkType);
task.addGroupIdentityLink(groupId, customGroupIdentityLinkType);
}
} else if (value instanceof Collection) {
Iterator groupIdSet = ((Collection) value).iterator();
while (groupIdSet.hasNext()) {
task.addGroupIdentityLink((String) groupIdSet.next(), identityLinkType);
task.addGroupIdentityLink((String) groupIdSet.next(), customGroupIdentityLinkType);
}
} else {
throw new ActivitiException("Expression did not resolve to a string or collection of strings");
}
}
}
}
}
/**
......@@ -272,11 +287,4 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior {
return Arrays.asList(str.split("[\\s]*,[\\s]*"));
}
// getters and setters
// //////////////////////////////////////////////////////
public TaskDefinition getTaskDefinition() {
return taskDefinition;
}
}
......@@ -86,7 +86,7 @@ import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.BpmnParser;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.delegate.ActivityBehavior;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.el.ExpressionManager;
/**
* Factory class used by the {@link BpmnParser} and {@link BpmnParse} to instantiate the behaviour classes. For example when parsing an exclusive gateway, this factory will be requested to create a
......@@ -115,7 +115,7 @@ public interface ActivityBehaviorFactory {
public abstract ReceiveTaskActivityBehavior createReceiveTaskActivityBehavior(ReceiveTask receiveTask);
public abstract UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask, TaskDefinition taskDefinition);
public abstract UserTaskActivityBehavior createUserTaskActivityBehavior(ExpressionManager expressionManager, UserTask userTask);
public abstract ClassDelegate createClassDelegateServiceTask(ServiceTask serviceTask);
......
......@@ -91,8 +91,8 @@ import org.activiti.engine.impl.bpmn.helper.ClassDelegate;
import org.activiti.engine.impl.bpmn.parser.FieldDeclaration;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.delegate.ActivityBehavior;
import org.activiti.engine.impl.el.ExpressionManager;
import org.activiti.engine.impl.scripting.ScriptingEngines;
import org.activiti.engine.impl.task.TaskDefinition;
import org.apache.commons.lang3.StringUtils;
/**
......@@ -123,8 +123,9 @@ public class DefaultActivityBehaviorFactory extends AbstractBehaviorFactory impl
return new ReceiveTaskActivityBehavior();
}
public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask, TaskDefinition taskDefinition) {
return new UserTaskActivityBehavior(taskDefinition);
@Override
public UserTaskActivityBehavior createUserTaskActivityBehavior(ExpressionManager expressionManager, UserTask userTask) {
return new UserTaskActivityBehavior(expressionManager, userTask);
}
// Service task
......
......@@ -12,7 +12,6 @@
*/
package org.activiti.engine.impl.bpmn.parser.handler;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -26,7 +25,6 @@ import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.el.ExpressionManager;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -62,7 +60,6 @@ public class ProcessParseHandler extends AbstractBpmnParseHandler<Process> {
currentProcessDefinition.setName(process.getName());
currentProcessDefinition.setCategory(bpmnParse.getBpmnModel().getTargetNamespace());
currentProcessDefinition.setDescription(process.getDocumentation());
currentProcessDefinition.setTaskDefinitions(new HashMap<String, TaskDefinition>());
currentProcessDefinition.setDeploymentId(bpmnParse.getDeployment().getId());
if (bpmnParse.getDeployment().getEngineVersion() != null) {
......
......@@ -12,22 +12,9 @@
*/
package org.activiti.engine.impl.bpmn.parser.handler;
import java.util.HashSet;
import java.util.Set;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.el.ExpressionManager;
import org.activiti.engine.impl.form.DefaultTaskFormHandler;
import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.apache.commons.lang3.StringUtils;
/**
* @author Joram Barrez
......@@ -40,103 +27,7 @@ public class UserTaskParseHandler extends AbstractActivityBpmnParseHandler<UserT
@Override
protected void executeParse(BpmnParse bpmnParse, UserTask userTask) {
TaskDefinition taskDefinition = parseTaskDefinition(bpmnParse, userTask, userTask.getId(), bpmnParse.getCurrentProcessDefinition());
userTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask, taskDefinition));
userTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(bpmnParse.getExpressionManager(), userTask));
}
public TaskDefinition parseTaskDefinition(BpmnParse bpmnParse, UserTask userTask, String taskDefinitionKey, ProcessDefinitionEntity processDefinition) {
TaskFormHandler taskFormHandler = new DefaultTaskFormHandler();
taskFormHandler.parseConfiguration(userTask.getFormProperties(), userTask.getFormKey(), bpmnParse.getDeployment(), processDefinition);
TaskDefinition taskDefinition = new TaskDefinition(taskFormHandler);
taskDefinition.setKey(taskDefinitionKey);
processDefinition.getTaskDefinitions().put(taskDefinitionKey, taskDefinition);
ExpressionManager expressionManager = bpmnParse.getExpressionManager();
if (StringUtils.isNotEmpty(userTask.getName())) {
taskDefinition.setNameExpression(expressionManager.createExpression(userTask.getName()));
}
if (StringUtils.isNotEmpty(userTask.getDocumentation())) {
taskDefinition.setDescriptionExpression(expressionManager.createExpression(userTask.getDocumentation()));
}
if (StringUtils.isNotEmpty(userTask.getAssignee())) {
taskDefinition.setAssigneeExpression(expressionManager.createExpression(userTask.getAssignee()));
}
if (StringUtils.isNotEmpty(userTask.getOwner())) {
taskDefinition.setOwnerExpression(expressionManager.createExpression(userTask.getOwner()));
}
for (String candidateUser : userTask.getCandidateUsers()) {
taskDefinition.addCandidateUserIdExpression(expressionManager.createExpression(candidateUser));
}
for (String candidateGroup : userTask.getCandidateGroups()) {
taskDefinition.addCandidateGroupIdExpression(expressionManager.createExpression(candidateGroup));
}
// Activiti custom extension
// Task listeners
for (ActivitiListener taskListener : userTask.getTaskListeners()) {
taskDefinition.addTaskListener(taskListener.getEvent(), createTaskListener(bpmnParse, taskListener, userTask.getId()));
}
// Due date
if (StringUtils.isNotEmpty(userTask.getDueDate())) {
taskDefinition.setDueDateExpression(expressionManager.createExpression(userTask.getDueDate()));
}
// Category
if (StringUtils.isNotEmpty(userTask.getCategory())) {
taskDefinition.setCategoryExpression(expressionManager.createExpression(userTask.getCategory()));
}
// Priority
if (StringUtils.isNotEmpty(userTask.getPriority())) {
taskDefinition.setPriorityExpression(expressionManager.createExpression(userTask.getPriority()));
}
if (StringUtils.isNotEmpty(userTask.getFormKey())) {
taskDefinition.setFormKeyExpression(expressionManager.createExpression(userTask.getFormKey()));
}
// CustomUserIdentityLinks
for (String customUserIdentityLinkType : userTask.getCustomUserIdentityLinks().keySet()) {
Set<Expression> userIdentityLinkExpression = new HashSet<Expression>();
for (String userIdentityLink : userTask.getCustomUserIdentityLinks().get(customUserIdentityLinkType)) {
userIdentityLinkExpression.add(expressionManager.createExpression(userIdentityLink));
}
taskDefinition.addCustomUserIdentityLinkExpression(customUserIdentityLinkType, userIdentityLinkExpression);
}
// CustomGroupIdentityLinks
for (String customGroupIdentityLinkType : userTask.getCustomGroupIdentityLinks().keySet()) {
Set<Expression> groupIdentityLinkExpression = new HashSet<Expression>();
for (String groupIdentityLink : userTask.getCustomGroupIdentityLinks().get(customGroupIdentityLinkType)) {
groupIdentityLinkExpression.add(expressionManager.createExpression(groupIdentityLink));
}
taskDefinition.addCustomGroupIdentityLinkExpression(customGroupIdentityLinkType, groupIdentityLinkExpression);
}
if (StringUtils.isNotEmpty(userTask.getSkipExpression())) {
taskDefinition.setSkipExpression(expressionManager.createExpression(userTask.getSkipExpression()));
}
return taskDefinition;
}
protected TaskListener createTaskListener(BpmnParse bpmnParse, ActivitiListener activitiListener, String taskId) {
TaskListener taskListener = null;
if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equalsIgnoreCase(activitiListener.getImplementationType())) {
taskListener = bpmnParse.getListenerFactory().createClassDelegateTaskListener(activitiListener);
} else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equalsIgnoreCase(activitiListener.getImplementationType())) {
taskListener = bpmnParse.getListenerFactory().createExpressionTaskListener(activitiListener);
} else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equalsIgnoreCase(activitiListener.getImplementationType())) {
taskListener = bpmnParse.getListenerFactory().createDelegateExpressionTaskListener(activitiListener);
}
return taskListener;
}
}
......@@ -12,24 +12,18 @@
*/
package org.activiti.engine.impl.cmd;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.delegate.event.ActivitiEventDispatcher;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.delegate.invocation.TaskListenerInvocation;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.task.DelegationState;
import org.activiti.engine.task.IdentityLinkType;
......@@ -51,7 +45,7 @@ public abstract class AbstractCompleteTaskCmd extends NeedsActiveTaskCmd<Void> {
throw new ActivitiException("A delegated task cannot be completed, but should be resolved instead.");
}
fireEvent(commandContext, taskEntity, TaskListener.EVENTNAME_COMPLETE);
commandContext.getTaskEntityManager().fireTaskListenerEvent(taskEntity, TaskListener.EVENTNAME_COMPLETE);
if (Authentication.getAuthenticatedUserId() != null && taskEntity.getProcessInstanceId() != null) {
ExecutionEntity processInstanceEntity = commandContext.getExecutionEntityManager().findById(taskEntity.getProcessInstanceId());
commandContext.getIdentityLinkEntityManager().involveUser(processInstanceEntity, Authentication.getAuthenticatedUserId(),IdentityLinkType.PARTICIPANT);
......@@ -75,38 +69,4 @@ public abstract class AbstractCompleteTaskCmd extends NeedsActiveTaskCmd<Void> {
}
}
// TODO: this needs to be revised
public void fireEvent(CommandContext commandContext, TaskEntity taskEntity, String taskEventName) {
TaskDefinition taskDefinition = getTaskDefinition(taskEntity);
if (taskDefinition != null) {
List<TaskListener> taskEventListeners = taskDefinition.getTaskListener(taskEventName);
if (taskEventListeners != null) {
for (TaskListener taskListener : taskEventListeners) {
ExecutionEntity execution = commandContext.getExecutionEntityManager().findById(taskEntity.getExecutionId());
if (execution != null) {
taskEntity.setEventName(taskEventName);
}
try {
Context.getProcessEngineConfiguration()
.getDelegateInterceptor()
.handleInvocation(new TaskListenerInvocation(taskListener, (DelegateTask)taskEntity));
}catch (Exception e) {
throw new ActivitiException("Exception while invoking TaskListener: "+e.getMessage(), e);
}
}
}
}
}
public TaskDefinition getTaskDefinition(TaskEntity taskEntity) {
if (taskEntity.getProcessDefinitionId() == null) {
return null;
}
// TODO: this has to be rewritten. Should not live on the ProcessDefinition!
ProcessDefinitionEntity processDefinitionEntity = ProcessDefinitionUtil.getProcessDefinitionEntity(taskEntity.getProcessDefinitionId());
return processDefinitionEntity.getTaskDefinitions().get(taskEntity.getTaskDefinitionKey());
}
}
......@@ -18,8 +18,8 @@ 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.task.TaskDefinition;
import org.activiti.engine.impl.util.FormHandlerUtil;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
/**
* Command for retrieving start or task form keys.
......@@ -57,17 +57,15 @@ public class GetFormKeyCmd implements Command<String> {
}
public String execute(CommandContext commandContext) {
ProcessDefinitionEntity processDefinition = commandContext.getProcessEngineConfiguration().getDeploymentManager().findDeployedProcessDefinitionById(processDefinitionId);
ProcessDefinitionEntity processDefinition = ProcessDefinitionUtil.getProcessDefinitionEntity(processDefinitionId);
DefaultFormHandler formHandler;
if (taskDefinitionKey == null) {
// TODO: Maybe add getFormKey() to FormHandler interface to avoid
// the following cast
// TODO: Maybe add getFormKey() to FormHandler interface to avoid the following cast
formHandler = (DefaultFormHandler) FormHandlerUtil.getStartFormHandler(commandContext, processDefinition);
} else {
TaskDefinition taskDefinition = processDefinition.getTaskDefinitions().get(taskDefinitionKey);
// TODO: Maybe add getFormKey() to FormHandler interface to avoid
// the following cast
formHandler = (DefaultFormHandler) taskDefinition.getTaskFormHandler();
// TODO: Maybe add getFormKey() to FormHandler interface to avoid the following cast
formHandler = (DefaultFormHandler) FormHandlerUtil.getTaskFormHandlder(processDefinitionId, taskDefinitionKey);
}
String formKey = null;
if (formHandler.getFormKey() != null) {
......
......@@ -24,8 +24,7 @@ import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.impl.util.FormHandlerUtil;
import org.activiti.engine.task.Task;
/**
......@@ -54,18 +53,9 @@ public class GetRenderedTaskFormCmd implements Command<Object>, Serializable {
throw new ActivitiObjectNotFoundException("Task '" + taskId + "' not found", Task.class);
}
if (task.getProcessDefinitionId() != null) {
TaskDefinition taskDefinition = ProcessDefinitionUtil.getProcessDefinitionEntity(task.getProcessDefinitionId()).getTaskDefinitions().get(task.getTaskDefinitionKey());
if (taskDefinition == null) {
throw new ActivitiException("Task form definition for '" + taskId + "' not found");
}
TaskFormHandler taskFormHandler = taskDefinition.getTaskFormHandler();
if (taskFormHandler == null) {
return null;
}
TaskFormHandler taskFormHandler = FormHandlerUtil.getTaskFormHandlder(task);
if (taskFormHandler != null) {
FormEngine formEngine = commandContext.getProcessEngineConfiguration().getFormEngines().get(formEngineName);
if (formEngine == null) {
......
......@@ -22,8 +22,7 @@ import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.impl.util.FormHandlerUtil;
import org.activiti.engine.task.Task;
/**
......@@ -44,20 +43,13 @@ public class GetTaskFormCmd implements Command<TaskFormData>, Serializable {
if (task == null) {
throw new ActivitiObjectNotFoundException("No task found for taskId '" + taskId + "'", Task.class);
}
if (task.getProcessDefinitionId() != null) {
TaskDefinition taskDefinition = ProcessDefinitionUtil.getProcessDefinitionEntity(task.getProcessDefinitionId()).getTaskDefinitions().get(task.getTaskDefinitionKey());
if (taskDefinition != null) {
TaskFormHandler taskFormHandler = taskDefinition.getTaskFormHandler();
if (taskFormHandler == null) {
throw new ActivitiException("No taskFormHandler specified for task '" + taskId + "'");
}
return taskFormHandler.createTaskForm(task);
}
}
return null;
TaskFormHandler taskFormHandler = FormHandlerUtil.getTaskFormHandlder(task);
if (taskFormHandler == null) {
throw new ActivitiException("No taskFormHandler specified for task '" + taskId + "'");
}
return taskFormHandler.createTaskForm(task);
}
}
......@@ -19,9 +19,8 @@ import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.util.Activiti5Util;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.impl.util.FormHandlerUtil;
/**
* @author Tom Baeyens
......@@ -54,10 +53,10 @@ public class SubmitTaskFormCmd extends AbstractCompleteTaskCmd {
}
commandContext.getHistoryManager().recordFormPropertiesSubmitted(task.getExecution(), properties, taskId);
TaskFormHandler taskFormHandler = FormHandlerUtil.getTaskFormHandlder(task);
if (task.getProcessDefinitionId() != null) {
TaskDefinition taskDefinition = ProcessDefinitionUtil.getProcessDefinitionEntity(task.getProcessDefinitionId()).getTaskDefinitions().get(task.getTaskDefinitionKey());
TaskFormHandler taskFormHandler = taskDefinition.getTaskFormHandler();
if (taskFormHandler != null) {
taskFormHandler.submitFormProperties(properties, task.getExecution());
if (completeTask) {
......
......@@ -37,8 +37,7 @@ import org.activiti.engine.impl.persistence.entity.HistoricVariableInstanceEntit
import org.activiti.engine.impl.persistence.entity.IdentityLinkEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.persistence.entity.VariableInstanceEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.impl.util.FormHandlerUtil;
import org.activiti.engine.task.Event;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -610,24 +609,17 @@ public class DefaultHistoryManager extends AbstractManager implements HistoryMan
if (taskDefinitionKey != null) {
TaskEntity taskEntity = getTaskEntityManager().findById(taskId);
if (taskEntity.getProcessDefinitionId() != null) {
TaskDefinition taskDefinition = ProcessDefinitionUtil.getProcessDefinitionEntity(taskEntity.getProcessDefinitionId())
.getTaskDefinitions().get(taskEntity.getTaskDefinitionKey());
if (taskDefinition != null) {
TaskFormHandler taskFormHandler = taskDefinition.getTaskFormHandler();
if (taskFormHandler != null) {
if (taskFormHandler.getFormKey() != null) {
Object formValue = taskFormHandler.getFormKey().getValue(taskEntity.getExecution());
if (formValue != null) {
historicTaskInstance.setFormKey(formValue.toString());
}
}
TaskFormHandler taskFormHandler = FormHandlerUtil.getTaskFormHandlder(taskEntity);
if (taskFormHandler != null) {
if (taskFormHandler.getFormKey() != null) {
Object formValue = taskFormHandler.getFormKey().getValue(taskEntity.getExecution());
if (formValue != null) {
historicTaskInstance.setFormKey(formValue.toString());
}
}
}
}
}
}
......
......@@ -21,7 +21,6 @@ import org.activiti.engine.delegate.event.impl.ActivitiEventSupport;
import org.activiti.engine.impl.bpmn.data.IOSpecification;
import org.activiti.engine.impl.db.Entity;
import org.activiti.engine.impl.db.HasRevision;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.repository.ProcessDefinition;
/**
......@@ -50,10 +49,6 @@ public interface ProcessDefinitionEntity extends ProcessDefinition, Entity, HasR
void setHistoryLevel(Integer historyLevel);
Map<String, TaskDefinition> getTaskDefinitions();
void setTaskDefinitions(Map<String, TaskDefinition> taskDefinitions);
Map<String, Object> getVariables();
void setVariables(Map<String, Object> variables);
......
......@@ -27,7 +27,6 @@ import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.event.impl.ActivitiEventSupport;
import org.activiti.engine.impl.bpmn.data.IOSpecification;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.task.TaskDefinition;
/**
* @author Joram Barrez
......@@ -50,7 +49,6 @@ public class ProcessDefinitionEntityImpl implements ProcessDefinitionEntity, Ser
protected Integer historyLevel;
protected String diagramResourceName;
protected boolean isGraphicalNotationDefined;
protected Map<String, TaskDefinition> taskDefinitions;
protected Map<String, Object> variables;
protected boolean hasStartFormKey;
protected int suspensionState = SuspensionState.ACTIVE.getStateCode();
......@@ -164,14 +162,6 @@ public class ProcessDefinitionEntityImpl implements ProcessDefinitionEntity, Ser
this.historyLevel = historyLevel;
}
public Map<String, TaskDefinition> getTaskDefinitions() {
return taskDefinitions;
}
public void setTaskDefinitions(Map<String, TaskDefinition> taskDefinitions) {
this.taskDefinitions = taskDefinitions;
}
public Map<String, Object> getVariables() {
return variables;
}
......
......@@ -30,7 +30,6 @@ import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.db.BulkDeleteable;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.task.DelegationState;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.IdentityLinkType;
......@@ -75,7 +74,6 @@ public class TaskEntityImpl extends VariableScopeImpl implements TaskEntity, Ser
protected String processDefinitionId;
protected TaskDefinition taskDefinition;
protected String taskDefinitionKey;
protected String formKey;
......
......@@ -17,6 +17,10 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.delegate.DelegateExecution;
......@@ -31,7 +35,6 @@ import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.delegate.invocation.TaskListenerInvocation;
import org.activiti.engine.impl.persistence.entity.data.DataManager;
import org.activiti.engine.impl.persistence.entity.data.TaskDataManager;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.util.Activiti5Util;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.task.IdentityLinkType;
......@@ -236,30 +239,44 @@ public class TaskEntityManagerImpl extends AbstractEntityManager<TaskEntity> imp
public void fireTaskListenerEvent(TaskEntity taskEntity, String taskEventName) {
if (taskEntity.getProcessDefinitionId() != null) {
TaskDefinition taskDefinition = ProcessDefinitionUtil.getProcessDefinitionEntity(taskEntity.getProcessDefinitionId())
.getTaskDefinitions().get(taskEntity.getTaskDefinitionKey());
if (taskDefinition != null) {
if (taskDefinition != null) {
List<TaskListener> taskEventListeners = taskDefinition.getTaskListener(taskEventName);
if (taskEventListeners != null) {
for (TaskListener taskListener : taskEventListeners) {
ExecutionEntity execution = taskEntity.getExecution();
if (execution != null) {
taskEntity.setEventName(taskEventName);
}
try {
getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(new TaskListenerInvocation(taskListener, (DelegateTask) taskEntity));
} catch (Exception e) {
throw new ActivitiException("Exception while invoking TaskListener: " + e.getMessage(), e);
}
org.activiti.bpmn.model.Process process = ProcessDefinitionUtil.getProcess(taskEntity.getProcessDefinitionId());
FlowElement flowElement = process.getFlowElement(taskEntity.getTaskDefinitionKey());
if (flowElement != null && flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
for (ActivitiListener activitiListener : userTask.getTaskListeners()) {
String event = activitiListener.getEvent();
if (event.equals(taskEventName) || event.equals(TaskListener.EVENTNAME_ALL_EVENTS)) {
TaskListener taskListener = createTaskListener(activitiListener, taskEventName);
ExecutionEntity execution = taskEntity.getExecution();
if (execution != null) {
taskEntity.setEventName(taskEventName);
}
try {
getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(new TaskListenerInvocation(taskListener, (DelegateTask) taskEntity));
} catch (Exception e) {
throw new ActivitiException("Exception while invoking TaskListener: " + e.getMessage(), e);
}
}
}
}
}
}
protected TaskListener createTaskListener(ActivitiListener activitiListener, String taskId) {
TaskListener taskListener = null;
if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equalsIgnoreCase(activitiListener.getImplementationType())) {
taskListener = getProcessEngineConfiguration().getListenerFactory().createClassDelegateTaskListener(activitiListener);
} else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equalsIgnoreCase(activitiListener.getImplementationType())) {
taskListener = getProcessEngineConfiguration().getListenerFactory().createExpressionTaskListener(activitiListener);
} else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equalsIgnoreCase(activitiListener.getImplementationType())) {
taskListener = getProcessEngineConfiguration().getListenerFactory().createDelegateExpressionTaskListener(activitiListener);
} else if (ImplementationType.IMPLEMENTATION_TYPE_INSTANCE.equalsIgnoreCase(activitiListener.getImplementationType())) {
taskListener = (TaskListener) activitiListener.getInstance();
}
return taskListener;
}
@Override
......
/* 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.
*/
package org.activiti.engine.impl.task;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.form.TaskFormHandler;
/**
* Container for task definition information gathered at parsing time.
*
* @author Joram Barrez
*/
public class TaskDefinition implements Serializable {
private static final long serialVersionUID = 1L;
protected String key;
// assignment fields
protected Expression nameExpression;
protected Expression ownerExpression;
protected Expression descriptionExpression;
protected Expression assigneeExpression;
protected Set<Expression> candidateUserIdExpressions = new HashSet<Expression>();
protected Set<Expression> candidateGroupIdExpressions = new HashSet<Expression>();
protected Expression dueDateExpression;
protected Expression priorityExpression;
protected Expression categoryExpression;
protected Map<String, Set<Expression>> customUserIdentityLinkExpressions = new HashMap<String, Set<Expression>>();
protected Map<String, Set<Expression>> customGroupIdentityLinkExpressions = new HashMap<String, Set<Expression>>();
protected Expression skipExpression;
// form fields
protected TaskFormHandler taskFormHandler;
protected Expression formKeyExpression;
// task listeners
protected Map<String, List<TaskListener>> taskListeners = new HashMap<String, List<TaskListener>>();
public TaskDefinition(TaskFormHandler taskFormHandler) {
this.taskFormHandler = taskFormHandler;
}
// getters and setters
// //////////////////////////////////////////////////////
public Expression getNameExpression() {
return nameExpression;
}
public void setNameExpression(Expression nameExpression) {
this.nameExpression = nameExpression;
}
public Expression getOwnerExpression() {
return ownerExpression;
}
public void setOwnerExpression(Expression ownerExpression) {
this.ownerExpression = ownerExpression;
}
public Expression getDescriptionExpression() {
return descriptionExpression;
}
public void setDescriptionExpression(Expression descriptionExpression) {
this.descriptionExpression = descriptionExpression;
}
public Expression getAssigneeExpression() {
return assigneeExpression;
}
public void setAssigneeExpression(Expression assigneeExpression) {
this.assigneeExpression = assigneeExpression;
}
public Set<Expression> getCandidateUserIdExpressions() {
return candidateUserIdExpressions;
}
public void addCandidateUserIdExpression(Expression userId) {
candidateUserIdExpressions.add(userId);
}
public Set<Expression> getCandidateGroupIdExpressions() {
return candidateGroupIdExpressions;
}
public void addCandidateGroupIdExpression(Expression groupId) {
candidateGroupIdExpressions.add(groupId);
}
public Map<String, Set<Expression>> getCustomUserIdentityLinkExpressions() {
return customUserIdentityLinkExpressions;
}
public void addCustomUserIdentityLinkExpression(String identityLinkType, Set<Expression> idList) {
customUserIdentityLinkExpressions.put(identityLinkType, idList);
}
public Map<String, Set<Expression>> getCustomGroupIdentityLinkExpressions() {
return customGroupIdentityLinkExpressions;
}
public void addCustomGroupIdentityLinkExpression(String identityLinkType, Set<Expression> idList) {
customGroupIdentityLinkExpressions.put(identityLinkType, idList);
}
public Expression getPriorityExpression() {
return priorityExpression;
}
public void setPriorityExpression(Expression priorityExpression) {
this.priorityExpression = priorityExpression;
}
public TaskFormHandler getTaskFormHandler() {
return taskFormHandler;
}
public void setTaskFormHandler(TaskFormHandler taskFormHandler) {
this.taskFormHandler = taskFormHandler;
}
public Expression getFormKeyExpression() {
return formKeyExpression;
}
public void setFormKeyExpression(Expression formKeyExpression) {
this.formKeyExpression = formKeyExpression;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Expression getDueDateExpression() {
return dueDateExpression;
}
public void setDueDateExpression(Expression dueDateExpression) {
this.dueDateExpression = dueDateExpression;
}
public Expression getCategoryExpression() {
return categoryExpression;
}
public void setCategoryExpression(Expression categoryExpression) {
this.categoryExpression = categoryExpression;
}
public Map<String, List<TaskListener>> getTaskListeners() {
return taskListeners;
}
public void setTaskListeners(Map<String, List<TaskListener>> taskListeners) {
this.taskListeners = taskListeners;
}
public List<TaskListener> getTaskListener(String eventName) {
return taskListeners.get(eventName);
}
public void addTaskListener(String eventName, TaskListener taskListener) {
if (TaskListener.EVENTNAME_ALL_EVENTS.equals(eventName)) {
// In order to prevent having to merge the "all" tasklisteners with
// the ones for a specific eventName,
// every time "getTaskListener()" is called, we add the listener
// explicitly to the individual lists
this.addTaskListener(TaskListener.EVENTNAME_CREATE, taskListener);
this.addTaskListener(TaskListener.EVENTNAME_ASSIGNMENT, taskListener);
this.addTaskListener(TaskListener.EVENTNAME_COMPLETE, taskListener);
this.addTaskListener(TaskListener.EVENTNAME_DELETE, taskListener);
} else {
List<TaskListener> taskEventListeners = taskListeners.get(eventName);
if (taskEventListeners == null) {
taskEventListeners = new ArrayList<TaskListener>();
taskListeners.put(eventName, taskEventListeners);
}
taskEventListeners.add(taskListener);
}
}
public Expression getSkipExpression() {
return skipExpression;
}
public void setSkipExpression(Expression skipExpression) {
this.skipExpression = skipExpression;
}
}
......@@ -17,11 +17,16 @@ import java.util.List;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.form.DefaultStartFormHandler;
import org.activiti.engine.impl.form.DefaultTaskFormHandler;
import org.activiti.engine.impl.form.StartFormHandler;
import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.DeploymentEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
/**
* @author Joram Barrez
......@@ -48,5 +53,33 @@ public class FormHandlerUtil {
return null;
}
public static TaskFormHandler getTaskFormHandlder(String processDefinitionId, String taskId) {
org.activiti.bpmn.model.Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);
FlowElement flowElement = process.getFlowElement(taskId);
if (flowElement != null && flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
ProcessDefinitionEntity processDefinitionEntity =
ProcessDefinitionUtil.getProcessDefinitionEntity(processDefinitionId);
DeploymentEntity deploymentEntity = Context.getProcessEngineConfiguration()
.getDeploymentEntityManager().findById(processDefinitionEntity.getDeploymentId());
TaskFormHandler taskFormHandler = new DefaultTaskFormHandler();
taskFormHandler.parseConfiguration(userTask.getFormProperties(), userTask.getFormKey(), deploymentEntity, processDefinitionEntity);
return taskFormHandler;
}
return null;
}
public static TaskFormHandler getTaskFormHandlder(TaskEntity taskEntity) {
if (taskEntity.getProcessDefinitionId() != null) {
return getTaskFormHandlder(taskEntity.getProcessDefinitionId(), taskEntity.getTaskDefinitionKey());
}
return null;
}
}
......@@ -94,8 +94,8 @@ import org.activiti.engine.impl.bpmn.parser.FieldDeclaration;
import org.activiti.engine.impl.bpmn.parser.factory.AbstractBehaviorFactory;
import org.activiti.engine.impl.bpmn.parser.factory.ActivityBehaviorFactory;
import org.activiti.engine.impl.delegate.ActivityBehavior;
import org.activiti.engine.impl.el.ExpressionManager;
import org.activiti.engine.impl.el.FixedValue;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.test.NoOpServiceTask;
/**
......@@ -148,10 +148,10 @@ public class TestActivityBehaviorFactory extends AbstractBehaviorFactory impleme
public ReceiveTaskActivityBehavior createReceiveTaskActivityBehavior(ReceiveTask receiveTask) {
return wrappedActivityBehaviorFactory.createReceiveTaskActivityBehavior(receiveTask);
}
@Override
public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask, TaskDefinition taskDefinition) {
return wrappedActivityBehaviorFactory.createUserTaskActivityBehavior(userTask, taskDefinition);
public UserTaskActivityBehavior createUserTaskActivityBehavior(ExpressionManager expressionManager, UserTask userTask) {
return wrappedActivityBehaviorFactory.createUserTaskActivityBehavior(expressionManager, userTask);
}
@Override
......
......@@ -206,21 +206,6 @@ public class BpmnDeploymentTest extends PluggableActivitiTestCase {
assertEquals("This is really good process documentation!", processDefinition.getDescription());
}
public void testDeployInvalidExpression() {
// ACT-1391: Deploying a process with invalid expressions inside should
// cause the deployment to fail, since
// the process is not deployed and useless...
try {
repositoryService.createDeployment().addClasspathResource("org/activiti/engine/test/bpmn/deployment/BpmnDeploymentTest.testInvalidExpression.bpmn20.xml").deploy();
fail("Expected exception when deploying process with invalid expression.");
} catch (ActivitiException expected) {
// Check if no deployments are made
assertEquals(0, repositoryService.createDeploymentQuery().count());
assertTrue(expected.getMessage().startsWith("Error parsing XML"));
}
}
public void testDeploySameFileTwiceForDifferentTenantId() {
String bpmnResourceName = "org/activiti/engine/test/bpmn/deployment/BpmnDeploymentTest.testGetBpmnXmlFileThroughService.bpmn20.xml";
repositoryService.createDeployment().enableDuplicateFiltering().addClasspathResource(bpmnResourceName).name("twice").tenantId("Tenant_A").deploy();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册