Merged HEAD-QA to HEAD (4.2) (including moving test classes into separate folders)

51903 to 54309 


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@54310 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Samuel Langlois
2013-08-20 17:17:31 +00:00
parent 0a36e2af67
commit ab4ca7177f
1576 changed files with 36419 additions and 8603 deletions

View File

@@ -1,331 +0,0 @@
/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.workflow.jbpm;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.Serializable;
import java.util.HashMap;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.model.Repository;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.scripts.ScriptException;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.BaseAlfrescoSpringTest;
import org.alfresco.util.GUID;
import org.alfresco.util.PropertyMap;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.Token;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public class AlfrescoJavaScriptIntegrationTest extends BaseAlfrescoSpringTest
{
private static final QName fooName = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "Foo");
private static final QName barName = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "Bar");
private static final QName docName = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "Doc");
private static final String BASIC_USER = "basic"+GUID.generate();
private static String systemUser = AuthenticationUtil.getSystemUserName();
private ServiceRegistry services;
private ExecutionContext context;
private HashMap<String, Object> variables;
private PersonService personService;
private Repository repository;
/**
* Test that JavaScript can still be run even if no Authentication is provided.
* This can occur if, e.g. the action is executed as part of an asynchronous task.
* @throws Exception
*/
public void testRunsWithoutAuthentication() throws Exception
{
NodeRef systemNode = personService.getPerson(systemUser);
NodeRef baseUserNode = personService.getPerson(BASIC_USER);
TestUserStore userStore = new TestUserStore();
variables.put("userStore", userStore);
Element script = buildScript("userStore.storeUsers(person)");
// Check authentication cleared.
AuthenticationUtil.clearCurrentSecurityContext();
assertNull(AuthenticationUtil.getFullyAuthenticatedUser());
assertNull(AuthenticationUtil.getRunAsUser());
// Check uses system user when no authentication set and no task assignee.
AlfrescoJavaScript scriptHandler = new AlfrescoJavaScript();
scriptHandler.setScript(script);
scriptHandler.execute(context);
assertEquals(systemUser, userStore.runAsUser);
assertEquals(systemUser, userStore.fullUser);
assertEquals(systemNode, userStore.person.getNodeRef());
// Check authentication is correctly reset.
assertNull(AuthenticationUtil.getFullyAuthenticatedUser());
assertNull(AuthenticationUtil.getRunAsUser());
// Check that when a task assignee exists, then he/she is used for authentication.
TaskInstance taskInstance = mock(TaskInstance.class);
when(taskInstance.getActorId()).thenReturn(BASIC_USER);
when(context.getTaskInstance()).thenReturn(taskInstance);
scriptHandler = new AlfrescoJavaScript();
scriptHandler.setScript(script);
scriptHandler.execute(context);
assertEquals(BASIC_USER, userStore.runAsUser);
assertEquals(BASIC_USER, userStore.fullUser);
assertEquals(baseUserNode, userStore.person.getNodeRef());
// Check authentication is correctly reset.
assertNull(AuthenticationUtil.getFullyAuthenticatedUser());
assertNull(AuthenticationUtil.getRunAsUser());
}
/**
* See Jira issue ALF-657.
* @throws Exception
*/
public void testRunAsAdminMoveContent() throws Exception
{
NodeRef fooFolder = nodeService.createNode(rootNodeRef,
ContentModel.ASSOC_CONTAINS,
fooName,
ContentModel.TYPE_FOLDER).getChildRef();
NodeRef barFolder = nodeService.createNode(rootNodeRef,
ContentModel.ASSOC_CONTAINS,
barName,
ContentModel.TYPE_FOLDER).getChildRef();
NodeRef doc = nodeService.createNode(fooFolder,
ContentModel.ASSOC_CONTAINS,
docName,
ContentModel.TYPE_CONTENT).getChildRef();
PermissionService permissions = services.getPermissionService();
permissions.setPermission(doc, BASIC_USER, PermissionService.ALL_PERMISSIONS, true);
AuthenticationUtil.setFullyAuthenticatedUser(BASIC_USER);
Element script = buildScript("doc.move(bar)");
variables.put("doc", new JBPMNode(doc, services));
variables.put("bar", new JBPMNode(barFolder, services));
assertEquals(fooFolder, nodeService.getPrimaryParent(doc).getParentRef());
try
{
AlfrescoJavaScript scriptHandler = new AlfrescoJavaScript();
scriptHandler.setScript(script);
scriptHandler.execute(context);
fail("The user should not have permission to write to bar!");
}
catch (ScriptException e)
{
// Do nothing.
}
assertEquals(fooFolder, nodeService.getPrimaryParent(doc).getParentRef());
AlfrescoJavaScript scriptHandler = new AlfrescoJavaScript();
scriptHandler.setScript(script);
scriptHandler.setRunas(AuthenticationUtil.getAdminUserName());
scriptHandler.execute(context);
assertEquals(barFolder, nodeService.getPrimaryParent(doc).getParentRef());
}
/**
* See Jira issue ALF-5346.
* @throws Exception
*/
public void testRunAsAdminMoveContentBetweenSites() throws Exception
{
SiteService siteService = services.getSiteService();
FileFolderService fileFolderService = services.getFileFolderService();
String siteAName = "siteA"+GUID.generate();
String siteBName = "siteB"+GUID.generate();
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
siteService.createSite(
"testSitePreset", siteAName, "title", "description", SiteVisibility.PRIVATE);
siteService.createSite(
"testSitePreset", siteBName, "title", "description", SiteVisibility.PRIVATE);
NodeRef docLibA = siteService.createContainer(siteAName, "documentLibrary", ContentModel.TYPE_FOLDER, null);
NodeRef docLibB = siteService.createContainer(siteBName, "documentLibrary", ContentModel.TYPE_FOLDER, null);
FileInfo docInfo = fileFolderService.create(docLibA, "test.txt", ContentModel.TYPE_CONTENT);
NodeRef doc = docInfo.getNodeRef();
ContentWriter writer = fileFolderService.getWriter(doc);
writer.putContent("Just some old content that doesn't mean anything");
AuthenticationUtil.setFullyAuthenticatedUser(BASIC_USER);
Element script = buildScript("doc.move(companyhome.childByNamePath(\"Sites/"+ siteBName +"/documentLibrary\"))");
NodeRef companyHome = repository.getCompanyHome();
variables.put("companyhome", new JBPMNode(companyHome, services));
variables.put("doc", new JBPMNode(doc, services));
assertEquals(docLibA, nodeService.getPrimaryParent(doc).getParentRef());
try
{
AlfrescoJavaScript scriptHandler = new AlfrescoJavaScript();
scriptHandler.setScript(script);
scriptHandler.execute(context);
fail("The user should not have permission to write to Site B!");
} catch(ScriptException e)
{
// Do nothing.
}
assertEquals(docLibA, nodeService.getPrimaryParent(doc).getParentRef());
AlfrescoJavaScript scriptHandler = new AlfrescoJavaScript();
scriptHandler.setScript(script);
scriptHandler.setRunas(AuthenticationUtil.getAdminUserName());
scriptHandler.execute(context);
assertEquals(docLibB, nodeService.getPrimaryParent(doc).getParentRef());
}
public void testScopeVariables() throws Exception
{
String admin = AuthenticationUtil.getAdminUserName();
AuthenticationUtil.setFullyAuthenticatedUser(admin);
NodeRef person = personService.getPerson(admin);
Serializable userHome = nodeService.getProperty(person, ContentModel.PROP_HOMEFOLDER);
AlfrescoJavaScript scriptHandler = new AlfrescoJavaScript();
String key = "result";
// Check person node set.
Element script = buildScript("executionContext.setVariable('" + key + "', person)");
scriptHandler.setScript(script);
scriptHandler.execute(context);
ScriptNode value = (ScriptNode) variables.get(key);
assertEquals(person, value.getNodeRef());
// Check user home set.
script = buildScript("executionContext.setVariable('" + key + "', userhome)");
scriptHandler.setScript(script);
scriptHandler.execute(context);
value = (ScriptNode) variables.get(key);
assertEquals(userHome, value.getNodeRef());
// Check company home set.
NodeRef companyHome = repository.getCompanyHome();
script = buildScript("executionContext.setVariable('" + key + "', companyhome)");
scriptHandler.setScript(script);
scriptHandler.execute(context);
value = (ScriptNode) variables.get(key);
assertEquals(companyHome, value.getNodeRef());
}
private Element buildScript(String expression)
{
Element script = DocumentHelper.createElement("script");
script.setText(expression);
return script;
}
@Override
@SuppressWarnings("deprecation")
protected void onSetUp() throws Exception
{
super.onSetUp();
this.services = (ServiceRegistry) applicationContext.getBean("ServiceRegistry");
repository = (Repository) applicationContext.getBean("repositoryHelper");
personService = services.getPersonService();
createUser(BASIC_USER);
// Sets up the Execution Context
context = mock(ExecutionContext.class);
ContextInstance contextInstance = mock(ContextInstance.class);
when(context.getContextInstance()).thenReturn(contextInstance);
variables = new HashMap<String, Object>();
when(contextInstance.getVariables()).thenReturn(variables);
when(contextInstance.getVariables( any(Token.class))).thenReturn(variables);
when(context.getVariable(anyString())).thenAnswer(new Answer<Object>()
{
public Object answer(InvocationOnMock invocation) throws Throwable
{
String key = (String)invocation.getArguments()[0];
return variables.get(key);
}
});
doAnswer(new Answer<Void>()
{
public Void answer(InvocationOnMock invocation) throws Throwable
{
String key = (String)invocation.getArguments()[0];
Object value= invocation.getArguments()[1];
variables.put(key, value);
return null;
}
}).when(context).setVariable(anyString(), any());
}
private void createUser(String userName)
{
if (this.authenticationService.authenticationExists(userName) == false)
{
this.authenticationService.createAuthentication(userName, "PWD".toCharArray());
PropertyMap ppOne = new PropertyMap(4);
ppOne.put(ContentModel.PROP_USERNAME, userName);
ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName");
ppOne.put(ContentModel.PROP_LASTNAME, "lastName");
ppOne.put(ContentModel.PROP_EMAIL, "email@email.com");
ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle");
personService.createPerson(ppOne);
}
}
public static class TestUserStore
{
private String runAsUser;
private String fullUser;
private ScriptNode person = null;
public void storeUsers(ScriptNode user)
{
fullUser = AuthenticationUtil.getFullyAuthenticatedUser();
runAsUser = AuthenticationUtil.getRunAsUser();
this.person = user;
}
}
}

