[jboss-svn-commits] JBL Code SVN: r24980 - in labs/jbossrules/trunk/drools-process/drools-process-task: src/main/java/org/drools/process/workitem/wsht and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jan 28 12:41:28 EST 2009


Author: salaboy21
Date: 2009-01-28 12:41:27 -0500 (Wed, 28 Jan 2009)
New Revision: 24980

Added:
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnAllSubTasksEndParentEndStrategy.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnParentAbortAllSubTasksEndStrategy.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategy.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategyFactory.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/InternalTaskEventListener.java
Modified:
   labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServiceSession.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/orm.xml
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/wsht/WSHumanTaskHandlerTest.java
Log:
JBRULES-1900: Task parent/child relationships support
- Closing the issue, tests working with SubTasksStrategy extensible

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml	2009-01-28 17:41:27 UTC (rev 24980)
@@ -11,7 +11,20 @@
   <artifactId>drools-process-task</artifactId>
   <packaging>jar</packaging>
   <name>Drools :: Process :: Task</name> 
-    
+
+   <!--build>
+     <plugins>
+         <plugin>
+             <groupId>org.apache.maven.plugins</groupId>
+             <artifactId>maven-surefire-plugin</artifactId>
+             <version>2.3</version>
+             <configuration>
+               <argLine>-Xdebug -Djava.compiler=none -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,address=${jpda.address}</argLine>
+             </configuration>
+         </plugin>
+     </plugins>
+ </build-->
+
       <dependencies>
             
     	<dependency>

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -22,8 +22,11 @@
 import org.drools.task.AccessType;
 import org.drools.task.Content;
 import org.drools.task.I18NText;
+import org.drools.task.OnParentAbortAllSubTasksEndStrategy;
 import org.drools.task.OrganizationalEntity;
 import org.drools.task.PeopleAssignments;
+import org.drools.task.SubTasksStrategy;
+import org.drools.task.SubTasksStrategyFactory;
 import org.drools.task.Task;
 import org.drools.task.TaskData;
 import org.drools.task.User;
@@ -95,7 +98,23 @@
 		TaskData taskData = new TaskData();
 		taskData.setWorkItemId(workItem.getId());
 		taskData.setSkipable(!"false".equals(workItem.getParameter("Skippable")));
-		task.setTaskData(taskData);
+        //Sub Task Data
+        Long parentId = (Long) workItem.getParameter("ParentId");
+        if(parentId != null){
+            taskData.setParentId(parentId);
+        }
+
+        String subTaskStrategiesCommaSeparated = (String) workItem.getParameter("SubTaskStrategies");
+        if(subTaskStrategiesCommaSeparated!= null && !subTaskStrategiesCommaSeparated.equals("")){
+            String[] subTaskStrategies =  subTaskStrategiesCommaSeparated.split(",");
+            List<SubTasksStrategy> strategies = new ArrayList<SubTasksStrategy>();
+            for(String subTaskStrategyString : subTaskStrategies){
+                SubTasksStrategy subTaskStrategy = SubTasksStrategyFactory.newStrategy(subTaskStrategyString);
+                strategies.add(subTaskStrategy);
+            }
+            task.setSubTaskStrategies(strategies);
+        }
+
 		String actorId = (String) workItem.getParameter("ActorId");
 		if (actorId != null) {
 			PeopleAssignments assignments = new PeopleAssignments();
@@ -106,13 +125,20 @@
 				user.setId(id.trim());
 				potentialOwners.add(user);
 			}
+            //Set the first user as creator ID??? hmmm might be wrong
+            if (potentialOwners.size() > 0){
+                taskData.setCreatedBy((User)potentialOwners.get(0));
+            }
+
 			assignments.setPotentialOwners(potentialOwners);
 			List<OrganizationalEntity> businessAdministrators = new ArrayList<OrganizationalEntity>();
 			businessAdministrators.add(new User("Administrator"));
 			assignments.setBusinessAdministrators(businessAdministrators);
 			task.setPeopleAssignments(assignments);
 		}
