<!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="http://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: Human task API, how to move forward in the workflow ?
</h3>
<span style="margin-bottom: 10px;">
    created by <a href="http://community.jboss.org/people/jcharnet">John Augusto Charnet</a> in <i>jBPM</i> - <a href="http://community.jboss.org/message/615187#615187">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><p>Hi Demian,</p><p>not sure what type of configuration you want me to share.</p><p>If you need any other information, please let me know.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Spring 3.0.1</p><p>Jbpm 5.1.0-Final</p><p>JPA 1.2</p><p>Hibernate 3.3.2.GA</p><pre>/**
 * Todos os direitos reservados para Softway.
 *
 * Data de criacao: 27/06/2011 16:12:28
 */
package br.com.softcomex.components.workflow.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.transaction.TransactionManager;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.SystemEventListener;
import org.drools.SystemEventListenerFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.persistence.jpa.JPAKnowledgeService;
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.KnowledgeSessionConfiguration;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.process.ProcessInstance;
import org.drools.spi.ProcessContext;
import org.jbpm.process.audit.JPAProcessInstanceDbLog;
import org.jbpm.process.audit.JPAWorkingMemoryDbLogger;
import org.jbpm.process.workitem.wsht.CommandBasedWSHumanTaskHandler;
import org.jbpm.task.Status;
import org.jbpm.task.query.TaskSummary;
import org.jbpm.task.service.TaskClient;
import org.jbpm.task.service.TaskServer;
import org.jbpm.task.service.TaskService;
import org.jbpm.task.service.mina.MinaTaskClientConnector;
import org.jbpm.task.service.mina.MinaTaskClientHandler;
import org.jbpm.task.service.mina.MinaTaskServer;
import org.jbpm.task.service.responsehandlers.BlockingTaskOperationResponseHandler;
import org.jbpm.task.service.responsehandlers.BlockingTaskSummaryResponseHandler;

import br.com.softcomex.components.log.SfwLogger;
import br.com.softcomex.components.log.SfwLoggerFactory;
import br.com.softcomex.components.workflow.service.SfwJbpmWorkFlow;


/**
 * <p> 
 * Implementa&#231;&atilde;o da classe respons&#225;vel por criar o ambiente do JBPM.
 * </p> * @author <a class="jive-link-email-small" href="mailto:jcharnet@sfw.com.br">Jo&atilde;o Augusto Charnet</a> *
 */
