public void internalTrigger()

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);
                        }
                    }
                }
            }
        }