mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud)
78747: Merged V4.2-BUG-FIX (4.2.4) to HEAD-BUG-FIX (5.0/Cloud) 78624: Merged V4.2.1 (4.2.1.10) to V4.2-BUG-FIX (4.2.4) 77969: MNT-11926: Unable to start a workflow from a taskListener When activity workflow is started suspend CommandContext propogation (if any exists) so that new ProcessInstance could be flushed and correctly converted to WorkflowPath. Add unit test. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@82635 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -52,9 +52,11 @@ import org.activiti.engine.impl.bpmn.behavior.ReceiveTaskActivityBehavior;
|
|||||||
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
|
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
|
||||||
import org.activiti.engine.impl.bpmn.deployer.BpmnDeployer;
|
import org.activiti.engine.impl.bpmn.deployer.BpmnDeployer;
|
||||||
import org.activiti.engine.impl.bpmn.diagram.ProcessDiagramGenerator;
|
import org.activiti.engine.impl.bpmn.diagram.ProcessDiagramGenerator;
|
||||||
|
import org.activiti.engine.impl.context.Context;
|
||||||
import org.activiti.engine.impl.form.DefaultTaskFormHandler;
|
import org.activiti.engine.impl.form.DefaultTaskFormHandler;
|
||||||
import org.activiti.engine.impl.form.TaskFormHandler;
|
import org.activiti.engine.impl.form.TaskFormHandler;
|
||||||
import org.activiti.engine.impl.identity.Authentication;
|
import org.activiti.engine.impl.identity.Authentication;
|
||||||
|
import org.activiti.engine.impl.interceptor.CommandContext;
|
||||||
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
|
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
|
||||||
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
|
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
|
||||||
import org.activiti.engine.impl.persistence.entity.TimerEntity;
|
import org.activiti.engine.impl.persistence.entity.TimerEntity;
|
||||||
@@ -985,16 +987,35 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Start the process-instance
|
// Start the process-instance
|
||||||
ProcessInstance instance = runtimeService.startProcessInstanceById(processDefId, variables);
|
CommandContext context = Context.getCommandContext();
|
||||||
if(instance.isEnded())
|
boolean isContextSuspended = false;
|
||||||
|
if (context != null && context.getException() == null)
|
||||||
{
|
{
|
||||||
return typeConverter.buildCompletedPath(instance.getId(), instance.getId());
|
// MNT-11926: push null context to stack to avoid context reusage when new instance is not flushed
|
||||||
|
Context.setCommandContext(null);
|
||||||
|
isContextSuspended = true;
|
||||||
}
|
}
|
||||||
else
|
try
|
||||||
{
|
{
|
||||||
WorkflowPath path = typeConverter.convert((Execution)instance);
|
ProcessInstance instance = runtimeService.startProcessInstanceById(processDefId, variables);
|
||||||
endStartTaskAutomatically(path, instance);
|
if (instance.isEnded())
|
||||||
return path;
|
{
|
||||||
|
return typeConverter.buildCompletedPath(instance.getId(), instance.getId());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WorkflowPath path = typeConverter.convert((Execution) instance);
|
||||||
|
endStartTaskAutomatically(path, instance);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (isContextSuspended)
|
||||||
|
{
|
||||||
|
// pop null context out of stack
|
||||||
|
Context.removeCommandContext();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (ActivitiException ae)
|
catch (ActivitiException ae)
|
||||||
|
@@ -86,7 +86,7 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
|
|||||||
protected TestPersonManager personManager;
|
protected TestPersonManager personManager;
|
||||||
protected TestGroupManager groupManager;
|
protected TestGroupManager groupManager;
|
||||||
protected NodeService nodeService;
|
protected NodeService nodeService;
|
||||||
private NodeRef companyHome;
|
protected NodeRef companyHome;
|
||||||
protected WorkflowTestHelper wfTestHelper;
|
protected WorkflowTestHelper wfTestHelper;
|
||||||
protected TransactionServiceImpl transactionService;
|
protected TransactionServiceImpl transactionService;
|
||||||
|
|
||||||
|
@@ -28,11 +28,13 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
||||||
import org.alfresco.repo.workflow.AbstractWorkflowServiceIntegrationTest;
|
import org.alfresco.repo.workflow.AbstractWorkflowServiceIntegrationTest;
|
||||||
import org.alfresco.repo.workflow.WorkflowModel;
|
import org.alfresco.repo.workflow.WorkflowModel;
|
||||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.TypeDefinition;
|
import org.alfresco.service.cmr.dictionary.TypeDefinition;
|
||||||
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||||
@@ -382,6 +384,39 @@ public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServ
|
|||||||
checkNoTasksFoundUsingQuery(taskQuery);
|
checkNoTasksFoundUsingQuery(taskQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testStartWorkflowFromTaskListener() throws Exception
|
||||||
|
{
|
||||||
|
WorkflowDefinition testDefinition = deployDefinition("activiti/testStartWfFromListener.bpmn20.xml");
|
||||||
|
|
||||||
|
AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
|
||||||
|
|
||||||
|
Map<QName, Serializable> props = new HashMap<QName, Serializable>();
|
||||||
|
props.put(ContentModel.PROP_NAME, "MNT-11926-testfile.txt");
|
||||||
|
final ChildAssociationRef childAssoc = nodeService.createNode(companyHome, ContentModel.ASSOC_CONTAINS,
|
||||||
|
QName.createQName(NamespaceService.CONTENT_MODEL_PREFIX, "MNT-11926-test"), ContentModel.TYPE_CONTENT, props);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Create workflow parameters
|
||||||
|
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
|
||||||
|
Serializable wfPackage = workflowService.createPackage(null);
|
||||||
|
params.put(WorkflowModel.ASSOC_PACKAGE, wfPackage);
|
||||||
|
NodeRef assignee = personManager.get(USER1);
|
||||||
|
params.put(WorkflowModel.ASSOC_ASSIGNEE, assignee); // task instance field
|
||||||
|
|
||||||
|
WorkflowPath path = workflowService.startWorkflow(testDefinition.getId(), params);
|
||||||
|
String instanceId = path.getInstance().getId();
|
||||||
|
|
||||||
|
WorkflowTask startTask = workflowService.getStartTask(instanceId);
|
||||||
|
workflowService.endTask(startTask.getId(), null);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// tidy up
|
||||||
|
nodeService.deleteNode(childAssoc.getChildRef());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getEngine()
|
protected String getEngine()
|
||||||
{
|
{
|
||||||
|
@@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
|
||||||
|
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
|
||||||
|
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
|
||||||
|
expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://alfresco.org">
|
||||||
|
|
||||||
|
<process isExecutable="true" id="testListenerTriggerAdhoc" name="Test Listener Trigger Activiti Process">
|
||||||
|
|
||||||
|
<startEvent id="start"
|
||||||
|
activiti:formKey="wf:submitAdhocTask" />
|
||||||
|
<sequenceFlow id='flow1'
|
||||||
|
sourceRef='start'
|
||||||
|
targetRef='adhocTask' />
|
||||||
|
|
||||||
|
<userTask id="adhocTask" name="Adhoc Task"
|
||||||
|
activiti:formKey="wf:adhocTask">
|
||||||
|
<extensionElements>
|
||||||
|
<activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
|
||||||
|
<activiti:field name="script">
|
||||||
|
<activiti:string>
|
||||||
|
var wfdef = workflow.getDefinitionByName("activiti$activitiReview");
|
||||||
|
var wfparams = new Object();
|
||||||
|
wfparams["bpm:workflowDescription"] = "Start workflow JS - ";
|
||||||
|
wfparams["bpm:assignee"] = people.getPerson("admin");
|
||||||
|
var wfpackage = workflow.createPackage();
|
||||||
|
wfpackage.addNode(search.luceneSearch("+PATH:\"/app:company_home/*\" +@cm\\:name:\"MNT-11926-testfile.txt\"")[0]);
|
||||||
|
wfdef.startWorkflow(wfpackage,wfparams);
|
||||||
|
</activiti:string>
|
||||||
|
</activiti:field>
|
||||||
|
</activiti:taskListener>
|
||||||
|
</extensionElements>
|
||||||
|
<humanPerformer>
|
||||||
|
<resourceAssignmentExpression>
|
||||||
|
<formalExpression>${bpm_assignee.properties.userName}</formalExpression>
|
||||||
|
</resourceAssignmentExpression>
|
||||||
|
</humanPerformer>
|
||||||
|
</userTask>
|
||||||
|
|
||||||
|
<sequenceFlow id='flow2'
|
||||||
|
sourceRef='adhocTask'
|
||||||
|
targetRef='verifyTaskDone' />
|
||||||
|
|
||||||
|
<userTask id="verifyTaskDone" name="Verify Adhoc Task Completed."
|
||||||
|
activiti:formKey="wf:completedAdhocTask" >
|
||||||
|
<documentation>
|
||||||
|
Verify the task was completed.
|
||||||
|
</documentation>
|
||||||
|
<extensionElements>
|
||||||
|
<activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
|
||||||
|
<activiti:field name="script">
|
||||||
|
<activiti:string>
|
||||||
|
if (typeof bpm_workflowDueDate != 'undefined') task.dueDate = bpm_workflowDueDate
|
||||||
|
if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;
|
||||||
|
|
||||||
|
if (wf_notifyMe)
|
||||||
|
{
|
||||||
|
var mail = actions.create("mail");
|
||||||
|
mail.parameters.to = initiator.properties.email;
|
||||||
|
mail.parameters.subject = "Adhoc Task " + bpm_workflowDescription;
|
||||||
|
mail.parameters.from = bpm_assignee.properties.email;
|
||||||
|
mail.parameters.text = "It's done";
|
||||||
|
mail.execute(bpm_package);
|
||||||
|
}
|
||||||
|
</activiti:string>
|
||||||
|
</activiti:field>
|
||||||
|
</activiti:taskListener>
|
||||||
|
</extensionElements>
|
||||||
|
<humanPerformer>
|
||||||
|
<resourceAssignmentExpression>
|
||||||
|
<formalExpression>${initiator.exists() ? initiator.properties.userName : 'admin'}</formalExpression>
|
||||||
|
</resourceAssignmentExpression>
|
||||||
|
</humanPerformer>
|
||||||
|
</userTask>
|
||||||
|
|
||||||
|
<sequenceFlow id='flow3' sourceRef='verifyTaskDone'
|
||||||
|
targetRef='theEnd' />
|
||||||
|
|
||||||
|
<endEvent id="theEnd" />
|
||||||
|
|
||||||
|
</process>
|
||||||
|
|
||||||
|
<!-- Graphical representaion of diagram -->
|
||||||
|
<bpmndi:BPMNDiagram id="BPMNDiagram_activitiAdhoc">
|
||||||
|
<bpmndi:BPMNPlane bpmnElement="activitiAdhoc" id="BPMNPlane_activitiAdhoc">
|
||||||
|
<bpmndi:BPMNShape bpmnElement="start"
|
||||||
|
id="BPMNShape_start">
|
||||||
|
<omgdc:Bounds height="35" width="35" x="30" y="200"></omgdc:Bounds>
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape bpmnElement="adhocTask"
|
||||||
|
id="BPMNShape_adhocTask">
|
||||||
|
<omgdc:Bounds height="55" width="105" x="130"
|
||||||
|
y="190"></omgdc:Bounds>
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape bpmnElement="verifyTaskDone"
|
||||||
|
id="BPMNShape_verifyTaskDone">
|
||||||
|
<omgdc:Bounds height="55" width="105" x="290"
|
||||||
|
y="190"></omgdc:Bounds>
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape bpmnElement="theEnd"
|
||||||
|
id="BPMNShape_theEnd">
|
||||||
|
<omgdc:Bounds height="35" width="35" x="455" y="200"></omgdc:Bounds>
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
|
||||||
|
<omgdi:waypoint x="65" y="217"></omgdi:waypoint>
|
||||||
|
<omgdi:waypoint x="130" y="217"></omgdi:waypoint>
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
|
||||||
|
<omgdi:waypoint x="235" y="217"></omgdi:waypoint>
|
||||||
|
<omgdi:waypoint x="290" y="217"></omgdi:waypoint>
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
|
||||||
|
<omgdi:waypoint x="395" y="217"></omgdi:waypoint>
|
||||||
|
<omgdi:waypoint x="455" y="217"></omgdi:waypoint>
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
</bpmndi:BPMNPlane>
|
||||||
|
</bpmndi:BPMNDiagram>
|
||||||
|
|
||||||
|
</definitions>
|
Reference in New Issue
Block a user