View File

@@ -1,670 +0,0 @@
/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.workflow.jbpm;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.workflow.BPMEngineRegistry;
import org.alfresco.repo.workflow.TaskComponent;
import org.alfresco.repo.workflow.WorkflowComponent;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.repo.workflow.WorkflowPackageComponent;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowDeployment;
import org.alfresco.service.cmr.workflow.WorkflowException;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.BaseAlfrescoSpringTest;
import org.alfresco.util.PropertyMap;
import org.springframework.core.io.ClassPathResource;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* JBPM Engine Tests
*
* @author davidc
*/
public class JBPMEngineTest extends BaseAlfrescoSpringTest
{
private static final String USER1 = "JbpmEngineTestJohn";
private static final String USER2 = "JbpmEngineTestJane";
private static final String USER3 = "JbpmEngineTestJoe";
private WorkflowComponent workflowComponent;
private TaskComponent taskComponent;
private WorkflowPackageComponent packageComponent;
private PersonService personService;
private WorkflowDefinition testWorkflowDef;
private NodeRef person1;
private NodeRef person2;
private NodeRef person3;
@SuppressWarnings("deprecation")
@Override
protected void onSetUpInTransaction() throws Exception
{
super.onSetUpInTransaction();
personService = (PersonService) applicationContext.getBean("PersonService");
person1 = createPerson(USER1);
person2 = createPerson(USER2);
person3 = createPerson(USER3);
BPMEngineRegistry registry = (BPMEngineRegistry)applicationContext.getBean("bpm_engineRegistry");
workflowComponent = registry.getWorkflowComponent(JBPMEngine.ENGINE_ID);
taskComponent = registry.getTaskComponent(JBPMEngine.ENGINE_ID);
packageComponent = (WorkflowPackageComponent)applicationContext.getBean("workflowPackageImpl");
// deploy test process messages
I18NUtil.registerResourceBundle("jbpmresources/test-messages");
// deploy test process definition
ClassPathResource processDef = new ClassPathResource("jbpmresources/test_processdefinition.xml");
assertFalse(workflowComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML));
WorkflowDeployment deployment = workflowComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
testWorkflowDef = deployment.definition;
assertNotNull(testWorkflowDef);
assertEquals("jbpm$test", testWorkflowDef.name);
assertEquals("1", testWorkflowDef.version);
assertTrue(workflowComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML));
authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName());
}
public void todoTestGetStartTask() throws Exception
{
//TODO Implement
}
public void testGetWorkflowDefinitions()
{
List<WorkflowDefinition> workflowDefs = workflowComponent.getDefinitions();
assertNotNull(workflowDefs);
assertTrue(workflowDefs.size() > 0);
}
public void testDeployWorkflow() throws Exception
{
ClassPathResource processDef = new ClassPathResource("jbpmresources/test_processdefinition.xml");
WorkflowDeployment deployment = workflowComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
testWorkflowDef = deployment.getDefinition();
assertNotNull(testWorkflowDef);
assertEquals("jbpm$test", testWorkflowDef.getName());
assertEquals("2", testWorkflowDef.getVersion());
}
public void testStartWorkflow()
{
try
{
workflowComponent.startWorkflow("norfolknchance", null);
fail("Failed to catch invalid definition id");
}
catch(WorkflowException e)
{
// Do nothing.
}
// TODO: Determine why process definition is loaded, even though it doesn't exist
// try
// {
// workflowComponent.startProcess("1000", null);
// fail("Failed to catch workflow definition id that does not exist");
// }
// catch(WorkflowException e)
// {
// }
WorkflowDefinition workflowDef = getTestDefinition();
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), null);
assertNotNull(path);
assertTrue(path.getId().endsWith("-@"));
assertNotNull(path.getNode());
assertNotNull(path.getInstance());
assertEquals(workflowDef.getId(), path.getInstance().getDefinition().getId());
}
public void testGetWorkflowById()
{
WorkflowDefinition workflowDef = getTestDefinition();
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), null);
assertNotNull(path);
assertTrue(path.getId().endsWith("-@"));
assertNotNull(path.getNode());
assertNotNull(path.getInstance());
assertEquals(workflowDef.getId(), path.getInstance().getDefinition().getId());
WorkflowInstance instance = workflowComponent.getWorkflowById(path.getInstance().getId());
assertNotNull(instance);
assertEquals(path.getInstance().getId(), instance.getId());
workflowComponent.cancelWorkflow(instance.getId());
WorkflowInstance result = workflowComponent.getWorkflowById(instance.getId());
assertNull("The workflow isntance should be null!", result);
}
public void testStartWorkflowParameters()
{
WorkflowDefinition workflowDef = getTestDefinition();
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(WorkflowModel.PROP_TASK_ID, 3); // protected - shouldn't be written
params.put(WorkflowModel.PROP_DUE_DATE, new Date()); // task instance field
params.put(WorkflowModel.PROP_PRIORITY, 1); // task instance field
params.put(WorkflowModel.PROP_PERCENT_COMPLETE, 10); // context variable
params.put(QName.createQName("", "Message"), "Hello World"); // context variable outside of task definition
params.put(QName.createQName("", "Array"), new String[] { "one", "two" }); // context variable outside of task definition
params.put(QName.createQName("", "NodeRef"), new NodeRef("workspace://1/1001")); // context variable outside of task definition
params.put(ContentModel.PROP_OWNER, AuthenticationUtil.getAdminUserName()); // task assignment
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), params);
assertNotNull(path);
assertTrue(path.getId().endsWith("-@"));
assertNotNull(path.getNode());
assertNotNull(path.getInstance());
assertEquals(workflowDef.getId(), path.getInstance().getDefinition().getId());
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
WorkflowTask task = tasks1.get(0);
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_TASK_ID));
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_DUE_DATE));
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_PRIORITY));
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_PERCENT_COMPLETE));
assertTrue(task.getProperties().containsKey(ContentModel.PROP_OWNER));
NodeRef initiator = path.getInstance().getInitiator();
String initiatorUsername = (String)nodeService.getProperty(initiator, ContentModel.PROP_USERNAME);
assertEquals(AuthenticationUtil.getAdminUserName(), initiatorUsername);
}
public void testUpdateTask()
{
WorkflowDefinition workflowDef = getTestDefinition();
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(WorkflowModel.PROP_TASK_ID, 3); // protected - shouldn't be written
params.put(WorkflowModel.PROP_DUE_DATE, new Date()); // task instance field
params.put(WorkflowModel.PROP_PRIORITY, 1); // task instance field
params.put(WorkflowModel.PROP_PERCENT_COMPLETE, 10); // context variable
params.put(QName.createQName("", "Message"), "Hello World"); // context variable outside of task definition
params.put(QName.createQName("", "Array"), new String[] { "one", "two" }); // context variable outside of task definition
params.put(QName.createQName("", "NodeRef"), new NodeRef("workspace://1/1001")); // context variable outside of task definition
params.put(ContentModel.PROP_OWNER, AuthenticationUtil.getAdminUserName()); // task assignment
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), params);
assertNotNull(path);
assertTrue(path.getId().endsWith("-@"));
assertNotNull(path.getNode());
assertNotNull(path.getInstance());
assertEquals(workflowDef.getId(), path.getInstance().getDefinition().getId());
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
WorkflowTask task = tasks1.get(0);
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_TASK_ID));
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_DUE_DATE));
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_PRIORITY));
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_PERCENT_COMPLETE));
assertTrue(task.getProperties().containsKey(ContentModel.PROP_OWNER));
// update with null parameters
try
{
WorkflowTask taskU1 = taskComponent.updateTask(task.getId(), null, null, null);
assertNotNull(taskU1);
}
catch(Throwable e)
{
fail("Task update failed with null parameters");
}
// update property value
Map<QName, Serializable> updateProperties2 = new HashMap<QName, Serializable>();
updateProperties2.put(WorkflowModel.PROP_PERCENT_COMPLETE, 100);
WorkflowTask taskU2 = taskComponent.updateTask(task.getId(), updateProperties2, null, null);
assertEquals(100, taskU2.getProperties().get(WorkflowModel.PROP_PERCENT_COMPLETE));
// add to assocation
QName assocName = QName.createQName("", "TestAssoc");
List<NodeRef> toAdd = new ArrayList<NodeRef>();
toAdd.add(new NodeRef("workspace://1/1001"));
toAdd.add(new NodeRef("workspace://1/1002"));
toAdd.add(new NodeRef("workspace://1/1003"));
Map<QName, List<NodeRef>> addAssocs = new HashMap<QName, List<NodeRef>>();
addAssocs.put(assocName, toAdd);
WorkflowTask taskU3 = taskComponent.updateTask(task.getId(), null, addAssocs, null);
assertNotNull(taskU3.getProperties().get(assocName));
assertEquals(3, ((List<?>)taskU3.getProperties().get(assocName)).size());
// add to assocation again
List<NodeRef> toAddAgain = new ArrayList<NodeRef>();
toAddAgain.add(new NodeRef("workspace://1/1004"));
toAddAgain.add(new NodeRef("workspace://1/1005"));
Map<QName, List<NodeRef>> addAssocsAgain = new HashMap<QName, List<NodeRef>>();
addAssocsAgain.put(assocName, toAddAgain);
WorkflowTask taskU4 = taskComponent.updateTask(task.getId(), null, addAssocsAgain, null);
assertNotNull(taskU4.getProperties().get(assocName));
assertEquals(5, ((List<?>)taskU4.getProperties().get(assocName)).size());
// remove assocation
List<NodeRef> toRemove = new ArrayList<NodeRef>();
toRemove.add(new NodeRef("workspace://1/1002"));
toRemove.add(new NodeRef("workspace://1/1003"));
Map<QName, List<NodeRef>> removeAssocs = new HashMap<QName, List<NodeRef>>();
removeAssocs.put(assocName, toRemove);
WorkflowTask taskU5 = taskComponent.updateTask(task.getId(), null, null, removeAssocs);
assertNotNull(taskU5.getProperties().get(assocName));
assertEquals(3, ((List<?>)taskU5.getProperties().get(assocName)).size());
}
public void testGetWorkflowInstances()
{
WorkflowDefinition workflowDef = getTestDefinition();
workflowComponent.startWorkflow(workflowDef.getId(), null);
workflowComponent.startWorkflow(workflowDef.getId(), null);
List<WorkflowInstance> instances = workflowComponent.getActiveWorkflows(workflowDef.getId());
assertNotNull(instances);
assertEquals(2, instances.size());
for (WorkflowInstance instance : instances)
{
assertEquals(workflowDef.getId(), instance.getDefinition().getId());
}
}
public void testGetPositions()
{
WorkflowDefinition workflowDef = getTestDefinition();
workflowComponent.startWorkflow(workflowDef.getId(), null);
List<WorkflowInstance> instances = workflowComponent.getActiveWorkflows(workflowDef.getId());
assertNotNull(instances);
assertEquals(1, instances.size());
List<WorkflowPath> paths = workflowComponent.getWorkflowPaths(instances.get(0).getId());
assertNotNull(paths);
assertEquals(1, paths.size());
assertEquals(instances.get(0).getId(), paths.get(0).getInstance().getId());
assertTrue(paths.get(0).getId().endsWith("-@"));
}
public void testCancelWorkflowInstance() throws Exception
{
WorkflowDefinition workflowDef = getTestDefinition();
workflowComponent.startWorkflow(workflowDef.getId(), null);
List<WorkflowInstance> instances1 = workflowComponent.getActiveWorkflows(workflowDef.getId());
assertNotNull(instances1);
assertEquals(1, instances1.size());
List<WorkflowTask> tasks = taskComponent.getAssignedTasks(AuthenticationUtil.getAdminUserName(), WorkflowTaskState.IN_PROGRESS, false);
assertNotNull(tasks);
assertTrue(tasks.size() > 0);
WorkflowInstance cancelledInstance = workflowComponent.cancelWorkflow(instances1.get(0).getId());
assertNotNull(cancelledInstance);
assertFalse(cancelledInstance.isActive());
List<WorkflowInstance> instances2 = workflowComponent.getActiveWorkflows(workflowDef.getId());
assertNotNull(instances2);
assertEquals(0, instances2.size());
List<WorkflowTask> tasks1 = taskComponent.getAssignedTasks(AuthenticationUtil.getAdminUserName(), WorkflowTaskState.IN_PROGRESS, false);
assertNotNull(tasks1);
tasks1 = filterTasksByWorkflowInstance(tasks1, cancelledInstance.getId());
assertEquals(0, tasks1.size());
}
/**
* See Alf-2764 in Jira.
* @throws Exception
*/
public void testCancelForEachFork() throws Exception
{
// Deploy Parallel Loop Review process definition.
ClassPathResource processDef = new ClassPathResource("test/alfresco/parallel_loop_review_processdefinition.xml");
WorkflowDeployment deployment = workflowComponent.deployDefinition(processDef.getInputStream(),
MimetypeMap.MIMETYPE_XML);
WorkflowDefinition parallelDef = deployment.getDefinition();
assertNotNull(parallelDef);
// Set Current User to USER1.
AuthenticationUtil.setFullyAuthenticatedUser(USER1);
// Set up parameters
QName approvePercentName = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "requiredApprovePercent");
NodeRef pckgNode = packageComponent.createPackage(null);
List<NodeRef> assignees = Arrays.asList(person1, person2, person3);
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(WorkflowModel.ASSOC_ASSIGNEES, (Serializable) assignees);
parameters.put(WorkflowModel.ASSOC_PACKAGE, pckgNode);
parameters.put(approvePercentName, 60f );
// Start workflow
WorkflowPath path = workflowComponent.startWorkflow(parallelDef.getId(), parameters);
WorkflowTask startTask = workflowComponent.getTasksForWorkflowPath(path.getId()).get(0);
taskComponent.endTask(startTask.getId(), null);
checkInstanceExists(path.getInstance().getId(), parallelDef.getId(), true);
// Set all users to reject document.
ParallelReject(USER1);
ParallelReject(USER2);
ParallelReject(USER3);
// Send review back round the loop.
List<WorkflowTask> tasks = workflowComponent.getTasksForWorkflowPath(path.getId());
assertEquals(1, tasks.size());
taskComponent.endTask(tasks.get(0).getId(), "again");
// Try to cancel workflow
WorkflowInstance cancelledWf = workflowComponent.cancelWorkflow(path.getInstance().getId());
checkInstanceExists(cancelledWf.getId(), parallelDef.getId(), false);
}
private void checkInstanceExists(String instanceId, String defId, boolean expected)
{
boolean match=false;
List<WorkflowInstance> activeWfs = workflowComponent.getActiveWorkflows(defId);
for (WorkflowInstance instance : activeWfs)
{
if(instance.getId().equals(instanceId))
{
match = true;
break;
}
}
assertEquals( expected, match);
}
private void ParallelReject(String user)
{
List<WorkflowTask> tasks = taskComponent.getAssignedTasks(user, WorkflowTaskState.IN_PROGRESS, false);
assertEquals(1, tasks.size());
WorkflowTask task = tasks.get(0);
taskComponent.endTask(task.getId(), "reject");
}
public void testSignal()
{
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), rootNodeRef);
WorkflowDefinition workflowDef = getTestDefinition();
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), parameters);
assertNotNull(path);
WorkflowPath updatedPath = workflowComponent.signal(path.getId(), path.getNode().getTransitions()[1].getId());
assertNotNull(updatedPath);
}
public void testGetAssignedTasks()
{
WorkflowDefinition workflowDef = getTestDefinition();
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "reviewer"), AuthenticationUtil.getAdminUserName());
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), rootNodeRef);
parameters.put(QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "package"), packageComponent.createPackage(null));
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), parameters);
assertNotNull(path);
List<WorkflowTask> tasks = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks);
assertEquals(1, tasks.size());
WorkflowTask updatedTask = taskComponent.endTask(tasks.get(0).getId(), path.getNode().getTransitions()[0].getId());
assertNotNull(updatedTask);
List<WorkflowTask> completedTasks = taskComponent.getAssignedTasks(AuthenticationUtil.getAdminUserName(), WorkflowTaskState.COMPLETED, false);
assertNotNull(completedTasks);
completedTasks = filterTasksByWorkflowInstance(completedTasks, path.getInstance().getId());
assertEquals(1, completedTasks.size());
List<WorkflowTask> assignedTasks = taskComponent.getAssignedTasks(AuthenticationUtil.getAdminUserName(), WorkflowTaskState.IN_PROGRESS, false);
assertNotNull(assignedTasks);
assignedTasks = filterTasksByWorkflowInstance(assignedTasks, path.getInstance().getId());
assertEquals(1, assignedTasks.size());
assertEquals("review", assignedTasks.get(0).getName());
}
public void xtestMultiAssign()
{
WorkflowDefinition workflowDef = getTestDefinition();
List<String> bpm_assignees = new ArrayList<String>();
bpm_assignees.add(AuthenticationUtil.getAdminUserName());
bpm_assignees.add("bob");
bpm_assignees.add("fred");
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "assignees"), (Serializable)bpm_assignees);
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), rootNodeRef);
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), parameters);
assertNotNull(path);
List<WorkflowTask> tasks = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks);
assertEquals(1, tasks.size());
WorkflowTask updatedTask = taskComponent.endTask(tasks.get(0).getId(), "multi");
assertNotNull(updatedTask);
}
public void testEndTask()
{
WorkflowDefinition workflowDef = getTestDefinition();
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "reviewer"), AuthenticationUtil.getAdminUserName());
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), rootNodeRef);
parameters.put(QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "package"), packageComponent.createPackage(null));
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), parameters);
assertNotNull(path);
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
assertEquals(WorkflowTaskState.IN_PROGRESS, tasks1.get(0).getState());
WorkflowTask updatedTask = taskComponent.endTask(tasks1.get(0).getId(), null);
assertNotNull(updatedTask);
assertEquals(WorkflowTaskState.COMPLETED, updatedTask.getState());
List<WorkflowTask> completedTasks = taskComponent.getAssignedTasks(AuthenticationUtil.getAdminUserName(), WorkflowTaskState.COMPLETED, false);
assertNotNull(completedTasks);
completedTasks = filterTasksByWorkflowInstance(completedTasks, path.getInstance().getId());
assertEquals(1, completedTasks.size());
assertEquals(WorkflowTaskState.COMPLETED, completedTasks.get(0).getState());
}
public void testGetTask()
{
WorkflowDefinition workflowDef = getTestDefinition();
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "reviewer"), AuthenticationUtil.getAdminUserName());
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), rootNodeRef);
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), parameters);
assertNotNull(path);
assertNotNull(path);
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
WorkflowTask getTask = taskComponent.getTaskById(tasks1.get(0).getId());
assertNotNull(getTask);
assertEquals(getTask.getId(), tasks1.get(0).getId());
}
public void testNodeRef()
{
WorkflowDefinition workflowDef = getTestDefinition();
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "reviewer"), AuthenticationUtil.getAdminUserName());
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), rootNodeRef);
parameters.put(QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "package"), packageComponent.createPackage(null));
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), parameters);
assertNotNull(path);
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
assertEquals(WorkflowTaskState.IN_PROGRESS, tasks1.get(0).getState());
WorkflowTask updatedTask = taskComponent.endTask(tasks1.get(0).getId(), null);
assertNotNull(updatedTask);
}
public void testScript() throws IOException
{
// deploy test script definition
ClassPathResource processDef = new ClassPathResource("jbpmresources/test_script.xml");
assertFalse(workflowComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML));
WorkflowDeployment deployment = workflowComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
assertNotNull(deployment);
WorkflowDefinition workflowDef = deployment.getDefinition();
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), rootNodeRef);
parameters.put(QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "package"), packageComponent.createPackage(null));
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), parameters);
assertNotNull(path);
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
assertEquals(WorkflowTaskState.IN_PROGRESS, tasks1.get(0).getState());
WorkflowTask updatedTask = taskComponent.endTask(tasks1.get(0).getId(), null);
assertNotNull(updatedTask);
}
public void testWorkflowDefinitionVisibility()
{
// retrieve workflow definitions
List<WorkflowDefinition> defs = workflowComponent.getDefinitions();
List<WorkflowDefinition> allDefs = workflowComponent.getAllDefinitions();
assertFalse(defs.isEmpty());
assertFalse(allDefs.isEmpty());
}
// public void testAssignTaskVariablesWithScript() throws Exception
// {
// WorkflowDefinition definition = workflowComponent.getDefinitionByName("jbpm$testwf:testTaskVarScriptAssign");
// assertNotNull(definition);
//
// String testwfUrl = "http://www.alfresco.org/model/workflow/test/1.0";
// QName simpleTextName = QName.createQName(testwfUrl, "simpleText");
// QName listConstrainedName = QName.createQName(testwfUrl, "listConstrainedText");
//
// String simpleTextValue = "Foo";
// String listConstrainedValue = "Second";
//
//
// Map<QName, Serializable> params = new HashMap<QName, Serializable>();
// params.put(simpleTextName, simpleTextValue);
// params.put(listConstrainedName, listConstrainedValue);
// params.put(WorkflowModel.ASSOC_PACKAGE, packageComponent.createPackage(null));
//
// WorkflowPath path = workflowComponent.startWorkflow(definition.getId(), params);
// // End start task.
// List<WorkflowTask> tasks = workflowComponent.getTasksForWorkflowPath(path.getId());
//
// // Get Start Task
// assertEquals(1, tasks.size());
// WorkflowTask startTask = tasks.get(0);
// QName startTaskName = definition.getStartTaskDefinition().getMetadata().getName();
// assertEquals("This is not the start task!", startTaskName, startTask.getDefinition().getMetadata().getName());
//
// taskComponent.endTask(startTask.getId(), null);
//
// tasks = workflowComponent.getTasksForWorkflowPath(path.getId());
//
// // Get Task
// assertEquals(1, tasks.size());
// WorkflowTask task = tasks.get(0);
// QName taskName = QName.createQName(testwfUrl, "assignVarTask");
// assertEquals("This is not the start task!", taskName, task.getDefinition().getMetadata().getName());
//
// Map<QName, Serializable> props = task.getProperties();
// assertEquals("Simple Text property value doesn't match!", simpleTextValue, props.get(simpleTextName));
// assertEquals("List Constrained property value doesn't match!", listConstrainedValue, props.get(listConstrainedName));
// }
/**
* Locate the Test Workflow Definition
*
* @return workflow definition
*/
private WorkflowDefinition getTestDefinition()
{
return testWorkflowDef;
}
private NodeRef createPerson(String userName)
{
// if user with given user name doesn't already exist then create user
if (this.authenticationService.authenticationExists(userName) == false)
{
// create user
this.authenticationService.createAuthentication(userName, "password".toCharArray());
}
// if person node with given user name doesn't already exist then create
// person
if (this.personService.personExists(userName) == false)
{
// create person properties
PropertyMap personProps = new PropertyMap();
personProps.put(ContentModel.PROP_USERNAME, userName);
// create person node for user
return personService.createPerson(personProps);
}
return personService.getPerson(userName);
}
/**
* Filter task list by workflow instance
*
* @param tasks
* @param processInstanceId
* @return
*/
private List<WorkflowTask> filterTasksByWorkflowInstance(List<WorkflowTask> tasks, String workflowInstanceId)
{
List<WorkflowTask> filteredTasks = new ArrayList<WorkflowTask>();
for (WorkflowTask task : tasks)
{
if (task.getPath().getInstance().getId().equals(workflowInstanceId))
{
filteredTasks.add(task);
}
}
return filteredTasks;
}
}

