You are viewing a plain text version of this content. The canonical link for it is here.
Posted to agila-commits@incubator.apache.org by ge...@apache.org on 2005/02/14 14:02:06 UTC
svn commit: r153792 - in incubator/agila/trunk/src:
java/org/apache/agila/example/ java/org/apache/agila/impl/dao/
java/org/apache/agila/impl/memory/ java/org/apache/agila/services/task/
java/org/apache/agila/util/ resources/ test/org/apache/agila/
test/org/apache/agila/services/ test/org/apache/agila/util/
Author: geirm
Date: Mon Feb 14 06:02:02 2005
New Revision: 153792
URL: http://svn.apache.org/viewcvs?view=rev&rev=153792
Log:
patch from James Strachan, to mail list, 1/18/05
Modified:
incubator/agila/trunk/src/java/org/apache/agila/example/LeaveApplicationTask.java
incubator/agila/trunk/src/java/org/apache/agila/impl/dao/AgilaDAO.java
incubator/agila/trunk/src/java/org/apache/agila/impl/dao/TaskServiceImpl.java
incubator/agila/trunk/src/java/org/apache/agila/impl/memory/TaskServiceImpl.java
incubator/agila/trunk/src/java/org/apache/agila/services/task/Task.java
incubator/agila/trunk/src/java/org/apache/agila/services/task/TaskService.java
incubator/agila/trunk/src/java/org/apache/agila/util/JDBCUtil.java
incubator/agila/trunk/src/java/org/apache/agila/util/XMLUtil.java
incubator/agila/trunk/src/resources/LeaveApplication.xml
incubator/agila/trunk/src/test/org/apache/agila/LeaveApplication.xml
incubator/agila/trunk/src/test/org/apache/agila/services/TaskServiceTestCase.java
incubator/agila/trunk/src/test/org/apache/agila/util/XMLUtilTestCase.java
Modified: incubator/agila/trunk/src/java/org/apache/agila/example/LeaveApplicationTask.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/example/LeaveApplicationTask.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/example/LeaveApplicationTask.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/example/LeaveApplicationTask.java Mon Feb 14 06:02:02 2005
@@ -36,6 +36,26 @@
protected final static String NUMDAYS = "numdays";
protected final static String REASON = "reason";
+ // mock properties to test XML serialization
+ private String foo;
+ private int bar;
+
+ public int getBar() {
+ return bar;
+ }
+
+ public void setBar(int bar) {
+ this.bar = bar;
+ }
+
+ public String getFoo() {
+ return foo;
+ }
+
+ public void setFoo(String foo) {
+ this.foo = foo;
+ }
+
/**
* Start method for the activity. Sets up a tast for the user
*
Modified: incubator/agila/trunk/src/java/org/apache/agila/impl/dao/AgilaDAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/impl/dao/AgilaDAO.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/impl/dao/AgilaDAO.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/impl/dao/AgilaDAO.java Mon Feb 14 06:02:02 2005
@@ -71,15 +71,19 @@
TaskID insertTask(Task task);
- List getTasksForUser(UserID userID, int type);
+ List getTasksForUser(UserID userID, int status);
List getTasksForGroups(GroupID[] teamIDs, int status);
+ List getTasksForInstance( InstanceID instanceID, int status );
+
Task getTaskByID(TaskID taskID);
boolean lockTaskForUser(TaskID taskID, UserID userID);
void unlockTaskForUser(TaskID taskID, UserID userID);
+
+ int setTaskStatusForInstance(InstanceID instanceID, int oldStatus, int newStatus);
// Token methods
Modified: incubator/agila/trunk/src/java/org/apache/agila/impl/dao/TaskServiceImpl.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/impl/dao/TaskServiceImpl.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/impl/dao/TaskServiceImpl.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/impl/dao/TaskServiceImpl.java Mon Feb 14 06:02:02 2005
@@ -24,6 +24,7 @@
import org.apache.agila.services.user.GroupID;
import org.apache.agila.util.JDBCUtil;
import org.apache.agila.engine.TokenID;
+import org.apache.agila.engine.InstanceID;
import java.util.List;
import java.util.Date;
@@ -51,10 +52,18 @@
return dao.lockTaskForUser(taskID, userID);
}
+ public List getTasksForInstance(InstanceID instanceID, int status) {
+ return dao.getTasksForInstance(instanceID, status);
+ }
+
public void unlockTaskForUser(TaskID taskID, UserID userID) {
dao.unlockTaskForUser(taskID, userID);
}
+ public int setTaskStatusForInstance(InstanceID instanceID, int oldStatus, int newStatus) {
+ return dao.setTaskStatusForInstance(instanceID, oldStatus, newStatus);
+ }
+
/**
* Add or update a task.
*/
@@ -69,9 +78,9 @@
}
}
- protected List internalGetTasksByUserID(UserID userID, int type) {
+ protected List internalGetTasksByUserID(UserID userID, int status) {
- return dao.getTasksForUser(userID, type);
+ return dao.getTasksForUser(userID, status);
}
Modified: incubator/agila/trunk/src/java/org/apache/agila/impl/memory/TaskServiceImpl.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/impl/memory/TaskServiceImpl.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/impl/memory/TaskServiceImpl.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/impl/memory/TaskServiceImpl.java Mon Feb 14 06:02:02 2005
@@ -23,6 +23,7 @@
import org.apache.agila.services.task.AbstractTaskService;
import org.apache.agila.services.task.TaskImpl;
import org.apache.agila.services.user.GroupID;
+import org.apache.agila.engine.InstanceID;
import java.util.Map;
import java.util.HashMap;
@@ -60,6 +61,29 @@
if (task != null && task.getUserID() == null) {
task.setUserID(null);
}
+ }
+
+ public List getTasksForInstance(InstanceID instanceID, int type) {
+ List answer = new ArrayList();
+ for (Iterator iter = taskIDMap.values().iterator(); iter.hasNext();) {
+ Task task = (Task) iter.next();
+ if (instanceID.equals(task.getInstanceID()) && (type == Task.TASK_ALL || task.getTaskStatus() == type)) {
+ answer.add(task);
+ }
+ }
+ return answer;
+ }
+
+ public int setTaskStatusForInstance(InstanceID instanceID, int oldType, int newType) {
+ int answer = 0;
+ for (Iterator iter = taskIDMap.values().iterator(); iter.hasNext();) {
+ Task task = (Task) iter.next();
+ if (instanceID.equals(task.getInstanceID()) && (oldType == Task.TASK_ALL || task.getTaskStatus() == oldType)) {
+ task.setTaskStatus(newType);
+ answer++;
+ }
+ }
+ return answer;
}
/**
Modified: incubator/agila/trunk/src/java/org/apache/agila/services/task/Task.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/services/task/Task.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/services/task/Task.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/services/task/Task.java Mon Feb 14 06:02:02 2005
@@ -36,6 +36,7 @@
public final static int TASK_ALL = 0xFFFFFFFF;
public final static int TASK_INCOMPLETE = 0x01;
public final static int TASK_COMPLETE = 0x02;
+ public final static int TASK_CANCELLED = 0x03;
public TaskID getTaskID();
Modified: incubator/agila/trunk/src/java/org/apache/agila/services/task/TaskService.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/services/task/TaskService.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/services/task/TaskService.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/services/task/TaskService.java Mon Feb 14 06:02:02 2005
@@ -16,16 +16,16 @@
package org.apache.agila.services.task;
+import org.apache.agila.engine.InstanceID;
import org.apache.agila.engine.TokenID;
-import org.apache.agila.services.user.UserID;
import org.apache.agila.services.user.GroupID;
+import org.apache.agila.services.user.UserID;
import java.util.Date;
import java.util.List;
/**
- * Manages tasks for users
- *
+ * Manages tasks for users
*
* @author <a href="mailto:geir@gluecode.com">Geir Magnusson Jr.</a>
* @version $Id: $
@@ -33,7 +33,7 @@
public interface TaskService {
/**
- * assigns a new task to a given user
+ * assigns a new task to a given user
*
* @param tokenID
* @param message
@@ -57,7 +57,7 @@
TaskID assignTaskToTeam(TokenID tokenID, String message, GroupID groupID, Date due);
/**
- * returns a list of tasks for a user
+ * returns a list of tasks for a user
*
* @param userID
* @return
@@ -74,6 +74,24 @@
List getTasksForGroups(GroupID[] groupIDs, int status);
/**
+ * Returns a list of tasks for the given workflow instance
+ * which are at the specified status
+ */
+ List getTasksForInstance(InstanceID instanceID, int status);
+
+ /**
+ * Updates the status of all tasks of the oldStatus on the given workflow instance
+ * to the newStatus. This method can be used to cancel/complete all open tasks, or
+ * re-open all complete tasks etc.
+ *
+ * @param instanceID
+ * @param oldStatus the current status of the tasks
+ * @param newStatus the new status of the tasks
+ * @return the number of rows updated
+ */
+ int setTaskStatusForInstance(InstanceID instanceID, int oldStatus, int newStatus);
+
+ /**
* Attempts to lock the given task for the user, to take ownership of the task
* if noone else has locked it yet.
*
@@ -93,15 +111,16 @@
void unlockTaskForUser(TaskID taskID, UserID userID);
/**
- * sets the status of a test
+ * sets the status of a test
+ *
* @param taskID
* @param status
*/
void setTaskStatus(TaskID taskID, int status);
/**
- * gets a task object by id
- *
+ * gets a task object by id
+ *
* @param taskID
* @return
*/
Modified: incubator/agila/trunk/src/java/org/apache/agila/util/JDBCUtil.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/util/JDBCUtil.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/util/JDBCUtil.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/util/JDBCUtil.java Mon Feb 14 06:02:02 2005
@@ -696,15 +696,17 @@
return retVal;
}
- public List getTasksForUser( UserID userID, int type ) {
+ public List getTasksForUser( UserID userID, int status ) {
List retVal = null;
Connection connection = null;
try {
String sql = "select ID from bpm_task" +
- " where userid = " + userID.getID() +
- " and status = " + type;
+ " where userid = " + userID.getID();
+ if (status != Task.TASK_ALL) {
+ sql += " and status = " + status;
+ }
connection = getConnection();
@@ -733,6 +735,77 @@
return retVal;
}
+ public List getTasksForInstance( InstanceID instanceID, int status ) {
+ List retVal = null;
+
+ Connection connection = null;
+
+ try {
+ String sql = "select ID from bpm_task" +
+ " where instanceid = " + instanceID.getID();
+ if (status != Task.TASK_ALL) {
+ sql += " and status = " + status;
+ }
+
+ connection = getConnection();
+
+ Statement statement = connection.createStatement();
+ ResultSet result = statement.executeQuery( sql );
+
+ retVal = new ArrayList();
+ while( result.next() ) {
+ retVal.add( getTaskByID( new TaskID(
+ result.getInt( "ID" ) ) ) );
+ }
+ } catch( SQLException e ) {
+ throw new RuntimeException( e );
+ }
+ finally {
+ if (connection != null) {
+ try {
+ connection.close();
+ }
+ catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return retVal;
+ }
+
+ public int setTaskStatusForInstance(InstanceID instanceID, int oldStatus, int newStatus) {
+ Connection connection = null;
+
+ try {
+ String sql = "update bpm_task set status = " + newStatus + " where instanceid = " + instanceID.getID();
+ if (oldStatus != Task.TASK_ALL) {
+ sql += " and status = " + oldStatus;
+ }
+
+ connection = getConnection();
+
+ Statement statement = connection.createStatement();
+
+ int rows = statement.executeUpdate(sql);
+ statement.close();
+
+ return rows;
+ } catch( SQLException e ) {
+ throw new RuntimeException( e );
+ }
+ finally {
+ if (connection != null) {
+ try {
+ connection.close();
+ }
+ catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
public List getTasksForGroups(GroupID[] groupIDs, int status) {
List retVal = new ArrayList();
@@ -748,8 +821,12 @@
}
buffer.append(Integer.toString(groupID.getID()));
}
- buffer.append(") and status = ");
- buffer.append(Integer.toString(status));
+ buffer.append(")");
+ if (status != Task.TASK_ALL) {
+ buffer.append(" and status = ");
+ buffer.append(Integer.toString(status));
+ }
+
String sql = buffer.toString();
System.out.println("Evaluating sql: " + sql);
Modified: incubator/agila/trunk/src/java/org/apache/agila/util/XMLUtil.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/java/org/apache/agila/util/XMLUtil.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/java/org/apache/agila/util/XMLUtil.java (original)
+++ incubator/agila/trunk/src/java/org/apache/agila/util/XMLUtil.java Mon Feb 14 06:02:02 2005
@@ -26,6 +26,7 @@
import org.apache.agila.model.NodeID;
import org.apache.agila.impl.BusinessProcessImpl;
+import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.io.SAXReader;
import org.dom4j.Document;
import org.dom4j.DocumentException;
@@ -37,6 +38,7 @@
import java.io.Reader;
import java.util.List;
import java.util.Iterator;
+import java.lang.reflect.InvocationTargetException;
/**
* Utility class for converting workflow XML to objects
@@ -164,6 +166,8 @@
*/
String classname = node.attribute("class").getValue();
+
+ // TODO may wish to also use the Thread context class loader
Node n = (Node) Class.forName(classname).newInstance();
n.setNodeId(new NodeID(Integer.parseInt(node.attribute("id").getValue())));
@@ -175,12 +179,33 @@
n.setDisplayName(node.attribute("display_name").getValue());
/*
- * get and actors
+ * set node properties
+ */
+
+ List properties = node.selectNodes("property");
+
+ Iterator it = properties.iterator();
+
+ while(it.hasNext()) {
+
+ Element property = (Element) it.next();
+
+ String name = property.attributeValue("name");
+ String value = property.attributeValue("value");
+ if (value == null || value.equals("")) {
+ value = property.getText();
+ }
+
+ setProperty(n, name, value);
+ }
+
+ /*
+ * get actors
*/
List actors = node.selectNodes("actors/actor");
- Iterator it = actors.iterator();
+ it = actors.iterator();
while(it.hasNext()) {
@@ -219,6 +244,18 @@
}
graph.addNode(n);
+ }
+
+ /**
+ * Sets the JavaBean property on the given node from the given name and value
+ */
+ protected static void setProperty(Node node, String name, String value) {
+ try {
+ BeanUtils.setProperty(node, name, value);
+ }
+ catch (Exception e) {
+ throw new RuntimeException("Could not set property: " + name + " on node: " + node + " due to: " + e, e);
+ }
}
private static String getValueOfAttribute(String name, Element node) {
Modified: incubator/agila/trunk/src/resources/LeaveApplication.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/resources/LeaveApplication.xml?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/resources/LeaveApplication.xml (original)
+++ incubator/agila/trunk/src/resources/LeaveApplication.xml Mon Feb 14 06:02:02 2005
@@ -14,6 +14,10 @@
</node>
<node id="3" type="activity" class="org.apache.agila.example.LeaveApplicationTask" display_name="Leave Application">
+ <!-- some example task properties to test out the XML marshalling -->
+ <property name="foo" value="hello"/>
+ <property name="bar">123</property>
+
<actors>
<actor name="Self"/>
</actors>
Modified: incubator/agila/trunk/src/test/org/apache/agila/LeaveApplication.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/test/org/apache/agila/LeaveApplication.xml?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/test/org/apache/agila/LeaveApplication.xml (original)
+++ incubator/agila/trunk/src/test/org/apache/agila/LeaveApplication.xml Mon Feb 14 06:02:02 2005
@@ -33,6 +33,10 @@
</node>
<node id="3" type="activity" class="org.apache.agila.example.LeaveApplicationTask" display_name="Leave Application">
+ <!-- some example task properties to test out the XML marshalling -->
+ <property name="foo" value="hello"/>
+ <property name="bar">123</property>
+
<actors>
<actor name="Self"/>
</actors>
Modified: incubator/agila/trunk/src/test/org/apache/agila/services/TaskServiceTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/test/org/apache/agila/services/TaskServiceTestCase.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/test/org/apache/agila/services/TaskServiceTestCase.java (original)
+++ incubator/agila/trunk/src/test/org/apache/agila/services/TaskServiceTestCase.java Mon Feb 14 06:02:02 2005
@@ -80,6 +80,18 @@
assertEquals( "Task ID should not change after update.", taskID1, taskID2 );
}
+
+ // lets find the tasks for a workflow instance
+ InstanceID instanceID = new InstanceID(1);
+ taskList = taskService.getTasksForInstance(instanceID, Task.TASK_ALL);
+ assertNotNull("Should have found a list");
+
+ taskList = taskService.getTasksForInstance(instanceID, Task.TASK_COMPLETE);
+ assertNotNull("Should have found a list");
+
+ // lets cancel all oustanding tasks
+ taskService.setTaskStatusForInstance(instanceID, Task.TASK_ALL, Task.TASK_INCOMPLETE);
+ taskService.setTaskStatusForInstance(instanceID, Task.TASK_INCOMPLETE, Task.TASK_COMPLETE);
}
public void setUp() throws Exception {
Modified: incubator/agila/trunk/src/test/org/apache/agila/util/XMLUtilTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/src/test/org/apache/agila/util/XMLUtilTestCase.java?view=diff&r1=153791&r2=153792
==============================================================================
--- incubator/agila/trunk/src/test/org/apache/agila/util/XMLUtilTestCase.java (original)
+++ incubator/agila/trunk/src/test/org/apache/agila/util/XMLUtilTestCase.java Mon Feb 14 06:02:02 2005
@@ -20,6 +20,9 @@
import org.apache.agila.model.BusinessProcess;
import org.apache.agila.model.Variable;
+import org.apache.agila.model.NodeID;
+import org.apache.agila.model.Node;
+import org.apache.agila.example.LeaveApplicationTask;
import org.dom4j.Document;
import org.dom4j.DocumentException;
@@ -70,6 +73,15 @@
public void testRequiredVariables() {
assertTrue( getRequiredVariables() == 1 );
+ }
+
+ public void testPropertiesSet() {
+ Node node = businessProcess.getNode(new NodeID(3));
+ assertTrue("Not found node!", node instanceof LeaveApplicationTask);
+
+ LeaveApplicationTask task = (LeaveApplicationTask) node;
+ assertEquals("foo property", "hello", task.getFoo());
+ assertEquals("bar property", 123, task.getBar());
}
private int getRequiredVariables() {