protected WorkItem createWorkItem(WorkItemNode workItemNode) { WorkItem workItem = super.createWorkItem(workItemNode); String actorId = assignWorkItem(workItem); if (actorId != null) { ((org.drools.core.process.instance.WorkItem) workItem).setParameter("ActorId", actorId); } return workItem; }
protected String assignWorkItem(WorkItem workItem) { String actorId = null; // if this human task node is part of a swimlane, check whether an actor // has already been assigned to this swimlane String swimlaneName = getHumanTaskNode().getSwimlane(); SwimlaneContextInstance swimlaneContextInstance = getSwimlaneContextInstance(swimlaneName); if (swimlaneContextInstance != null) { actorId = swimlaneContextInstance.getActorId(swimlaneName); workItem.setParameter("SwimlaneActorId", actorId); } // if no actor can be assigned based on the swimlane, check whether an // actor is specified for this human task if (actorId == null) { actorId = (String) workItem.getParameter("ActorId"); if (actorId != null && swimlaneContextInstance != null && actorId.split(separator).length == 1) { swimlaneContextInstance.setActorId(swimlaneName, actorId); workItem.setParameter("SwimlaneActorId", actorId); } } // always return ActorId from workitem as SwimlaneActorId is kept as separate parameter return (String) workItem.getParameter("ActorId"); }
@Test public void testAssignTaskstakeholders() { String taskStakeholderId = "espiegelberg"; Task task = TaskModelProvider.getFactory().newTask(); InternalPeopleAssignments peopleAssignments = peopleAssignmentHelper.getNullSafePeopleAssignments(task); WorkItem workItem = new WorkItemImpl(); workItem.setParameter(PeopleAssignmentHelper.TASKSTAKEHOLDER_ID, taskStakeholderId); peopleAssignmentHelper.assignTaskStakeholders(workItem, peopleAssignments); assertEquals(1, peopleAssignments.getTaskStakeholders().size()); OrganizationalEntity organizationalEntity1 = peopleAssignments.getTaskStakeholders().get(0); assertTrue(organizationalEntity1 instanceof User); assertEquals(taskStakeholderId, organizationalEntity1.getId()); }
private static void executeWorkItem(StatefulKnowledgeSessionImpl ksession, WorkItemImpl workItem, WorkItemNodeInstance workItemNodeInstance) { ProcessEventSupport eventSupport = ((InternalProcessRuntime) ksession.getProcessRuntime()).getProcessEventSupport(); eventSupport.fireBeforeNodeTriggered(workItemNodeInstance, ksession); ((WorkItemManager) ksession.getWorkItemManager()).internalExecuteWorkItem(workItem); workItemNodeInstance.internalSetWorkItemId(workItem.getId()); eventSupport.fireAfterNodeTriggered(workItemNodeInstance, ksession); }
@Override public Void execute(Context context) { KieSession ksession = ((RegistryContext) context).lookup( KieSession.class ); ProcessInstance processInstance = ksession.getProcessInstance(pId); assertNotNull(processInstance); NodeInstance nodeInstance = ((WorkflowProcessInstance) processInstance) .getNodeInstance(((org.drools.core.process.instance.WorkItem) workItem).getNodeInstanceId()); assertNotNull(nodeInstance); assertTrue(nodeInstance instanceof WorkItemNodeInstance); String deploymentId = ((WorkItemNodeInstance) nodeInstance).getWorkItem().getDeploymentId(); long nodeInstanceId = ((WorkItemNodeInstance) nodeInstance).getWorkItem().getNodeInstanceId(); long nodeId = ((WorkItemNodeInstance) nodeInstance).getWorkItem().getNodeId(); assertEquals(((org.drools.core.process.instance.WorkItem) workItem).getDeploymentId(), deploymentId); assertEquals(((org.drools.core.process.instance.WorkItem) workItem).getNodeId(), nodeId); assertEquals(((org.drools.core.process.instance.WorkItem) workItem).getNodeInstanceId(), nodeInstanceId); return null; } });
public void cancel() { WorkItem workItem = getWorkItem(); if (workItem != null && workItem.getState() != WorkItem.COMPLETED && workItem.getState() != WorkItem.ABORTED) { try { ((WorkItemManager) ((ProcessInstance) getProcessInstance()) .getKnowledgeRuntime().getWorkItemManager()).internalAbortWorkItem(workItemId); } catch (WorkItemHandlerNotFoundException wihnfe) { getProcessInstance().setState(ProcessInstance.STATE_ABORTED); throw wihnfe; } } if (exceptionHandlingProcessInstanceId > -1) { ProcessInstance processInstance = null; KieRuntime kruntime = getKieRuntimeForSubprocess(); processInstance = (ProcessInstance) kruntime.getProcessInstance(exceptionHandlingProcessInstanceId); if (processInstance != null) { processInstance.setState(ProcessInstance.STATE_ABORTED); } } super.cancel(); }
public String getNodeName() { Node node = getNode(); if (node == null) { String nodeName = "[Dynamic]"; WorkItem workItem = getWorkItem(); if (workItem != null) { nodeName += " " + workItem.getParameter("TaskName"); } return nodeName; } return super.getNodeName(); }
public void triggerCompleted(WorkItem workItem) { String swimlaneName = getHumanTaskNode().getSwimlane(); SwimlaneContextInstance swimlaneContextInstance = getSwimlaneContextInstance(swimlaneName); if (swimlaneContextInstance != null) { String newActorId = (String) workItem.getResult("ActorId"); if (newActorId != null) { swimlaneContextInstance.setActorId(swimlaneName, newActorId); } } super.triggerCompleted(workItem); } }
@Override public void handleAbortException(Throwable cause, WorkItem workItem, WorkItemManager manager) { if( getAndIncreaseExceptionCount(workItem.getProcessInstanceId()) < exceptionCountLimit ) { workItem.getParameters().put(this.workItemExceptionParameterName, cause); ((org.drools.core.process.instance.WorkItemManager) manager).signalEvent(this.eventType, (org.drools.core.process.instance.WorkItem) workItem, workItem.getProcessInstanceId()); } }
public void readWorkItems(MarshallerReaderContext context) throws IOException { ProtobufMessages.ProcessData _pdata = (ProtobufMessages.ProcessData) context.parameterObject; InternalWorkingMemory wm = context.wm; for ( JBPMMessages.WorkItem _workItem : _pdata.getExtension( JBPMMessages.workItem ) ) { WorkItem workItem = readWorkItem( context, _workItem ); ((WorkItemManager) wm.getWorkItemManager()).internalAddWorkItem( (org.drools.core.process.instance.WorkItem) workItem ); } }
public WorkItem getWorkItem() { if (workItem == null && workItemId >= 0) { workItem = ((WorkItemManager) ((ProcessInstance) getProcessInstance()) .getKnowledgeRuntime().getWorkItemManager()).getWorkItem(workItemId); } return workItem; }
public void writeWorkItems(MarshallerWriteContext context) throws IOException { ProtobufMessages.ProcessData.Builder _pdata = (ProtobufMessages.ProcessData.Builder) context.parameterObject; List<WorkItem> workItems = new ArrayList<WorkItem>( ((WorkItemManager) context.wm.getWorkItemManager()).getWorkItems() ); Collections.sort( workItems, new Comparator<WorkItem>() { public int compare(WorkItem o1, WorkItem o2) { return (int) (o2.getId() - o1.getId()); } } ); for ( WorkItem workItem : workItems ) { _pdata.addExtension( JBPMMessages.workItem, writeWorkItem( context, workItem ) ); } }
@Test public void testAssignExcludedOwners() { String excludedOwnerId = "espiegelberg"; Task task = TaskModelProvider.getFactory().newTask(); InternalPeopleAssignments peopleAssignments = peopleAssignmentHelper.getNullSafePeopleAssignments(task); WorkItem workItem = new WorkItemImpl(); workItem.setParameter(PeopleAssignmentHelper.EXCLUDED_OWNER_ID, excludedOwnerId); peopleAssignmentHelper.assignExcludedOwners(workItem, peopleAssignments); assertEquals(1, peopleAssignments.getExcludedOwners().size()); OrganizationalEntity organizationalEntity1 = peopleAssignments.getExcludedOwners().get(0); assertTrue(organizationalEntity1 instanceof User); assertEquals(excludedOwnerId, organizationalEntity1.getId()); }
@Override public void handleExecuteException(Throwable cause, WorkItem workItem, WorkItemManager manager) { if( getAndIncreaseExceptionCount(workItem.getProcessInstanceId()) < exceptionCountLimit ) { workItem.getParameters().put(this.workItemExceptionParameterName, cause); ((org.drools.core.process.instance.WorkItemManager) manager).signalEvent(this.eventType, (org.drools.core.process.instance.WorkItem) workItem, workItem.getProcessInstanceId()); } else { if( cause instanceof RuntimeException ) { throw (RuntimeException) cause; } else { throw new WorkItemHandlerRuntimeException(cause, "Signalling process instance " + workItem.getProcessInstanceId() + " with '" + this.eventType + "' resulted this exception."); } } }
@Test public void testAssignRecipients() { String recipientId = "espiegelberg"; Task task = TaskModelProvider.getFactory().newTask(); InternalPeopleAssignments peopleAssignments = peopleAssignmentHelper.getNullSafePeopleAssignments(task); WorkItem workItem = new WorkItemImpl(); workItem.setParameter(PeopleAssignmentHelper.RECIPIENT_ID, recipientId); peopleAssignmentHelper.assignRecipients(workItem, peopleAssignments); assertEquals(1, peopleAssignments.getRecipients().size()); OrganizationalEntity organizationalEntity1 = peopleAssignments.getRecipients().get(0); assertTrue(organizationalEntity1 instanceof User); assertEquals(recipientId, organizationalEntity1.getId()); }
@Override public void writeWorkItem(MarshallerWriteContext context, org.drools.core.process.instance.WorkItem workItem) { try { JBPMMessages.WorkItem _workItem = writeWorkItem(context, workItem, persistWorkItemVars); PersisterHelper.writeToStreamWithHeader( context, _workItem ); } catch (IOException e) { throw new IllegalArgumentException( "IOException while storing work item instance " + workItem.getId() + ": " + e.getMessage(), e ); } }
protected WorkItemNodeInstance findNodeInstance(long workItemId, NodeInstanceContainer container) { for (NodeInstance nodeInstance : container.getNodeInstances()) { if (nodeInstance instanceof WorkItemNodeInstance) { WorkItemNodeInstance workItemNodeInstance = (WorkItemNodeInstance) nodeInstance; if (workItemNodeInstance.getWorkItem().getId() == workItemId) { return workItemNodeInstance; } } if (nodeInstance instanceof NodeInstanceContainer) { WorkItemNodeInstance result = findNodeInstance(workItemId, ((NodeInstanceContainer) nodeInstance)); if (result != null) { return result; } } } return null; } }
@Override public AuditEvent buildEvent(ProcessNodeTriggeredEvent pnte, Object log) { NodeInstanceImpl nodeInstance = (NodeInstanceImpl) pnte.getNodeInstance(); NodeInstanceLog logEvent =null; if (log != null) { logEvent = (NodeInstanceLog) log; if (nodeInstance instanceof WorkItemNodeInstance && ((WorkItemNodeInstance) nodeInstance).getWorkItem() != null) { logEvent.setWorkItemId(((WorkItemNodeInstance) nodeInstance).getWorkItem().getId()); } if (nodeInstance instanceof SubProcessNodeInstance) { logEvent.setReferenceId(((SubProcessNodeInstance) nodeInstance).getProcessInstanceId()); } return logEvent; } return null; }