View File

@@ -1,267 +0,0 @@
package org.alfresco.repo.workflow.jbpm;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.model.Repository;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.BaseSpringTest;
import org.junit.AfterClass;
import org.junit.Test;
/**
* This test shows a performance benefit from a usage of direct queries
* instead of creating required classes like WorkflowTask in a loop with collecting
* required properties from different services.
*
* @author arsenyko
*
*/
public class JBPMJunit4LoadTests extends BaseSpringTest
{
private static String WORKFLOW_NAME = "jbpm$wf:adhoc";
private static String WORKFLOW_NODE_NAME = "workflow-test-19243cbb-c58a-485e-bcd9-2e2be030dfb9.txt";
private static int WORKFLOW_COUNT = 2000;
private static List<String> workflowIds = null;
private static NodeRef rootNode = null;
private ServiceRegistry serviceRegistry;
private RetryingTransactionHelper retryingTransactionHelper;
private static NodeService nodeService;
private static WorkflowService workflowService;
private FileFolderService fileFolderService;
private Repository repositoryHelper;
private JBPMEngine jbpmEngine;
private NodeRef companyHomeNodeRef;
public void onSetUp() throws Exception
{
serviceRegistry = (ServiceRegistry) getApplicationContext().getBean(ServiceRegistry.SERVICE_REGISTRY);
repositoryHelper = (Repository) getApplicationContext().getBean("repositoryHelper");
jbpmEngine = (JBPMEngine) getApplicationContext().getBean("jbpm_engine");
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
fileFolderService = serviceRegistry.getFileFolderService();
workflowService = serviceRegistry.getWorkflowService();
nodeService = serviceRegistry.getNodeService();
companyHomeNodeRef = repositoryHelper.getCompanyHome();
System.out.println(" -------------- ");
createWorkflowStuff();
}
public void createWorkflowStuff() throws Exception
{
System.out.println(" [createWorkflowStuff] Started at " + new Date().toString());
if (rootNode == null)
{
workflowIds =new ArrayList<String>();
RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>(){
@Override
public Void execute() throws Throwable
{
FileInfo rootInfo = fileFolderService.create(companyHomeNodeRef,
WORKFLOW_NODE_NAME,
ContentModel.TYPE_FOLDER);
rootNode = rootInfo.getNodeRef();
FileInfo contentInfo = fileFolderService.create(rootNode,
WORKFLOW_NODE_NAME,
ContentModel.TYPE_CONTENT);
NodeRef content = contentInfo.getNodeRef();
ContentService contentService = serviceRegistry.getContentService();
ContentWriter writer = contentService.getWriter(content, ContentModel.PROP_CONTENT, true);
writer.setMimetype("text/plain");
writer.setEncoding("UTF-8");
writer.putContent("many workflows many workflows many workflows many workflows many workflows many workflows many workflows many workflows");
System.out.println(" [createWorkflowStuff] Workflow root node '" + WORKFLOW_NODE_NAME + "' has been created");
WorkflowDefinition wfDef = jbpmEngine.getDefinitionByName(WORKFLOW_NAME);
long startTime = new Date().getTime();
for (Integer i = 0; i < WORKFLOW_COUNT; i++)
{
// We are creating workflows in usual way, but with new persistent objects.
// There is a some performance issue with sesssion.flash() in each iteration,
// but this was made to avoid a lot of changes in a logic related to org.alfresco.service.cmr.workflow.*
// classes.
Map<QName, Serializable> properties = prepareWorkflowProperties(rootNode, content, i.toString());
WorkflowPath path = workflowService.startWorkflow(wfDef.getId(), properties);
workflowIds.add(path.getInstance().getId());
// jbpmEngine.startWorkflow_ALF1787(wfDef.id, prepareWorkflowProperties(fileInfo.getNodeRef(), i.toString()));
}
long endTime = new Date().getTime();
System.out.println(" [createWorkflowStuff] Execution time (ms): " + (endTime - startTime));
return null;
}
};
retryingTransactionHelper.setMaxRetries(1);
retryingTransactionHelper.doInTransaction(callback);
System.out.println(" [createWorkflowStuff] Finished at " + new Date().toString());
}
else
{
System.out.println(" [createWorkflowStuff] Workflow node '" + WORKFLOW_NODE_NAME + "' already exists");
}
}
//@Test
// public void testQuery1() throws Exception
// {
// RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>(){
//
// @Override
// public Void execute() throws Throwable
// {
// JbpmTemplate jbpmTemplate = (JbpmTemplate) applicationContext.getBean("jbpm_template");
// List<Object[]> result = (List<Object[]>) jbpmTemplate.execute(new JbpmCallback()
// {
// public List<Object[]> doInJbpm(JbpmContext context)
// {
// Session session = context.getSession();
// Query query = session.getNamedQuery("org.alfresco.repo.workflow.findTaskInstancesByActorId");
// return query.setString("actorId", "admin").list();
// }
// });
// for(Object[] ti : result)
// {
// System.out.println(Arrays.toString(ti));
// }
// System.out.println(result.size());
// return null;
// }
// };
// retryingTransactionHelper.setMaxRetries(1);
// retryingTransactionHelper.doInTransaction(callback);
// }
@Test
public void testGetAssignedTasks_NEW() throws Exception
{
final int RUN_COUNT = 7;
RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>(){
@Override
public Void execute() throws Throwable
{
Date beginTime = new Date();
System.out.println(" [testGetAssignedTasks_NEW] Started at " + beginTime.toString());
List<WorkflowTask> tasks = workflowService.getAssignedTasks("admin", WorkflowTaskState.IN_PROGRESS);
Date endTime = new Date();
System.out.println(" [testGetAssignedTasks_NEW] Retrieved tasks: " + tasks.size() + " in " + (endTime.getTime() - beginTime.getTime()) + " ms");
System.out.println(" [testGetAssignedTasks_NEW] Finished at " + endTime.toString());
return null;
}
};
retryingTransactionHelper.setMaxRetries(1);
for(int i=0; i<RUN_COUNT; i++)
{
retryingTransactionHelper.doInTransaction(callback);
}
}
/*
@Test
public void testGetAssignedTasks_OLD() throws Exception
{
RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>(){
@Override
public Void execute() throws Throwable
{
Date beginTime = new Date();
System.out.println(" [testGetAssignedTasks_OLD] Started at " + beginTime.toString());
List<WorkflowTask> tasks = jbpmEngine.getAssignedTasks_OLD("admin", WorkflowTaskState.IN_PROGRESS);
Date endTime = new Date();
System.out.println(" [testGetAssignedTasks_OLD] Retrieved tasks: " + tasks.size() + " in " + (endTime.getTime() - beginTime.getTime()) + " ms");
System.out.println(" [testGetAssignedTasks_OLD] Finished at " + new Date().toString());
return null;
}
};
retryingTransactionHelper.setMaxRetries(1);
retryingTransactionHelper.doInTransaction(callback);
}
*/
public void onTearDown() throws Exception
{
System.out.println(" -------------- ");
}
private Map<QName, Serializable> prepareWorkflowProperties(NodeRef root, NodeRef content, String id)
{
NodeRef packageRef = makePackage(root, content, id);
Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();
parameters.put(WorkflowModel.ASSOC_PACKAGE, packageRef);
parameters.put(WorkflowModel.ASSOC_ASSIGNEE, "admin");
parameters.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, "Test workflow '" + id + "'");
parameters.put(WorkflowModel.PROP_WORKFLOW_DEFINITION_NAME, "test_workflow_" + id);
return parameters;
}
/**
* @param root
* @param content
* @param id
* @return
*/
private NodeRef makePackage(NodeRef root, NodeRef content, String id)
{
NodeRef container = fileFolderService.create(root, "package"+id, ContentModel.TYPE_FOLDER).getNodeRef();
NodeRef packageRef = workflowService.createPackage(container);
nodeService.addChild(packageRef, content, ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.DEFAULT_URI, id));
return packageRef;
}
@AfterClass
public static void cleanup()
{
// Clean up workflows
if(workflowIds !=null)
{
for (String wfId : workflowIds)
{
try
{
workflowService.cancelWorkflow(wfId);
}
catch(Exception e)
{
//NOOP
}
}
}
nodeService.deleteNode(rootNode);
}
}

