mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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
|
@@ -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>
|
@@ -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>
|
@@ -1,4 +0,0 @@
|
||||
<parsers>
|
||||
<parser class="org.alfresco.repo.workflow.jbpm.JBPMJpdlArchiveParser" />
|
||||
<parser class="org.jbpm.jpdl.par.FileArchiveParser" />
|
||||
</parsers>
|
@@ -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>
|
Reference in New Issue
Block a user