diff --git a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java index 42a10fe720..3eabbed47f 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java +++ b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java @@ -27,6 +27,8 @@ import java.util.Map; import org.alfresco.repo.workflow.AbstractWorkflowServiceIntegrationTest; import org.alfresco.repo.workflow.WorkflowModel; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; +import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowPath; @@ -101,6 +103,35 @@ public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServ assertEquals("bpm_foo_task", taskName); } + /** + * Actually tests if the priority is the default value. This is based on the assumption that custom + * tasks are defaulted to a priority of 50 (which is invalid). I'm testing that the code I wrote decides this is an + * invalid number and sets it to the default value (2). + */ + public void testPriorityIsValid() + { + WorkflowDefinition definition = deployDefinition("activiti/testCustomActiviti.bpmn20.xml"); + + personManager.setUser(USER1); + + // Start the Workflow + WorkflowPath path = workflowService.startWorkflow(definition.getId(), null); + String instanceId = path.getInstance().getId(); + + // Check the Start Task is completed. + WorkflowTask startTask = workflowService.getStartTask(instanceId); + assertEquals(WorkflowTaskState.COMPLETED, startTask.getState()); + + List tasks = workflowService.getTasksForWorkflowPath(path.getId()); + for (WorkflowTask workflowTask : tasks) + { + Map props = workflowTask.getProperties(); + TypeDefinition typeDefinition = workflowTask.getDefinition().getMetadata(); + Map propertyDefs = typeDefinition.getProperties(); + PropertyDefinition priorDef = propertyDefs.get(WorkflowModel.PROP_PRIORITY); + assertEquals(props.get(WorkflowModel.PROP_PRIORITY),Integer.valueOf(priorDef.getDefaultValue())); + } + } @Override protected void checkTaskQueryStartTaskCompleted(String workflowInstanceId, WorkflowTask startTask) { diff --git a/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java b/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java index 32c54c45dc..37d317bf06 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java +++ b/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java @@ -58,6 +58,8 @@ import org.alfresco.repo.workflow.activiti.ActivitiTaskTypeManager; import org.alfresco.repo.workflow.activiti.ActivitiUtil; import org.alfresco.service.cmr.dictionary.AssociationDefinition; import org.alfresco.service.cmr.dictionary.ClassAttributeDefinition; +import org.alfresco.service.cmr.dictionary.ConstraintDefinition; +import org.alfresco.service.cmr.dictionary.ConstraintException; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; @@ -70,6 +72,8 @@ import org.alfresco.util.collections.CollectionUtils; import org.alfresco.util.collections.EntryTransformer; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * @author Nick Smith @@ -77,6 +81,7 @@ import org.apache.commons.lang.StringUtils; */ public class ActivitiPropertyConverter { + private static Log logger = LogFactory.getLog(ActivitiPropertyConverter.class); private static final String ERR_CONVERT_VALUE = "activiti.engine.convert.value.error"; private static final String ERR_SET_TASK_PROPS_INVALID_VALUE = "activiti.engine.set.task.properties.invalid.value"; private static final String ERR_MANDATORY_TASK_PROPERTIES_MISSING = "activiti.engine.mandatory.properties.missing"; @@ -376,6 +381,26 @@ public class ActivitiPropertyConverter } } + // Special case for property priorities + PropertyDefinition priorDef = propertyDefs.get(WorkflowModel.PROP_PRIORITY); + Serializable existingValue = existingValues.get(WorkflowModel.PROP_PRIORITY); + try + { + for (ConstraintDefinition constraintDef : priorDef.getConstraints()) + { + constraintDef.getConstraint().evaluate(existingValue); + } + } + catch (ConstraintException ce) + { + Integer defaultVal = Integer.valueOf(priorDef.getDefaultValue()); + if (logger.isDebugEnabled()) + { + logger.debug("Task priority value ("+existingValue+") was invalid so it was set to the default value of "+defaultVal+". Task:"+task.getName()); + } + defaultValues.put(WorkflowModel.PROP_PRIORITY, defaultVal); + } + // Special case for task description default value String description = (String) existingValues.get(WorkflowModel.PROP_DESCRIPTION); if (description == null || description.length() == 0) diff --git a/source/test-resources/activiti/testCustomActiviti.bpmn20.xml b/source/test-resources/activiti/testCustomActiviti.bpmn20.xml new file mode 100644 index 0000000000..f219523b86 --- /dev/null +++ b/source/test-resources/activiti/testCustomActiviti.bpmn20.xml @@ -0,0 +1,13 @@ + + + + Custom activiti, created to test that the priority is automatically set to an allowed value e.g. change from 50 to 2. + + + hello e + + + + + + \ No newline at end of file