View File

@@ -1,181 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.workflow.jbpm;
import java.util.List;
import org.alfresco.service.descriptor.DescriptorService;
import org.alfresco.util.BaseSpringTest;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import org.springmodules.workflow.jbpm31.JbpmCallback;
import org.springmodules.workflow.jbpm31.JbpmTemplate;
/**
* Test Usage of jBPM within Alfresco Spring Context
*
* @author davidc
*/
public class JBPMSpringTest extends BaseSpringTest
{
JbpmTemplate jbpmTemplate;
DescriptorService descriptorService;
//@Override
@SuppressWarnings("deprecation")
@Override
protected void onSetUpInTransaction() throws Exception
{
jbpmTemplate = (JbpmTemplate)applicationContext.getBean("jbpm_template");
descriptorService = (DescriptorService)applicationContext.getBean("DescriptorService");
}
public void testHelloWorld()
throws Exception
{
deployProcessDefinition();
processInstanceIsCreatedWhenUserSubmitsWebappForm();
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
undeployProcessDefinition();
}
private void deployProcessDefinition()
{
// This test shows a process definition and one execution
// of the process definition. The process definition has
// 3 nodes: an unnamed start-state, a state 's' and an
// end-state named 'end'.
final ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition name='hello world'>" +
" <start-state name='start'>" +
" <transition to='s' />" +
" </start-state>" +
" <node name='s'>" +
" <action class='org.alfresco.repo.workflow.jbpm.JBPMTestSpringActionHandler' config-type='bean'>" +
" <value>a test value</value>" +
" </action>" +
" <transition to='end' />" +
" </node>" +
" <end-state name='end' />" +
"</process-definition>"
);
jbpmTemplate.execute(new JbpmCallback()
{
public Object doInJbpm(JbpmContext context)
{
context.deployProcessDefinition(processDefinition);
return null;
}
});
}
private void undeployProcessDefinition()
{
jbpmTemplate.execute(new JbpmCallback()
{
public Object doInJbpm(JbpmContext context)
{
GraphSession graphSession = context.getGraphSession();
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("hello world");
graphSession.deleteProcessDefinition(processDefinition.getId());
return null;
}
});
}
private void processInstanceIsCreatedWhenUserSubmitsWebappForm()
{
jbpmTemplate.execute(new JbpmCallback()
{
public Object doInJbpm(JbpmContext context)
{
GraphSession graphSession = context.getGraphSession();
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("hello world");
// With the processDefinition that we retrieved from the database, we
// can create an execution of the process definition just like in the
// hello world example (which was without persistence).
ProcessInstance processInstance = new ProcessInstance(processDefinition);
Token token = processInstance.getRootToken();
assertEquals("start", token.getNode().getName());
// Let's start the process execution
token.signal();
// Now the process is in the state 's'.
assertEquals("s", token.getNode().getName());
// Spring based action has been called, check the result by looking at the
// process variable set by the action
String result = "Repo: " + descriptorService.getServerDescriptor().getVersion() + ", Value: a test value, Node: s, Token: /";
assertEquals(result, processInstance.getContextInstance().getVariable("jbpm.test.action.result"));
context.save(processInstance);
return null;
}
});
}
private void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived()
{
jbpmTemplate.execute(new JbpmCallback()
{
public Object doInJbpm(JbpmContext context)
{
GraphSession graphSession = context.getGraphSession();
// First, we need to get the process instance back out of the database.
// There are several options to know what process instance we are dealing
// with here. The easiest in this simple test case is just to look for
// the full list of process instances. That should give us only one
// result. So let's look up the process definition.
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("hello world");
// Now, we search for all process instances of this process definition.
List<?> processInstances = graphSession.findProcessInstances(processDefinition.getId());
// Because we know that in the context of this unit test, there is
// only one execution. In real life, the processInstanceId can be
// extracted from the content of the message that arrived or from
// the user making a choice.
ProcessInstance processInstance = (ProcessInstance) processInstances.get(0);
// Now we can continue the execution. Note that the processInstance
// delegates signals to the main path of execution (=the root token).
processInstance.signal();
// After this signal, we know the process execution should have
// arrived in the end-state.
assertTrue(processInstance.hasEnded());
// Now we can update the state of the execution in the database
context.save(processInstance);
return null;
}
});
}
}

