diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/calendar/DueDateBusinessCalendar.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/calendar/DueDateBusinessCalendar.java index c821b149e20ed25fcffd2d7075e67b6a2ce97f67..d6f9bcc10288bf51db59a4cbd0e9dfc4158956c4 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/calendar/DueDateBusinessCalendar.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/calendar/DueDateBusinessCalendar.java @@ -16,6 +16,7 @@ import java.util.Date; import org.activiti.engine.ActivitiException; import org.joda.time.DateTime; +import org.joda.time.Period; public class DueDateBusinessCalendar implements BusinessCalendar { @@ -24,6 +25,12 @@ public class DueDateBusinessCalendar implements BusinessCalendar { public Date resolveDuedate(String duedate) { try { + + // check if due period was specified + if(duedate.startsWith("P")){ + return DateTime.now().plus(Period.parse(duedate)).toDate(); + } + return DateTime.parse(duedate).toDate(); } catch (Exception e) { diff --git a/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/usertask/TaskDueDateExtensionsTest.java b/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/usertask/TaskDueDateExtensionsTest.java index 1575c160d84a2ec262f0aca07f793172bc391f5a..88749d6112ed2399b56903757922a4147bc043e3 100644 --- a/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/usertask/TaskDueDateExtensionsTest.java +++ b/modules/activiti-engine/src/test/java/org/activiti/engine/test/bpmn/usertask/TaskDueDateExtensionsTest.java @@ -22,6 +22,7 @@ import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.test.Deployment; +import org.joda.time.Period; /** @@ -60,4 +61,22 @@ public class TaskDueDateExtensionsTest extends PluggableActivitiTestCase { Date date = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("06-07-1986 12:10:00"); assertEquals(date, task.getDueDate()); } + + @Deployment + public void testRelativeDueDateStringExtension() throws Exception { + + Map variables = new HashMap(); + variables.put("dateVariable", "P2DT5H40M"); + + // Start process-instance, passing ISO8601 duration formatted String that should be used to calculate dueDate + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("dueDateExtension", variables); + + Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); + + assertNotNull(task.getDueDate()); + Period period = new Period(task.getCreateTime().getTime(), task.getDueDate().getTime()); + assertEquals(period.getDays(), 2); + assertEquals(period.getHours(), 5); + assertEquals(period.getMinutes(), 40); + } } diff --git a/modules/activiti-engine/src/test/resources/org/activiti/engine/test/bpmn/usertask/TaskDueDateExtensionsTest.testRelativeDueDateStringExtension.bpmn20.xml b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/bpmn/usertask/TaskDueDateExtensionsTest.testRelativeDueDateStringExtension.bpmn20.xml new file mode 100644 index 0000000000000000000000000000000000000000..5897810e252c27d14130b7621897e6e534c70411 --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/bpmn/usertask/TaskDueDateExtensionsTest.testRelativeDueDateStringExtension.bpmn20.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file