in jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/ForEachNodeInstance.java [244:312]
public void internalTrigger(KogitoNodeInstance from, String type) {
triggerTime = new Date();
setExecutedInstances(getExecutedInstances() + 1);
Map<String, Object> tempVariables = new HashMap<>();
if (getForEachNode().getOutputVariableName() != null) {
Object outputVariable = from.getVariable(getForEachNode().getOutputVariableName());
Collection<Object> outputCollection = (Collection<Object>) this.getVariable(TEMP_OUTPUT_VAR);
if (outputCollection == null) {
outputCollection = new ArrayList<>();
}
outputCollection.add(outputVariable);
setVariable(TEMP_OUTPUT_VAR, outputCollection);
tempVariables.put(getForEachNode().getOutputVariableName(), outputVariable);
String outputCollectionName = getForEachNode().getOutputCollectionExpression();
if (outputCollectionName != null) {
tempVariables.put(outputCollectionName, outputCollection);
}
}
boolean isCompletionConditionMet = getForEachNode().hasCompletionCondition() && evaluateCompletionCondition(getForEachNode().getCompletionConditionExpression(), tempVariables);
if (isSequential() && !isCompletionConditionMet && !areNodeInstancesCompleted()) {
getFirstCompositeNodeInstance()
.ifPresent(nodeInstance -> {
logger.debug("Triggering [{}] in multi-instance loop.", nodeInstance.getNodeId());
nodeInstance.trigger(null, getForEachNode().getForEachSplitNode().getTo().getToType());
});
}
if (areNodeInstancesCompleted() || isCompletionConditionMet) {
String outputCollection = getForEachNode().getOutputCollectionExpression();
Action outputAction = getForEachNode().getCompletionAction();
if (outputCollection != null) {
Collection<?> outputVariable = (Collection<?>) getVariable(outputCollection);
Collection collectedValues = (Collection) getVariable(TEMP_OUTPUT_VAR);
if (outputVariable != null) {
outputVariable.addAll(collectedValues);
} else {
outputVariable = collectedValues;
}
setVariable(outputCollection, outputVariable);
} else if (outputAction != null) {
try {
outputAction.execute(ContextFactory.fromNode(this));
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
((NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
if (getForEachNode().isWaitForCompletion()) {
if (!WORKFLOW_PARAM_MULTIPLE_CONNECTIONS.get(getProcessInstance().getProcess())) {
triggerConnection(getForEachJoinNode().getTo());
} else {
List<Connection> connections = getForEachJoinNode().getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE);
for (Connection connection : connections) {
triggerConnection(connection);
}
}
}
}
}