View File

@@ -1,64 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.workflow.jbpm;
import org.alfresco.repo.workflow.AbstractMultitenantWorkflowTest;
/**
* @author Nick Smith
* @since 4.0
*
*/
public class JbpmMultitenantWorkflowTest extends AbstractMultitenantWorkflowTest
{
@Override
protected String getEngine()
{
return JBPMEngine.ENGINE_ID;
}
@Override
protected String getTestDefinitionPath()
{
return "jbpmresources/test_simple_processdefinition.xml";
}
@Override
protected String getTestDefinitionKey()
{
return "jbpm$test";
}
protected String getAdhocDefinitionPath()
{
return "alfresco/workflow/adhoc_processdefinition.xml";
}
@Override
protected String getAdhocDefinitionKey()
{
return "jbpm$wf:adhoc";
}
public void testSetup() throws Exception
{
// dummy test
}
}

View File

@@ -1,138 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.workflow.jbpm;
import java.io.InputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.workflow.WorkflowAdminServiceImpl;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.repo.workflow.WorkflowTestHelper;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.workflow.WorkflowDeployment;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.ApplicationContextHelper;
import org.hibernate.HibernateException;
import org.springframework.context.ApplicationContext;
import junit.framework.TestCase;
/**
* @author Nick Smith
* @since 4.0
*
*/
public class JbpmTimerTest extends TestCase
{
private static final String simpleDefLocation = "jbpmresources/test_simpleTimer.xml";
private static final String exceptionDefLocation = "jbpmresources/test_timerException.xml";
private WorkflowService workflowService;
private WorkflowTestHelper testHelper;
private String defId;
public void testTimerException() throws Exception
{
defId = deployDefinition(exceptionDefLocation);
NodeRef pckg = workflowService.createPackage(null);
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(WorkflowModel.ASSOC_PACKAGE, pckg);
params.put(WorkflowModel.ASSOC_ASSIGNEE, AuthenticationUtil.getAdminUserName());
WorkflowPath path = workflowService.startWorkflow(defId, params);
String instanceId = path.getInstance().getId();
WorkflowTask start = workflowService.getStartTask(instanceId);
workflowService.endTask(start.getId(), null);
Thread.sleep(30000);
System.out.println("Done!");
}
public void testTimerIsReassignable() throws Exception
{
defId = deployDefinition(simpleDefLocation);
NodeRef pckg = workflowService.createPackage(null);
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(WorkflowModel.ASSOC_PACKAGE, pckg);
params.put(WorkflowModel.ASSOC_ASSIGNEE, AuthenticationUtil.getAdminUserName());
WorkflowPath path = workflowService.startWorkflow(defId, params);
String instanceId = path.getInstance().getId();
WorkflowTask start = workflowService.getStartTask(instanceId);
workflowService.endTask(start.getId(), null);
List<WorkflowTask> tasks = workflowService.getTasksForWorkflowPath(path.getId());
WorkflowTask task = tasks.get(0);
assertTrue(workflowService.isTaskReassignable(task, AuthenticationUtil.getAdminUserName()));
// Wait for timer to end task
Thread.sleep(30000);
assertFalse(workflowService.isTaskReassignable(task, AuthenticationUtil.getAdminUserName()));
}
@Override
protected void setUp() throws Exception
{
ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
ServiceRegistry services = (ServiceRegistry) ctx.getBean(ServiceRegistry.SERVICE_REGISTRY);
workflowService = services.getWorkflowService();
WorkflowAdminServiceImpl adminService = (WorkflowAdminServiceImpl) ctx.getBean(WorkflowAdminServiceImpl.NAME);
AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
testHelper = new WorkflowTestHelper(adminService, JBPMEngine.ENGINE_ID, false);
testHelper.setVisible(true);
}
/**
* @return
*/
private String deployDefinition(String location)
{
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream(exceptionDefLocation);
input = classLoader.getResourceAsStream(location);
WorkflowDeployment deployment
= workflowService.deployDefinition(JBPMEngine.ENGINE_ID, input, MimetypeMap.MIMETYPE_XML);
return deployment.getDefinition().getId();
}
@Override
protected void tearDown() throws Exception
{
workflowService.undeployDefinition(defId);
testHelper.tearDown();
AuthenticationUtil.clearCurrentSecurityContext();
}
public static void throwException() throws HibernateException
{
throw new HibernateException("My Timer Exception");
}
}