-		
+
+		task.setTaskData(taskData);
+
 		ContentData content = null;
 		Object contentObject = workItem.getParameter("Content");
 		if (contentObject != null) {

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnAllSubTasksEndParentEndStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnAllSubTasksEndParentEndStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnAllSubTasksEndParentEndStrategy.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -0,0 +1,53 @@
+/*
+ *  Copyright 2009 salaboy.
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.task;
+
+import java.util.List;
+import javax.persistence.Entity;
+import org.drools.task.event.InternalTaskEventListener;
+import org.drools.task.query.TaskSummary;
+import org.drools.task.service.TaskService;
+import org.drools.task.service.TaskServiceSession;
+
+/**
+ *
+ * @author salaboy
+ */
+ at Entity
+public class OnAllSubTasksEndParentEndStrategy  extends SubTasksStrategy {
+
+     public OnAllSubTasksEndParentEndStrategy() {
+    }
+
+    public OnAllSubTasksEndParentEndStrategy(String name) {
+        this.setName(name);
+    }
+
+     public void execute(TaskServiceSession taskServiceSession, TaskService service, Task parentTask) {
+       
+       List<TaskSummary> subTasks = taskServiceSession.getSubTasksByParent(parentTask.getId(), "en-UK");
+
+            if (subTasks.size() == 0) {
+                // trigger event support
+                service.addEventListener(new InternalTaskEventListener(taskServiceSession));
+
+                service.getEventSupport().fireTaskCompleted( parentTask.getId(),
+                                                                parentTask.getTaskData().getActualOwner().getId() );
+            }
+    }
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnParentAbortAllSubTasksEndStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnParentAbortAllSubTasksEndStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/OnParentAbortAllSubTasksEndStrategy.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -0,0 +1,56 @@
+/*
+ *  Copyright 2009 salaboy.
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.task;
+
+import java.util.List;
+import javax.persistence.Entity;
+import org.drools.task.event.InternalTaskEventListener;
+import org.drools.task.query.TaskSummary;
+import org.drools.task.service.TaskService;
+import org.drools.task.service.TaskServiceSession;
+
+/**
+ *
+ * @author salaboy
+ */
+ at Entity
+public class OnParentAbortAllSubTasksEndStrategy extends SubTasksStrategy {
+
+    public OnParentAbortAllSubTasksEndStrategy(){}
+
+    public OnParentAbortAllSubTasksEndStrategy(String name) {
+        this.setName(name);
+    }
+
+
+
+    public void execute(TaskServiceSession taskServiceSession, TaskService service, Task task) {
+        
+        List<TaskSummary> subTasks = taskServiceSession.getSubTasksByParent(task.getId(), "en-UK");
+            for(TaskSummary taskSummary : subTasks){
+                Task subTask = taskServiceSession.getTask(taskSummary.getId());
+                service.addEventListener(new InternalTaskEventListener(taskServiceSession));
+
+                service.getEventSupport().fireTaskCompleted( subTask.getId(),
+                                                                subTask.getTaskData().getActualOwner().getId() );
+            }
+    }
+
+   
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategy.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -0,0 +1,88 @@
+/*
+ *  Copyright 2009 salaboy.
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.task;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import org.drools.task.service.TaskService;
+import org.drools.task.service.TaskServiceSession;
+
+/**
+ *
+ * @author salaboy
+ */
+
+ at Entity
+ at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING, name="DTYPE",length=100)
+public abstract class SubTasksStrategy implements Externalizable {
+    @Id @GeneratedValue(strategy = GenerationType.AUTO)
+    private long id;
+    private String name;
+
+    public abstract void execute(TaskServiceSession taskServiceSession, TaskService service, Task task);
+
+     /**
+     * @return the id
+     */
+    public long getId() {
+        return id;
+    }
+
+    /**
+     * @param id the id to set
+     */
+    public void setId(long id) {
+        this.id = id;
+    }
+
+     public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeLong( id );
+        out.writeUTF( name );
+     }
+      public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        id = in.readLong();
+        name = in.readUTF();
+      }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategyFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategyFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/SubTasksStrategyFactory.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -0,0 +1,47 @@
+/*
+ *  Copyright 2009 salaboy.
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.task;
+
+/**
+ *
+ * @author salaboy
+ */
+public  class SubTasksStrategyFactory  {
+
+    public SubTasksStrategyFactory() {
+
+    }
+    public static SubTasksStrategy newStrategy(String type){
+        if(type!= null && !type.equals("")){
+            if(type.equals("OnParentAbortAllSubTasksEnd")){
+                return new OnParentAbortAllSubTasksEndStrategy("OnParentAbortAllSubTasksEnd");
+            }
+             if(type.equals("OnAllSubTasksEndParentEnd")){
+                return new OnAllSubTasksEndParentEndStrategy("OnAllSubTasksEndParentEnd");
+            }
+        
+        }
+
+
+        return null;
+    }
+    
+
+   
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -4,12 +4,15 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Embedded;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
@@ -21,11 +24,11 @@
 @Entity
 public class Task implements Externalizable {
     /**
-     * WSHT uses a name for the unique identifier, for now we use a generated ID which is also the key, which can be 
+     * WSHT uses a name for the unique identifier, for now we use a generated ID which is also the key, which can be
      * mapped to the name or a unique name field added later.
      */
     @Id
-    @GeneratedValue(strategy = GenerationType.AUTO)        
+    @GeneratedValue(strategy = GenerationType.AUTO)
     private long                 id;
 
     /**
@@ -33,103 +36,123 @@
      * default value is 0.
      */
     private int                  priority;
-    
+
     @OneToMany(cascade = CascadeType.ALL)
-    @JoinColumn(name = "Task_Names_Id", nullable = true)    
+    @JoinColumn(name = "Task_Names_Id", nullable = true)
     private List<I18NText> names        = Collections.emptyList();
-    
+
     @OneToMany(cascade = CascadeType.ALL)
-    @JoinColumn(name = "Task_Subjects_Id", nullable = true)    
+    @JoinColumn(name = "Task_Subjects_Id", nullable = true)
     private List<I18NText> subjects     = Collections.emptyList();
-    
+
     @OneToMany(cascade = CascadeType.ALL)
     @JoinColumn(name = "Task_Descriptions_Id", nullable = true)
-    private List<I18NText> descriptions = Collections.emptyList();      
-    
+    private List<I18NText> descriptions = Collections.emptyList();
 
+
     @Embedded
-    private PeopleAssignments    peopleAssignments;        
+    private PeopleAssignments    peopleAssignments;
 
-    @Embedded    
+    @Embedded
     private Delegation           delegation;
 
     @Embedded
-    private TaskData             taskData;   
-    
-    @Embedded 
+    private TaskData             taskData;
+
+    @Embedded
     private Deadlines            deadlines;
-    
+
+    @OneToMany(cascade = CascadeType.ALL)
+    @JoinColumn(name = "Task_Id", nullable = true)
+    private List<SubTasksStrategy> subTaskStrategies = Collections.emptyList();
+
     public Task() {
     }
-    
+
     public void writeExternal(ObjectOutput out) throws IOException {
         out.writeLong( id );
         out.writeInt( priority );
-        
+
         CollectionUtils.writeI18NTextList( names, out );
         CollectionUtils.writeI18NTextList( subjects, out );
         CollectionUtils.writeI18NTextList( descriptions, out );
-        
+
         if ( peopleAssignments != null ) {
             out.writeBoolean( true );
             peopleAssignments.writeExternal( out );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( delegation != null ) {
             out.writeBoolean( true );
             delegation.writeExternal( out );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( taskData != null ) {
             out.writeBoolean( true );
             taskData.writeExternal( out );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( deadlines != null ) {
             out.writeBoolean( true );
             deadlines.writeExternal( out );
         } else {
             out.writeBoolean( false );
         }
-        
-    } 
-    
+
+        out.writeInt( subTaskStrategies.size() );
+        for( SubTasksStrategy strategy : subTaskStrategies ) {
+            out.writeUTF(strategy.getName());
+            strategy.writeExternal( out );
+        }
+    }
+
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
         id = in.readLong();
         priority = in.readInt();
-        
+
         names = CollectionUtils.readI18NTextList( in );
         subjects = CollectionUtils.readI18NTextList( in );
         descriptions = CollectionUtils.readI18NTextList( in );
-        
+
         if ( in.readBoolean() ) {
             peopleAssignments = new PeopleAssignments();
             peopleAssignments.readExternal( in );
         }
-        
+
         if ( in.readBoolean() ) {
             delegation = new Delegation();
             delegation.readExternal( in );
         }
-        
+
         if ( in.readBoolean() ) {
             taskData = new TaskData();
             taskData.readExternal( in );
         }
-        
+
         if ( in.readBoolean() ) {
             deadlines = new Deadlines();
             deadlines.readExternal( in );
         }
-    }    
 
+        int size = in.readInt();
+        List<SubTasksStrategy> list = new ArrayList<SubTasksStrategy>(size);
+        for ( int i = 0; i < size; i++ ) {
+            String name = in.readUTF();
+            SubTasksStrategy strategy = SubTasksStrategyFactory.newStrategy(name) ;
+            strategy.readExternal( in );
+            list.add( strategy );
+        }
+       subTaskStrategies = list;
+
+    }
+
     public Long getId() {
         return id;
     }
@@ -145,7 +168,7 @@
     public void setPriority(int priority) {
         this.priority = priority;
     }
-    
+
     public List<I18NText> getNames() {
         return names;
     }
@@ -161,14 +184,14 @@
     public void setSubjects(List<I18NText> subjects) {
         this.subjects = subjects;
     }
-    
+
     public List<I18NText> getDescriptions() {
         return descriptions;
-    }    
+    }
 
     public void setDescriptions(List<I18NText> descriptions) {
         this.descriptions = descriptions;
-    }    
+    }
 
     public PeopleAssignments getPeopleAssignments() {
         return peopleAssignments;
@@ -206,14 +229,14 @@
     public int hashCode() {
         final int prime = 31;
         int result = 1;
-        result = prime * result + priority;        
+        result = prime * result + priority;
         result = prime * result + CollectionUtils.hashCode( descriptions );
         result = prime * result + CollectionUtils.hashCode( names );
-        result = prime * result + CollectionUtils.hashCode( subjects );        
+        result = prime * result + CollectionUtils.hashCode( subjects );
         result = prime * result + ((peopleAssignments == null) ? 0 : peopleAssignments.hashCode());
         result = prime * result + ((delegation == null) ? 0 : delegation.hashCode());
         result = prime * result + ((taskData == null) ? 0 : taskData.hashCode());
-        result = prime * result + ((deadlines == null) ? 0 : deadlines.hashCode());        
+        result = prime * result + ((deadlines == null) ? 0 : deadlines.hashCode());
         return result;
     }
 
@@ -225,7 +248,7 @@
         Task other = (Task) obj;
         if ( deadlines == null ) {
             if ( other.deadlines != null ) {
-                
+
             }
         } else if ( !deadlines.equals( other.deadlines ) ) return false;
         if ( delegation == null ) {
@@ -233,8 +256,8 @@
         } else if ( !delegation.equals( other.delegation ) ) return false;
         if ( peopleAssignments == null ) {
             if ( other.peopleAssignments != null ) return false;
-        } else if ( !peopleAssignments.equals( other.peopleAssignments ) ) return false;       
-        
+        } else if ( !peopleAssignments.equals( other.peopleAssignments ) ) return false;
+
         if ( priority != other.priority ) return false;
         if ( taskData == null ) {
             if ( other.taskData != null ) return false;
@@ -242,5 +265,21 @@
         return ( CollectionUtils.equals( descriptions, other.descriptions ) && CollectionUtils.equals( names, other.names )
         && CollectionUtils.equals( subjects, other.subjects ));
     }
-               
+
+    /**
+     * @return the subTaskStrategies
+     */
+    public List<SubTasksStrategy> getSubTaskStrategies() {
+        return subTaskStrategies;
+    }
+
+    /**
+     * @param subTaskStrategies the subTaskStrategies to set
+     */
+    public void setSubTaskStrategies(List<SubTasksStrategy> subTaskStrategies) {
+        this.subTaskStrategies = subTaskStrategies;
+    }
+
+   
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -24,7 +24,7 @@
     Externalizable {
     @Enumerated(EnumType.STRING)
     private Status           status      = Status.Created;         // initial default state
-    
+
     private Status           previousStatus = null;
 
     @ManyToOne()
@@ -40,9 +40,9 @@
     private Date             expirationTime;
 
     private boolean          skipable;
-    
+
     private long             workItemId = -1;
-    
+
     private AccessType       documentAccessType;
 
     private String           documentType;
@@ -54,7 +54,7 @@
     private String           outputType;
 
     private long             outputContentId = -1;
-    
+
     private String 	         faultName;
 
     private AccessType       faultAccessType;
@@ -62,7 +62,9 @@
     private String           faultType;
 
     private long             faultContentId = -1;
-    
+
+    private long             parentId = -1;
+
     @OneToMany(cascade = CascadeType.ALL)
     @JoinColumn(name = "TaskData_Comments_Id", nullable = true)
     private List<Comment>    comments    = Collections.emptyList();
@@ -78,13 +80,13 @@
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( previousStatus != null ) {
             out.writeBoolean( true );
             out.writeUTF( previousStatus.toString() );
         } else {
             out.writeBoolean( false );
-        }        
+        }
 
         if ( actualOwner != null ) {
             out.writeBoolean( true );
@@ -120,86 +122,93 @@
         } else {
             out.writeBoolean( false );
         }
-        
+
         out.writeBoolean( skipable );
-        
+
         if ( workItemId != -1 ) {
             out.writeBoolean( true );
             out.writeLong( workItemId );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( documentAccessType != null ) {
             out.writeBoolean( true );
             out.writeObject( documentAccessType );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( documentType != null ) {
             out.writeBoolean( true );
             out.writeUTF( documentType );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( documentContentId != -1 ) {
             out.writeBoolean( true );
             out.writeLong( documentContentId );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( outputAccessType != null ) {
             out.writeBoolean( true );
             out.writeObject( outputAccessType );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( outputType != null ) {
             out.writeBoolean( true );
             out.writeUTF( outputType );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( outputContentId != -1 ) {
             out.writeBoolean( true );
             out.writeLong( outputContentId );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( faultName != null ) {
             out.writeBoolean( true );
             out.writeUTF( faultName );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( faultAccessType != null ) {
             out.writeBoolean( true );
             out.writeObject( faultAccessType );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( faultType != null ) {
             out.writeBoolean( true );
             out.writeUTF( faultType );
         } else {
             out.writeBoolean( false );
         }
-        
+
         if ( faultContentId != -1 ) {
             out.writeBoolean( true );
             out.writeLong( faultContentId );
         } else {
             out.writeBoolean( false );
         }
-        
+
+        if ( parentId != -1 ) {
+            out.writeBoolean( true );
+            out.writeLong( parentId );
+        } else {
+            out.writeBoolean( false );
+        }
+
         CollectionUtils.writeCommentList( comments,
                                           out );
         CollectionUtils.writeAttachmentList( attachments,
@@ -211,7 +220,7 @@
         if ( in.readBoolean() ) {
             status = Status.valueOf( in.readUTF() );
         }
-        
+
         if ( in.readBoolean() ) {
             previousStatus = Status.valueOf( in.readUTF() );
         }
@@ -243,7 +252,7 @@
         if ( in.readBoolean() ) {
             workItemId = in.readLong();
         }
-        
+
         if ( in.readBoolean() ) {
             documentAccessType = (AccessType) in.readObject();
         }
@@ -251,11 +260,11 @@
         if ( in.readBoolean() ) {
             documentType = in.readUTF();
         }
-        
+
         if ( in.readBoolean() ) {
             documentContentId = in.readLong();
         }
-        
+
         if ( in.readBoolean() ) {
             outputAccessType = (AccessType) in.readObject();
         }
@@ -263,15 +272,15 @@
         if ( in.readBoolean() ) {
             outputType = in.readUTF();
         }
-        
+
         if ( in.readBoolean() ) {
             outputContentId = in.readLong();
         }
-        
+
         if ( in.readBoolean() ) {
             faultName = in.readUTF();
         }
-        
+
         if ( in.readBoolean() ) {
             faultAccessType = (AccessType) in.readObject();
         }
@@ -279,11 +288,14 @@
         if ( in.readBoolean() ) {
             faultType = in.readUTF();
         }
-        
+
         if ( in.readBoolean() ) {
             faultContentId = in.readLong();
         }
-        
+
+        if ( in.readBoolean() ) {
+            parentId = in.readLong();
+        }
         comments = CollectionUtils.readCommentList( in );
         attachments = CollectionUtils.readAttachmentList( in );
 
@@ -296,7 +308,7 @@
     public void setStatus(Status status) {
         previousStatus = this.status;
         this.status = status;
-    }        
+    }
 
     public Status getPreviousStatus() {
         return previousStatus;
@@ -353,15 +365,15 @@
     public void setSkipable(boolean isSkipable) {
         this.skipable = isSkipable;
     }
-    
+
     public void setWorkItemId(long workItemId) {
     	this.workItemId = workItemId;
     }
-    
+
     public long getWorkItemId() {
     	return workItemId;
     }
-             
+
     public AccessType getDocumentAccessType() {
         return documentAccessType;
     }
@@ -372,7 +384,7 @@
 
     public String getDocumentType() {
         return documentType;
-    }        
+    }
 
     public long getDocumentContentId() {
         return documentContentId;
@@ -458,6 +470,14 @@
         this.attachments = attachments;
     }
 
+    public long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(long parentId) {
+        this.parentId = parentId;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -471,6 +491,7 @@
         result = prime * result + ((status == null) ? 0 : status.hashCode());
         result = prime * result + ((previousStatus == null) ? 0 : previousStatus.hashCode());
         result = prime * result + ((workItemId == -1) ? 0 : (int) workItemId);
+        //Should I add parentId to this hashCode?
         return result;
     }
 
@@ -506,22 +527,24 @@
         } else if ( !status.equals( other.status ) ) return false;
         if ( previousStatus == null ) {
             if ( other.previousStatus != null ) return false;
-        } else if ( !previousStatus.equals( other.previousStatus ) ) return false;        
+        } else if ( !previousStatus.equals( other.previousStatus ) ) return false;
         if ( activationTime == null ) {
             if ( other.activationTime != null ) return false;
         } else if ( activationTime.getTime() != other.activationTime.getTime() ) return false;
-                
+
         if ( workItemId != other.workItemId ) return false;
-        
+
         if ( documentAccessType == null ) {
             if ( other.documentAccessType != null ) return false;
         } else if ( !documentAccessType.equals( other.documentAccessType ) ) return false;
-        
+
         if ( documentContentId != other.documentContentId ) return false;
         if ( documentType == null ) {
             if ( other.documentType != null ) return false;
-        } else if ( !documentType.equals( other.documentType ) ) return false;                
-        
+        } else if ( !documentType.equals( other.documentType ) ) return false;
+        // I think this is OK!
+        if ( parentId != other.parentId ) return false;
+
         return CollectionUtils.equals( attachments,
                                        other.attachments ) && CollectionUtils.equals( comments,
                                                                                       other.comments );

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/InternalTaskEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/InternalTaskEventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/InternalTaskEventListener.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -0,0 +1,63 @@
+/*
+ *  Copyright 2009 salaboy.
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.task.event;
+
+
+import javax.persistence.EntityManager;
+import org.drools.task.Status;
+import org.drools.task.Task;
+import org.drools.task.service.Operation;
+import org.drools.task.service.TaskServiceSession;
+
+/**
+ *
+ * @author salaboy
+ */
+public class InternalTaskEventListener extends DefaultTaskEventListener{
+    private TaskServiceSession session;
+    private EntityManager em;
+    public InternalTaskEventListener(TaskServiceSession session){
+        this.session = session;
+        this.em = session.getEntityManager();
+    }
+
+    @Override
+    public void taskClaimed(TaskClaimedEvent event) {
+    }
+
+    @Override
+    public void taskCompleted(TaskCompletedEvent event) {
+
+        if(! em.getTransaction().isActive()){
+            em.getTransaction().begin();
+        }
+        Task task = session.getTask(event.getTaskId());
+        task.getTaskData().setStatus(Status.Completed);
+        em.persist(task);
+        em.getTransaction().commit();
+        
+    }
+
+    @Override
+	public void taskFailed(TaskFailedEvent event) {
+	}
+
+    @Override
+	public void taskSkipped(TaskSkippedEvent event) {
+	}
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -63,6 +63,8 @@
     QueryTasksAssignedAsBusinessAdministrator,
     QueryTasksAssignedAsExcludedOwner,
     QueryTasksAssignedAsPotentialOwner,
+    QuerySubTasksAssignedAsPotentialOwner,
+    QueryGetSubTasksByParentTaskId,
     QueryTasksAssignedAsRecipient,
     QueryTasksAssignedAsTaskInitiator,
     QueryTasksAssignedAsTaskStakeholder,    

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -409,6 +409,33 @@
         session.write( cmd );
     }
 
+
+    public void getSubTasksAssignedAsPotentialOwner(long parentId, String userId,
+                                                 String language,
+                                                 TaskSummaryResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>( 2 );
+        args.add( parentId );
+        args.add( userId );
+        args.add( language );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QuerySubTasksAssignedAsPotentialOwner,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
+        session.write( cmd );
+    }
+    public void getSubTasksByParent(long parentId, TaskSummaryResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>( 2 );
+        args.add( parentId );
+        //@TODO: un hard code this
+        args.add( "en-UK" );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryGetSubTasksByParentTaskId,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
+        session.write( cmd );
+    }
     public void getTasksAssignedAsRecipient(String userId,
                                             String language,
                                             TaskSummaryResponseHandler responseHandler) {

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -227,6 +227,33 @@
                     session.write( resultsCmnd );
                     break;
                 }
+                case QuerySubTasksAssignedAsPotentialOwner : {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getSubTasksAssignedAsPotentialOwner( (Long) cmd.getArguments().get( 0 ),
+                                                                                                 (String) cmd.getArguments().get( 1 ),
+                                                                                                 (String) cmd.getArguments().get( 2 ) );
+                    List args = new ArrayList( 1 );
+                    args.add( results );
+                    Command resultsCmnd = new Command( cmd.getId(),
+                                                       CommandName.QueryTaskSummaryResponse,
+                                                       args );
+                    session.write( resultsCmnd );
+                    break;
+                }
+                case QueryGetSubTasksByParentTaskId : {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getSubTasksByParent((Long) cmd.getArguments().get( 0 ),
+                                                                                (String) cmd.getArguments().get( 1 ));
+                    List args = new ArrayList( 1 );
+                    args.add( results );
+                    Command resultsCmnd = new Command( cmd.getId(),
+                                                       CommandName.QueryTaskSummaryResponse,
+                                                       args );
+                    session.write( resultsCmnd );
+                    break;
+                }
+
+
                 case QueryTasksAssignedAsTaskInitiator : {
                     response = CommandName.QueryTaskSummaryResponse;
                     List<TaskSummary> results = taskSession.getTasksAssignedAsTaskInitiator( (String) cmd.getArguments().get( 0 ),

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServiceSession.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServiceSession.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServiceSession.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -15,6 +15,7 @@
 
 import org.drools.RuleBase;
 import org.drools.StatefulSession;
+import org.drools.eventmessaging.EventKeys;
 import org.drools.task.Attachment;
 import org.drools.task.Comment;
 import org.drools.task.Content;
@@ -23,6 +24,7 @@
 import org.drools.task.OrganizationalEntity;
 import org.drools.task.PeopleAssignments;
 import org.drools.task.Status;
+import org.drools.task.SubTasksStrategy;
 import org.drools.task.Task;
 import org.drools.task.TaskData;
 import org.drools.task.User;
@@ -36,6 +38,7 @@
     private EntityManager em;
     private Map<String, RuleBase> ruleBases;  
     private Map<String, Map<String, Object>> globals;  
+    private EventKeys eventKeys;
 
     public TaskServiceSession(TaskService service,
                               EntityManager em) {
@@ -361,7 +364,9 @@
                                     targetEntityId );
         }
         
+        if(! em.getTransaction().isActive()){
         em.getTransaction().begin();
+        }
         TaskError error = null;
         try {
             Map<Operation, List<OperationCommand>> dsl = service.getOperations();
@@ -401,6 +406,7 @@
                 	// trigger event support
                     service.getEventSupport().fireTaskCompleted( task.getId(),
                                                                  task.getTaskData().getActualOwner().getId() );
+                    checkSubTaskStrategy(task);
                     break;
                 }
                 
@@ -427,6 +433,7 @@
                     // trigger event support
                     service.getEventSupport().fireTaskSkipped( task.getId(),
                                                                userId );
+                    checkSubTaskStrategy(task);
                     break;
                 }
                 
@@ -619,7 +626,30 @@
         List<TaskSummary> list = (List<TaskSummary>) tasksAssignedAsPotentialOwner.getResultList();
         return list;
     }
+    public List<TaskSummary> getSubTasksAssignedAsPotentialOwner(long parentId, String userId,
+                                                              String language) {
+        Query tasksAssignedAsPotentialOwner = em.createNamedQuery( "SubTasksAssignedAsPotentialOwner" );
+        tasksAssignedAsPotentialOwner.setParameter( "parentId",
+                                                    parentId );
+        tasksAssignedAsPotentialOwner.setParameter( "userId",
+                                                    userId );
+        tasksAssignedAsPotentialOwner.setParameter( "language",
+                                                    language );
+        List<TaskSummary> list = (List<TaskSummary>) tasksAssignedAsPotentialOwner.getResultList();
+        return list;
+    }
+    public List<TaskSummary> getSubTasksByParent(long parentId, String language) {
+        Query subTaskByParent = em.createNamedQuery( "GetSubTasksByParentTaskId" );
+        subTaskByParent.setParameter( "parentId",
+                                                    parentId );
+        subTaskByParent.setParameter( "language",
+                                                    language );
 
+
+        List<TaskSummary> list = (List<TaskSummary>) subTaskByParent.getResultList();
+        return list;
+    }
+
     public List<TaskSummary> getTasksAssignedAsRecipient(String userId,
                                                          String language) {
         Query tasksAssignedAsRecipient = em.createNamedQuery( "TasksAssignedAsRecipient" );
@@ -684,4 +714,19 @@
         }
         return sb.toString();
     }
+
+    private void checkSubTaskStrategy(Task task){
+        if(task != null){
+            for(SubTasksStrategy strategy : task.getSubTaskStrategies()){
+                strategy.execute(this, service, task);
+            }
+        }
+        Task parentTask = null;
+        if(task.getTaskData().getParentId() != -1){
+            parentTask = getTask(task.getTaskData().getParentId());
+            for(SubTasksStrategy strategy : parentTask.getSubTaskStrategies()){
+                strategy.execute(this, service, parentTask);
+            }
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/orm.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/orm.xml	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/orm.xml	2009-01-28 17:41:27 UTC (rev 24980)
@@ -123,6 +123,90 @@
           </query>
           <!-- hint name="org.hibernate.timeout" value="200"/ -->
       </named-query>
+      <named-query name="SubTasksAssignedAsPotentialOwner">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy left join t.taskData.actualOwner,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity potentialOwners
+where
+    t.taskData.parentId = :parentId and
+    potentialOwners.id = :userId and
+    potentialOwners in elements ( t.peopleAssignments.potentialOwners  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    subjects.language = :language and
+    subjects in elements( t.subjects) and
+
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions) and
+
+    t.taskData.status in ('Created', 'Ready', 'Reserved', 'InProgress', 'Suspended') and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+
+<named-query name="GetSubTasksByParentTaskId">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions
+
+where
+    t.taskData.parentId = :parentId and
+    names.language = :language and
+    names in elements( t.names) and
+
+    subjects.language = :language and
+    subjects in elements( t.subjects) and
+
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions) and
+
+    t.taskData.status in ('Created', 'Ready', 'Reserved', 'InProgress', 'Suspended') and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+
+
       <named-query name="TasksAssignedAsRecipient">
           <query>
 select 

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml	2009-01-28 17:41:27 UTC (rev 24980)
@@ -1,47 +1,51 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<persistence version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
-http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence">
-    <persistence-unit name="org.drools.task">
-        <provider>org.hibernate.ejb.HibernatePersistence</provider>
-        <class>org.drools.task.Attachment</class>
-        <class>org.drools.task.Content</class>        
-        <class>org.drools.task.BooleanExpression</class>        
-        <class>org.drools.task.Comment</class>
-        <class>org.drools.task.Deadline</class>
-        <class>org.drools.task.Comment</class>
-        <class>org.drools.task.Deadline</class>
-        <class>org.drools.task.Delegation</class>
-        <class>org.drools.task.Escalation</class>
-        <class>org.drools.task.Group</class>
-        <class>org.drools.task.I18NText</class>
-        <class>org.drools.task.Notification</class>
-        <class>org.drools.task.EmailNotification</class>
-        <class>org.drools.task.EmailNotificationHeader</class>
-        <class>org.drools.task.PeopleAssignments</class>
-        <class>org.drools.task.Reassignment</class>
-        <class>org.drools.task.Status</class>
-        <class>org.drools.task.Task</class>
-        <class>org.drools.task.TaskData</class>
-        <class>org.drools.task.User</class>
-        
-	    <properties>
-	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
-	        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>	        
-	        <property name="hibernate.connection.url" value="jdbc:h2:mem:mydb" />
-	        <!--  property name="hibernate.connection.url" value="jdbc:h2:file:\dev\drools\trunk7\drools-process\drools-process-task\mydb"/ -->
-	        
-<!--			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>-->
-<!--	        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>	  	        -->
-<!--	        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/postgres"/>-->
-	        
-	        
-	        <property name="hibernate.connection.username" value="sa"/>
-	        <property name="hibernate.connection.password" value="sasa"/>	
-	        <property name="hibernate.connection.autocommit" value="false" /> 	               
-	        <property name="hibernate.max_fetch_depth" value="3"/>
-		    <property name="hibernate.hbm2ddl.auto" value="create" />
-            <property name="hibernate.show_sql" value="true" />		    
-	    </properties>        
-    </persistence-unit>
-    
-</persistence>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<persistence version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
+http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence">
+    <persistence-unit name="org.drools.task">
+        <provider>org.hibernate.ejb.HibernatePersistence</provider>
+        <class>org.drools.task.Attachment</class>
+        <class>org.drools.task.Content</class>
+        <class>org.drools.task.BooleanExpression</class>
+        <class>org.drools.task.Comment</class>
+        <class>org.drools.task.Deadline</class>
+        <class>org.drools.task.Comment</class>
+        <class>org.drools.task.Deadline</class>
+        <class>org.drools.task.Delegation</class>
+        <class>org.drools.task.Escalation</class>
+        <class>org.drools.task.Group</class>
+        <class>org.drools.task.I18NText</class>
+        <class>org.drools.task.Notification</class>
+        <class>org.drools.task.EmailNotification</class>
+        <class>org.drools.task.EmailNotificationHeader</class>
+        <class>org.drools.task.PeopleAssignments</class>
+        <class>org.drools.task.Reassignment</class>
+        <class>org.drools.task.Status</class>
+        <class>org.drools.task.Task</class>
+        <class>org.drools.task.TaskData</class>
+        <class>org.drools.task.SubTasksStrategy</class>
+        <class>org.drools.task.OnParentAbortAllSubTasksEndStrategy</class>
+        <class>org.drools.task.OnAllSubTasksEndParentEndStrategy</class>
+
+        <class>org.drools.task.User</class>
+
+	    <properties>
+	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
+	        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
+	        <property name="hibernate.connection.url" value="jdbc:h2:mem:mydb" />
+	        <!--  property name="hibernate.connection.url" value="jdbc:h2:file:\dev\drools\trunk7\drools-process\drools-process-task\mydb"/ -->
+
+<!--			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>-->
+<!--	        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>	  	        -->
+<!--	        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/postgres"/>-->
+
+
+	        <property name="hibernate.connection.username" value="sa"/>
+	        <property name="hibernate.connection.password" value="sasa"/>
+	        <property name="hibernate.connection.autocommit" value="false" />
+	        <property name="hibernate.max_fetch_depth" value="3"/>
+		    <property name="hibernate.hbm2ddl.auto" value="create" />
+            <property name="hibernate.show_sql" value="true" />
+	    </properties>
+    </persistence-unit>
+
+</persistence>

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/wsht/WSHumanTaskHandlerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/wsht/WSHumanTaskHandlerTest.java	2009-01-28 17:26:05 UTC (rev 24979)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/wsht/WSHumanTaskHandlerTest.java	2009-01-28 17:41:27 UTC (rev 24980)
@@ -2,7 +2,6 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.net.InetSocketAddress;
@@ -18,7 +17,6 @@
 import org.drools.runtime.process.WorkItemManager;
 import org.drools.task.AccessType;
 import org.drools.task.BaseTest;
-import org.drools.task.Content;
 import org.drools.task.Status;
 import org.drools.task.Task;
 import org.drools.task.query.TaskSummary;
@@ -90,7 +88,7 @@
 		System.out.println("Completing task " + task.getId());
 		operationResponseHandler = new BlockingTaskOperationResponseHandler();
 		client.complete(task.getId(), "Darth Vader", null, operationResponseHandler);
-		operationResponseHandler.waitTillDone(5000);
+		operationResponseHandler.waitTillDone(15000);
 		System.out.println("Completed task " + task.getId());
 		
 		assertTrue(manager.isCompleted());
@@ -323,7 +321,305 @@
 		assertEquals("Darth Vader", results.get("ActorId"));
 		assertEquals("This is the result", results.get("Result"));
 	}
-	
+
+    public void testOnAllSubTasksEndParentEndStrategy() throws Exception {
+
+        TestWorkItemManager manager = new TestWorkItemManager();
+        //Create the parent task
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskNameParent");
+		workItem.setParameter("Comment", "CommentParent");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+        //Set the subtask policy
+        workItem.setParameter("SubTaskStrategies", "OnAllSubTasksEndParentEnd");
+        handler.executeWorkItem(workItem, manager);
+
+
+		Thread.sleep(500);
+
+        //Test if the task is succesfully created
+		BlockingTaskSummaryResponseHandler responseHandler = new BlockingTaskSummaryResponseHandler();
+		client.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+		List<TaskSummary> tasks = responseHandler.getResults();
+		assertEquals(1, tasks.size());
+		TaskSummary task = tasks.get(0);
+		assertEquals("TaskNameParent", task.getName());
+		assertEquals(10, task.getPriority());
+		assertEquals("CommentParent", task.getDescription());
+		assertEquals(Status.Reserved, task.getStatus());
+		assertEquals("Darth Vader", task.getActualOwner().getId());
+
+
+        //Create the child task
+        workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskNameChild1");
+		workItem.setParameter("Comment", "CommentChild1");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+		handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Create the child task2
+        workItem = new WorkItemImpl();
+		workItem.setName("Human Task2");
+		workItem.setParameter("TaskName", "TaskNameChild2");
+		workItem.setParameter("Comment", "CommentChild2");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+		handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Start the parent task
+        System.out.println("Starting task " + task.getId());
+		BlockingTaskOperationResponseHandler operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.start(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Started task " + task.getId());
+
+        //Check if the parent task is InProgress
+        BlockingGetTaskResponseHandler getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( task.getId(), getTaskResponseHandler );
+        Task parentTask = getTaskResponseHandler.getTask();
+        assertEquals(  Status.InProgress, parentTask.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), parentTask.getTaskData().getActualOwner() );
+
+        //Get all the subtask created for the parent task based on the potential owner
+        responseHandler = new BlockingTaskSummaryResponseHandler();
+        client.getSubTasksAssignedAsPotentialOwner(parentTask.getId(),"Darth Vader", "en-UK", responseHandler);
+        List<TaskSummary> subTasks = responseHandler.getResults();
+        assertEquals(2, subTasks.size());
+        TaskSummary subTaskSummary1 = subTasks.get(0);
+        TaskSummary subTaskSummary2 = subTasks.get(1);
+        assertNotNull(subTaskSummary1);
+        assertNotNull(subTaskSummary2);
+
+        //Starting the sub task 1
+        System.out.println("Starting sub task " + subTaskSummary1.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.start(subTaskSummary1.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Started sub task " + subTaskSummary1.getId());
+
+        //Starting the sub task 2
+        System.out.println("Starting sub task " + subTaskSummary2.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.start(subTaskSummary2.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Started sub task " + subTaskSummary2.getId());
+
+
+
+        //Check if the child task 1 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTaskSummary1.getId(), getTaskResponseHandler );
+        Task subTask1 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.InProgress, subTask1.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask1.getTaskData().getActualOwner() );
+
+
+         //Check if the child task 2 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTaskSummary2.getId(), getTaskResponseHandler );
+        Task subTask2 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.InProgress, subTask2.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask2.getTaskData().getActualOwner() );
+
+        // Complete the child task 1
+        System.out.println("Completing sub task " + subTask1.getId());
+        operationResponseHandler = new BlockingTaskOperationResponseHandler();
+        client.complete( subTask1.getId(),"Darth Vader" , null, operationResponseHandler );
+        operationResponseHandler.waitTillDone( 5000 );
+        System.out.println("Completed sub task " + subTask1.getId());
+
+         // Complete the child task 2
+        System.out.println("Completing sub task " + subTask2.getId());
+        operationResponseHandler = new BlockingTaskOperationResponseHandler();
+        client.complete( subTask2.getId(),"Darth Vader" , null, operationResponseHandler );
+        operationResponseHandler.waitTillDone( 5000 );
+        System.out.println("Completed sub task " + subTask2.getId());
+
+
+
+         //Check if the child task 1 is Completed
+
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTask1.getId(), getTaskResponseHandler );
+        subTask1 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.Completed, subTask1.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask1.getTaskData().getActualOwner() );
+
+          //Check if the child task 2 is Completed
+
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTask2.getId(), getTaskResponseHandler );
+        subTask2 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.Completed, subTask2.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask2.getTaskData().getActualOwner() );
+
+
+
+        // Check is the parent task is Complete
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( parentTask.getId(), getTaskResponseHandler );
+        parentTask = getTaskResponseHandler.getTask();
+        assertEquals(  Status.Completed, parentTask.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), parentTask.getTaskData().getActualOwner() );
+
+
+
+
+
+        assertTrue(manager.isCompleted());
+	}
+
+        public void testOnParentAbortAllSubTasksEndStrategy() throws Exception {
+
+        TestWorkItemManager manager = new TestWorkItemManager();
+        //Create the parent task
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskNameParent");
+		workItem.setParameter("Comment", "CommentParent");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+        //Set the subtask policy
+        workItem.setParameter("SubTaskStrategies", "OnParentAbortAllSubTasksEnd");
+        handler.executeWorkItem(workItem, manager);
+
+
+		Thread.sleep(500);
+
+        //Test if the task is succesfully created
+		BlockingTaskSummaryResponseHandler responseHandler = new BlockingTaskSummaryResponseHandler();
+		client.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+		List<TaskSummary> tasks = responseHandler.getResults();
+		assertEquals(1, tasks.size());
+		TaskSummary task = tasks.get(0);
+		assertEquals("TaskNameParent", task.getName());
+		assertEquals(10, task.getPriority());
+		assertEquals("CommentParent", task.getDescription());
+		assertEquals(Status.Reserved, task.getStatus());
+		assertEquals("Darth Vader", task.getActualOwner().getId());
+
+
+        //Create the child task
+        workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskNameChild1");
+		workItem.setParameter("Comment", "CommentChild1");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+		handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Create the child task2
+        workItem = new WorkItemImpl();
+		workItem.setName("Human Task2");
+		workItem.setParameter("TaskName", "TaskNameChild2");
+		workItem.setParameter("Comment", "CommentChild2");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+		handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Start the parent task
+        System.out.println("Starting task " + task.getId());
+		BlockingTaskOperationResponseHandler operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.start(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Started task " + task.getId());
+
+        //Check if the parent task is InProgress
+        BlockingGetTaskResponseHandler getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( task.getId(), getTaskResponseHandler );
+        Task parentTask = getTaskResponseHandler.getTask();
+        assertEquals(  Status.InProgress, parentTask.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), parentTask.getTaskData().getActualOwner() );
+
+        //Get all the subtask created for the parent task based on the potential owner
+        responseHandler = new BlockingTaskSummaryResponseHandler();
+        client.getSubTasksAssignedAsPotentialOwner(parentTask.getId(),"Darth Vader", "en-UK", responseHandler);
+        List<TaskSummary> subTasks = responseHandler.getResults();
+        assertEquals(2, subTasks.size());
+        TaskSummary subTaskSummary1 = subTasks.get(0);
+        TaskSummary subTaskSummary2 = subTasks.get(1);
+        assertNotNull(subTaskSummary1);
+        assertNotNull(subTaskSummary2);
+
+        //Starting the sub task 1
+        System.out.println("Starting sub task " + subTaskSummary1.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.start(subTaskSummary1.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Started sub task " + subTaskSummary1.getId());
+
+        //Starting the sub task 2
+        System.out.println("Starting sub task " + subTaskSummary2.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.start(subTaskSummary2.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Started sub task " + subTaskSummary2.getId());
+
+
+
+        //Check if the child task 1 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTaskSummary1.getId(), getTaskResponseHandler );
+        Task subTask1 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.InProgress, subTask1.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask1.getTaskData().getActualOwner() );
+
+
+         //Check if the child task 2 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTaskSummary2.getId(), getTaskResponseHandler );
+        Task subTask2 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.InProgress, subTask2.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask2.getTaskData().getActualOwner() );
+
+        // Complete the parent task
+        System.out.println("Completing parent task " + parentTask.getId());
+        operationResponseHandler = new BlockingTaskOperationResponseHandler();
+        client.skip( parentTask.getId(), "Darth Vader", operationResponseHandler );
+        operationResponseHandler.waitTillDone( 5000 );
+        System.out.println("Completed parent task " + parentTask.getId());
+
+
+
+
+        //Check if the child task 1 is Completed
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTaskSummary1.getId(), getTaskResponseHandler );
+        subTask1 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.Completed, subTask1.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask1.getTaskData().getActualOwner() );
+
+
+         //Check if the child task 2 is Completed
+        getTaskResponseHandler = new BlockingGetTaskResponseHandler();
+        client.getTask( subTaskSummary2.getId(), getTaskResponseHandler );
+        subTask2 = getTaskResponseHandler.getTask();
+        assertEquals(  Status.Completed, subTask2.getTaskData().getStatus() );
+        assertEquals( users.get( "darth" ), subTask2.getTaskData().getActualOwner() );
+
+
+
+        assertTrue(manager.isCompleted());
+	}
+
+
+
 	private class TestWorkItemManager implements WorkItemManager  {
 		
 		private boolean completed;




More information about the jboss-svn-commits mailing list