public class SfwJbpmWorkFlowImpl implements SfwJbpmWorkFlow {

&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Log.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private SfwLogger sfwLogger = SfwLoggerFactory.getLogger(getClass());
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Entity Manager Factory injetado.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private EntityManagerFactory emf;
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Transa&#231;&atilde;o.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private TransactionManager transactionManager;
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Sess&atilde;o da base de conhecimento do JBPM.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private StatefulKnowledgeSession kSession;
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Thread do servidor de tarefa humana.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private TaskServer humanTaskServerThread;
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Porta do sevidor de tarefa humana.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private int humanTaskServerPort = -1;
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Endere&#231;o do Servidor de tarefa humana.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private String humanTaskServerLocalAddress = "127.0.0.1";
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Lista com os jbpm que precisa ser carregado.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private List workFlowResourcesList;

&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Respons&#225;vel por se comunicar com o servidor de tarefas humanas.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private TaskClient taskClient;
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Contexto do processo.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Construtor padr&atilde;o.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; public SfwJbpmWorkFlowImpl() {

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

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void prepareSession() {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (String resource : this.workFlowResourcesList) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; kbuilder.add(ResourceFactory.newClassPathResource(resource), ResourceType.BPMN2);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; KnowledgeBase kbase = kbuilder.newKnowledgeBase();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Environment env = KnowledgeBaseFactory.newEnvironment();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, this.emf);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; env.set(EnvironmentName.TRANSACTION_MANAGER,
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.transactionManager);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Human Task
&#160;&#160;&#160;&#160;&#160;&#160;&#160; SystemEventListener systemEventListener = SystemEventListenerFactory.getSystemEventListener();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskService taskService = new TaskService(this.emf, systemEventListener);
&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.startHumanTaskServer(taskService);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Properties properties = new Properties();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; properties.put("drools.processInstanceManagerFactory", "org.jbpm.persistence.processinstance.JPAProcessInstanceManagerFactory");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; properties.put("drools.processSignalManagerFactory", "org.jbpm.persistence.processinstance.JPASignalManagerFactory");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(properties);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; StatefulKnowledgeSession ksession =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; JPAKnowledgeService.newStatefulKnowledgeSession(kbase, config, env);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160; //this will log in audit tables
&#160;&#160;&#160;&#160;&#160;&#160;&#160; JPAWorkingMemoryDbLogger jpaWorkingMemoryLog = new JPAWorkingMemoryDbLogger(ksession);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; JPAProcessInstanceDbLog processLog = new JPAProcessInstanceDbLog(ksession.getEnvironment());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandBasedWSHumanTaskHandler humanTask = new CommandBasedWSHumanTaskHandler(ksession);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; humanTask.setConnection(this.humanTaskServerLocalAddress, this.humanTaskServerPort);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.getWorkItemManager().registerWorkItemHandler("Human Task", humanTask);
&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.setkSession(ksession);
&#160;&#160;&#160; }

&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Inicia o servidor para a tarefa humana.
&#160;&#160;&#160;&#160; * 
&#160;&#160;&#160;&#160; * @param taskService Servi&#231;o da tarefa.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private void startHumanTaskServer(TaskService taskService) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (this.humanTaskServerPort &lt;= 0) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.humanTaskServerPort = SfwJbpmWorkFlow.DEFAULT_HUMAN_TASK_SERVER_PORT;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwLogger.debug("Iniciando Human Task Server! ip [ " + this.humanTaskServerLocalAddress + "] port [" + this.humanTaskServerPort +"]");

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.humanTaskServerThread = new MinaTaskServer(taskService, this.humanTaskServerPort);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Thread thread = new Thread(this.humanTaskServerThread);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; thread.start();
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void stopHumanTaskServer() throws Exception {

&#160;&#160;&#160;&#160;&#160;&#160; if (this.humanTaskServerThread != null &amp;&amp; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.humanTaskServerThread.isRunning()) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.disconnect();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.humanTaskServerThread.stop();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwLogger.debug("Encerrando Human Task Server!");
&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void setHumanTaskServerPort(int humanTaskServerPort) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.humanTaskServerPort = humanTaskServerPort;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public int getHumanTaskServerPort() {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; return humanTaskServerPort;
&#160;&#160;&#160; }

&#160;&#160;&#160; 
&#160;&#160;&#160; @Override
&#160;&#160;&#160; public EntityManagerFactory getEmf() {
&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return emf;
&#160;&#160;&#160; }

&#160;&#160;&#160; 
&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void setEmf(EntityManagerFactory emf) {
&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.emf = emf;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void setkSession(StatefulKnowledgeSession kSession) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.kSession = kSession;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public StatefulKnowledgeSession getkSession() {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; return kSession;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void setTransactionManager(TransactionManager transactionManager) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.transactionManager = transactionManager;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public TransactionManager getTransactionManager() {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; return transactionManager;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public ProcessInstance startProcess(String processId, Map params) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; return this.kSession.startProcess(processId, params);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void setWorkFlowResourcesList(List workFlowResourcesList) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.workFlowResourcesList = workFlowResourcesList;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public List getWorkFlowResourcesList() {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; return workFlowResourcesList;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void addWorkFlowResource(String workFlowResource) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (this.workFlowResourcesList == null) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.workFlowResourcesList = new ArrayList();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.workFlowResourcesList.add(workFlowResource);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public String getHumanTaskServerLocalAddress() {
&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return humanTaskServerLocalAddress;
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void setHumanTaskServerLocalAddress(String humanTaskServerLocalAddress) {
&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.humanTaskServerLocalAddress = humanTaskServerLocalAddress;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public ProcessContext getProcessContext() {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; ProcessContext procContext = new ProcessContext(this.kSession);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return procContext;
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Cria um TaskClient conectando no servido de tarefa humana.
&#160;&#160;&#160;&#160; * @return TaskClient TaskClient.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private TaskClient createTaskClient() {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (this.taskClient == null) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient = new TaskClient(new MinaTaskClientConnector("SfwTaskClient", 
&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new MinaTaskClientHandler(SystemEventListenerFactory.getSystemEventListener())));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; boolean connected = this.taskClient.connect(this.humanTaskServerLocalAddress, this.humanTaskServerPort);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!connected) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwLogger.error("N&atilde;o foi poss&#237;vel conectar no servidor de tarefa humana. Server [" + this.humanTaskServerLocalAddress + "] - Port [" + this.humanTaskServerPort + "]");
&#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 this.taskClient;
&#160;&#160;&#160; }

&#160;&#160;&#160; 
&#160;&#160;&#160; @Override
&#160;&#160;&#160; public TaskClient getTaskClient() {
&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return taskClient;
&#160;&#160;&#160; }

&#160;&#160;&#160; 
&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void setTaskClient(TaskClient taskClient) {
&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient = taskClient;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public List getTasksByUser(String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClient();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskSummaryResponseHandler taskSummaryResponseHandler = 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new BlockingTaskSummaryResponseHandler();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.getTasksAssignedAsPotentialOwner(user, "en-UK", taskSummaryResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskSummaryResponseHandler.waitTillDone(oneSec);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = taskSummaryResponseHandler.getResults();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return tasks;

&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Cria uma TaskClient, caso necess&#225;rio e retorna um taskResponseHandler
&#160;&#160;&#160;&#160; * para se comunicar com o servidor de tarefa humana.
&#160;&#160;&#160;&#160; * 
&#160;&#160;&#160;&#160; * @return BlockingTaskOperationResponseHandler
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; private BlockingTaskOperationResponseHandler createTaskClientAndReturnTaskOperationResponseHandler() {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClient();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new BlockingTaskOperationResponseHandler();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return taskResponseHandler;
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void completeTask(List tasks, String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (TaskSummary task : tasks) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwLogger.debug("Completando tarefa [" + task.getName() + "] do usu&#225;rio [" + user + "]");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.completeTask(task, user);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void completeTask(TaskSummary task, String user) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.complete(task.getId(), user, null, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);

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

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void failTask(TaskSummary task, String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.fail(task.getId(), user, null, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void suspendTask(TaskSummary task, String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.suspend(task.getId(), user, taskResponseHandler);

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

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void startTask(TaskSummary task,
&#160;&#160;&#160;&#160;&#160;&#160;&#160; String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!task.getStatus().equals(Status.InProgress)) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.start(task.getId(), user, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);
&#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; @Override
&#160;&#160;&#160; public void stopTask(TaskSummary task,
&#160;&#160;&#160;&#160;&#160;&#160;&#160; String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.stop(task.getId(), user, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void releaseTask(TaskSummary task,
&#160;&#160;&#160;&#160;&#160;&#160;&#160; String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.release(task.getId(), user, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void resumeTask(TaskSummary task,
&#160;&#160;&#160;&#160;&#160;&#160;&#160; String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.resume(task.getId(), user, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void skipTask(TaskSummary task,
&#160;&#160;&#160;&#160;&#160;&#160;&#160; String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.skip(task.getId(), user, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160; }

&#160;&#160;&#160; @Override
&#160;&#160;&#160; public void claimTask(TaskSummary task,
&#160;&#160;&#160;&#160;&#160;&#160;&#160; String user) {

&#160;&#160;&#160;&#160;&#160;&#160;&#160; BlockingTaskOperationResponseHandler taskResponseHandler =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.createTaskClientAndReturnTaskOperationResponseHandler();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.taskClient.claim(task.getId(), user, taskResponseHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; final int oneSec = 1000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskResponseHandler.waitTillDone(oneSec);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160; }

}

</pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p><br/>Unit Test case</p><pre>/**
 * Todos os direitos reservados para Softway.
 *
 * Data de criacao: 28/06/2011 15:18:56
 */
package br.com.softcomex.components.workflow.service.impl;

import java.net.ConnectException;
import java.net.Socket;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

import junit.framework.Assert;

import org.drools.runtime.process.ProcessInstance;
import org.drools.runtime.process.WorkItem;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;
import org.drools.spi.ProcessContext;
import org.jbpm.task.query.TaskSummary;
import org.junit.BeforeClass;
import org.junit.Test;

import bitronix.tm.TransactionManagerServices;
import bitronix.tm.resource.jdbc.PoolingDataSource;
import br.com.softcomex.components.workflow.service.SfwJbpmWorkFlow;
import br.com.softcomex.test.serviceeao.SfwBaseServiceTestCase;


/**
 * Classe de teste do servi&#231;o SfwJbmWorkFlowImpl.
 * 
 * @author <a class="jive-link-email-small" href="mailto:jcharnet@sfw.com.br">Jo&atilde;o Augusto Charnet</a> *
 */
public class SfwJbpmWorkFlowImplTest extends SfwBaseServiceTestCase {

&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Servi&#231;o.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; @Inject
&#160;&#160;&#160; private SfwJbpmWorkFlow sfwWorkFlow;

&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Prepara o datasource.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; @BeforeClass
&#160;&#160;&#160; public static void prepareDatasource() {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; PoolingDataSource ds = new PoolingDataSource();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.setUniqueName("localDataSource");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.setClassName("oracle.jdbc.xa.client.OracleXADataSource");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.setMaxPoolSize(3);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.setAllowLocalTransactions(true);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ResourceBundle rb = ResourceBundle.getBundle("jdbc");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.getDriverProperties().put("user", rb.getString("jdbc.username"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.getDriverProperties().put("password", rb.getString("jdbc.password"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.getDriverProperties().put("URL", rb.getString("jdbc.url"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ds.init();
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; /**
&#160;&#160;&#160;&#160; * Teste.
&#160;&#160;&#160;&#160; * @throws Exception Exce&#231;&atilde;o.
&#160;&#160;&#160;&#160; */
&#160;&#160;&#160; @Test
&#160;&#160;&#160; public void testJbpmWorkFlow() throws Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.setTransactionManager(TransactionManagerServices.getTransactionManager());
this.sfwWorkFlow.getTransactionManager().begin();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //this.sfwWorkFlow.setHumanTaskServerPort(1234);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.addWorkFlowResource("test.bpmn");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.addWorkFlowResource("testHumanTask.bpmn");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.prepareSession();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; MyAutomaticHumanSimulatorWorkItemHandler workHandler = new MyAutomaticHumanSimulatorWorkItemHandler();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //this.sfwWorkFlow.getkSession().getWorkItemManager().registerWorkItemHandler("Human Task", workHandler);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Socket socket = new Socket("127.0.0.1", this.sfwWorkFlow.getHumanTaskServerPort());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.assertNotNull(socket);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map params = new HashMap();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; params.put("ator", "Joao");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; params.put("responsible", "Joao");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; //ProcessInstance processInstance = this.sfwWorkFlow.startProcess("test.bpmn", params);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ProcessInstance processInstance = this.sfwWorkFlow.startProcess("testHumanTask", params);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Thread.currentThread().sleep(3000);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; List tasks = this.sfwWorkFlow.getTasksByUser("John");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.startTask(tasks.get(0), "John");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.completeTask(tasks.get(0), "John");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Thread.currentThread().sleep(5000);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.stopHumanTaskServer();
&#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; socket = new Socket("127.0.0.1", this.sfwWorkFlow.getHumanTaskServerPort());
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.fail("Esperando exce&#231;&atilde;o, por n&atilde;o ter ningu&eacute;m escutando na porta do sevidor " + this.sfwWorkFlow.getHumanTaskServerPort());
&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (ConnectException excep) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.assertTrue(true);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; } finally {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.sfwWorkFlow.getTransactionManager().rollback();
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160; }
&#160;&#160;&#160; 
&#160;&#160;&#160; 
}

</pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p><a href="http://community.jboss.org/servlet/JiveServlet/showImage/2-615187-16726/testHumanTask.JPG"><span> http://community.jboss.org/servlet/JiveServlet/downloadImage/2-615187-16726/408-442/testHumanTask.JPG </span></a></p><p>jbpm xml </p><pre>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;?xml version="1.0" encoding="UTF-8"?&gt;&#160; 
&lt;definitions id="Definition"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; targetNamespace="http://www.jboss.org/drools"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; typeLanguage="http://www.java.com/javaTypes"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; expressionLanguage="http://www.mvel.org/2.0"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xs:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:g="http://www.jboss.org/drools/flow/gpd"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:tns="http://www.jboss.org/drools"&gt; 

&#160; &lt;itemDefinition id="_responsibleItem" structureRef="String" /&gt; 

&#160; &lt;process processType="Private" isExecutable="true" id="testHumanTask" name="testHumanTask" &gt; 

&#160;&#160;&#160; &lt;!-- process variables --&gt; 
&#160;&#160;&#160; &lt;property id="responsible" itemSubjectRef="_responsibleItem"/&gt; 

&#160;&#160;&#160; &lt;!-- nodes --&gt; 
&#160;&#160;&#160; &lt;startEvent id="_1" name="Start" /&gt; 
&#160;&#160;&#160; &lt;userTask id="_2" name="User Task" &gt; 
&#160;&#160;&#160;&#160;&#160; &lt;ioSpecification&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dataInput id="_2_TaskNameInput" name="TaskName" /&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;inputSet&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dataInputRefs&gt; _2_TaskNameInput&lt;/dataInputRefs&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/inputSet&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;outputSet&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/outputSet&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/ioSpecification&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;dataInputAssociation&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;targetRef&gt; _2_TaskNameInput&lt;/targetRef&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;assignment&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;from xs:type="tFormalExpression"&gt; Test Human Task&lt;/from&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;to xs:type="tFormalExpression"&gt; _2_TaskNameInput&lt;/to&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/assignment&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/dataInputAssociation&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;potentialOwner&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;resourceAssignmentExpression&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;formalExpression&gt; #{responsible}&lt;/formalExpression&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/resourceAssignmentExpression&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/potentialOwner&gt; 
&#160;&#160;&#160; &lt;/userTask&gt; 
&#160;&#160;&#160; &lt;scriptTask id="_3" name="Script" scriptFormat="http://www.java.com/java" &gt; 
&#160;&#160;&#160;&#160;&#160; &lt;script&gt; System.out.println("Script task :" + new java.util.Date());&lt;/script&gt; 
&#160;&#160;&#160; &lt;/scriptTask&gt; 
&#160;&#160;&#160; &lt;endEvent id="_4" name="End" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;terminateEventDefinition/&gt; 
&#160;&#160;&#160; &lt;/endEvent&gt; 

&#160;&#160;&#160; &lt;!-- connections --&gt; 
&#160;&#160;&#160; &lt;sequenceFlow id="_1-_2" sourceRef="_1" targetRef="_2" /&gt; 
&#160;&#160;&#160; &lt;sequenceFlow id="_2-_3" sourceRef="_2" targetRef="_3" /&gt; 
&#160;&#160;&#160; &lt;sequenceFlow id="_3-_4" sourceRef="_3" targetRef="_4" /&gt; 

&#160; &lt;/process&gt; 

&#160; &lt;bpmndi:BPMNDiagram&gt; 
&#160;&#160;&#160; &lt;bpmndi:BPMNPlane bpmnElement="testHumanTask" &gt; 
&#160;&#160;&#160;&#160;&#160; &lt;bpmndi:BPMNShape bpmnElement="_1" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dc:Bounds x="51" y="34" width="48" height="48" /&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/bpmndi:BPMNShape&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;bpmndi:BPMNShape bpmnElement="_2" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dc:Bounds x="165" y="35" width="100" height="48" /&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/bpmndi:BPMNShape&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;bpmndi:BPMNShape bpmnElement="_3" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dc:Bounds x="176" y="158" width="80" height="48" /&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/bpmndi:BPMNShape&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;bpmndi:BPMNShape bpmnElement="_4" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dc:Bounds x="191" y="301" width="48" height="48" /&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/bpmndi:BPMNShape&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;bpmndi:BPMNEdge bpmnElement="_1-_2" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;di:waypoint x="75" y="58" /&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;di:waypoint x="215" y="59" /&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/bpmndi:BPMNEdge&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;bpmndi:BPMNEdge bpmnElement="_2-_3" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;di:waypoint x="215" y="59" /&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;di:waypoint x="216" y="182" /&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/bpmndi:BPMNEdge&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;bpmndi:BPMNEdge bpmnElement="_3-_4" &gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;di:waypoint x="216" y="182" /&gt; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;di:waypoint x="215" y="325" /&gt; 
&#160;&#160;&#160;&#160;&#160; &lt;/bpmndi:BPMNEdge&gt; 
&#160;&#160;&#160; &lt;/bpmndi:BPMNPlane&gt; 
&#160; &lt;/bpmndi:BPMNDiagram&gt; 

&lt;/definitions&gt;&#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;&#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;&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="http://community.jboss.org/message/615187#615187">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in jBPM at <a href="http://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>