View File

@@ -1,153 +0,0 @@
/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.workflow.jbpm;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.repo.workflow.AbstractWorkflowServiceIntegrationTest;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
/**
* JBPM Workflow Service Implementation Tests
*
* @author Nick Smith
* @since 3.4.e
*/
public class JbpmWorkflowServiceIntegrationTest extends AbstractWorkflowServiceIntegrationTest
{
@SuppressWarnings("deprecation")
public void disabledTestAsynchronousTaskExecutes() throws Exception
{
setComplete();
endTransaction();
String defId = null;
String instanceId = null;
try
{
WorkflowDefinition def = deployDefinition(getAsyncAdhocPath());
defId = def.getId();
// Create workflow parameters
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
Serializable wfPackage = workflowService.createPackage(null);
params.put(WorkflowModel.ASSOC_PACKAGE, wfPackage);
Date dueDate = new Date();
params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, dueDate);
params.put(WorkflowModel.PROP_WORKFLOW_PRIORITY, 1);
NodeRef assignee = personManager.get(USER2);
params.put(WorkflowModel.ASSOC_ASSIGNEE, assignee);
WorkflowPath path = workflowService.startWorkflow(defId, params);
instanceId = path.getInstance().getId();
// End the Start Task.
List<WorkflowTask> tasks = workflowService.getTasksForWorkflowPath(path.getId());
assertEquals(1, tasks.size());
WorkflowTask startTask = tasks.get(0);
workflowService.endTask(startTask.getId(), null);
// Wait for async execution to occur.
Thread.sleep(1000);
// Should move past the asynchronous adhoc task.
tasks = workflowService.getTasksForWorkflowPath(path.getId());
assertEquals(1, tasks.size());
WorkflowTask endTask = tasks.get(0);
assertEquals("wf:completedAdhocTask", endTask.getName());
// Check async task assigned to USER2
tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS);
assertEquals(1, tasks.size());
WorkflowTask adhocTask = tasks.get(0);
assertEquals("wf:adhocTask", adhocTask.getName());
}
finally
{
if(instanceId != null)
{
workflowService.cancelWorkflow(instanceId);
}
if(defId != null)
{
workflowService.undeployDefinition(defId);
}
}
}
private String getAsyncAdhocPath()
{
return "jbpmresources/async_adhoc_processdefinition.xml";
}
@Override
protected String getEngine()
{
return JBPMEngine.ENGINE_ID;
}
@Override
protected String getTestDefinitionPath()
{
return "jbpmresources/test_simple_processdefinition.xml";
}
@Override
protected String getAdhocDefinitionPath()
{
return "alfresco/workflow/adhoc_processdefinition.xml";
}
@Override
protected String getPooledReviewDefinitionPath()
{
return "alfresco/workflow/review_pooled_processdefinition.xml";
}
@Override
protected String getParallelReviewDefinitionPath()
{
return "alfresco/workflow/parallelreview_processdefinition.xml";
}
@Override
protected String getTestTimerDefinitionPath()
{
return "jbpmresources/test_timer.xml";
}
@Override
protected QName getAdhocProcessName()
{
return QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "adhoc");
}
}

View File

@@ -1,178 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.workflow.jbpm;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.workflow.BPMEngineRegistry;
import org.alfresco.repo.workflow.TaskComponent;
import org.alfresco.repo.workflow.WorkflowComponent;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowDeployment;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.BaseSpringTest;
import org.springframework.core.io.ClassPathResource;
/**
* Review and Approve workflow specific Tests
*
* @author davidc
*/
public class ReviewAndApproveTest extends BaseSpringTest
{
AuthenticationComponent authenticationComponent;
PersonService personService;
WorkflowComponent workflowComponent;
TaskComponent taskComponent;
WorkflowDefinition testWorkflowDef;
NodeRef testNodeRef;
@SuppressWarnings("deprecation")
@Override
protected void onSetUpInTransaction() throws Exception
{
personService = (PersonService)applicationContext.getBean("personService");
BPMEngineRegistry registry = (BPMEngineRegistry)applicationContext.getBean("bpm_engineRegistry");
workflowComponent = registry.getWorkflowComponent(JBPMEngine.ENGINE_ID);
taskComponent = registry.getTaskComponent(JBPMEngine.ENGINE_ID);
// deploy latest review and approve process definition
ClassPathResource processDef = new ClassPathResource("alfresco/workflow/review_processdefinition.xml");
WorkflowDeployment deployment = workflowComponent.deployDefinition(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML);
testWorkflowDef = deployment.getDefinition();
assertNotNull(testWorkflowDef);
// run as system
authenticationComponent = (AuthenticationComponent)applicationContext.getBean("authenticationComponent");
authenticationComponent.setSystemUserAsCurrentUser();
// get valid node ref
NodeService nodeService = (NodeService)applicationContext.getBean(ServiceRegistry.NODE_SERVICE.getLocalName());
testNodeRef = nodeService.getRootNode(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"));
}
@Override
protected void onTearDownInTransaction()
{
authenticationComponent.clearCurrentSecurityContext();
}
public void testSubmitForReview()
{
WorkflowDefinition workflowDef = testWorkflowDef;
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(WorkflowModel.ASSOC_PACKAGE, testNodeRef);
Date reviewDueDate = new Date();
params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, reviewDueDate);
NodeRef reviewer = personService.getPerson(AuthenticationUtil.getAdminUserName());
params.put(WorkflowModel.ASSOC_ASSIGNEE, reviewer);
params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, "Test review");
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), params);
assertNotNull(path);
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
WorkflowTask task = tasks1.get(0);
assertTrue(task.getProperties().containsKey(WorkflowModel.ASSOC_PACKAGE));
WorkflowTask endedTask = taskComponent.endTask(task.getId(), null);
assertNotNull(endedTask);
assertTrue(endedTask.getProperties().containsKey(WorkflowModel.PROP_OUTCOME));
assertEquals("", endedTask.getProperties().get(WorkflowModel.PROP_OUTCOME));
assertEquals("Test review", endedTask.getProperties().get(WorkflowModel.PROP_DESCRIPTION));
assertEquals("Test review", endedTask.getPath().getInstance().getDescription());
List<WorkflowTask> assignedTasks = taskComponent.getAssignedTasks(AuthenticationUtil.getAdminUserName(), WorkflowTaskState.IN_PROGRESS, false);
assertNotNull(assignedTasks);
assignedTasks = filterTasksByWorkflowInstance(assignedTasks, path.getInstance().getId());
assertEquals(testNodeRef, assignedTasks.get(0).getProperties().get(WorkflowModel.ASSOC_PACKAGE));
assertEquals(reviewDueDate, assignedTasks.get(0).getProperties().get(WorkflowModel.PROP_DUE_DATE));
}
public void testCompletedItems()
{
WorkflowDefinition workflowDef = testWorkflowDef;
List<NodeRef> nodeRefs = new ArrayList<NodeRef>();
nodeRefs.add(testNodeRef);
nodeRefs.add(testNodeRef);
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(WorkflowModel.ASSOC_PACKAGE, testNodeRef);
params.put(WorkflowModel.PROP_COMPLETED_ITEMS, (Serializable)nodeRefs);
Date reviewDueDate = new Date();
params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, reviewDueDate);
NodeRef reviewer = personService.getPerson(AuthenticationUtil.getAdminUserName());
params.put(WorkflowModel.ASSOC_ASSIGNEE, reviewer);
WorkflowPath path = workflowComponent.startWorkflow(workflowDef.getId(), params);
assertNotNull(path);
List<WorkflowTask> tasks1 = workflowComponent.getTasksForWorkflowPath(path.getId());
assertNotNull(tasks1);
assertEquals(1, tasks1.size());
WorkflowTask task = tasks1.get(0);
assertTrue(task.getProperties().containsKey(WorkflowModel.PROP_COMPLETED_ITEMS));
assertEquals(2, ((List<?>)task.getProperties().get(WorkflowModel.PROP_COMPLETED_ITEMS)).size());
}
/**
* Filter task list by workflow instance
*
* @param tasks
* @param processInstanceId
* @return
*/
private List<WorkflowTask> filterTasksByWorkflowInstance(List<WorkflowTask> tasks, String workflowInstanceId)
{
List<WorkflowTask> filteredTasks = new ArrayList<WorkflowTask>();
for (WorkflowTask task : tasks)
{
if (task.getPath().getInstance().getId().equals(workflowInstanceId))
{
filteredTasks.add(task);
}
}
return filteredTasks;
}
}

