diff --git a/modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/Process.java b/modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/Process.java index f660e956e6400b191ff06aae8a2dd4062870e868..e4a50a53d55ea9e5a948c21e671e5a1004ceb922 100644 --- a/modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/Process.java +++ b/modules/activiti-bpmn-model/src/main/java/org/activiti/bpmn/model/Process.java @@ -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 candidateStarterUsers = new ArrayList(); protected List candidateStarterGroups = new ArrayList(); protected List eventListeners = new ArrayList(); - + // 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; } - + } diff --git a/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java b/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java index 3b93fe358217d9be0ee3305abe18f95ff9561bd0..755e3ebb4e1e04ce155c505e3d7a0548375d7a26 100644 --- a/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java +++ b/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java @@ -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); } } diff --git a/modules/activiti-crystalball/src/main/java/org/activiti/crystalball/simulator/impl/bpmn/parser/handler/AddListenerUserTaskParseHandler.java b/modules/activiti-crystalball/src/main/java/org/activiti/crystalball/simulator/impl/bpmn/parser/handler/AddListenerUserTaskParseHandler.java index c8221886292678c1fd35b9ff3ff307910b60da5c..5b98567b888315f2c6cde4deb46fdfbf10ad5b8c 100644 --- a/modules/activiti-crystalball/src/main/java/org/activiti/crystalball/simulator/impl/bpmn/parser/handler/AddListenerUserTaskParseHandler.java +++ b/modules/activiti-crystalball/src/main/java/org/activiti/crystalball/simulator/impl/bpmn/parser/handler/AddListenerUserTaskParseHandler.java @@ -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); } + } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java index ace55d2de5e327905c65f19964a38d6356217d90..45337884d73e85721d0ef933d935e1eaa30e4e11 100755 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java @@ -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 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 candidates = extractCandidates((String) value); @@ -216,50 +223,58 @@ public class UserTaskActivityBehavior extends TaskActivityBehavior { } } } - - if (!taskDefinition.getCustomUserIdentityLinkExpressions().isEmpty()) { - Map> 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 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> 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 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; - } - } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/ActivityBehaviorFactory.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/ActivityBehaviorFactory.java index f7638ec2a98a79c136849d4a5d599315be7883c2..19c4df56be43c12518117f8647754669104324e9 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/ActivityBehaviorFactory.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/ActivityBehaviorFactory.java @@ -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); diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java index c2155ea8737a939eb5abb7350952c9408f2bd928..230848a6cb99d52992cfbe8cf94172e847910667 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/factory/DefaultActivityBehaviorFactory.java @@ -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 diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/ProcessParseHandler.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/ProcessParseHandler.java index 1db10b82323b868920f400853afaaaab805835b5..43ad01f652881179a5b21f9527ce7362de4714c3 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/ProcessParseHandler.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/ProcessParseHandler.java @@ -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 { currentProcessDefinition.setName(process.getName()); currentProcessDefinition.setCategory(bpmnParse.getBpmnModel().getTargetNamespace()); currentProcessDefinition.setDescription(process.getDocumentation()); - currentProcessDefinition.setTaskDefinitions(new HashMap()); currentProcessDefinition.setDeploymentId(bpmnParse.getDeployment().getId()); if (bpmnParse.getDeployment().getEngineVersion() != null) { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/UserTaskParseHandler.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/UserTaskParseHandler.java index 994814e1724fc10a00c5aea5768d604b37442a04..7269d723c573677d5d0e21526c328a7d4bc657c0 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/UserTaskParseHandler.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/UserTaskParseHandler.java @@ -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 userIdentityLinkExpression = new HashSet(); - for (String userIdentityLink : userTask.getCustomUserIdentityLinks().get(customUserIdentityLinkType)) { - userIdentityLinkExpression.add(expressionManager.createExpression(userIdentityLink)); - } - taskDefinition.addCustomUserIdentityLinkExpression(customUserIdentityLinkType, userIdentityLinkExpression); - } - - // CustomGroupIdentityLinks - for (String customGroupIdentityLinkType : userTask.getCustomGroupIdentityLinks().keySet()) { - Set groupIdentityLinkExpression = new HashSet(); - 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; - } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/AbstractCompleteTaskCmd.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/AbstractCompleteTaskCmd.java index 585fab3b9731b465e6cd457f972b3895c14fd722..63c3177775bdc8bf3aa823b45decd028477b4800 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/AbstractCompleteTaskCmd.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/AbstractCompleteTaskCmd.java @@ -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 { 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 { } } - // TODO: this needs to be revised - public void fireEvent(CommandContext commandContext, TaskEntity taskEntity, String taskEventName) { - TaskDefinition taskDefinition = getTaskDefinition(taskEntity); - if (taskDefinition != null) { - List 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()); - } - } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetFormKeyCmd.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetFormKeyCmd.java index 65c3699cb7a2e2efedbee3ba57b5ae2c2573419a..83aa820b159c0202e97611fb888a634886af8684 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetFormKeyCmd.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetFormKeyCmd.java @@ -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 { } 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) { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetRenderedTaskFormCmd.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetRenderedTaskFormCmd.java index 846298cc42642930071d81c3438e7a96cb691483..55b3d7fc609fe64554e284ad0836eb374a716610 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetRenderedTaskFormCmd.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetRenderedTaskFormCmd.java @@ -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, 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) { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetTaskFormCmd.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetTaskFormCmd.java index a1d512c89b423b26c6a3dc9d4bf413742ffb610d..b98fc328512d35ff66e54d29dce8295755e5588a 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetTaskFormCmd.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/GetTaskFormCmd.java @@ -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, 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); } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/SubmitTaskFormCmd.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/SubmitTaskFormCmd.java index 7e7df6f90927119fd5f3427dfff284c077dd4abe..5aa9dd0c06c2a823de46ab45c6f5fef4250d28a4 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/SubmitTaskFormCmd.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/SubmitTaskFormCmd.java @@ -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) { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/DefaultHistoryManager.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/DefaultHistoryManager.java index 1d3ff58abbeb2dcc61d581742fe697c497ff3f74..072e9c261f49f9f38349e1b23d9afc859b7c4de8 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/DefaultHistoryManager.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/DefaultHistoryManager.java @@ -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()); } } } - + } } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntity.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntity.java index fb3776393c99ffc334c4d825e9f9f259f3f447f2..28620644900b0da89f5639af08eb5ec7cc9a96a8 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntity.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntity.java @@ -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 getTaskDefinitions(); - - void setTaskDefinitions(Map taskDefinitions); - Map getVariables(); void setVariables(Map variables); diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntityImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntityImpl.java index acf535c068a53b99e722c7093fb0a06f4124bff7..c2563a28c44db18e15b6b0cfc461b205cf1fa54a 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntityImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ProcessDefinitionEntityImpl.java @@ -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 taskDefinitions; protected Map 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 getTaskDefinitions() { - return taskDefinitions; - } - - public void setTaskDefinitions(Map taskDefinitions) { - this.taskDefinitions = taskDefinitions; - } - public Map getVariables() { return variables; } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityImpl.java index dd3a99401561ce8e0c78c6261011de5a68f5cb29..8fc6401958c725d023f15ab087b9613b75c9317c 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityImpl.java @@ -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; diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityManagerImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityManagerImpl.java index 02731e46e6d76124e976292ac6bc6966388bc158..3d2d169a749311fac8d6c12290bec9662a4bf489 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityManagerImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/TaskEntityManagerImpl.java @@ -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 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 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 diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/task/TaskDefinition.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/task/TaskDefinition.java deleted file mode 100644 index 72ef2fc3480168c93bc749984b8790ccf32e23e6..0000000000000000000000000000000000000000 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/task/TaskDefinition.java +++ /dev/null @@ -1,218 +0,0 @@ -/* 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 candidateUserIdExpressions = new HashSet(); - protected Set candidateGroupIdExpressions = new HashSet(); - protected Expression dueDateExpression; - protected Expression priorityExpression; - protected Expression categoryExpression; - protected Map> customUserIdentityLinkExpressions = new HashMap>(); - protected Map> customGroupIdentityLinkExpressions = new HashMap>(); - protected Expression skipExpression; - - // form fields - protected TaskFormHandler taskFormHandler; - protected Expression formKeyExpression; - - // task listeners - protected Map> taskListeners = new HashMap>(); - - 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 getCandidateUserIdExpressions() { - return candidateUserIdExpressions; - } - - public void addCandidateUserIdExpression(Expression userId) { - candidateUserIdExpressions.add(userId); - } - - public Set getCandidateGroupIdExpressions() { - return candidateGroupIdExpressions; - } - - public void addCandidateGroupIdExpression(Expression groupId) { - candidateGroupIdExpressions.add(groupId); - } - - public Map> getCustomUserIdentityLinkExpressions() { - return customUserIdentityLinkExpressions; - } - - public void addCustomUserIdentityLinkExpression(String identityLinkType, Set idList) { - customUserIdentityLinkExpressions.put(identityLinkType, idList); - } - - public Map> getCustomGroupIdentityLinkExpressions() { - return customGroupIdentityLinkExpressions; - } - - public void addCustomGroupIdentityLinkExpression(String identityLinkType, Set 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> getTaskListeners() { - return taskListeners; - } - - public void setTaskListeners(Map> taskListeners) { - this.taskListeners = taskListeners; - } - - public List 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 taskEventListeners = taskListeners.get(eventName); - if (taskEventListeners == null) { - taskEventListeners = new ArrayList(); - taskListeners.put(eventName, taskEventListeners); - } - taskEventListeners.add(taskListener); - } - } - - public Expression getSkipExpression() { - return skipExpression; - } - - public void setSkipExpression(Expression skipExpression) { - this.skipExpression = skipExpression; - } -} diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/util/FormHandlerUtil.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/util/FormHandlerUtil.java index 0f9e358a8e511b7275f1c919ebc70c99e85862f3..ea0cf8f4220b93754ccd4ed8955782b5417b6a02 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/util/FormHandlerUtil.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/util/FormHandlerUtil.java @@ -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; + } + } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/test/TestActivityBehaviorFactory.java b/modules/activiti-engine/src/main/java/org/activiti/engine/test/TestActivityBehaviorFactory.java index df436d4260095b8d2dc41916fd99288d91475073..779fc431cbb84e9cc6173bce518ae51d7ab5d0d3 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/test/TestActivityBehaviorFactory.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/test/TestActivityBehaviorFactory.java @@ -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 diff --git a/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/deployment/BpmnDeploymentTest.java b/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/deployment/BpmnDeploymentTest.java index 2960535b91661e3c6669c811c70278f0f5aebaf7..73bfd884c4d713c6cfb0f30bae94011ceb383182 100644 --- a/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/deployment/BpmnDeploymentTest.java +++ b/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/deployment/BpmnDeploymentTest.java @@ -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();