[jboss-svn-commits] JBL Code SVN: r23094 - in labs/jbossrules/trunk: drools-process/drools-process-task and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Sep 25 18:55:36 EDT 2008


Author: KrisVerlaenen
Date: 2008-09-25 18:55:35 -0400 (Thu, 25 Sep 2008)
New Revision: 23094

Added:
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskFailedEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskSkippedEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskUserEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/wsht/
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/wsht/WSHumanTaskHandlerTest.java
Modified:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-task/src/main/java/org/drools/eclipse/task/views/TaskView.java
   labs/jbossrules/trunk/drools-process/drools-process-task/.classpath
   labs/jbossrules/trunk/drools-process/drools-process-task/.project
   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/event/DefaultTaskEventListener.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskCompletedEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.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/OperationCommand.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/org/drools/task/service/operations-dsl.mvel
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceDeadlinesTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/LoadUsers.mvel
Log:
JBRULES-1757: Add WS-HT service views to IDE
 - updated task view
 - updated WS-HT work item handler

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-task/src/main/java/org/drools/eclipse/task/views/TaskView.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-task/src/main/java/org/drools/eclipse/task/views/TaskView.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-task/src/main/java/org/drools/eclipse/task/views/TaskView.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -2,6 +2,7 @@
 
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
+import java.text.DateFormat;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -56,12 +57,14 @@
 	private static final String NAME_COLUMN = "Name";
 	private static final String STATUS_COLUMN = "Status";
 	private static final String OWNER_COLUMN = "Owner";
+	private static final String CREATED_COLUMN = "Created";
 	private static final String COMMENT_COLUMN = "Comment";
 
 	private static String[] columnNames = new String[] { 
 		NAME_COLUMN, 
 		STATUS_COLUMN,
 		OWNER_COLUMN,
+		CREATED_COLUMN,
 		COMMENT_COLUMN
 	};
 	
@@ -97,6 +100,8 @@
 	private Button skipButton;
 	private Button completeButton;
 	private Button failButton;
+	
+	private MinaTaskClient client;
 
 	private class ViewContentProvider implements IStructuredContentProvider {
 		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
@@ -131,6 +136,9 @@
 						return user.getId();
 					case 3:
 						return taskSummary.getDescription();
+					case 4:
+						return DateFormat.getDateTimeInstance().format(
+							taskSummary.getCreatedOn());
 					default:
 						throw new IllegalArgumentException(
 							"Unknown column index: " + index);
@@ -171,6 +179,7 @@
 		userNameText = new Text(parent, SWT.NONE);
 		GridData layoutData = new GridData();
 		layoutData.horizontalSpan = 8;
+		layoutData.minimumWidth = 120;
 		layoutData.grabExcessHorizontalSpace = true;
 		layoutData.horizontalAlignment = GridData.FILL_HORIZONTAL;
 		userNameText.setLayoutData(layoutData);
@@ -219,8 +228,12 @@
 		column.setWidth(100);
 		// 4th column = expiration time 
 		column = new TableColumn(table, SWT.CENTER, 3);
-		column.setText("Expiration");
+		column.setText("Comment");
 		column.setWidth(120);
+		// 5th column = created 
+		column = new TableColumn(table, SWT.CENTER, 3);
+		column.setText("Created On");
+		column.setWidth(120);
 	}
 
 	private void createTableViewer() {
@@ -311,23 +324,41 @@
 				System.out.println(e);
 			}
 			public void widgetSelected(SelectionEvent e) {
-				boolean selected = table.getSelectionCount() == 1;
-				TaskSummary task = getSelectedTask();
-				claimButton.setEnabled(selected && Status.Created.equals(task.getStatus()));
-				startButton.setEnabled(selected && 
-					(Status.Ready.equals(task.getStatus()) || Status.Reserved.equals(task.getStatus())));
-				stopButton.setEnabled(selected && Status.InProgress.equals(task.getStatus()));
-				releaseButton.setEnabled(selected && 
-					(Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus())));
-				suspendButton.setEnabled(selected && 
-					(Status.Ready.equals(task.getStatus()) || Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus())));
-				resumeButton.setEnabled(selected && Status.Suspended.equals(task.getStatus()));
-				skipButton.setEnabled(selected && !Status.Completed.equals(task.getStatus()) && !Status.Failed.equals(task.getStatus())&& !Status.Obsolete.equals(task.getStatus()));
-				completeButton.setEnabled(selected && Status.InProgress.equals(task.getStatus()));
-				failButton.setEnabled(selected && Status.InProgress.equals(task.getStatus()));
+				updateButtons();
 			}
 		});
 	}
