Author: jbarrez
Date: 2009-09-10 09:45:51 -0400 (Thu, 10 Sep 2009)
New Revision: 5627
Modified:
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/Task.java
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/task/TaskQueryTest.java
Log:
Test case for JBPM-2535
Also added progress getter/setter to Task interface
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/Task.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/Task.java 2009-09-10 10:21:20
UTC (rev 5626)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/task/Task.java 2009-09-10 13:45:51
UTC (rev 5627)
@@ -24,6 +24,7 @@
import java.io.Serializable;
import java.util.Date;
+import org.jbpm.api.JbpmException;
import org.jbpm.api.TaskService;
import org.jbpm.api.history.HistoryTask;
@@ -91,6 +92,21 @@
* Updates like this require you to invoke {@link TaskService#saveTask(Task)}
afterwards. */
void setPriority(int priority);
+ /**
+ * The progress of this task. This is a data item for user purposes and
+ * doesn't influence the functionality of the engine.
+ */
+ Integer getProgress();
+
+ /**
+ * Change the progress of this task.
+ * Updates like this require you to invoke {@link TaskService#saveTask(Task)}
afterwards.
+ *
+ * <b>IMPORTANT</b>: Only values between 0 and 100 are accepted.
+ * Using other values will cause a {@link JbpmException}.
+ */
+ void setProgress(Integer progress);
+
/** reference to the execution or null if this task is unrelated to an execution */
String getExecutionId();
Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/task/TaskQueryTest.java
===================================================================
---
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/task/TaskQueryTest.java 2009-09-10
10:21:20 UTC (rev 5626)
+++
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/task/TaskQueryTest.java 2009-09-10
13:45:51 UTC (rev 5627)
@@ -21,11 +21,19 @@
*/
package org.jbpm.test.task;
+import java.lang.reflect.Method;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.jbpm.api.TaskQuery;
import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.util.ReflectUtil;
import org.jbpm.test.JbpmTestCase;
@@ -41,10 +49,8 @@
task.setPriority(Integer.MAX_VALUE);
task.setDescription("make sure the test fails if property names are
incorrect");
task.setDuedate(new Date());
- String writeTestTaskId = taskService.saveTask(task);
+ String taskId = taskService.saveTask(task);
- //TaskQuery taskQuery = taskService.createTaskQuery();
-
checkProperty(taskService.createTaskQuery(), task, TaskQuery.PROPERTY_ASSIGNEE);
checkProperty(taskService.createTaskQuery(), task, TaskQuery.PROPERTY_CREATEDATE);
checkProperty(taskService.createTaskQuery(), task, TaskQuery.PROPERTY_DUEDATE);
@@ -52,7 +58,7 @@
checkProperty(taskService.createTaskQuery(), task, TaskQuery.PROPERTY_PRIORITY);
checkProperty(taskService.createTaskQuery(), task, TaskQuery.PROPERTY_PROGRESS);
- taskService.deleteTaskCascade(writeTestTaskId);
+ taskService.deleteTaskCascade(taskId);
}
private void checkProperty(TaskQuery taskQuery, Task task, String propertyName) {
@@ -63,29 +69,8 @@
}
public void testSimplestTaskQuery() {
- Task task = taskService.newTask();
- task.setName("do laundry");
- task.setAssignee("johndoe");
- task.setPriority(3);
- String laudryTaskId = taskService.saveTask(task);
+ List<Task> tasks = createTestTasks();
- task = taskService.newTask();
- task.setName("change dyper");
- task.setAssignee("johndoe");
- task.setPriority(1);
- String dyperTaskId = taskService.saveTask(task);
-
- task = taskService.newTask();
- task.setName("start new business");
- task.setAssignee("joesmoe");
- task.setPriority(4);
- String startBusinessTaskId = taskService.saveTask(task);
-
- task = taskService.newTask();
- task.setName("find venture capital");
- task.setPriority(4);
- String capitalTaskId = taskService.saveTask(task);
-
List<Task> taskList = taskService
.createTaskQuery()
.list();
@@ -98,52 +83,178 @@
assertEquals(4, taskList.size());
- taskService.deleteTaskCascade(capitalTaskId);
- taskService.deleteTaskCascade(startBusinessTaskId);
- taskService.deleteTaskCascade(dyperTaskId);
- taskService.deleteTaskCascade(laudryTaskId);
+ deleteTasks(tasks);
}
- public void testSimplestTaskQuerySortBy() {
- Task task = taskService.newTask();
- task.setName("do laundry");
- task.setAssignee("johndoe");
- task.setPriority(3);
- String laudryTaskId = taskService.saveTask(task);
+ public void testOrderByName() {
+ testOrderBy(TaskQuery.PROPERTY_NAME,
+ new String[] {"change dyper", "do laundry", "find
venture capital", "start new business"});
+ }
+
+ public void testOrderByAssignee() {
+ testOrderBy(TaskQuery.PROPERTY_ASSIGNEE, new String[] {null, "Joram",
"Koen", "Tom"});
+ }
+
+ public void testOrderByCreateTime() {
+ testOrderByResultsInNaturalOrdening(TaskQuery.PROPERTY_CREATEDATE, 4);
+ }
+
+ public void testOrderByDueDate() {
+ testOrderByResultsInNaturalOrdening(TaskQuery.PROPERTY_DUEDATE, 4);
+ }
+
+ public void testOrderByPriority() {
+ testOrderByResultsInNaturalOrdening(TaskQuery.PROPERTY_PRIORITY, 4);
+ }
+
+ public void testOrderByProgress() {
+ testOrderBy(TaskQuery.PROPERTY_PROGRESS, new Integer[] {2, 15, 75, 99});
+ }
+
+
+ /* -------------------------------------------------------------------
+ * HELPER METHODS
+ * ------------------------------------------------------------------- */
+
+ private List<Task> createTestTasks() {
+ List<Task> result = new ArrayList<Task>();
- task = taskService.newTask();
- task.setName("change dyper");
- task.setAssignee("johndoe");
- task.setPriority(1);
- String dyperTaskId = taskService.saveTask(task);
+ Task task1 = taskService.newTask();
+ task1.setName("do laundry");
+ task1.setAssignee("Tom");
+ task1.setPriority(3);
+ task1.setDuedate(stringToDate("10/10/1985"));
+ task1.setProgress(15);
- task = taskService.newTask();
- task.setName("start new business");
- task.setAssignee("joesmoe");
- task.setPriority(4);
- String startBusinessTaskId = taskService.saveTask(task);
+ Task task2 = taskService.newTask();
+ task2.setName("change dyper");
+ task2.setAssignee("Koen");
+ task2.setPriority(1);
+ task2.setDuedate(stringToDate("28/06/1989"));
+ task2.setProgress(2);
+
+ Task task3 = taskService.newTask();
+ task3.setName("start new business");
+ task3.setAssignee("Joram");
+ task3.setPriority(4);
+ task3.setProgress(75);
- task = taskService.newTask();
- task.setName("find venture capital");
- task.setPriority(7);
- String capitalTaskId = taskService.saveTask(task);
-
- List<Task> taskList = taskService
- .createTaskQuery()
- .orderAsc(TaskQuery.PROPERTY_NAME)
- .list();
- assertNotNull(taskList);
+ Task task4 = taskService.newTask();
+ task4.setName("find venture capital");
+ task4.setPriority(7);
+ task4.setDuedate(stringToDate("09/09/2009"));
+ task4.setProgress(99);
- assertEquals("change dyper", taskList.get(0).getName());
- assertEquals("do laundry", taskList.get(1).getName());
- assertEquals("find venture capital", taskList.get(2).getName());
- assertEquals("start new business", taskList.get(3).getName());
+ for (Task t : new Task[] {task1, task2, task3, task4}) {
+ taskService.saveTask(t);
+ result.add(t);
+ }
+
+ return result;
+ }
+
+ /**
+ * Convience method:
+ * - Creates a task query with order asc/desc on the given <i>property</i>
param.
+ * - Loops over both result lists and checks if the elements
+ * are in the order as given by the <i>expectedValues</i> param.
+ */
+ private void testOrderBy(String property, Object[] expectedValues) {
+ List<Task> tasks = createTestTasks();
- assertEquals(4, taskList.size());
+ List<Task> taskListAsc =
taskService.createTaskQuery().orderAsc(property).list();
+ List<Task> taskListDesc =
taskService.createTaskQuery().orderDesc(property).list();
- taskService.deleteTaskCascade(capitalTaskId);
- taskService.deleteTaskCascade(startBusinessTaskId);
- taskService.deleteTaskCascade(dyperTaskId);
- taskService.deleteTaskCascade(laudryTaskId);
+ assertNotNull(taskListAsc);
+ assertEquals(expectedValues.length, taskListAsc.size());
+
+ assertNotNull(taskListDesc);
+ assertEquals(expectedValues.length, taskListDesc.size());
+
+ for (int i = 0; i < expectedValues.length; i++) {
+
+ Object realValueAsc = null;
+ Object realValueDesc = null;
+
+ try {
+
+ realValueAsc = invokeGetterOnTask(property, taskListAsc.get(i));
+ realValueDesc = invokeGetterOnTask(property,
taskListDesc.get((taskListDesc.size() -1) - i));
+
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ assertEquals("Incorrect order by ASC for property " + property,
expectedValues[i], realValueAsc);
+ assertEquals("Incorrect order by ASC for property " + property,
expectedValues[i], realValueAsc);
+
+ }
+
+ deleteTasks(tasks);
}
+
+ /**
+ * Creates a taskquery for tasks, orderd on the given property.
+ * The resulting list is checked asc/desc for natural order.
+ *
+ * Note property must implement Comparable!
+ */
+ @SuppressWarnings("unchecked")
+ private void testOrderByResultsInNaturalOrdening(String property, int
expectedNrOfResults) {
+ List<Task> tasks = createTestTasks();
+ List<Task> taskListAsc =
taskService.createTaskQuery().orderAsc(property).list();
+ List<Task> taskListDesc =
taskService.createTaskQuery().orderDesc(property).list();
+
+ assertEquals(expectedNrOfResults, taskListAsc.size());
+ assertEquals(expectedNrOfResults, taskListDesc.size());
+
+ if (expectedNrOfResults > 1) {
+
+ for (int i = 1; i < taskListAsc.size(); i++) {
+
+ // ascending check
+ Comparable c1 = (Comparable) invokeGetterOnTask(property, taskListAsc.get(i -
1));
+ Comparable c2 = (Comparable) invokeGetterOnTask(property, taskListAsc.get(i));
+ if (c1 != null && c2 != null) {
+ assertTrue(c1.compareTo(c2) <= 0); // c1 <= c2 when ascending
+ }
+
+ // ascending check
+ Comparable c3 = (Comparable) invokeGetterOnTask(property, taskListDesc.get(i -
1));
+ Comparable c4 = (Comparable) invokeGetterOnTask(property, taskListDesc.get(i));
+ if (c3 != null && c4 != null) {
+ assertTrue(c3.compareTo(c4) >= 0); // c3 >= c4 when ascending
+ }
+
+ }
+ }
+
+ deleteTasks(tasks);
+ }
+
+ private Object invokeGetterOnTask(String property, Task task) {
+ Method getter = ReflectUtil.getMethod(TaskImpl.class,
+ "get" + property.substring(0, 1).toUpperCase() +
property.substring(1), null);
+ try {
+ return getter.invoke(task);
+ } catch (Exception e) {
+ throw new RuntimeException("Couldn't invoke getter for property " +
property);
+ }
+ }
+
+ private void deleteTasks(List<Task> tasks) {
+ for (Task t : tasks) {
+ taskService.deleteTaskCascade(t.getId());
+ }
+ }
+
+ private Date stringToDate(String dateString) {
+ DateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
+ try {
+ return dateFormat.parse(dateString);
+ } catch (ParseException e) {
+ throw new RuntimeException("Couldn't convert " + dateString);
+ }
+ }
+
}