package brainslug.flow.execution.node;
import brainslug.flow.context.ExecutionContext;
import brainslug.flow.execution.instance.FlowInstanceToken;
import brainslug.flow.node.JoinDefinition;
import brainslug.flow.path.FlowEdgeDefinition;
import brainslug.util.Option;
import java.util.ArrayList;
import java.util.List;
public class JoinNodeExecutor extends DefaultNodeExecutor<JoinDefinition> {
@Override
public FlowNodeExecutionResult execute(JoinDefinition joinDefinition, ExecutionContext execution) {
List<FlowInstanceToken> joinTokens = execution
.getInstance()
.getTokens()
.getNodeTokens(joinDefinition.getId());
FlowNodeExecutionResult takeAll = takeAll(joinDefinition);
for (FlowEdgeDefinition edge : joinDefinition.getIncoming()) {
List<FlowInstanceToken> edgeTokens = getEdgeTokens(edge, joinTokens);
if (edgeTokens.isEmpty()) {
return takeNone(joinDefinition, execution.getInstance());
} else {
takeAll.withRemovedTokens(joinDefinition.getId(), Option.of(edge.getSource().getId()), 1);
}
}
return takeAll;
}
private List<FlowInstanceToken> getEdgeTokens(FlowEdgeDefinition edge, List<FlowInstanceToken> joinTokens) {
List<FlowInstanceToken> edgeTokens = new ArrayList();
for (FlowInstanceToken joinToken : joinTokens) {
if (joinToken.getSourceNodeId().isPresent() && joinToken.getSourceNodeId().get().equals(edge.getSource().getId())) {
edgeTokens.add(joinToken);
}
}
return edgeTokens;
}
}