in taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/Converter.java [186:233]
public Workflow convertWorkflowProcess(WorkflowProcess workflowProcess, WorkflowBundle bundle) {
Workflow workflow = new Workflow();
Set<InputWorkflowPort> inputs = new HashSet<>(workflowProcess.getWorkflowInputs().values());
Set<OutputWorkflowPort> outputs = new HashSet<>(workflowProcess.getWorkflowOutputs().values());
workflow.setInputPorts(inputs);
workflow.setOutputPorts(outputs);
Set<InputPort> inputPorts = workflowProcess.getInsideInputPorts();
Set<OutputPort> outputPorts = workflowProcess.getInsideOutputPorts();
NamedSet<InputProcessorPort> inputProcessorPorts = new NamedSet<>();
NamedSet<OutputProcessorPort> outputProcessorPorts = new NamedSet<>();
for(Process process: workflowProcess.getProcesses()) {
Processor processor;
if(process instanceof WorkflowProcess) {
Workflow childWorkflow = convertWorkflowProcess((WorkflowProcess) process, bundle); // TODO: Add nested relationship
processor = new Processor(workflow, childWorkflow.getName()); // TODO: Check if we want the processor to have the same name as the childworkflow
createProcessPortsFromWorkflow(processor, childWorkflow);
bundle.getWorkflows().add(childWorkflow);
} else if(process instanceof CommandLineTool) {
processor = convertCommandLineTool((CommandLineTool) process);
workflow.getProcessors().add(processor);
} else {
assert(process instanceof Reference);
processor = convertReference((Reference) process);
workflow.getProcessors().add(processor);
}
inputProcessorPorts.addAll(processor.getInputPorts());
outputProcessorPorts.addAll(processor.getOutputPorts());
}
// DataLinks
for(InputPort port: inputPorts) {
String senderName = port.getSource();
String destName = port.getName();
SenderPort senderPort = outputProcessorPorts.getByName(senderName);
if(senderPort == null) { // Source is one of the Workflow inputs
senderPort = workflow.getInputPorts().getByName(senderName);
}
ReceiverPort receiverPort = inputProcessorPorts.getByName(destName);
if(receiverPort == null) { // Destination is one of the Workflow outputs
receiverPort = workflow.getOutputPorts().getByName(destName);
}
new DataLink(workflow, senderPort, receiverPort);
}
return workflow;
}