in taverna-workflowmodel-extensions/src/main/java/org/apache/taverna/workflowmodel/processor/dispatch/layers/Loop.java [316:380]
public void receiveResult(Map<String, T2Reference> data, int[] index) {
if (index.length > 0) {
// Ignore streaming
return;
}
T2Reference loopRef = data.get(LOOP_PORT);
if (loopRef == null) {
fail("Condition service didn't contain output port " + LOOP_PORT);
return;
}
if (loopRef.containsErrors()) {
fail("Condition service failed: " + loopRef);
return;
}
if (loopRef.getDepth() != 0) {
fail("Condition service output " + LOOP_PORT
+ " depth is not 0, but " + loopRef.getDepth());
}
ReferenceService referenceService = context.getReferenceService();
String loop = (String) referenceService.renderIdentifier(loopRef,
String.class, context);
if (Boolean.parseBoolean(loop)) {
// Push it down again
AbstractDispatchEvent dispatchEvent;
synchronized (incomingJobs) {
dispatchEvent = incomingJobs.get(jobIdentifier);
}
if (dispatchEvent == null) {
fail("Unknown job identifier " + jobIdentifier);
}
if (dispatchEvent instanceof DispatchJobEvent) {
DispatchJobEvent newJobEvent = prepareNewJobEvent(data,
dispatchEvent);
getBelow().receiveJob(newJobEvent);
} else if (dispatchEvent instanceof DispatchJobQueueEvent) {
getBelow().receiveJobQueue(
(DispatchJobQueueEvent) dispatchEvent);
} else {
fail("Unknown type of incoming event " + dispatchEvent);
}
return;
} else {
// We'll push it up, end of loop for now
AbstractDispatchEvent outgoingEvent;
synchronized (outgoingJobs) {
outgoingEvent = outgoingJobs.get(jobIdentifier);
}
if (outgoingEvent == null && !config.get("runFirst").asBoolean()) {
fail("Initial loop condition failed");
}
if (outgoingEvent instanceof DispatchCompletionEvent) {
getAbove().receiveResultCompletion(
(DispatchCompletionEvent) outgoingEvent);
} else if (outgoingEvent instanceof DispatchResultEvent) {
getAbove().receiveResult(
(DispatchResultEvent) outgoingEvent);
} else {
fail("Unknown type of outgoing event " + outgoingEvent);
}
}
}