node.getGUI().setBodyColor(NodeState.FINISHED.color);
}
private void handleForEach(Node node) throws XBayaException {
final ForEachNode forEachNode = (ForEachNode) node;
EndForEachNode endForEachNode = null;
Collection<Node> repeatNodes = node.getOutputPort(0).getToNodes();
// we will support only one for now
if (repeatNodes.size() != 1) {
throw new WorkFlowInterpreterException(
"Only one node allowed inside foreach");
}
Iterator<Node> iterator = repeatNodes.iterator();
if (iterator.hasNext()) {
Node middleNode = iterator.next();
// forEachNode should point to a WSNode and should have only one
// output
if ((!(middleNode instanceof WSNode))
&& (!(middleNode instanceof SubWorkflowNode))) {
throw new WorkFlowInterpreterException(
"Encountered Node inside foreach that is not a WSNode"
+ middleNode);
} else if (middleNode instanceof SubWorkflowNode) {
/* Get the EndforEach Node of the Subworkflow */
Iterator<Node> subWorkflowOut = middleNode.getOutputPort(0)
.getToNodes().iterator();
while (subWorkflowOut.hasNext()) {
Node node2 = subWorkflowOut.next();
if (node2 instanceof EndForEachNode) {
endForEachNode = (EndForEachNode) node2;
}
}
final LinkedList<String> listOfValues = new LinkedList<String>();
InterpreterUtil.getInputsForForEachNode(forEachNode,
listOfValues, this.invokerMap);
final Integer[] inputNumbers = InterpreterUtil
.getNumberOfInputsForForEachNode(forEachNode,
this.invokerMap);
Workflow workflow1 = ((SubWorkflowNode) middleNode)
.getWorkflow();
List<NodeImpl> nodes = workflow1.getGraph().getNodes();
List<Node> wsNodes = new ArrayList<Node>();
/* Take the List of WSNodes in the subworkflow */
for (NodeImpl subWorkflowNode : nodes) {
if (subWorkflowNode instanceof WSNode) {
wsNodes.add(subWorkflowNode);
}
}
for (int i = 0; i < wsNodes.size(); i++) {
final WSNode node1 = (WSNode) wsNodes.get(i);
SystemComponentInvoker systemInvoker = null;
List<DataPort> outputPorts1 = node1.getOutputPorts();
List<Node> endForEachNodes = new ArrayList<Node>();
for (DataPort port : outputPorts1) {
Iterator<Node> endForEachNodeItr1 = port.getToNodes()
.iterator();
while (endForEachNodeItr1.hasNext()) {
Node node2 = endForEachNodeItr1.next();
if (node2 instanceof EndForEachNode) {
endForEachNodes.add(node2);
} else if (node2 instanceof OutputNode) {
// intentionally left noop
} else {
throw new WorkFlowInterpreterException(
"Found More than one node inside foreach");
}
}
}
final List<Node> finalEndForEachNodes = endForEachNodes;
Iterator<Node> endForEachNodeItr1 = node1.getOutputPort(0)
.getToNodes().iterator();
while (endForEachNodeItr1.hasNext()) {
Node node2 = endForEachNodeItr1.next();
// Start reading input came for foreach node
int parallelRuns = listOfValues.size()
* node1.getOutputPorts().size();
if (listOfValues.size() > 0) {
forEachNode.getGUI().setBodyColor(
NodeState.EXECUTING.color);
node1.getGUI().setBodyColor(
NodeState.EXECUTING.color);
List<DataPort> outputPorts = node1.getOutputPorts();
final AtomicInteger counter = new AtomicInteger();
for (Node endFor : endForEachNodes) {
systemInvoker = new SystemComponentInvoker();
this.invokerMap.put(endFor, systemInvoker);
}
final Map<Node, Invoker> finalMap = this.invokerMap;
new Thread() {
@Override
public void run() {
try {
runInThread(listOfValues, forEachNode,
node1, finalEndForEachNodes,
finalMap, counter, inputNumbers);
} catch (XBayaException e) {
WorkflowInterpreter.this.engine
.getErrorWindow().error(e);
}
}
}.start();
while (counter.intValue() < parallelRuns) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
if (!(node2 instanceof OutputNode)) {
listOfValues.removeAll(listOfValues);
String output = (String) systemInvoker
.getOutput(node1.getOutputPort(0)
.getName());
XmlElement xmlElement = XMLUtil
.stringToXmlElement("<result>" + output
+ "</result>");
Iterator iterator1 = xmlElement.children()
.iterator();
while (iterator1.hasNext()) {
Object next1 = iterator1.next();
if (next1 instanceof XmlElement) {
listOfValues
.add((String) ((XmlElement) next1)
.children().iterator()
.next());
}
}
}
}
}
}
// we have finished execution so end foreach is finished
// todo this has to be done in a separate thread
endForEachNode.getGUI().setBodyColor(NodeState.FINISHED.color);
middleNode.getGUI().setBodyColor(NodeState.FINISHED.color);
node.getGUI().setBodyColor(NodeState.FINISHED.color);
} else {