<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">

<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>

                                <td>

                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="https://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">JBoss Community</a></h1>
                                                                </td>

                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px;  -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
    Re: New Local human task service in JBPM5.2
</h3>
<span style="margin-bottom: 10px;">
    created by <a href="https://community.jboss.org/people/devilkazuya99">TC ONG</a> in <i>jBPM</i> - <a href="https://community.jboss.org/message/734940#734940">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><pre>/**
 * Copyright 2010 JBoss Inc
 *
 * 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
 *
 *&#160;&#160;&#160;&#160;&#160; 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.
 */
package org.jbpm.process.workitem.wsht.local.sync;

import org.jbpm.process.workitem.wsht.SyncWSHumanTaskHandler;
import org.jbpm.process.workitem.wsht.sync.WSHumanTaskHandlerBaseSyncTest;
import org.jbpm.task.service.TaskServer;
import org.jbpm.task.service.local.LocalTaskService;

public class WSHumanTaskHandlerLocalSyncTest extends WSHumanTaskHandlerBaseSyncTest {

&#160;&#160;&#160; private TaskServer server;

&#160;&#160;&#160; @Override
&#160;&#160;&#160; protected void setUp() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; super.setUp();
&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; setClient(new LocalTaskService(taskService));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; setHandler(new SyncWSHumanTaskHandler(getClient(), ksession));
&#160;&#160;&#160; }

&#160;&#160;&#160; protected void tearDown() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ((SyncWSHumanTaskHandler) getHandler()).dispose();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().disconnect();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; super.tearDown();
&#160;&#160;&#160; }
}</pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><pre>/**
 * Copyright 2010 JBoss Inc
 *
 * 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
 *
 *&#160;&#160;&#160;&#160;&#160; 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.
 */
package org.jbpm.process.workitem.wsht.sync;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.drools.process.instance.impl.WorkItemImpl;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;
import org.jbpm.process.workitem.wsht.MyObject;
import org.jbpm.process.workitem.wsht.SyncWSHumanTaskHandler;
import org.jbpm.task.AccessType;
import org.jbpm.task.BaseTest;
import org.jbpm.task.Status;
import org.jbpm.task.Task;
import org.jbpm.task.TaskService;
import org.jbpm.task.TestStatefulKnowledgeSession;
import org.jbpm.task.query.TaskSummary;
import org.jbpm.task.service.ContentData;
import org.jbpm.task.service.PermissionDeniedException;
import org.jbpm.task.utils.OnErrorAction;

public abstract class WSHumanTaskHandlerBaseSyncTest extends BaseTest {

&#160;&#160;&#160; private static final int DEFAULT_WAIT_TIME = 5000;
&#160;&#160;&#160; private static final int MANAGER_COMPLETION_WAIT_TIME = DEFAULT_WAIT_TIME;
&#160;&#160;&#160; private static final int MANAGER_ABORT_WAIT_TIME = DEFAULT_WAIT_TIME;
&#160;&#160;&#160; private TaskService client;
&#160;&#160;&#160; private WorkItemHandler handler;
&#160;&#160;&#160; protected TestStatefulKnowledgeSession ksession = new TestStatefulKnowledgeSession();

&#160;&#160;&#160; public void setClient(TaskService client) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.client = client;
&#160;&#160;&#160; }

&#160;&#160;&#160; public TaskService getClient() {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return client;
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTask() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setProcessInstanceId(10);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; handler.executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = client.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary task = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", task.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", task.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, task.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", task.getActualOwner().getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getProcessInstanceId());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; client.start(task.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; client.complete(task.getId(), "Darth Vader", null);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskMultipleActors() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader, Dalai Lama");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary task = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", task.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", task.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Ready, task.getStatus());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().claim(task.getId(), "Darth Vader");

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(task.getId(), "Darth Vader");

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().complete(task.getId(), "Darth Vader", null);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskGroupActors() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("GroupId", "Crusaders");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List groupIds = new ArrayList();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; groupIds.add("Crusaders");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner(null, groupIds, "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary taskSummary = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", taskSummary.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, taskSummary.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", taskSummary.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Ready, taskSummary.getStatus());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; PermissionDeniedException denied = null;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().claim(taskSummary.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (PermissionDeniedException e) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; denied = e;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertNotNull("Should get permissed denied exception", denied);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the parent task is InProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task task = getClient().getTask(taskSummary.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Ready, task.getTaskData().getStatus());
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskSingleAndGroupActors() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task One");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameOne");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("GroupId", "Crusaders");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);
&#160; 