View File

@@ -1,15 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
<subclass name="org.alfresco.repo.workflow.jbpm.WorkflowTaskInstance"
extends="org.jbpm.taskmgmt.exe.TaskInstance" discriminator-value="W">
<property name="jbpmEngineName" type="string" length="50"
column="JBPM_ENGINE_NAME" />
</subclass>
</hibernate-mapping>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
<subclass name="org.alfresco.repo.workflow.jbpm.AlfrescoCreateTimerAction"
extends="org.jbpm.graph.def.Action"
discriminator-value="C">
<property name="timerName" column="TIMERNAME_" />
<property name="dueDate" column="DUEDATE_" />
<property name="repeat" column="REPEAT_" />
<property name="transitionName" column="TRANSITIONNAME_" />
<many-to-one name="timerAction"
column="TIMERACTION_"
foreign-key="FK_CRTETIMERACT_TA"
cascade="all" />
</subclass>
</hibernate-mapping>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
<subclass name="org.alfresco.repo.workflow.jbpm.AlfrescoExecuteNodeJob"
discriminator-value="X"
extends="org.jbpm.job.ExecuteNodeJob">
</subclass>
</hibernate-mapping>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field" >
<subclass name="org.alfresco.repo.workflow.jbpm.Join"
discriminator-value="J"
extends="org.jbpm.graph.def.Node" />
</hibernate-mapping>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
<subclass name="org.alfresco.repo.workflow.jbpm.AlfrescoTaskNode"
discriminator-value="S"
extends="org.jbpm.graph.node.TaskNode">
</subclass>
</hibernate-mapping>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
<subclass name="org.alfresco.repo.workflow.jbpm.AlfrescoTimer"
discriminator-value="S"
extends="org.jbpm.job.Timer">
</subclass>
</hibernate-mapping>

View File

@@ -1,7 +0,0 @@
<action-types>
<action-type element="action" class="org.jbpm.graph.def.Action" />
<action-type element="create-timer" class="org.alfresco.repo.workflow.jbpm.CreateTimerAction" />
<action-type element="cancel-timer" class="org.jbpm.scheduler.def.CancelTimerAction" />
<action-type element="script" class="org.jbpm.graph.action.Script" />
<action-type element="mail" class="org.jbpm.graph.action.MailAction" />
</action-types>

View File

@@ -1,91 +0,0 @@
<jbpm-configuration>
<jbpm-context>
<service name="persistence">
<factory>
<bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
<field name="isCurrentSessionEnabled">
<true />
</field>
<field name="isTransactionEnabled">
<false />
</field>
</bean>
</factory>
</service>
<service name="tx" factory="org.jbpm.tx.TxServiceFactory" />
<service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
<service name="scheduler"
factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
<service name="logging"
factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
<service name="authentication"
factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
</jbpm-context>
<!--
configuration resource files pointing to default configuration
files in jbpm-{version}.jar
-->
<string name="resource.business.calendar"
value="org/jbpm/calendar/jbpm.business.calendar.properties" />
<string name="resource.default.modules"
value="org/jbpm/graph/def/jbpm.default.modules.properties" />
<string name='resource.converter'
value='org/alfresco/repo/workflow/jbpm/jbpm.converter.properties' />
<string name="resource.action.types"
value="org/alfresco/repo/workflow/jbpm/jbpm.action.types.xml" />
<string name="resource.node.types"
value="org/alfresco/repo/workflow/jbpm/jbpm.node.types.xml" />
<string name="resource.parsers"
value="org/alfresco/repo/workflow/jbpm/jbpm.parsers.xml" />
<string name="resource.varmapping"
value="org/alfresco/repo/workflow/jbpm/jbpm.varmapping.xml" />
<string name="resource.mail.templates" value="jbpm.mail.templates.xml" />
<int name="jbpm.byte.block.size" value="1024" singleton="true" />
<string name="jbpm.mail.smtp.host" value="localhost" />
<bean name="jbpm.task.instance.factory"
class="org.alfresco.repo.workflow.jbpm.WorkflowTaskInstanceFactory"
singleton="true">
<field name="jbpmEngineName">
<string value="jbpm_engine" />
</field>
</bean>
<bean name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver"
singleton="true" />
<bean name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver"
singleton="true" />
<bean name="jbpm.job.executor" class="org.alfresco.repo.workflow.jbpm.AlfrescoJobExecutor">
<field name="jbpmConfiguration">
<ref bean="jbpmConfiguration" />
</field>
<field name="name">
<string value="AlfrescoJbpmJobExecutor" />
</field>
<field name="nbrOfThreads">
<int value="1" />
</field>
<field name="idleInterval">
<int value="90000" />
</field> <!-- 15 minutes -->
<field name="maxIdleInterval">
<int value="3600000" />
</field> <!-- 1 hour -->
<field name="historyMaxSize">
<int value="20" />
</field>
<field name="maxLockTime">
<int value="600000" />
</field> <!-- 10 minutes -->
<field name="lockMonitorInterval">
<int value="60000" />
</field> <!-- 1 minute -->
<field name="lockBufferTime">
<int value="5000" />
</field> <!-- 5 seconds -->
</bean>
</jbpm-configuration>

View File

@@ -1,19 +0,0 @@
# this file contains the mappings between converter types
# and the char that is used in the database. this mapping
# is used by the ConverterEnumType to store the VariableInstance
# converter field. The Converters class provides singleton access
# to these converter classes.
B org.jbpm.context.exe.converter.BooleanToStringConverter
Y org.jbpm.context.exe.converter.BytesToByteArrayConverter
E org.jbpm.context.exe.converter.ByteToLongConverter
C org.jbpm.context.exe.converter.CharacterToStringConverter
A org.jbpm.context.exe.converter.DateToLongConverter
D org.jbpm.context.exe.converter.DoubleToStringConverter
F org.jbpm.context.exe.converter.FloatToStringConverter
G org.jbpm.context.exe.converter.FloatToDoubleConverter
I org.jbpm.context.exe.converter.IntegerToLongConverter
R org.jbpm.context.exe.converter.SerializableToByteArrayConverter
H org.jbpm.context.exe.converter.ShortToLongConverter
N org.alfresco.repo.workflow.jbpm.NodeConverter
L org.alfresco.repo.workflow.jbpm.NodeListConverter

View File

