Workflow Service:

1) Fix bug in retrieving completed tasks for an authority - unfortunately, this is not provided OOTB by jBPM!, so extended in their recommended way
2) Support for creating a Workflow Package (a container of content that's routed through the workflow) - can create a new container or provide an existing one (e.g. a versioned folder, layered folder).  Provide appropriate patch for creating workflow system folder in repository etc.
3) Collapsed WorkflowDefinitionComponent into WorkflowComponent interface

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3522 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
David Caruana
2006-08-15 18:14:27 +00:00
parent b29838ab8f
commit 86d5ef460c
20 changed files with 497 additions and 173 deletions

View File

@@ -34,7 +34,6 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.workflow.BPMEngine;
import org.alfresco.repo.workflow.TaskComponent;
import org.alfresco.repo.workflow.WorkflowComponent;
import org.alfresco.repo.workflow.WorkflowDefinitionComponent;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.dictionary.AspectDefinition;
@@ -55,6 +54,8 @@ import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.proxy.HibernateProxy;
import org.jbpm.JbpmContext;
import org.jbpm.JbpmException;
@@ -81,7 +82,7 @@ import org.springmodules.workflow.jbpm31.JbpmTemplate;
* @author davidc
*/
public class JBPMEngine extends BPMEngine
implements WorkflowDefinitionComponent, WorkflowComponent, TaskComponent
implements WorkflowComponent, TaskComponent
{
// Implementation dependencies
protected DictionaryService dictionaryService;
@@ -91,6 +92,16 @@ public class JBPMEngine extends BPMEngine
protected PersonService personService;
private JbpmTemplate jbpmTemplate;
// Note: jBPM query which is not provided out-of-the-box
// TODO: Check jBPM 3.2 and get this implemented in jBPM
private final static String COMPLETED_TASKS_QUERY =
"select ti " +
"from org.jbpm.taskmgmt.exe.TaskInstance as ti " +
"where ti.actorId = :actorId " +
"and ti.isOpen = false " +
"and ti.end is not null";
/**
* Sets the JBPM Template used for accessing JBoss JBPM in the correct context
*
@@ -528,27 +539,61 @@ public class JBPMEngine extends BPMEngine
public List<WorkflowTask> doInJbpm(JbpmContext context)
{
// retrieve tasks assigned to authority
TaskMgmtSession taskSession = context.getTaskMgmtSession();
List<TaskInstance> tasks = taskSession.findTaskInstances(authority);
List<TaskInstance> tasks;
if (state.equals(WorkflowTaskState.IN_PROGRESS))
{
TaskMgmtSession taskSession = context.getTaskMgmtSession();
tasks = taskSession.findTaskInstances(authority);
}
else
{
// Note: This method is not implemented by jBPM
tasks = findCompletedTaskInstances(context, authority);
}
// convert tasks to appropriate service response format
List<WorkflowTask> workflowTasks = new ArrayList<WorkflowTask>(tasks.size());
for (TaskInstance task : tasks)
{
if (getWorkflowTaskState(task).equals(state))
{
WorkflowTask workflowTask = createWorkflowTask(task);
workflowTasks.add(workflowTask);
}
WorkflowTask workflowTask = createWorkflowTask(task);
workflowTasks.add(workflowTask);
}
return workflowTasks;
}
/**
* Gets the completed task list for the specified actor
*
* TODO: This method provides a query that's not in JBPM! Look to have JBPM implement this.
*
* @param jbpmContext the jbpm context
* @param actorId the actor to retrieve tasks for
* @return the tasks
*/
private List findCompletedTaskInstances(JbpmContext jbpmContext, String actorId)
{
List result = null;
try
{
Session session = jbpmContext.getSession();
Query query = session.createQuery(COMPLETED_TASKS_QUERY);
query.setString("actorId", actorId);
result = query.list();
}
catch (Exception e)
{
throw new JbpmException("Couldn't get completed task instances list for actor '" + actorId + "'", e);
}
return result;
}
});
}
catch(JbpmException e)
{
throw new WorkflowException("Failed to retrieve tasks assigned to authority '" + authority + "'", e);
throw new WorkflowException("Failed to retrieve tasks assigned to authority '" + authority + "' in state '" + state + "'", e);
}
}
/* (non-Javadoc)
* @see org.alfresco.repo.workflow.TaskComponent#getPooledTasks(java.util.List)
*/

