in jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java [777:871]
public Function<String, Object> getEventFilterResolver(org.kie.api.runtime.process.NodeInstanceContainer container, org.kie.api.definition.process.Node node,
List<org.kie.api.runtime.process.NodeInstance> currentView) {
if (node instanceof DynamicNode) {
// special handling for dynamic node to allow to resolve variables from individual node instances of the dynamic node
// instead of just relying on process instance's variables
return (varExpresion) -> {
List<org.kie.api.runtime.process.NodeInstance> nodeInstances = getNodeInstances(node.getId(), currentView);
if (nodeInstances != null && !nodeInstances.isEmpty()) {
StringBuilder st = new StringBuilder();
for (org.kie.api.runtime.process.NodeInstance ni : nodeInstances) {
Object result = resolveExpressionVariable(varExpresion, new NodeInstanceResolverFactory((NodeInstance) ni));
st.append(result).append("###");
}
return st.toString();
} else {
NodeInstanceImpl instance = (NodeInstanceImpl) getNodeInstance(node.getId().toExternalFormat(), true);
if (instance != null) {
return instance.getVariable(varExpresion);
}
return null;
}
};
} else if (node instanceof BoundaryEventNode) {
return (varExpresion) -> {
Function<String, Object> getScopedVariable;
if (container instanceof CompositeContextNodeInstance) {
getScopedVariable = (name) -> getVariable(name, ((CompositeContextNodeInstance) container).getContextInstances(VariableScope.VARIABLE_SCOPE));
} else if (container instanceof WorkflowProcessInstanceImpl) {
getScopedVariable = (name) -> ((WorkflowProcessInstanceImpl) container).getVariable(name);
} else {
getScopedVariable = null;
}
Object value = getScopedVariable.apply(varExpresion);
if (value != null) {
return value;
}
VariableResolverFactory resolverFactory = new ImmutableDefaultFactory() {
@Override
public boolean isResolveable(String varName) {
return getScopedVariable.apply(varName) != null;
}
@Override
public org.mvel2.integration.VariableResolver getVariableResolver(String varName) {
return new org.mvel2.integration.impl.SimpleValueResolver(getScopedVariable.apply(varName));
}
};
return resolveExpressionVariable(varExpresion, resolverFactory).orElse(null);
};
} else if (node instanceof ForEachNode) {
return (varExpression) -> {
try {
// for each can have multiple outcomes 1 per item of the list so it should be computed like that
ForEachNodeInstance forEachNodeInstance = (ForEachNodeInstance) getNodeInstanceByNodeId(node.getId(), true);
if (forEachNodeInstance == null) {
return new Object[0];
}
List<CompositeContextNodeInstance> data = forEachNodeInstance.getNodeInstances().stream().filter(e -> e instanceof CompositeContextNodeInstance)
.map(e -> (CompositeContextNodeInstance) e).collect(Collectors.toList());
List<Object> outcome = new ArrayList<>();
for (CompositeContextNodeInstance nodeInstance : data) {
Object resolvedValue = resolveExpressionVariable(varExpression, new NodeInstanceResolverFactory(nodeInstance)).orElse(null);
if (resolvedValue != null) {
outcome.add(resolvedValue);
}
}
return outcome.toArray();
} catch (Throwable t) {
return new Object[0];
}
};
} else if (node instanceof EventSubProcessNode || node instanceof StateNode) {
return (varName) -> {
return resolveExpressionVariable(varName, new ProcessInstanceResolverFactory(this)).orElse(null);
};
} else if (node instanceof CompositeContextNode) {
return (varExpression) -> {
List<org.kie.api.runtime.process.NodeInstance> nodeInstances = getNodeInstances(node.getId(), currentView);
List<Object> outcome = new ArrayList<>();
if (nodeInstances != null && !nodeInstances.isEmpty()) {
for (org.kie.api.runtime.process.NodeInstance nodeInstance : nodeInstances) {
Object resolvedValue = resolveExpressionVariable(varExpression, new NodeInstanceResolverFactory((NodeInstance) nodeInstance)).orElse(null);
if (resolvedValue != null) {
outcome.add(resolvedValue);
}
}
}
return outcome.toArray();
};
} else {
return (varName) -> {
return resolveExpressionVariable(varName, new ProcessInstanceResolverFactory(this)).orElse(null);
};
}
}