<!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: Integrating jBPM 5 into web application - architecture
</h3>
<span style="margin-bottom: 10px;">
    created by <a href="https://community.jboss.org/people/joploya">Sandra Renaud</a> in <i>jBPM</i> - <a href="https://community.jboss.org/message/796530#796530">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><p>Hello Lisa and Anand,</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I can't give you my application but this is the relevant code concerning the task management :</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I use maven so I have these dependencies in the POM :</p><blockquote class="jive-quote"><p>&lt;!-- jbpm --&gt;</p><p>&#160;&#160;&#160;&#160; &lt;dependency&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.drools&lt;/groupId&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;artifactId&gt;drools-compiler&lt;/artifactId&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;version&gt;5.4.0.Final&lt;/version&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/dependency&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;dependency&gt;</p><p>&#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;&lt;groupId&gt;org.jbpm&lt;/groupId&gt;</p><p>&#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;&lt;artifactId&gt;jbpm-bpmn2&lt;/artifactId&gt;</p><p>&#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;&lt;version&gt;5.4.0.Final&lt;/version&gt;</p><p>&#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;&lt;exclusions&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;</p><p>&#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; &lt;groupId&gt;dom4j&lt;/groupId&gt;</p><p>&#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; &lt;artifactId&gt;dom4j&lt;/artifactId&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/dependency&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;dependency&gt;</p><p>&#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;&lt;groupId&gt;org.jbpm&lt;/groupId&gt;</p><p>&#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;&lt;artifactId&gt;jbpm-flow&lt;/artifactId&gt;</p><p>&#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;&lt;version&gt;5.4.0.Final&lt;/version&gt;</p><p>&#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;&lt;exclusions&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;</p><p>&#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; &lt;groupId&gt;dom4j&lt;/groupId&gt;</p><p>&#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; &lt;artifactId&gt;dom4j&lt;/artifactId&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/dependency&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;dependency&gt;</p><p>&#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;&lt;groupId&gt;org.jbpm&lt;/groupId&gt;</p><p>&#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;&lt;artifactId&gt;jbpm-human-task-core&lt;/artifactId&gt;</p><p>&#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;&lt;version&gt;5.4.0.Final&lt;/version&gt;</p><p>&#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;&lt;exclusions&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;</p><p>&#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; &lt;groupId&gt;dom4j&lt;/groupId&gt;</p><p>&#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; &lt;artifactId&gt;dom4j&lt;/artifactId&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/dependency&gt;</p></blockquote><p>Then, the two java classes :</p><blockquote class="jive-quote"><p>import java.io.InputStream;</p><p>import java.io.InputStreamReader;</p><p>import java.io.Reader;</p><p>import java.io.Serializable;</p><p>import java.util.ArrayList;</p><p>import java.util.HashMap;</p><p>import java.util.List;</p><p>import java.util.Map;</p><p>import java.util.Properties;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>import javax.annotation.PostConstruct;</p><p>import javax.ejb.LocalBean;</p><p>import javax.ejb.Stateless;</p><p>import javax.enterprise.context.ApplicationScoped;</p><p>import javax.enterprise.inject.Produces;</p><p>import javax.persistence.EntityManagerFactory;</p><p>import javax.persistence.PersistenceUnit;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>import org.drools.KnowledgeBase;</p><p>import org.drools.SystemEventListenerFactory;</p><p>import org.drools.builder.KnowledgeBuilder;</p><p>import org.drools.builder.KnowledgeBuilderFactory;</p><p>import org.drools.builder.ResourceType;</p><p>import org.drools.io.Resource;</p><p>import org.drools.io.ResourceFactory;</p><p>import org.drools.logger.KnowledgeRuntimeLogger;</p><p>import org.drools.logger.KnowledgeRuntimeLoggerFactory;</p><p>import org.drools.runtime.EnvironmentName;</p><p>import org.drools.runtime.StatefulKnowledgeSession;</p><p>import org.jbpm.process.workitem.email.EmailWorkItemHandler;</p><p>import org.jbpm.task.Group;</p><p>import org.jbpm.task.User;</p><p>import org.jbpm.task.identity.UserGroupCallbackManager;</p><p>import org.jbpm.task.service.TaskService;</p><p>import org.jbpm.task.service.TaskServiceSession;</p><p>import org.slf4j.Logger;</p><p>import org.slf4j.LoggerFactory;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>//import static org.junit.Assert.*;</p><p>@Stateless</p><p>@LocalBean</p><p>public class KnowledgeSessionProducer implements Serializable{</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private static final long serialVersionUID = -4494168896880405667L;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private Logger log = LoggerFactory.getLogger(KnowledgeSessionProducer.class);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private KnowledgeRuntimeLogger logger;</p><p>&#160; </p><p>&#160;&#160;&#160; @PersistenceUnit(unitName = "org.jbpm.task")</p><p>&#160;&#160;&#160; private EntityManagerFactory emf;</p><p>&#160; </p><p>&#160;&#160;&#160; public @PostConstruct void init(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;log.debug("init of KnowledgeSessionProducer ...");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;TaskService taskService = new TaskService(emf, SystemEventListenerFactory.getSystemEventListener());</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskServiceSession taskSession = taskService.createSession();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Add users</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; @SuppressWarnings("rawtypes")</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Map vars = new HashMap();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; InputStream usersin = KnowledgeSessionProducer.class.getResourceAsStream( "/LoadUsers.mvel" );</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(usersin != null) {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;Reader reader = new InputStreamReader( usersin );&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;@SuppressWarnings("unchecked")</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;Map&lt;String, User&gt; users = ( Map&lt;String, User&gt; ) TaskService.eval( reader, vars );&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;log.debug("Users to load in db : ...");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;for ( User user : users.values() ) {</p><p>&#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;taskSession.addUser( user );</p><p>&#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;log.debug(" - "+user);</p><p>&#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; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; InputStream groupsin = KnowledgeSessionProducer.class.getResourceAsStream( "/LoadGroups.mvel" );</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(groupsin != null) {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;Reader reader = new InputStreamReader( groupsin );&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;@SuppressWarnings("unchecked")</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;Map&lt;String, Group&gt; groups = ( Map&lt;String, Group&gt; ) TaskService.eval( reader, vars );&#160;&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;log.debug("Groups to load in db : ...");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;for ( Group group : groups.values() ) {</p><p>&#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;taskSession.addGroup( group );</p><p>&#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;log.debug(" - "+group);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // try to get the usergroup callback properties</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; InputStream usergroupsin = KnowledgeSessionProducer.class.getResourceAsStream(&#160; "/jbpm.usergroup.callback.properties" );</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(usergroupsin != null) {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;Properties callbackproperties = new Properties();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;try {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Properties.load(Reader) is a JDK 6 method</p><p>&#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;callbackproperties.load(usergroupsin);</p><p>&#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;UserGroupCallbackManager.getInstance().setCallbackFromProperties(callbackproperties);</p><p>&#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;System.out.println("Task service registered usergroup callback ...");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;} catch (Exception e) {</p><p>&#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;System.out.println("Task service unable to register usergroup callback ...");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; taskSession.dispose();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("Task service started correctly!");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("Task service running ...");</p><p>&#160;&#160;&#160; }</p><p>&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;@Produces</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;@ApplicationScoped</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public StatefulKnowledgeSession produceKnowledgeSession(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;log.debug("produce the KnowledgeSession ...");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//Create the knowledgeBase</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/*This factory is used to build the knowledge base resources that are held collectively in KnowledgePackages.*/</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();</p><p>&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//Add all processes to the knowledgeBuilder</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;List&lt;Resource&gt; resources = getProcessDefinitionList();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (Resource resource : resources) {</p><p>&#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;kbuilder.add(resource, ResourceType.BPMN2);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/*Create a new KnowledgeBase from the knowledge packages that have been added to this builder. </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * An exception is thrown if there are any errors.*/</p><p>//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;assertFalse( kbuilder.hasErrors() );</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ( kbuilder.hasErrors() ) {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; log.error( kbuilder.getErrors().toString() );</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KnowledgeBase kbase = kbuilder.newKnowledgeBase();</p><p>&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/*Create a new StatefulKnowledgeSession using the default session configuration. </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * Don't forget to dispose() session when you are done.</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * StatefulKnowledgeSession is the most common way to interact with the engine. </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * A StatefulKnowledgeSession allows the application to establish an iterative conversation with the engine, </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * where the state of the session is kept across invocations.*/</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();</p><p>&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; logger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession, "loggerFile", 1000);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; /*A work item manager is responsible for finding the right work item handler when a work item should be executed </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * and should be notified when this work item has been completed (or aborted).</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * Register the given handler for all work items of the given type of work </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * This part is done in the LocalHumanTaskService*/</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p><p>//&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler );</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksession.getEnvironment().set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; /*</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * Register WorkItem Handler for Email</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; //EmailWorkItemHandler emailHandler =&#160; new EmailWorkItemHandler();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; //ksession.getWorkItemManager().registerWorkItemHandler("Email", emailHandler);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return ksession;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public KnowledgeRuntimeLogger getLogger(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return this.logger;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private List&lt;Resource&gt; getProcessDefinitionList(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;List&lt;Resource&gt; resourceList = new ArrayList&lt;&gt;();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;resourceList.add(ResourceFactory.newClassPathResource("workflows/MyFlow.bpmn2"));</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * TODO </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * add all other process here</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return resourceList;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p></blockquote><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><blockquote class="jive-quote"><p>import javax.annotation.PostConstruct;</p><p>import javax.enterprise.context.SessionScoped;</p><p>import javax.enterprise.event.Event;</p><p>import javax.faces.application.FacesMessage;</p><p>import javax.faces.context.FacesContext;</p><p>import javax.inject.Inject;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>import org.drools.runtime.StatefulKnowledgeSession;</p><p>import org.jboss.seam.security.Identity;</p><p>import org.drools.runtime.process.ProcessInstance;</p><p>import org.jbpm.task.Status;</p><p>import org.jbpm.task.query.TaskSummary;</p><p>import org.jbpm.task.service.local.LocalHumanTaskService;</p><p>import org.jbpm.workflow.instance.WorkflowProcessInstance;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>import com.st.ams.tools.ClaimEventListener;</p><p>import com.ste.ws.authentication.seam.api.UserLDAP;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>/**</p><p> * Linked to the task management view</p><p> *</p><p> */</p><p>public @Named @SessionScoped class TaskManager implements Serializable{</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private static final long serialVersionUID = 7768657778155604411L;</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;protected @Inject Identity identity;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private @Inject StatefulKnowledgeSession kSession;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private @Inject Event&lt;ClaimEventListener&gt; event;</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private List&lt;Status&gt; listStatus = new ArrayList&lt;Status&gt;();</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public org.jbpm.task.TaskService getTaskService(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return LocalHumanTaskService.getTaskService(kSession);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private List&lt;TaskSummary&gt; userTaskList = new ArrayList&lt;TaskSummary&gt;();</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private Map&lt;String, List&lt;TaskSummary&gt;&gt; groupTaskMap = new HashMap&lt;String, List&lt;TaskSummary&gt;&gt;();</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private TaskSummary manageTask;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private List&lt;String&gt; groups;</p><p>&#160; </p><p>&#160; </p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public @PostConstruct void init(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println("init task manager ...");</p><p>&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//Load user tasks</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;listStatus.clear();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;listStatus.add(Status.Reserved);listStatus.add(Status.InProgress);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println("load task list for user : "+((UserLDAP)identity.getUser()).getUser().getLogin());</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;userTaskList = new ArrayList&lt;TaskSummary&gt;(getTaskService().getTasksAssignedAsPotentialOwnerByStatus(</p><p>&#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;((UserLDAP)identity.getUser()).getUser().getLogin(), </p><p>&#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;listStatus, </p><p>&#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;"en-UK"));</p><p>&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//Load groups and tasks for each group</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;groups = new ArrayList&lt;String&gt;();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(String grp : ((UserLDAP)identity.getUser()).getUser().getGroups()){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; groups.add(grp);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; groupTaskMap.put(grp, getGroupTasks(grp));</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public List&lt;TaskSummary&gt; getUserTaskList() {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if((userTaskList == null) || userTaskList.isEmpty()){</p><p>&#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;listStatus.clear();</p><p>&#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;listStatus.add(Status.Reserved);listStatus.add(Status.InProgress);</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Trick because UserGroupCallBackImpl is not properly implemented</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //TODO correction</p><p>&#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;Set&lt;TaskSummary&gt; set = new HashSet&lt;TaskSummary&gt;(getTaskService().getTasksAssignedAsPotentialOwnerByStatus(</p><p>&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;((UserLDAP)identity.getUser()).getUser().getLogin(), </p><p>&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;listStatus, </p><p>&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;"en-UK"));</p><p>&#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;userTaskList = new ArrayList&lt;TaskSummary&gt;(set);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return userTaskList;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * In order to refresh the user task list</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * This function allow to clear the content of the list</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void clearUserTaskList(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;userTaskList.clear();</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * In order to refresh the groups task list</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * This function allow to clear the content of all lists</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void clearAllGroupTaskList(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;List&lt;String&gt; keys = new ArrayList&lt;&gt;(groupTaskMap.keySet());</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(String grp : keys){</p><p>&#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;clearGroupTaskList(grp);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * In order to refresh the group task list</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * This function allow to clear the content of the list</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void clearGroupTaskList(String group){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;groupTaskMap.put(group, null);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * return all group tasks available for the user</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @return List&lt;TaskSummary&gt;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public List&lt;TaskSummary&gt; getAllGroupTaskList() {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;List&lt;TaskSummary&gt; allGroupTask = new ArrayList&lt;TaskSummary&gt;();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Iterable&lt;List&lt;TaskSummary&gt;&gt; mapValues = groupTaskMap.values();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(List&lt;TaskSummary&gt; entry : mapValues){</p><p>&#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;allGroupTask.addAll(entry);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return allGroupTask;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public List&lt;String&gt; getUserGroups(){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if((groups == null) || groups.isEmpty()){</p><p>&#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;groups = new ArrayList&lt;String&gt;();</p><p>&#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;for(String grp : ((UserLDAP)identity.getUser()).getUser().getGroups()){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="font-size: 10pt;"> groups.add(grp);</span></p><p>&#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;}</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return groups;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * return tasks available for the group</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param group</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @return List&lt;TaskSummary&gt;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public List&lt;TaskSummary&gt; getGroupTaskList(String group){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if((groupTaskMap.get(group) == null) || groupTaskMap.get(group).isEmpty()){</p><p>&#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;groupTaskMap.put(group, getGroupTasks(group));</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return groupTaskMap.get(group);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * return tasks available for the group</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param group</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @return List&lt;TaskSummary&gt;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public List&lt;TaskSummary&gt; getGroupTasks(String group){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;listStatus.clear();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;listStatus.add(Status.Ready);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Trick because UserGroupCallBackImpl is not properly implemented</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //TODO correction</p><p><span style="font-size: 10pt;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Set&lt;TaskSummary&gt; set = new HashSet&lt;TaskSummary&gt;(getTaskService().getTasksAssignedAsPotentialOwnerByStatus(group, listStatus, "en-UK"));</span></p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return new ArrayList&lt;TaskSummary&gt;(set);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void removeGroup(String group){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;groups.remove(group);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void addGroup(String group){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if((group != null) &amp;&amp; !group.isEmpty())</p><p>&#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;groups.add(group);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void addGroupTask(String group){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;groupTaskMap.put(group, getGroupTasks(group));</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * Start a new processInstance of an existing Process</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * and set the variables of this instance</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param processId, map of variables, id of the requestor</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @return ProcessInstance created</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public ProcessInstance startProcess(String processId, Map&lt;String, Object&gt; parameters){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ProcessInstance p = kSession.startProcess(processId,parameters);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return p;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * Return the WorkflowProcessInstance associated to a Task</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * This instance allow to access the map of variables</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @return WorkflowProcessInstance managed</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public WorkflowProcessInstance getWorkflowProcessInstance(long processInstanceId){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return (WorkflowProcessInstance)kSession.getProcessInstance(processInstanceId);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * Start a new processInstance of an existing Process</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param processId</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @return ProcessInstance created</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public ProcessInstance startProcess(String processId){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return kSession.startProcess(processId);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * When a user claim a task, the task go to RESERVED state</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * Then we call start and the task goes to IN_PROGRESS state</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * and is not visible for others</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param task</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void claimTask(TaskSummary task){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;addMessage("task "+task.getId()+" claimed");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setManageTask(task);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;getTaskService().claim(task.getId(), </p><p>&#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;((UserLDAP)identity.getUser()).getUser().getLogin());</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;getTaskService().start(task.getId(), ((UserLDAP)identity.getUser()).getUser().getLogin());</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;event.fire(new ClaimEventListener());</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * return a task to group task</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param task</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void revokeTask(TaskSummary task){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;addMessage("task "+task.getId()+" revoked");</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setManageTask(task);</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;getTaskService().release(task.getId(), </p><p>&#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;((UserLDAP)identity.getUser()).getUser().getLogin());</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void completeTask(TaskSummary task, Object results){</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;getTaskService().completeWithResults(task.getId(), </p><p>&#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;((UserLDAP)identity.getUser()).getUser().getLogin(), results);</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p>&#160; </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * The current manage task</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @return TaskSummary</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public TaskSummary getManageTask() {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return manageTask;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * Set the currently manage task </p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * (save it during the session)</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param manageTask</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;private void setManageTask(TaskSummary manageTask) {</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.manageTask = manageTask;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;/**</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * faces message rendered</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; * @param message to display</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; */</p><p>&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;public void addMessage(String summary) {&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary,&#160; null);&#160; </p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; FacesContext.getCurrentInstance().addMessage(null, message);&#160; </p><p>&#160;&#160;&#160; } </p><p>&#160; </p><p>}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p></blockquote><p>You have to implement the UserGroupCallBackImpl. (See the doc for that : <a class="jive-link-external-small" href="http://docs.jboss.org/jbpm/v5.4/userguide/ch.human-tasks.html#d0e5419">http://docs.jboss.org/jbpm/v5.4/userguide/ch.human-tasks.html#d0e5419</a>)</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="margin-bottom: .0001pt;"><span style="font-size: 10pt; font-family: Arial, sans-serif;">You have to register your implementation of usergroupcallback by creating a file jbpm.usergroup.callback.properties in the folder resources.</span></p><p style="margin-bottom: .0001pt;"><blockquote class="jive-quote"><span style="font-family: Arial, sans-serif; font-size: 10pt;">jbpm.usergroup.callback=com.your.package.path.with.dot.MyUserGroupCallbackImpl</span></blockquote></p><p style="margin-bottom: .0001pt;"> <a href="https://community.jboss.org/servlet/JiveServlet/showImage/2-796530-20279/resources.png"><span> https://community.jboss.org/servlet/JiveServlet/downloadImage/2-796530-20279/252-141/resources.png </span></a></p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>The persistence.xml must be configured like this :</p></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/796530#796530">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>