View File

@@ -28,7 +28,6 @@ import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.workflow.BPMEngineRegistry;
import org.alfresco.repo.workflow.TaskComponent;
import org.alfresco.repo.workflow.WorkflowComponent;
import org.alfresco.repo.workflow.WorkflowDefinitionComponent;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -53,7 +52,6 @@ import org.springframework.core.io.ClassPathResource;
*/
public class JBPMEngineTest extends BaseSpringTest
{
WorkflowDefinitionComponent workflowDefinitionComponent;
WorkflowComponent workflowComponent;
TaskComponent taskComponent;
WorkflowDefinition testWorkflowDef;
@@ -64,18 +62,17 @@ public class JBPMEngineTest extends BaseSpringTest
protected void onSetUpInTransaction() throws Exception
{
BPMEngineRegistry registry = (BPMEngineRegistry)applicationContext.getBean("bpm_engineRegistry");
workflowDefinitionComponent = registry.getWorkflowDefinitionComponent("jbpm");
workflowComponent = registry.getWorkflowComponent("jbpm");
taskComponent = registry.getTaskComponent("jbpm");
// deploy test process definition
ClassPathResource processDef = new ClassPathResource("org/alfresco/repo/workflow/jbpm/test_processdefinition.xml");
assertFalse(workflowDefinitionComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML));
testWorkflowDef = workflowDefinitionComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
assertFalse(workflowComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML));
testWorkflowDef = workflowComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
assertNotNull(testWorkflowDef);
assertEquals("Test", testWorkflowDef.name);
assertEquals("1", testWorkflowDef.version);
assertTrue(workflowDefinitionComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML));
assertTrue(workflowComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML));
// get valid node ref
NodeService nodeService = (NodeService)applicationContext.getBean(ServiceRegistry.NODE_SERVICE.getLocalName());
@@ -85,7 +82,7 @@ public class JBPMEngineTest extends BaseSpringTest
public void testGetWorkflowDefinitions()
{
List<WorkflowDefinition> workflowDefs = workflowDefinitionComponent.getDefinitions();
List<WorkflowDefinition> workflowDefs = workflowComponent.getDefinitions();
assertNotNull(workflowDefs);
assertTrue(workflowDefs.size() > 0);
}
@@ -94,7 +91,7 @@ public class JBPMEngineTest extends BaseSpringTest
public void testDeployWorkflow() throws Exception
{
ClassPathResource processDef = new ClassPathResource("org/alfresco/repo/workflow/jbpm/test_processdefinition.xml");
testWorkflowDef = workflowDefinitionComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
testWorkflowDef = workflowComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
assertNotNull(testWorkflowDef);
assertEquals("Test", testWorkflowDef.name);
assertEquals("2", testWorkflowDef.version);
@@ -343,8 +340,13 @@ public class JBPMEngineTest extends BaseSpringTest
WorkflowTask updatedTask = taskComponent.endTask(tasks1.get(0).id, null);
assertNotNull(updatedTask);
assertEquals(WorkflowTaskState.COMPLETED, updatedTask.state);
List<WorkflowTask> completedTasks = taskComponent.getAssignedTasks("System", WorkflowTaskState.COMPLETED);
assertNotNull(completedTasks);
assertEquals(1, completedTasks.size());
assertEquals(WorkflowTaskState.COMPLETED, completedTasks.get(0).state);
}
public void testGetTask()
{
WorkflowDefinition workflowDef = getTestDefinition();