&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task Two");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameTwo");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List groupIds = new ArrayList();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; groupIds.add("Crusaders");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", groupIds, "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(2, tasks.size());
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskFail() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary task = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", task.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", task.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, task.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", task.getActualOwner().getId());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(task.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().fail(task.getId(), "Darth Vader", null);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillAborted(MANAGER_ABORT_WAIT_TIME));
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskSkip() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary task = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", task.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", task.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, task.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", task.getActualOwner().getId());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().skip(task.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillAborted(MANAGER_ABORT_WAIT_TIME));
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; public void testTaskExit() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task task = getClient().getTaskByWorkItemId(workItem.getId());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().exit(task.getId(), "Administrator");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; task = getClient().getTaskByWorkItemId(workItem.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", task.getNames().get(0).getText());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", task.getDescriptions().get(0).getText());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Exited, task.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(0, tasks.size());
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; public void testTaskExitNonAdministrator() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task task = getClient().getTaskByWorkItemId(workItem.getId());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().exit(task.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; fail("Should not allow to exit task for non administrators");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (PermissionDeniedException e) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary taskSummary = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", taskSummary.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, taskSummary.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", taskSummary.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, taskSummary.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", taskSummary.getActualOwner().getId());
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskAbortSkippable() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().abortWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(0, tasks.size());
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskAbortNotSkippable() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Skippable", "false");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().abortWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; // aborting work item will exit task and not skip it
&#160;&#160;&#160;&#160;&#160;&#160;&#160; tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(0, tasks.size());
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskData() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Content", "This is the content");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary taskSummary = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", taskSummary.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, taskSummary.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", taskSummary.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, taskSummary.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", taskSummary.getActualOwner().getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task task = getClient().getTask(taskSummary.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(AccessType.Inline, task.getTaskData().getDocumentAccessType());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(task.getTaskData().getProcessSessionId(), TestStatefulKnowledgeSession.testSessionId);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; long contentId = task.getTaskData().getDocumentContentId();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(contentId != -1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ByteArrayInputStream bis = new ByteArrayInputStream(getClient().getContent(contentId).getContent());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ObjectInputStream in = new ObjectInputStream(bis);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object data = in.readObject();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; in.close();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("This is the content", data);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(task.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ContentData result = new ContentData();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; result.setAccessType(AccessType.Inline);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; result.setType("java.lang.String");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ByteArrayOutputStream bos = new ByteArrayOutputStream();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ObjectOutputStream out = new ObjectOutputStream(bos);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.writeObject("This is the result");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.close();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; result.setContent(bos.toByteArray());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().complete(task.getId(), "Darth Vader", result);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map results = manager.getResults();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertNotNull(results);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", results.get("ActorId"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("This is the result", results.get("Result"));
&#160;&#160;&#160; }

&#160;&#160;&#160; public void testTaskDataAutomaticMapping() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; MyObject myObject = new MyObject("MyObjectValue");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("MyObject", myObject);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map mapParameter = new HashMap();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapParameter.put("MyObjectInsideTheMap", myObject);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("MyMap", mapParameter);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("MyObject", myObject);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160; 

&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary taskSummary = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskName", taskSummary.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, taskSummary.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Comment", taskSummary.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, taskSummary.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", taskSummary.getActualOwner().getId());



&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task task = getClient().getTask(taskSummary.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(AccessType.Inline, task.getTaskData().getDocumentAccessType());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; long contentId = task.getTaskData().getDocumentContentId();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(contentId != -1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ByteArrayInputStream bis = new ByteArrayInputStream(getClient().getContent(contentId).getContent());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ObjectInputStream in = new ObjectInputStream(bis);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map data = (Map) in.readObject();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; in.close();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Checking that the input parameters are being copied automatically if the Content Element doesn't exist
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("MyObjectValue", ((MyObject) data.get("MyObject")).getValue());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("10", data.get("Priority"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("MyObjectValue", ((MyObject) ((Map) data.get("MyMap")).get("MyObjectInsideTheMap")).getValue());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(task.getId(), "Darth Vader");

&#160;&#160;&#160;&#160;&#160;&#160;&#160; ContentData result = new ContentData();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; result.setAccessType(AccessType.Inline);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; result.setType("java.lang.String");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ByteArrayOutputStream bos = new ByteArrayOutputStream();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ObjectOutputStream out = new ObjectOutputStream(bos);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.writeObject("This is the result");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.close();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; result.setContent(bos.toByteArray());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().complete(task.getId(), "Darth Vader", result);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map results = manager.getResults();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertNotNull(results);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", results.get("ActorId"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("This is the result", results.get("Result"));
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; public void testTaskCreateFailedWithLog() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (handler instanceof SyncWSHumanTaskHandler) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ((SyncWSHumanTaskHandler) handler).setAction(OnErrorAction.LOG);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "DoesNotExist");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setProcessInstanceId(10);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; handler.executeWorkItem(workItem, manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertFalse(manager.isAborted());
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; public void testTaskCreateFailedWithAbort() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (handler instanceof SyncWSHumanTaskHandler) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ((SyncWSHumanTaskHandler) handler).setAction(OnErrorAction.ABORT);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "DoesNotExist");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setProcessInstanceId(10);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; handler.executeWorkItem(workItem, manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.isAborted());
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; public void testTaskCreateFailedWithRethrow() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (handler instanceof SyncWSHumanTaskHandler) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ((SyncWSHumanTaskHandler) handler).setAction(OnErrorAction.RETHROW);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskName");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "Comment");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "DoesNotExist");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setProcessInstanceId(10);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; handler.executeWorkItem(workItem, manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; fail("Should fail due to OnErroAction set to rethrow");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Exception e) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // do nothing
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160; }

&#160;&#160;&#160; public void TODOtestOnAllSubTasksEndParentEndStrategy() throws Exception {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Create the parent task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameParent");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "CommentParent");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Set the subtask policy
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("SubTaskStrategies", "OnAllSubTasksEndParentEnd");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);


&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Test if the task is succesfully created
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary task = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskNameParent", task.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("CommentParent", task.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, task.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", task.getActualOwner().getId());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Create the child task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameChild1");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "CommentChild1");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ParentId", task.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Create the child task2
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task2");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameChild2");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "CommentChild2");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ParentId", task.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Start the parent task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(task.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the parent task is InProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task parentTask = getClient().getTask(task.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.InProgress, parentTask.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), parentTask.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Get all the subtask created for the parent task based on the potential owner
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List subTasks = getClient().getSubTasksAssignedAsPotentialOwner(parentTask.getId(), "Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(2, subTasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary subTaskSummary1 = subTasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary subTaskSummary2 = subTasks.get(1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertNotNull(subTaskSummary1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertNotNull(subTaskSummary2);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Starting the sub task 1
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(subTaskSummary1.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Starting the sub task 2
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(subTaskSummary2.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 1 is InProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task subTask1 = getClient().getTask(subTaskSummary1.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.InProgress, subTask1.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 2 is InProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task subTask2 = getClient().getTask(subTaskSummary2.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.InProgress, subTask2.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Complete the child task 1
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().complete(subTask1.getId(), "Darth Vader", null);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Complete the child task 2
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().complete(subTask2.getId(), "Darth Vader", null);
&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 1 is Completed

&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; subTask1 = getClient().getTask(subTask1.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Completed, subTask1.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 2 is Completed
&#160;&#160;&#160;&#160;&#160;&#160;&#160; subTask2 = getClient().getTask(subTask2.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Completed, subTask2.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Check is the parent task is Complete
&#160;&#160;&#160;&#160;&#160;&#160;&#160; parentTask = getClient().getTask(parentTask.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Completed, parentTask.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), parentTask.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
&#160;&#160;&#160; }

&#160;&#160;&#160; public void TODOtestOnParentAbortAllSubTasksEndStrategy() throws Exception {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemManager manager = new TestWorkItemManager();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.setWorkItemManager(manager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Create the parent task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; WorkItemImpl workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameParent");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "CommentParent");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Set the subtask policy
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("SubTaskStrategies", "OnParentAbortAllSubTasksEnd");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);


&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Test if the task is succesfully created
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = getClient().getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(1, tasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary task = tasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("TaskNameParent", task.getName());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(10, task.getPriority());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("CommentParent", task.getDescription());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Reserved, task.getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals("Darth Vader", task.getActualOwner().getId());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Create the child task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameChild1");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "CommentChild1");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ParentId", task.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Create the child task2
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem = new WorkItemImpl();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setName("Human Task2");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("TaskName", "TaskNameChild2");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Comment", "CommentChild2");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("Priority", "10");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ActorId", "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; workItem.setParameter("ParentId", task.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getHandler().executeWorkItem(workItem, manager);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Start the parent task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(task.getId(), "Darth Vader");

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the parent task is InProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task parentTask = getClient().getTask(task.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.InProgress, parentTask.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), parentTask.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Get all the subtask created for the parent task based on the potential owner
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List subTasks = getClient().getSubTasksAssignedAsPotentialOwner(parentTask.getId(), "Darth Vader", "en-UK");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(2, subTasks.size());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary subTaskSummary1 = subTasks.get(0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskSummary subTaskSummary2 = subTasks.get(1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertNotNull(subTaskSummary1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertNotNull(subTaskSummary2);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Starting the sub task 1
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(subTaskSummary1.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Starting the sub task 2
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().start(subTaskSummary2.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 1 is InProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task subTask1 = getClient().getTask(subTaskSummary1.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.InProgress, subTask1.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 2 is InProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Task subTask2 = getClient().getTask(subTaskSummary2.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.InProgress, subTask2.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Complete the parent task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; getClient().skip(parentTask.getId(), "Darth Vader");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 1 is Completed
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; subTask1 = getClient().getTask(subTaskSummary1.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Completed, subTask1.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Check if the child task 2 is Completed
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; subTask2 = getClient().getTask(subTaskSummary2.getId());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(Status.Completed, subTask2.getTaskData().getStatus());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());

&#160;&#160;&#160;&#160;&#160;&#160;&#160; assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
&#160;&#160;&#160; }

&#160;&#160;&#160; public void setHandler(WorkItemHandler handler) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.handler = handler;
&#160;&#160;&#160; }

&#160;&#160;&#160; public WorkItemHandler getHandler() {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return handler;
&#160;&#160;&#160; }

&#160;&#160;&#160; private class TestWorkItemManager implements WorkItemManager {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; private volatile boolean completed;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; private volatile boolean aborted;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; private volatile Map results;

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public synchronized boolean waitTillCompleted(long time) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!isCompleted()) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wait(time);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (InterruptedException e) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // swallow and return state of completed
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return isCompleted();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public synchronized boolean waitTillAborted(long time) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!isAborted()) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wait(time);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (InterruptedException e) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // swallow and return state of aborted
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return isAborted();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void abortWorkItem(long id) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; setAborted(true);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public synchronized boolean isAborted() {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return aborted;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; private synchronized void setAborted(boolean aborted) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.aborted = aborted;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; notifyAll();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void completeWorkItem(long id, Map results) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.results = results;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; setCompleted(true);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; private synchronized void setCompleted(boolean completed) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.completed = completed;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; notifyAll();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public synchronized boolean isCompleted() {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return completed;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public Map getResults() {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return results;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }

&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160; }
}</pre></div>

<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
    <p style="margin: 0;">Reply to this message by <a href="https://community.jboss.org/message/734940#734940">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in jBPM at <a href="https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034">Community</a></p>
</div></td>
                        </tr>
                    </tbody>
                </table>


                </td>
            </tr>
        </tbody>
    </table>

</div>

</body>
</html>