+	
+	private void updateButtons() {
+		boolean selected = table.getSelectionCount() == 1;
+		TaskSummary task = getSelectedTask();
+		String userId = getUserId();
+		claimButton.setEnabled(selected && Status.Created.equals(task.getStatus()));
+		startButton.setEnabled(selected && 
+			(Status.Ready.equals(task.getStatus()) ||
+				(Status.Reserved.equals(task.getStatus())
+					&& userId.equals(task.getActualOwner().getId()))));
+		stopButton.setEnabled(selected && Status.InProgress.equals(task.getStatus())
+			&& userId.equals(task.getActualOwner().getId()));
+		releaseButton.setEnabled(selected && 
+			(Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus()))
+				&& userId.equals(task.getActualOwner().getId()));
+		suspendButton.setEnabled(selected && 
+			(Status.Ready.equals(task.getStatus()) || 
+				((Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus()))
+					&& userId.equals(task.getActualOwner().getId()))));
+		// TODO only actual owner if previousStatus = reserved or inProgress
+		resumeButton.setEnabled(selected && Status.Suspended.equals(task.getStatus()));
+		// TODO only initiator if state Created
+		skipButton.setEnabled(selected && task.isSkipable() &&
+			(Status.Created.equals(task.getStatus()) && Status.Ready.equals(task.getStatus()) || 
+				((Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus())) 
+					&& userId.equals(task.getActualOwner().getId()))));
+		completeButton.setEnabled(selected && Status.InProgress.equals(task.getStatus())
+			&& userId.equals(task.getActualOwner().getId()));
+		failButton.setEnabled(selected && Status.InProgress.equals(task.getStatus())
+			&& userId.equals(task.getActualOwner().getId()));
+	}
 
 	private void hookContextMenu() {
 		MenuManager menuMgr = new MenuManager("#PopupMenu");
@@ -396,11 +427,11 @@
 		BlockingTaskSummaryResponseHandler responseHandler = new BlockingTaskSummaryResponseHandler();
 		client.getTasksAssignedAsPotentialOwner(userId, language, responseHandler);
         List<TaskSummary> tasks = responseHandler.getResults();
-        client.disconnect();
         
         tableViewer.setInput(tasks);
         tableViewer.refresh();
         tableViewer.setSelection(null);
+        updateButtons();
 	}
 	
 	public void claim() {
@@ -421,7 +452,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.claim(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -443,7 +474,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.start(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -465,7 +496,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.stop(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -487,7 +518,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.release(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -509,7 +540,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.suspend(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -531,7 +562,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.resume(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -553,7 +584,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.skip(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -575,7 +606,7 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.complete(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
@@ -597,23 +628,32 @@
 		
 		BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
 		client.fail(taskSummary.getId(), userId, responseHandler);
-        client.disconnect();
+		responseHandler.waitTillDone(3000);
         refresh();
 	}
 	
 	private MinaTaskClient getTaskClient() {
-		MinaTaskClient client = new MinaTaskClient(
-			"org.drools.eclipse.task.views.TaskView", new TaskClientHandler());
-		NioSocketConnector connector = new NioSocketConnector();
-		SocketAddress address = new InetSocketAddress(ipAddress, port);
-		boolean connected = client.connect(connector, address);
-		if (!connected) {
-			showMessage("Could not connect to task server: " + ipAddress + " [port " + port + "]");
-			return null;
+		if (client == null) {
+			client = new MinaTaskClient(
+				"org.drools.eclipse.task.views.TaskView", new TaskClientHandler());
+			NioSocketConnector connector = new NioSocketConnector();
+			SocketAddress address = new InetSocketAddress(ipAddress, port);
+			boolean connected = client.connect(connector, address);
+			if (!connected) {
+				showMessage("Could not connect to task server: " + ipAddress + " [port " + port + "]");
+				client = null;
+			}
 		}
 		return client;
 	}
 	
+	public void dispose() {
+		if (client != null) {
+			client.disconnect();
+		}
+		super.dispose();
+	}
+	
 	private String getUserId() {
 		return userNameText.getText();
 	}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/.classpath	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/.classpath	2008-09-25 22:55:35 UTC (rev 23094)
@@ -1,51 +1,53 @@
-<classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
-  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
-  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
-  <classpathentry kind="output" path="target/classes"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.jar"/>
-  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/mina/mina-core/2.0.0-M3/mina-core-2.0.0-M3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.2/slf4j-api-1.5.2.jar"/>
-  <classpathentry kind="src" path="/drools-workitems"/>
-  <classpathentry kind="src" path="/drools-core"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0M2/mvel-2.0M2.jar"/>
-  <classpathentry kind="src" path="/drools-compiler"/>
-  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
-  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.15/janino-2.5.15.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-finder/1.0-SNAPSHOT/commons-finder-1.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.4/commons-io-1.4.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-cli/2.0-SNAPSHOT/commons-cli-2.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-compress/1.0-SNAPSHOT/commons-compress-1.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-exec/1.0.0-SNAPSHOT/commons-exec-1.0.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.1.0.GA/hibernate-commons-annotations-3.1.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.0.SP1/hibernate-core-3.3.0.SP1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar"/>
-  <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/2.0.2/xml-apis-2.0.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-jdk14/1.5.2/slf4j-jdk14-1.5.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-wiser/1.2/subethasmtp-wiser-1.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-smtp/1.2/subethasmtp-smtp-1.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
-  <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/postgresql/postgresql/8.3-603.jdbc3/postgresql-8.3-603.jdbc3.jar"/>
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/mina/mina-core/2.0.0-M3/mina-core-2.0.0-M3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.2/slf4j-api-1.5.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-workitems/5.0.0.SNAPSHOT/drools-workitems-5.0.0.SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-core/5.0.0.SNAPSHOT/drools-core-5.0.0.SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0M2/mvel-2.0M2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-compiler/5.0.0.SNAPSHOT/drools-compiler-5.0.0.SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-finder/1.0-SNAPSHOT/commons-finder-1.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.4/commons-io-1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-cli/2.0-SNAPSHOT/commons-cli-2.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-compress/1.0-SNAPSHOT/commons-compress-1.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-exec/1.0.0-SNAPSHOT/commons-exec-1.0.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.1.0.GA/hibernate-commons-annotations-3.1.0.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.0.SP1/hibernate-core-3.3.0.SP1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/seam/jboss-seam/2.1.0-SNAPSHOT/jboss-seam-2.1.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/el/jboss-el/1.0_02.CR2/jboss-el-1.0_02.CR2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/el/el-api/1.0/el-api-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-jdk14/1.5.2/slf4j-jdk14-1.5.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-wiser/1.2/subethasmtp-wiser-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-smtp/1.2/subethasmtp-smtp-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+  <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/postgresql/postgresql/8.3-603.jdbc3/postgresql-8.3-603.jdbc3.jar"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/.project
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/.project	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/.project	2008-09-25 22:55:35 UTC (rev 23094)
@@ -1,17 +1,13 @@
-<projectDescription>
-  <name>drools-process-task</name>
-  <comment>A rule production system</comment>
-  <projects>
-    <project>drools-workitems</project>
-    <project>drools-core</project>
-    <project>drools-compiler</project>
-  </projects>
-  <buildSpec>
-    <buildCommand>
-      <name>org.eclipse.jdt.core.javabuilder</name>
-    </buildCommand>
-  </buildSpec>
-  <natures>
-    <nature>org.eclipse.jdt.core.javanature</nature>
-  </natures>
+<projectDescription>
+  <name>drools-process-task</name>
+  <comment>A rule production system</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
 </projectDescription>
\ No newline at end of file

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	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -20,10 +20,11 @@
 import org.drools.task.Task;
 import org.drools.task.TaskData;
 import org.drools.task.User;
-import org.drools.task.event.EventPayload;
 import org.drools.task.event.TaskCompletedEvent;
 import org.drools.task.event.TaskEvent;
 import org.drools.task.event.TaskEventKey;
+import org.drools.task.event.TaskFailedEvent;
+import org.drools.task.event.TaskSkippedEvent;
 import org.drools.task.service.MinaTaskClient;
 import org.drools.task.service.TaskClientHandler;
 import org.drools.task.service.TaskClientHandler.AddTaskResponseHandler;
@@ -34,24 +35,29 @@
 	private int port = 9123;
 	private MinaTaskClient client;
 	private Map<Long, WorkItemManager> managers = new HashMap<Long, WorkItemManager>();
+	private Map<Long, Long> idMapping = new HashMap<Long, Long>();
 
 	public void setConnection(String ipAddress, int port) {
 		this.ipAddress = ipAddress;
 		this.port = port;
 	}
 	
-	private void createClient() {
-		client = new MinaTaskClient(
-			"org.drools.process.workitem.wsht.WSHumanTaskHandler", new TaskClientHandler());
-		NioSocketConnector connector = new NioSocketConnector();
-		SocketAddress address = new InetSocketAddress(ipAddress, port);
-		client.connect(connector, address);
+	public void connect() {
+		if (client == null) {
+			client = new MinaTaskClient(
+				"org.drools.process.workitem.wsht.WSHumanTaskHandler", new TaskClientHandler());
+			NioSocketConnector connector = new NioSocketConnector();
+			SocketAddress address = new InetSocketAddress(ipAddress, port);
+			boolean connected = client.connect(connector, address);
+			if (!connected) {
+				throw new IllegalArgumentException(
+					"Could not connect task client");
+			}
+		}
 	}
 
 	public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
-		if (client == null) {
-			createClient();
-		}
+		connect();
 		Task task = new Task();
 		String taskName = (String) workItem.getParameter("TaskName");
 		if (taskName != null) {
@@ -78,19 +84,28 @@
 		}
 		TaskData taskData = new TaskData();
 		taskData.setWorkItemId(workItem.getId());
+		taskData.setSkipable(!"false".equals(workItem.getParameter("Skippable")));
 		task.setTaskData(taskData);
 		String actorId = (String) workItem.getParameter("ActorId");
 		if (actorId != null) {
 			PeopleAssignments assignments = new PeopleAssignments();
 			List<OrganizationalEntity> potentialOwners = new ArrayList<OrganizationalEntity>();
-			User user = new User();
-			user.setId(actorId);
-			potentialOwners.add(user);
+			String[] actorIds = actorId.split(",");
+			for (String id: actorIds) {
+				User user = new User();
+				user.setId(id.trim());
+				potentialOwners.add(user);
+			}
 			assignments.setPotentialOwners(potentialOwners);
+			List<OrganizationalEntity> businessAdministrators = new ArrayList<OrganizationalEntity>();
+			businessAdministrators.add(new User("Administrator"));
+			assignments.setBusinessAdministrators(businessAdministrators);
 			task.setPeopleAssignments(assignments);
 		}
 		
-		TaskWorkItemAddTaskResponseHandler taskResponseHandler = new TaskWorkItemAddTaskResponseHandler(this.client, this.managers, manager, workItem.getId());
+		TaskWorkItemAddTaskResponseHandler taskResponseHandler =
+			new TaskWorkItemAddTaskResponseHandler(this.client, this.managers,
+				this.idMapping, manager, workItem.getId());
 		client.addTask(task, taskResponseHandler);
 	}
 	
@@ -101,32 +116,52 @@
 	}
 
 	public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
-		// TODO
+		Long taskId = idMapping.get(workItem.getId());
+		if (taskId != null) {
+			synchronized (idMapping) {
+				idMapping.remove(taskId);
+			}
+			synchronized (managers) {
+				managers.remove(taskId);
+			}
+			client.skip(taskId, "Administrator", null);
+		}
 	}
 	
     public static class TaskWorkItemAddTaskResponseHandler implements AddTaskResponseHandler {
         private volatile String error;
         private Map<Long, WorkItemManager> managers;
+        private Map<Long, Long> idMapping;
         private WorkItemManager manager;
         private long workItemId;
         private MinaTaskClient client;
         
-        public TaskWorkItemAddTaskResponseHandler(MinaTaskClient client, Map<Long, WorkItemManager> managers,  WorkItemManager manager, long workItemId) {
+        public TaskWorkItemAddTaskResponseHandler(MinaTaskClient client,
+        		Map<Long, WorkItemManager> managers,  Map<Long, Long> idMapping,
+        		WorkItemManager manager, long workItemId) {
             this.client = client;
             this.managers = managers;
+            this.idMapping = idMapping;
             this.manager = manager;
             this.workItemId = workItemId;
         }
         
         public void execute(long taskId) {
-            synchronized ( managers ) {
+        	synchronized ( managers ) {
                 managers.put(taskId, this.manager);           
-            }      
+            }
+            synchronized ( idMapping ) {
+                idMapping.put(workItemId, taskId);           
+            }
             System.out.println("Created task " + taskId + " for work item " + workItemId);
             
             EventKey key = new TaskEventKey(TaskCompletedEvent.class, taskId );           
             TaskCompletedHandler eventResponseHandler = new TaskCompletedHandler(workItemId, taskId, managers); 
-            client.registerForEvent( key, true, eventResponseHandler );                       
+            client.registerForEvent( key, true, eventResponseHandler );
+            key = new TaskEventKey(TaskFailedEvent.class, taskId );           
+            client.registerForEvent( key, true, eventResponseHandler );
+            key = new TaskEventKey(TaskSkippedEvent.class, taskId );           
+            client.registerForEvent( key, true, eventResponseHandler );
         }
 
         public void setError(String error) {
@@ -153,14 +188,26 @@
 
         public void execute(Payload payload) {
             TaskEvent event = ( TaskEvent ) payload.get();
-            if ( event.getTaskId() != taskId ) {
+        	if ( event.getTaskId() != taskId ) {
                 // defensive check that should never happen, just here for testing                
                 this.error = "Expected task id and arrived task id do not march";
                 return;
             }
-            synchronized ( this.managers ) {
-                this.managers.get(taskId).completeWorkItem(workItemId, null);   
-            }
+        	if (event instanceof TaskCompletedEvent) {
+		        synchronized ( this.managers ) {
+		            WorkItemManager manager = this.managers.get(taskId);
+		            if (manager != null) {
+		            	manager.completeWorkItem(workItemId, null);   
+		            }
+		        }
+        	} else {
+        		synchronized ( this.managers ) {
+        			WorkItemManager manager = this.managers.get(taskId);
+		            if (manager != null) {
+		            	manager.abortWorkItem(workItemId);
+		            }
+		        }
+        	}
         }
 
         public void setError(String error) {

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/DefaultTaskEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/DefaultTaskEventListener.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/DefaultTaskEventListener.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -8,4 +8,10 @@
     public void taskCompleted(TaskCompletedEvent event) {
     }
 
+	public void taskFailed(TaskFailedEvent event) {
+	}
+
+	public void taskSkipped(TaskSkippedEvent event) {
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -9,7 +9,8 @@
 import org.drools.eventmessaging.Payload;
 
 public class MessagingTaskEventListener implements TaskEventListener {
-    EventKeys keys;
+	
+    private EventKeys keys;
     
     public MessagingTaskEventListener(EventKeys keys) {
         this.keys = keys;
@@ -53,4 +54,42 @@
         }   
     }
 
+	public void taskFailed(TaskFailedEvent event) {
+        EventKey key = new TaskEventKey(TaskFailedEvent.class, event.getTaskId() );
+        List<EventTriggerTransport> targets = keys.getTargets( key );
+        if ( targets == null ){
+            return;
+        }
+        Payload payload = new EventPayload( event );
+        for ( Iterator<EventTriggerTransport> it = targets.iterator(); it.hasNext(); ) {
+            EventTriggerTransport target = it.next();
+            target.trigger( payload );
+            if ( target.isRemove() ) {
+                it.remove();
+            }
+        }
+        if ( targets.isEmpty() ) {
+            keys.removeKey( key );
+        }
+	}
+
+	public void taskSkipped(TaskSkippedEvent event) {
+        EventKey key = new TaskEventKey(TaskSkippedEvent.class, event.getTaskId() );
+        List<EventTriggerTransport> targets = keys.getTargets( key );
+        if ( targets == null ){
+            return;
+        }
+        Payload payload = new EventPayload( event );
+        for ( Iterator<EventTriggerTransport> it = targets.iterator(); it.hasNext(); ) {
+            EventTriggerTransport target = it.next();
+            target.trigger( payload );
+            if ( target.isRemove() ) {
+                it.remove();
+            }
+        }
+        if ( targets.isEmpty() ) {
+            keys.removeKey( key );
+        }
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -1,34 +1,12 @@
 package org.drools.task.event;
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
+public class TaskClaimedEvent extends TaskUserEvent {
 
-public class TaskClaimedEvent extends TaskEvent implements Externalizable {
-    private String userId;
-    
-    public TaskClaimedEvent() {
-        super();
+	public TaskClaimedEvent() {
     }
     
     public TaskClaimedEvent(long taskId, String userId) {
-        super( taskId );
-        this.userId = userId;
+        super( taskId, userId );
     }
-    
-    public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal( out );
-        out.writeUTF( userId );
-    }  
-    
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal( in );
-        userId = in.readUTF();
-    }
-    
-    public String getUserId() {
-        return userId;
-    }
-        
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskCompletedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskCompletedEvent.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskCompletedEvent.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -1,35 +1,13 @@
 package org.drools.task.event;
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
 
-public class TaskCompletedEvent extends TaskEvent implements Externalizable {
+public class TaskCompletedEvent extends TaskUserEvent {
 	
-    private String userId;
-    
     public TaskCompletedEvent() {
-    	
     }
     
     public TaskCompletedEvent(long taskId, String userId) {
-        super( taskId );
-        this.userId = userId;
+        super( taskId, userId );
     }
     
-    public void writeExternal(ObjectOutput out) throws IOException {
-    	super.writeExternal(out);
-        out.writeUTF( userId );
-    }   
-    
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-    	super.readExternal(in);
-    	userId = in.readUTF();
-    }
-
-    public String getUserId() {
-        return userId;
-    }
-
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -6,7 +6,8 @@
 import java.io.ObjectOutput;
 import java.util.EventObject;
 
-public abstract class TaskEvent  extends EventObject implements Externalizable {
+public abstract class TaskEvent extends EventObject implements Externalizable {
+	
     private static final String dummySource = "";
     private long taskId;
     

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -18,12 +18,14 @@
 
 import java.util.EventListener;
 
-public interface TaskEventListener
-    extends
-    EventListener {
+public interface TaskEventListener extends EventListener {
+	
+	void taskClaimed(TaskClaimedEvent event);
     
-    void taskClaimed(TaskClaimedEvent event);
-    
     void taskCompleted(TaskCompletedEvent event);
     
+    void taskFailed(TaskFailedEvent event);
+    
+    void taskSkipped(TaskSkippedEvent event);
+    
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -25,22 +25,17 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 
-public class TaskEventSupport
-    implements
-    Externalizable {
-    /**
-     *
-     */
+public class TaskEventSupport implements Externalizable {
+
     private static final long serialVersionUID = 400L;
+
     private List<TaskEventListener> listeners = new CopyOnWriteArrayList<TaskEventListener>();
 
-    public TaskEventSupport() {
+    @SuppressWarnings("unchecked")
+	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        listeners = (List<TaskEventListener>)in.readObject();
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        listeners   = (List<TaskEventListener>)in.readObject();
-    }
-
     public void writeExternal(ObjectOutput out) throws IOException {
         out.writeObject(listeners);
     }
@@ -68,19 +63,17 @@
     }
     
     public void fireTaskClaimed(final long taskId, final String userId) {
-    	System.out.println("Task " + taskId + " claimed");
-        if ( this.listeners.isEmpty() ) {
-          return;
-      }
+        if (this.listeners.isEmpty()) {
+			return;
+		}
 
-      final TaskClaimedEvent event = new TaskClaimedEvent(taskId, userId);
-      
-      for ( TaskEventListener listener: listeners) {
-      	  System.out.println("notifying listener " + listener);
-          listener.taskClaimed( event );
-      }
-  }    
+		final TaskClaimedEvent event = new TaskClaimedEvent(taskId, userId);
 
+		for (TaskEventListener listener : listeners) {
+			listener.taskClaimed(event);
+		}
+    }    
+
     public void fireTaskCompleted(final long taskId, final String userId) {
         if ( this.listeners.isEmpty() ) {
             return;
@@ -89,13 +82,34 @@
         final TaskCompletedEvent event = new TaskCompletedEvent( taskId, userId );
         
         for ( TaskEventListener listener: listeners) {
-        	System.out.println("notifying listener " + listener);
             listener.taskCompleted( event );
         }
     } 
     
+    public void fireTaskFailed(final long taskId, final String userId) {
+        if ( this.listeners.isEmpty() ) {
+            return;
+        }
+
+        final TaskFailedEvent event = new TaskFailedEvent( taskId, userId );
+        
+        for ( TaskEventListener listener: listeners) {
+            listener.taskFailed( event );
+        }
+    } 
     
+    public void fireTaskSkipped(final long taskId, final String userId) {
+        if ( this.listeners.isEmpty() ) {
+            return;
+        }
 
+        final TaskSkippedEvent event = new TaskSkippedEvent( taskId, userId );
+        
+        for ( TaskEventListener listener: listeners) {
+            listener.taskSkipped( event );
+        }
+    } 
+    
     public void reset() {
         this.listeners.clear();
     }

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskFailedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskFailedEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskFailedEvent.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -0,0 +1,12 @@
+package org.drools.task.event;
+
+public class TaskFailedEvent extends TaskUserEvent {
+
+	public TaskFailedEvent() {
+    }
+    
+    public TaskFailedEvent(long taskId, String userId) {
+        super( taskId, userId );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskSkippedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskSkippedEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskSkippedEvent.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -0,0 +1,12 @@
+package org.drools.task.event;
+
+public class TaskSkippedEvent extends TaskUserEvent {
+
+	public TaskSkippedEvent() {
+    }
+    
+    public TaskSkippedEvent(long taskId, String userId) {
+        super( taskId, userId );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskUserEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskUserEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskUserEvent.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -0,0 +1,35 @@
+package org.drools.task.event;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+public class TaskUserEvent extends TaskEvent implements Externalizable {
+	
+    private String userId;
+    
+    public TaskUserEvent() {
+        super();
+    }
+    
+    public TaskUserEvent(long taskId, String userId) {
+        super( taskId );
+        this.userId = userId;
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal( out );
+        out.writeUTF( userId );
+    }  
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        super.readExternal( in );
+        userId = in.readUTF();
+    }
+    
+    public String getUserId() {
+        return userId;
+    }
+        
+}

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	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -1,31 +1,14 @@
 package org.drools.task.service;
 
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.mina.core.future.ConnectFuture;
-import org.apache.mina.core.service.IoHandler;
-import org.apache.mina.core.session.IoSession;
-import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
-import org.apache.mina.filter.codec.serialization.ObjectSerializationEncoder;
-import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
-import org.apache.mina.transport.socket.SocketConnector;
-import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.drools.eventmessaging.EventKey;
 import org.drools.eventmessaging.EventResponseHandler;
-import org.drools.task.AccessType;
 import org.drools.task.Attachment;
-import org.drools.task.Content;
 import org.drools.task.Comment;
+import org.drools.task.Content;
 import org.drools.task.Task;
-import org.drools.task.User;
 import org.drools.task.service.TaskClientHandler.AddAttachmentResponseHandler;
 import org.drools.task.service.TaskClientHandler.AddCommentResponseHandler;
 import org.drools.task.service.TaskClientHandler.AddTaskResponseHandler;
@@ -47,7 +30,7 @@
 
     public void addTask(Task task,
                         AddTaskResponseHandler responseHandler) {
-        List args = new ArrayList( 1 );
+        List<Object> args = new ArrayList<Object>( 1 );
         args.add( task );
         Command cmd = new Command( counter.getAndIncrement(),
                                    CommandName.AddTaskRequest,
@@ -61,7 +44,7 @@
 
     public void getTask(long taskId,
                         GetTaskResponseHandler responseHandler) {
-        List args = new ArrayList( 1 );
+        List<Object> args = new ArrayList<Object>( 1 );
         args.add( taskId );
         Command cmd = new Command( counter.getAndIncrement(),
                                    CommandName.GetTaskRequest,
@@ -77,7 +60,7 @@
     public void addComment(long taskId,
                            Comment comment,
                            AddCommentResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( taskId );
         args.add( comment );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -93,7 +76,7 @@
     public void deleteComment(long taskId,
                               long commentId,
                               DeleteCommentResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( taskId );
         args.add( commentId );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -110,7 +93,7 @@
                               Attachment attachment,
                               Content content,
                               AddAttachmentResponseHandler responseHandler) {
-        List args = new ArrayList( 3 );
+        List<Object> args = new ArrayList<Object>( 3 );
         args.add( taskId );
         args.add( attachment );
         args.add( content );
@@ -128,7 +111,7 @@
                                  long attachmentId,
                                  long contentId,
                                  DeleteAttachmentResponseHandler responseHandler ) {
-        List args = new ArrayList( 3 );
+        List<Object> args = new ArrayList<Object>( 3 );
         args.add( taskId );
         args.add( attachmentId );
         args.add( contentId );
@@ -145,7 +128,7 @@
     public void setDocumentContent(long taskId,
                                    Content content,
                                    SetDocumentResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( taskId );
         args.add( content );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -160,7 +143,7 @@
 
     public void getContent(long contentId,
                            GetContentResponseHandler responseHandler) {
-        List args = new ArrayList( 1 );
+        List<Object> args = new ArrayList<Object>( 1 );
         args.add( contentId );
         Command cmd = new Command( counter.getAndIncrement(),
                                    CommandName.GetContentRequest,
@@ -175,7 +158,7 @@
     public void claim(long taskId,
                       String userId,
                       TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Claim );
         args.add( taskId );
         args.add( userId );
@@ -193,7 +176,7 @@
     public void start(long taskId,
                       String userId,
                       TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Start );
         args.add( taskId );
         args.add( userId );
@@ -211,7 +194,7 @@
     public void stop(long taskId,
                      String userId,
                      TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Stop );
         args.add( taskId );
         args.add( userId );
@@ -229,7 +212,7 @@
     public void release(long taskId,
                         String userId,
                         TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Release );
         args.add( taskId );
         args.add( userId );
@@ -247,7 +230,7 @@
     public void suspend(long taskId,
                         String userId,
                         TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Suspend );
         args.add( taskId );
         args.add( userId );
@@ -265,7 +248,7 @@
     public void resume(long taskId,
                        String userId,
                        TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Resume );
         args.add( taskId );
         args.add( userId );
@@ -283,7 +266,7 @@
     public void skip(long taskId,
                      String userId,
                      TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Skip );
         args.add( taskId );
         args.add( userId );
@@ -302,7 +285,7 @@
                          String userId,
                          String targetUserId,
                          TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Delegate );
         args.add( taskId );
         args.add( userId );
@@ -321,7 +304,7 @@
                         String userId,
                         String targetEntityId,
                         TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Forward );
         args.add( taskId );
         args.add( userId );
@@ -339,7 +322,7 @@
     public void complete(long taskId,
                          String userId,
                          TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Complete );
         args.add( taskId );
         args.add( userId );
@@ -357,7 +340,7 @@
     public void fail(long taskId,
                      String userId,
                      TaskOperationResponseHandler responseHandler) {
-        List args = new ArrayList( 4 );
+        List<Object> args = new ArrayList<Object>( 4 );
         args.add( Operation.Fail );
         args.add( taskId );
         args.add( userId );
@@ -375,7 +358,7 @@
     public void getTasksOwned(String userId,
                               String language,
                               TaskSummaryResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( userId );
         args.add( language );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -389,7 +372,7 @@
     public void getTasksAssignedAsBusinessAdministrator(String userId,
                                                         String language,
                                                         TaskSummaryResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( userId );
         args.add( language );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -403,7 +386,7 @@
     public void getTasksAssignedAsExcludedOwner(String userId,
                                                 String language,
                                                 TaskSummaryResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( userId );
         args.add( language );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -417,7 +400,7 @@
     public void getTasksAssignedAsPotentialOwner(String userId,
                                                  String language,
                                                  TaskSummaryResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( userId );
         args.add( language );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -431,7 +414,7 @@
     public void getTasksAssignedAsRecipient(String userId,
                                             String language,
                                             TaskSummaryResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( userId );
         args.add( language );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -445,7 +428,7 @@
     public void getTasksAssignedAsTaskInitiator(String userId,
                                                 String language,
                                                 TaskSummaryResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( userId );
         args.add( language );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -459,7 +442,7 @@
     public void getTasksAssignedAsTaskStakeholder(String userId,
                                                   String language,
                                                   TaskSummaryResponseHandler responseHandler) {
-        List args = new ArrayList( 2 );
+        List<Object> args = new ArrayList<Object>( 2 );
         args.add( userId );
         args.add( language );
         Command cmd = new Command( counter.getAndIncrement(),
@@ -473,7 +456,7 @@
     public void registerForEvent(EventKey key,
                                  boolean remove,
                                  EventResponseHandler responseHandler) {
-        List args = new ArrayList( 3 );
+        List<Object> args = new ArrayList<Object>( 3 );
         args.add( key );
         args.add( remove );
         args.add( this.name );

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/OperationCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/OperationCommand.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/OperationCommand.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -2,9 +2,7 @@
 
 import java.util.List;
 
-import org.drools.task.OrganizationalEntity;
 import org.drools.task.Status;
-import org.drools.task.User;
 
 public class OperationCommand {
     private List<Status>        status;
@@ -17,6 +15,7 @@
     private boolean       userIsExplicitPotentialOwner;
     private boolean       addTargetUserToPotentialOwners;
     private boolean       removeUserFromPotentialOwners;
+    private boolean       skippable;
     private Operation     exec;
     
     public List<Status> getStatus() {
@@ -83,7 +82,13 @@
     public void setRemoveUserFromPotentialOwners(boolean removeUserFromPotentialOwners) {
         this.removeUserFromPotentialOwners = removeUserFromPotentialOwners;
     }
-    public Operation getExec() {
+    public boolean isSkippable() {
+		return skippable;
+	}
+	public void setSkippable(boolean skippable) {
+		this.skippable = skippable;
+	}
+	public Operation getExec() {
         return exec;
     }
     public void setExec(Operation exec) {

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	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -1,7 +1,5 @@
 package org.drools.task.service;
 
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -11,14 +9,13 @@
 
 import javax.persistence.EntityManager;
 
-import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.drools.eventmessaging.EventKey;
-import org.drools.task.AccessType;
 import org.drools.task.Attachment;
-import org.drools.task.Content;
 import org.drools.task.Comment;
+import org.drools.task.Content;
 import org.drools.task.Task;
 import org.drools.task.query.TaskSummary;
 

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	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServiceSession.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -63,7 +63,7 @@
         taskData.setStatus( Status.Created );
 
         if ( task.getPeopleAssignments() != null ) {
-            List potentialOwners = task.getPeopleAssignments().getPotentialOwners();
+            List<OrganizationalEntity> potentialOwners = task.getPeopleAssignments().getPotentialOwners();
             if ( potentialOwners.size() == 1 ) {
                 // if there is a single potential owner, assign and set status to Reserved
                 taskData.setActualOwner( (User) potentialOwners.get( 0 ) );
@@ -135,13 +135,11 @@
     }
 
     public TaskError evalCommand(Operation operation,
-                                          List<OperationCommand> commands,
-                                          Task task,
-                                          User user,
-                                          OrganizationalEntity targetEntity) {
-        PeopleAssignments people = task.getPeopleAssignments();
+                                 List<OperationCommand> commands,
+                                 Task task,
+                                 User user,
+                                 OrganizationalEntity targetEntity) {
         TaskData taskData = task.getTaskData();
-        boolean operationAllowed = false;
         boolean statusMatched = false;
         for ( OperationCommand command : commands ) {
             // first find out if we have a matching status
@@ -235,6 +233,10 @@
             // if user has rights to execute the command, make sure user is explicitely specified (not as a group)
             operationAllowed = people.getPotentialOwners().contains( user );
         }
+        
+        if ( operationAllowed && command.isSkippable() ) {
+        	operationAllowed = taskData.isSkipable();
+        }
 
         return operationAllowed;
     }
@@ -286,9 +288,9 @@
     }
 
     public TaskError taskOperation(Operation operation,
-                                            long taskId,
-                                            String userId,
-                                            String targetEntityId) {
+                                   long taskId,
+                                   String userId,
+                                   String targetEntityId) {
         Task task = em.find( Task.class,
                              taskId );
 
@@ -332,6 +334,21 @@
                                                                  task.getTaskData().getActualOwner().getId() );
                     break;
                 }
+                
+                case Fail : {
+                    // trigger event support
+                    service.getEventSupport().fireTaskFailed( task.getId(),
+                                                              task.getTaskData().getActualOwner().getId() );
+                    break;
+                }
+
+                case Skip : {
+                    // trigger event support
+                    service.getEventSupport().fireTaskSkipped( task.getId(),
+                                                               task.getTaskData().getActualOwner().getId() );
+                    break;
+                }
+                
             }
 
         } catch ( Exception e ) {

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	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/orm.xml	2008-09-25 22:55:35 UTC (rev 23094)
@@ -98,7 +98,7 @@
      t.taskData.activationTime,
      t.taskData.expirationTime)
 from 
-    Task t left join t.taskData.createdBy,
+    Task t left join t.taskData.createdBy left join t.taskData.actualOwner,
     I18NText names,
     I18NText subjects,
     I18NText descriptions, 
@@ -115,6 +115,8 @@
     
     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>

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/org/drools/task/service/operations-dsl.mvel
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/org/drools/task/service/operations-dsl.mvel	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/org/drools/task/service/operations-dsl.mvel	2008-09-25 22:55:35 UTC (rev 23094)
@@ -56,17 +56,20 @@
         : [ new OperationCommand().{ 
                 status = [ Status.Created ],
                 allowed = [ Allowed.Initiator, Allowed.BusinessAdministrator  ],              
-                newStatus = Status.Obsolete
+                newStatus = Status.Obsolete,
+                skippable = true
             },
             new OperationCommand().{ 
                 status = [ Status.Ready ],
                 allowed = [ Allowed.PotentialOwner, Allowed.BusinessAdministrator  ],              
-                newStatus = Status.Obsolete
+                newStatus = Status.Obsolete,
+                skippable = true
             },
             new OperationCommand().{ 
                 status = [ Status.Reserved, Status.InProgress ],
                 allowed = [ Allowed.Owner, Allowed.BusinessAdministrator ],          
-                newStatus = Status.Obsolete
+                newStatus = Status.Obsolete,
+                skippable = true
             } ],
     Operation.Delegate 
         : [ new OperationCommand().{ 

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/process/workitem/wsht/WSHumanTaskHandlerTest.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -0,0 +1,293 @@
+package org.drools.process.workitem.wsht;
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.task.BaseTest;
+import org.drools.task.Status;
+import org.drools.task.query.TaskSummary;
+import org.drools.task.service.BlockingTaskOperationResponseHandler;
+import org.drools.task.service.BlockingTaskSummaryResponseHandler;
+import org.drools.task.service.MinaTaskClient;
+import org.drools.task.service.MinaTaskServer;
+import org.drools.task.service.TaskClientHandler;
+
+public class WSHumanTaskHandlerTest extends BaseTest {
+	
+    MinaTaskServer server;
+    MinaTaskClient client;
+    WSHumanTaskHandler handler;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        server = new MinaTaskServer( taskService );
+        Thread thread = new Thread( server );
+        thread.start();
+        Thread.sleep( 500 );
+        client = new MinaTaskClient("client 1", new TaskClientHandler());
+		NioSocketConnector connector = new NioSocketConnector();
+		SocketAddress address = new InetSocketAddress("127.0.0.1", 9123);
+		client.connect(connector, address);
+		handler = new WSHumanTaskHandler();
+    }
+
+    protected void tearDown() throws Exception {
+        handler.dispose();
+        client.disconnect();
+        server.stop();
+        super.tearDown();
+    }
+    
+	public void testTask() throws Exception {
+		TestWorkItemManager manager = new TestWorkItemManager();
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskName");
+		workItem.setParameter("Comment", "Comment");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+		handler.executeWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		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("TaskName", task.getName());
+		assertEquals(10, task.getPriority());
+		assertEquals("Comment", task.getDescription());
+		assertEquals(Status.Reserved, task.getStatus());
+		assertEquals("Darth Vader", task.getActualOwner().getId());
+		
+		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());
+		
+		System.out.println("Completing task " + task.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.complete(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Completed task " + task.getId());
+		
+		assertTrue(manager.isCompleted());
+	}
+	
+	public void testTaskMultipleActors() throws Exception {
+		TestWorkItemManager manager = new TestWorkItemManager();
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskName");
+		workItem.setParameter("Comment", "Comment");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader, Dalai Lama");
+		handler.executeWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		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("TaskName", task.getName());
+		assertEquals(10, task.getPriority());
+		assertEquals("Comment", task.getDescription());
+		assertEquals(Status.Ready, task.getStatus());
+		
+		System.out.println("Claiming task " + task.getId());
+		BlockingTaskOperationResponseHandler operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.claim(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Claimed task " + task.getId());
+		
+		System.out.println("Starting task " + task.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.start(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Started task " + task.getId());
+		
+		System.out.println("Completing task " + task.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.complete(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Completed task " + task.getId());
+		
+		assertTrue(manager.isCompleted());
+	}
+	
+	public void testTaskFail() throws Exception {
+		TestWorkItemManager manager = new TestWorkItemManager();
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskName");
+		workItem.setParameter("Comment", "Comment");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+		handler.executeWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		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("TaskName", task.getName());
+		assertEquals(10, task.getPriority());
+		assertEquals("Comment", task.getDescription());
+		assertEquals(Status.Reserved, task.getStatus());
+		assertEquals("Darth Vader", task.getActualOwner().getId());
+		
+		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());
+		
+		System.out.println("Failing task " + task.getId());
+		operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.fail(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Failed task " + task.getId());
+		
+		assertTrue(manager.isAborted());
+	}
+	
+	public void testTaskSkip() throws Exception {
+		TestWorkItemManager manager = new TestWorkItemManager();
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskName");
+		workItem.setParameter("Comment", "Comment");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+		handler.executeWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		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("TaskName", task.getName());
+		assertEquals(10, task.getPriority());
+		assertEquals("Comment", task.getDescription());
+		assertEquals(Status.Reserved, task.getStatus());
+		assertEquals("Darth Vader", task.getActualOwner().getId());
+		
+		System.out.println("Skipping task " + task.getId());
+		BlockingTaskOperationResponseHandler operationResponseHandler = new BlockingTaskOperationResponseHandler();
+		client.skip(task.getId(), "Darth Vader", operationResponseHandler);
+		operationResponseHandler.waitTillDone(5000);
+		System.out.println("Skipped task " + task.getId());
+		
+		assertTrue(manager.isAborted());
+	}
+	
+	public void testTaskAbortSkippable() throws Exception {
+		TestWorkItemManager manager = new TestWorkItemManager();
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskName");
+		workItem.setParameter("Comment", "Comment");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+		handler.executeWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		handler.abortWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		BlockingTaskSummaryResponseHandler responseHandler = new BlockingTaskSummaryResponseHandler();
+		client.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+		List<TaskSummary> tasks = responseHandler.getResults();
+		assertEquals(0, tasks.size());
+	}
+	
+	public void testTaskAbortNotSkippable() throws Exception {
+		TestWorkItemManager manager = new TestWorkItemManager();
+		WorkItemImpl workItem = new WorkItemImpl();
+		workItem.setName("Human Task");
+		workItem.setParameter("TaskName", "TaskName");
+		workItem.setParameter("Comment", "Comment");
+		workItem.setParameter("Priority", "10");
+		workItem.setParameter("ActorId", "Darth Vader");
+		workItem.setParameter("Skippable", "false");
+		handler.executeWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		BlockingTaskSummaryResponseHandler responseHandler = new BlockingTaskSummaryResponseHandler();
+		client.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+		List<TaskSummary> tasks = responseHandler.getResults();
+		assertEquals(1, tasks.size());
+		
+		handler.abortWorkItem(workItem, manager);
+		
+		Thread.sleep(500);
+		
+		responseHandler = new BlockingTaskSummaryResponseHandler();
+		client.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+		tasks = responseHandler.getResults();
+		assertEquals(1, tasks.size());
+	}
+	
+	private class TestWorkItemManager implements WorkItemManager  {
+		
+		private boolean completed;
+		private boolean aborted;
+		
+		public void abortWorkItem(long id) {
+			aborted = true;
+		}
+		
+		public boolean isAborted() {
+			return aborted;
+		}
+
+		public void completeWorkItem(long id, Map<String, Object> results) {
+			completed = true;
+		}
+		
+		public boolean isCompleted() {
+			return completed;
+		}
+
+		public WorkItem getWorkItem(long id) {
+			return null;
+		}
+
+		public Set<WorkItem> getWorkItems() {
+			return null;
+		}
+
+		public void internalAbortWorkItem(long id) {
+		}
+
+		public void internalAddWorkItem(WorkItem workItem) {
+		}
+
+		public void internalExecuteWorkItem(WorkItem workItem) {
+		}
+
+		public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
+		}
+		
+	}
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -17,7 +17,7 @@
 import org.drools.task.Status;
 import org.drools.task.Task;
 import org.drools.task.event.EventPayload;
-import org.drools.task.event.TaskClaimedEvent;
+import org.drools.task.event.TaskUserEvent;
 import org.drools.task.event.TaskCompletedEvent;
 import org.drools.task.event.TaskEventKey;
 import org.drools.task.service.MinaTaskClient;
@@ -41,7 +41,7 @@
         
         long taskId = task.getId();      
         
-        EventKey key = new TaskEventKey(TaskClaimedEvent.class, taskId );        
+        EventKey key = new TaskEventKey(TaskUserEvent.class, taskId );        
         MockEventTriggerTransport transport = new MockEventTriggerTransport();   
         taskService.getEventKeys().register( key, transport );      
         
@@ -49,8 +49,8 @@
         taskSession.taskOperation( Operation.Claim, taskId, users.get( "darth" ).getId(), null );        
         
         assertEquals( 1, transport.list.size() );
-        assertEquals( taskId, ((TaskClaimedEvent) ((Payload) transport.list.get(0)).get()).getTaskId() );
-        assertEquals( users.get( "darth" ).getId(), ((TaskClaimedEvent) ((Payload) transport.list.get(0)).get()).getUserId() );
+        assertEquals( taskId, ((TaskUserEvent) ((Payload) transport.list.get(0)).get()).getTaskId() );
+        assertEquals( users.get( "darth" ).getId(), ((TaskUserEvent) ((Payload) transport.list.get(0)).get()).getUserId() );
         
     }
     

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceDeadlinesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceDeadlinesTest.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceDeadlinesTest.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -31,7 +31,7 @@
 import org.drools.task.Status;
 import org.drools.task.Task;
 import org.drools.task.User;
-import org.drools.task.event.TaskClaimedEvent;
+import org.drools.task.event.TaskUserEvent;
 import org.drools.task.event.TaskEventKey;
 import org.drools.task.service.DefaultEscalatedDeadlineHandler;
 import org.drools.util.ChainedProperties;

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java	2008-09-25 22:55:35 UTC (rev 23094)
@@ -18,7 +18,7 @@
 import org.drools.task.MockUserInfo;
 import org.drools.task.Status;
 import org.drools.task.Task;
-import org.drools.task.event.TaskClaimedEvent;
+import org.drools.task.event.TaskUserEvent;
 import org.drools.task.event.TaskEventKey;
 import org.drools.task.service.MockEventMessagingTest.MockEventTriggerTransport;
 
@@ -84,7 +84,7 @@
         Task task1 = getTaskResponseHandler.getTask();
         assertEquals( Status.Ready , task1.getTaskData().getStatus() );         
         
-        EventKey key = new TaskEventKey(TaskClaimedEvent.class, taskId );           
+        EventKey key = new TaskEventKey(TaskUserEvent.class, taskId );           
         BlockingEventResponseHandler handler = new BlockingEventResponseHandler(); 
         client.registerForEvent( key, true, handler );
         Thread.sleep( 3000 );
@@ -93,7 +93,7 @@
         handler.waitTillDone( 5000 );
         
         Payload payload = handler.getPayload();
-        TaskClaimedEvent event = ( TaskClaimedEvent ) payload.get();
+        TaskUserEvent event = ( TaskUserEvent ) payload.get();
         assertNotNull( event );        
     }
   

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/LoadUsers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/LoadUsers.mvel	2008-09-25 22:48:59 UTC (rev 23093)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/LoadUsers.mvel	2008-09-25 22:55:35 UTC (rev 23094)
@@ -5,7 +5,7 @@
           'peter'  : new User('Peter Parker'),   'steve'      : new User('Steve Rogers'),
           'sly'    : new User('Sly Stalone'),    'liz'        : new User('Elizabeth Windsor'),
           'bruce'  : new User('Bruce Wayne' ),   'tony'       : new User('Tony Stark'),
-          'luke'   : new User('Luke Cage')
+          'luke'   : new User('Luke Cage'),      'admin'      : new User('Administrator')
         ];       
 
 return users;




More information about the jboss-svn-commits mailing list