@@ -1,105 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<sql-query name="org.alfresco.repo.workflow.findTaskInstancesByActorId">
<!--
Query Result Object[]:
0=> TaskInstance,
1=> TaskMgmtDefinition,
2=> Token,
3=> ProcessInstance,
4=> StartState (Node),
5=> Task,
6=> ProcessDefinition,
7=> Task (StartTask),
8=> ContextInstance
-->
<return alias="taskInstance" class="org.jbpm.taskmgmt.exe.TaskInstance" />
<return alias="taskMgmtDefinition" class="org.jbpm.taskmgmt.def.TaskMgmtDefinition" />
<return-join alias="token" property="taskInstance.token" />
<return-join alias="processInstance" property="token.processInstance" />
<return-join alias="node" property="token.node" />
<return-join alias="task" property="taskInstance.task" />
<return-join alias="processDefinition1" property="task.processDefinition" />
<return-join alias="startTask" property="taskMgmtDefinition.startTask" />
<return alias="contextInstance" class="org.jbpm.context.exe.ContextInstance" />
<![CDATA[
SELECT
{taskInstance.*},
{token.*},
{processInstance.*},
{node.*},
{task.*},
{processDefinition1.*},
{taskMgmtDefinition.*},
{startTask.*},
{contextInstance.*}
FROM
JBPM_TASKINSTANCE taskInstance
JOIN JBPM_TOKEN token ON (taskInstance.TOKEN_ = token.ID_)
LEFT JOIN JBPM_NODE node ON (token.NODE_ = node.ID_)
JOIN JBPM_TASK task ON (taskInstance.TASK_ = task.ID_)
JOIN JBPM_PROCESSINSTANCE processInstance ON (taskInstance.PROCINST_ = processInstance.ID_)
JOIN JBPM_MODULEINSTANCE contextInstance ON (contextInstance.PROCESSINSTANCE_ = processInstance.ID_)
JOIN JBPM_PROCESSDEFINITION processDefinition1 ON (task.PROCESSDEFINITION_ = processDefinition1.ID_)
JOIN JBPM_PROCESSDEFINITION processDefinition2 ON (processInstance.PROCESSDEFINITION_ = processDefinition2.ID_)
JOIN JBPM_MODULEDEFINITION taskMgmtDefinition ON (taskMgmtDefinition.PROCESSDEFINITION_ = processDefinition2.ID_)
JOIN JBPM_TASK startTask ON (taskMgmtDefinition.STARTTASK_ = startTask.ID_)
WHERE
taskInstance.ACTORID_=:actorId
AND taskMgmtDefinition.NAME_ = 'org.jbpm.taskmgmt.def.TaskMgmtDefinition'
AND contextInstance.NAME_='org.jbpm.context.exe.ContextInstance'
AND taskInstance.ISSUSPENDED_ <> :true
AND taskInstance.ISOPEN_= :true
]]>
</sql-query>
<query name="org.alfresco.repo.workflow.findTaskInstancesByActorIdHQL">
select taskInstance
from org.jbpm.taskmgmt.exe.TaskInstance as taskInstance
left join fetch taskInstance.token as token
left join fetch taskInstance.task as task
left join fetch token.processInstance as processInstance
left join fetch processInstance.processDefinition as processDefinition
left join fetch processDefinition.definitions as taskMgmtDefinition
where taskInstance.actorId = :actorId
and taskInstance.isSuspended != true
and taskInstance.isOpen = true
</query>
<query name="org.alfresco.repo.workflow.cacheTaskInstanceProperties">
<![CDATA[
select taskInstance
from org.jbpm.taskmgmt.exe.TaskInstance as taskInstance
left join fetch taskInstance.variableInstances
left join fetch taskInstance.comments
left join fetch taskInstance.pooledActors
left join fetch taskInstance.swimlaneInstance as swimlaneInstance
left join fetch swimlaneInstance.pooledActors
left join fetch taskInstance.token as token
left join fetch token.processInstance as processInstance
left join fetch processInstance.rootToken as rootToken
left join fetch processInstance.instances
left join fetch token.node as node
left join fetch node.leavingTransitions
where taskInstance.id in (:ids)
]]>
</query>
<query name="org.alfresco.repo.workflow.cacheInstanceVariables">
<![CDATA[
select variableMap
from org.jbpm.context.exe.TokenVariableMap as variableMap
left join fetch variableMap.contextInstance as contextInstance
left join fetch variableMap.variableInstances
where contextInstance.id in (:ids)
]]>
</query>
</hibernate-mapping>

View File

@@ -1,19 +0,0 @@
<node-types>
<node-type element="start-state" class="org.jbpm.graph.node.StartState" />
<node-type element="end-state" class="org.jbpm.graph.node.EndState" />
<node-type element="node" class="org.jbpm.graph.def.Node" />
<node-type element="state" class="org.jbpm.graph.node.State" />
<node-type element="task-node" class="org.jbpm.graph.node.TaskNode" />
<node-type element="fork" class="org.jbpm.graph.node.Fork" />
<node-type element="join" class="org.alfresco.repo.workflow.jbpm.Join" />
<node-type element="decision" class="org.jbpm.graph.node.Decision" />
<node-type element="process-state" class="org.jbpm.graph.node.ProcessState" />
<node-type element="super-state" class="org.jbpm.graph.def.SuperState" />
<node-type element="merge" class="org.jbpm.graph.node.Merge" />
<node-type element="milestone-node" class="org.jbpm.graph.node.MilestoneNode" />
<node-type element="interleave-start" class="org.jbpm.graph.node.InterleaveStart" />
<node-type element="interleave-end" class="org.jbpm.graph.node.InterleaveEnd" />
<node-type element="mail-node" class="org.jbpm.graph.node.MailNode" />
<node-type element="page" class="org.jboss.seam.pageflow.Page" />
<node-type element="start-page" class="org.jboss.seam.pageflow.Page" />
</node-types>

View File

@@ -1,4 +0,0 @@
<parsers>
<parser class="org.alfresco.repo.workflow.jbpm.JBPMJpdlArchiveParser" />
<parser class="org.jbpm.jpdl.par.FileArchiveParser" />
</parsers>

View File

@@ -1,198 +0,0 @@
<!--
# This file specifies how jbpm will store variables into the database.
#
# If jbpm needs to determine how to store a variable into the database,
# the jbpm-types below or scanned in sequence as they are specified here.
# For each jbpm-type, jbpm will see if the give variable object matches
# with the matcher bean. If there is a match, the converter (optional)
# and the variable instance will be used to store and retrieve
# the variable value for the rest of its lifetime till the variable is
# deleted.
-->
<jbpm-types>
<list name="jbpm.types" singleton="true">
<!-- java.lang.String -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.String" /></field>
</bean>
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.StringInstance" />
</jbpm-type>
<!-- java.lang.Boolean -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Boolean" /></field>
</bean>
</matcher>
<converter class="org.jbpm.context.exe.converter.BooleanToStringConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.StringInstance" />
</jbpm-type>
<!-- java.lang.Character -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Character" /></field>
</bean>
</matcher>
<converter class="org.jbpm.context.exe.converter.CharacterToStringConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.StringInstance" />
</jbpm-type>
<!-- java.lang.Long -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Long" /></field>
</bean>
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.LongInstance" />
</jbpm-type>
<!-- java.lang.Byte -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Byte" /></field>
</bean>
</matcher>
<converter class="org.jbpm.context.exe.converter.ByteToLongConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.LongInstance" />
</jbpm-type>
<!-- java.lang.Short -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Short" /></field>
</bean>
</matcher>
<converter class="org.jbpm.context.exe.converter.ShortToLongConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.LongInstance" />
</jbpm-type>
<!-- java.lang.Integer -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Integer" /></field>
</bean>
</matcher>
<converter class="org.jbpm.context.exe.converter.IntegerToLongConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.LongInstance" />
</jbpm-type>
<!-- java.lang.Double -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Double" /></field>
</bean>
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.DoubleInstance" />
</jbpm-type>
<!-- java.lang.Float -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.lang.Float" /></field>
</bean>
</matcher>
<converter class="org.jbpm.context.exe.converter.FloatToDoubleConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.DoubleInstance" />
</jbpm-type>
<!-- java.util.Date -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="java.util.Date" /></field>
</bean>
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.DateInstance" />
</jbpm-type>
<!-- org.alfresco.repo.workflow.jbpm.JBPMNode -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="org.alfresco.repo.workflow.jbpm.JBPMNode" /></field>
</bean>
</matcher>
<converter class="org.alfresco.repo.workflow.jbpm.NodeConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.StringInstance" />
</jbpm-type>
<!-- org.alfresco.repo.workflow.jbpm.JBPMNodeList -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="org.alfresco.repo.workflow.jbpm.JBPMNodeList" /></field>
</bean>
</matcher>
<converter class="org.alfresco.repo.workflow.jbpm.NodeListConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.ByteArrayInstance" />
</jbpm-type>
<!-- byte[] -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.ClassNameMatcher">
<field name="className"><string value="[B" /></field>
</bean>
</matcher>
<converter class="org.jbpm.context.exe.converter.BytesToByteArrayConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.ByteArrayInstance" />
</jbpm-type>
<!-- hibernatable long id types -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.HibernateLongIdMatcher" />
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.HibernateLongInstance" />
</jbpm-type>
<!-- hibernatable string id types -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.HibernateStringIdMatcher" />
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.HibernateStringInstance" />
</jbpm-type>
<!-- java.io.Serializable -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.SerializableMatcher" />
</matcher>
<converter class="org.jbpm.context.exe.converter.SerializableToByteArrayConverter" />
<variable-instance class="org.jbpm.context.exe.variableinstance.ByteArrayInstance" />
</jbpm-type>
<!-- hibernatable ejb3 types -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.Ejb3Matcher" />
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.Ejb3Instance" />
</jbpm-type>
<!-- JSR 170 JCR Node -->
<jbpm-type>
<matcher>
<bean class="org.jbpm.context.exe.matcher.JcrNodeMatcher" />
</matcher>
<variable-instance class="org.jbpm.context.exe.variableinstance.JcrNodeInstance" />
</jbpm-type>
</list>
</jbpm-types>