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() {