public void internalTrigger(final NodeInstance from, String type) { super.internalTrigger(from, type); if (getNodeInstanceContainer().getNodeInstance(getId()) == null) { return; String deploymentId = (String) getProcessInstance().getKnowledgeRuntime().getEnvironment().get(EnvironmentName.DEPLOYMENT_ID); ((WorkItem) workItem).setDeploymentId(deploymentId); ((WorkItem) workItem).setNodeInstanceId(this.getId()); ((WorkItem) workItem).setNodeId(getNodeId()); if (isInversionOfControl()) { ((ProcessInstance) getProcessInstance()).getKnowledgeRuntime() .update(((ProcessInstance) getProcessInstance()).getKnowledgeRuntime().getFactHandle(this), this); } else { try { throw wihnfe; } catch (ProcessWorkItemHandlerException handlerException) { this.workItemId = workItem.getId(); handleWorkItemHandlerException(handlerException, workItem); } catch (Exception e) { this.workItemId = workItem.getId(); exceptionScopeInstance.handleException(exceptionName, e); triggerCompleted(); this.workItemId = workItem.getId();
private void handleWorkItemHandlerException(ProcessWorkItemHandlerException handlerException, WorkItem workItem) { Map<String, Object> parameters = new HashMap<>(); parameters.put("DeploymentId", workItem.getDeploymentId()); parameters.put("ProcessInstanceId", workItem.getProcessInstanceId()); parameters.put("WorkItemId", workItem.getId()); parameters.put("NodeInstanceId", this.getId()); parameters.put("ErrorMessage", handlerException.getMessage()); parameters.put("Error", handlerException); parameters.putAll(workItem.getParameters()); KieRuntime kruntime = getKieRuntimeForSubprocess(); ((ProcessInstanceImpl) processInstance).setMetaData("ParentProcessInstanceId", getProcessInstance().getId()); ((ProcessInstanceImpl) processInstance).setMetaData("ParentNodeInstanceId", getUniqueId());
if (workItemNode != null && workItem.getState() == WorkItem.COMPLETED) { validateWorkItemResultVariable(getProcessInstance().getProcessName(), workItemNode.getOutAssociations(), workItem); for (Iterator<DataAssociation> iterator = getWorkItemNode().getOutAssociations().iterator(); iterator.hasNext();) { DataAssociation association = iterator.next(); DataTransformer transformer = DataTransformerRegistry.get().find(transformation.getLanguage()); if (transformer != null) { Object parameterValue = transformer.transform(transformation.getCompiledExpression(), workItem.getResults()); VariableScopeInstance variableScopeInstance = (VariableScopeInstance) resolveContextInstance(VariableScope.VARIABLE_SCOPE, association.getTarget()); if (variableScopeInstance != null && parameterValue != null) { } else { logger.warn("Could not find variable scope for variable {}", association.getTarget()); logger.warn("when trying to complete Work Item {}", workItem.getName()); logger.warn("Continuing without setting variable."); ((WorkItem) workItem).setParameter(association.getTarget(), parameterValue); VariableScopeInstance variableScopeInstance = (VariableScopeInstance) resolveContextInstance(VariableScope.VARIABLE_SCOPE, association.getTarget()); if (variableScopeInstance != null) { Object value = workItem.getResult(association.getSources().get(0)); if (value == null) { try { } else { logger.warn("Could not find variable scope for variable {}", association.getTarget()); logger.warn("when trying to complete Work Item {}", workItem.getName()); logger.warn("Continuing without setting variable.");
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 testSetDeadlinesNotCompletedReassign() { WorkItem workItem = new WorkItemImpl(); workItem.setParameter("NotCompletedReassign", "[users:john]@[4h]"); @SuppressWarnings("unchecked") Deadlines deadlines = HumanTaskHandlerHelper.setDeadlines(workItem.getParameters(), Collections.EMPTY_LIST, null); assertNotNull(deadlines); assertEquals(1, deadlines.getEndDeadlines().size()); assertEquals(0, deadlines.getStartDeadlines().size()); assertEquals(1, deadlines.getEndDeadlines().get(0).getEscalations().size()); assertEquals(1, deadlines.getEndDeadlines().get(0).getEscalations().get(0).getReassignments().size()); assertEquals(0, deadlines.getEndDeadlines().get(0).getEscalations().get(0).getNotifications().size()); // verify reassignment Reassignment reassignment = deadlines.getEndDeadlines().get(0).getEscalations().get(0).getReassignments().get(0); assertEquals(1, reassignment.getPotentialOwners().size()); assertEquals("john", reassignment.getPotentialOwners().get(0).getId()); // check deadline expiration time assertNotNull(deadlines.getEndDeadlines().get(0).getDate()); long expirationTime = deadlines.getEndDeadlines().get(0).getDate().getTime() - System.currentTimeMillis(); assertEquals(4, roundExpirationTime(expirationTime)); }
@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()); }
protected WorkItem createWorkItem(WorkItemNode workItemNode) { Work work = workItemNode.getWork(); workItem = new WorkItemImpl(); ((WorkItem) workItem).setName(work.getName()); ((WorkItem) workItem).setProcessInstanceId(getProcessInstance().getId()); ((WorkItem) workItem).setParameters(new HashMap<String, Object>(work.getParameters())); ((WorkItem) workItem).getParameters().putAll(dynamicParameters); DataTransformer transformer = DataTransformerRegistry.get().find(transformation.getLanguage()); if (transformer != null) { Object parameterValue = transformer.transform(transformation.getCompiledExpression(), getSourceParameters(association)); if (parameterValue != null) { ((WorkItem) workItem).setParameter(association.getTarget(), parameterValue); VariableScopeInstance variableScopeInstance = (VariableScopeInstance) resolveContextInstance(VariableScope.VARIABLE_SCOPE, association.getSources().get(0)); if (variableScopeInstance != null) { parameterValue = variableScopeInstance.getVariable(association.getSources().get(0)); ((WorkItem) workItem).setParameter(association.getTarget(), parameterValue); for (Map.Entry<String, Object> entry : workItem.getParameters().entrySet()) { if (entry.getValue() instanceof String) { String s = (String) entry.getValue(); s = s.replace("#{" + replacement.getKey() + "}", replacement.getValue()); ((WorkItem) workItem).setParameter(entry.getKey(), s);
@Test public void testClass() { GenericCamelWorkitemHandler handler = new GenericCamelWorkitemHandler("class", "FQCN"); final WorkItem workItem = new WorkItemImpl(); workItem.setParameter("FQCN", getClass().getCanonicalName()); workItem.setParameter("method", "testMethod"); WorkItemManager manager = new DefaultWorkItemManager(null); handler.executeWorkItem(workItem, manager); Assert.assertTrue(called); } }
public static void writeWorkItem_v1(MarshallerWriteContext context, WorkItem workItem) throws IOException { ObjectOutputStream stream = context.stream; stream.writeLong( workItem.getId() ); stream.writeLong( workItem.getProcessInstanceId() ); stream.writeUTF( workItem.getName() ); stream.writeInt( workItem.getState() ); //Work Item Parameters Map<String, Object> parameters = workItem.getParameters(); Collection<Object> notNullValues = new ArrayList<Object>(); for ( Object value : parameters.values() ) { if ( value != null ) { notNullValues.add( value ); } } stream.writeInt( notNullValues.size() ); for ( String key : parameters.keySet() ) { Object object = parameters.get( key ); if ( object != null ) { stream.writeUTF( key ); int index = context.objectMarshallingStrategyStore.getStrategy( object ); stream.writeInt( index ); ObjectMarshallingStrategy strategy = context.objectMarshallingStrategyStore.getStrategy( index ); if ( strategy.accept( object ) ) { strategy.write( stream, object ); } } } }
public static JBPMMessages.WorkItem writeWorkItem(MarshallerWriteContext context, WorkItem workItem, boolean includeVariables) throws IOException { JBPMMessages.WorkItem.Builder _workItem = JBPMMessages.WorkItem.newBuilder() .setId( workItem.getId() ) .setProcessInstancesId( workItem.getProcessInstanceId() ) .setName( workItem.getName() ) .setState( workItem.getState() ); if (workItem instanceof org.drools.core.process.instance.WorkItem) { if (((org.drools.core.process.instance.WorkItem)workItem).getDeploymentId() != null){ _workItem.setDeploymentId(((org.drools.core.process.instance.WorkItem)workItem).getDeploymentId()); } _workItem.setNodeId(((org.drools.core.process.instance.WorkItem)workItem).getNodeId()) .setNodeInstanceId(((org.drools.core.process.instance.WorkItem)workItem).getNodeInstanceId()); } if ( includeVariables ) { Map<String, Object> parameters = workItem.getParameters(); for ( Map.Entry<String, Object> entry : parameters.entrySet() ) { _workItem.addVariable( marshallVariable( context, entry.getKey(), entry.getValue() ) ); } } return _workItem.build(); }
@Override public void completeWorkItem(long id, Map<String, Object> results) { Environment env = this.kruntime.getEnvironment(); // EntityManager em = (EntityManager) env.get(EnvironmentName.CMD_SCOPED_ENTITY_MANAGER); PersistenceContext context = ((PersistenceContextManager) env.get( EnvironmentName.PERSISTENCE_CONTEXT_MANAGER )).getCommandScopedPersistenceContext(); PersistentWorkItem workItemInfo = context.findWorkItem( id ); // work item may have been aborted if (workItemInfo != null) { WorkItem workItem = internalGetWorkItem(workItemInfo); workItem.setResults(results); ProcessInstance processInstance = kruntime.getProcessInstance(workItem.getProcessInstanceId()); workItem.setState(WorkItem.COMPLETED); // process instance may have finished already if (processInstance != null) { processInstance.signalEvent("workItemCompleted", workItem); } context.remove(workItemInfo); } }
public void internalExecuteWorkItem( WorkItem workItem ) { Environment env = this.kruntime.getEnvironment(); WorkItemInfo workItemInfo = new WorkItemInfo( workItem, env ); PersistenceContext context = getPersistenceContext(); workItemInfo = (WorkItemInfo) context.persist( workItemInfo ); ((WorkItemImpl) workItem).setId( workItemInfo.getId() ); if ( this.workItems == null ) { this.workItems = new HashMap<Long, WorkItemInfo>(); } workItems.put( workItem.getId(), workItemInfo ); WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get( workItem.getName() ); if ( handler != null ) { handler.executeWorkItem( workItem, this ); } else { throwWorkItemNotFoundException( workItem ); } }
public void completeWorkItem( long id, Map<String, Object> results ) { PersistenceContext context = getPersistenceContext(); WorkItemInfo workItemInfo = null; if ( this.workItems != null ) { workItemInfo = this.workItems.get( id ); if ( workItemInfo != null ) { workItemInfo = (WorkItemInfo) context.merge( workItemInfo ); } } if ( workItemInfo == null ) { workItemInfo = (WorkItemInfo) context.findWorkItem( id ); } // work item may have been aborted if ( workItemInfo != null ) { WorkItem workItem = internalGetWorkItem( workItemInfo ); workItem.setResults( results ); ProcessInstance processInstance = kruntime.getProcessInstance( workItem.getProcessInstanceId() ); workItem.setState( WorkItem.COMPLETED ); // process instance may have finished already if ( processInstance != null ) { processInstance.signalEvent( "workItemCompleted", workItem ); } context.remove( workItemInfo ); if ( workItems != null ) { this.workItems.remove( workItem.getId() ); } } }
((WorkItemManager) ((ProcessInstance) getProcessInstance()) .getKnowledgeRuntime().getWorkItemManager()).abortWorkItem(getWorkItem().getId()); break; case RETHROW: String exceptionName = handlerException.getCause().getClass().getName(); ExceptionScopeInstance exceptionScopeInstance = (ExceptionScopeInstance) resolveContextInstance(ExceptionScope.EXCEPTION_SCOPE, exceptionName); if (exceptionScopeInstance == null) { throw new WorkflowRuntimeException(this, getProcessInstance(), "Unable to execute work item " + handlerException.getMessage(), handlerException.getCause()); break; case RETRY: Map<String, Object> parameters = new HashMap<>(getWorkItem().getParameters()); ((WorkItemManager) ((ProcessInstance) getProcessInstance()) .getKnowledgeRuntime().getWorkItemManager()).retryWorkItem(getWorkItem().getId(), parameters); break; case COMPLETE: ((WorkItemManager) ((ProcessInstance) getProcessInstance()) .getKnowledgeRuntime().getWorkItemManager()).completeWorkItem(getWorkItem().getId(), ((WorkflowProcessInstanceImpl)processInstance).getVariables()); break;
public void workItemCompleted(WorkItem workItem) { if (workItemId == workItem.getId() || (workItemId == -1 && getWorkItem().getId() == workItem.getId())) { removeEventListeners(); triggerCompleted(workItem); } }
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 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; } });
@Override public void internalExecuteWorkItem(WorkItem workItem) { Environment env = this.kruntime.getEnvironment(); // EntityManager em = (EntityManager) env.get(EnvironmentName.CMD_SCOPED_ENTITY_MANAGER); WorkItemInfo workItemInfo = new WorkItemInfo(workItem, env); // em.persist(workItemInfo); PersistenceContext context = ((PersistenceContextManager) env.get( EnvironmentName.PERSISTENCE_CONTEXT_MANAGER )).getCommandScopedPersistenceContext(); context.persist( workItemInfo ); ((WorkItemImpl) workItem).setId(workItemInfo.getId()); workItemInfo.transform(); context.merge(workItemInfo); WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName()); if (handler != null) { handler.executeWorkItem(workItem, this); workItemInfo.transform(); context.merge(workItemInfo); } else { throwWorkItemNotFoundException( workItem ); } }
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 void retryWorkItemWithParams( long workItemId, Map<String, Object> map ) { Environment env = this.kruntime.getEnvironment(); WorkItem workItem = getWorkItem( workItemId ); if ( workItem != null ) { workItem.setParameters( map ); WorkItemInfo workItemInfo = new WorkItemInfo( workItem, env ); PersistenceContext context = getPersistenceContext(); context.merge( workItemInfo ); retryWorkItem( workItem ); } }