Add support for datalinks while converting a Workflow
diff --git a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/Converter.java b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/Converter.java
index 4134783..5637ced 100644
--- a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/Converter.java
+++ b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/Converter.java
@@ -22,6 +22,8 @@
import java.util.HashSet;
import java.util.Map;
+import org.apache.taverna.scufl2.api.common.NamedSet;
+import org.apache.taverna.scufl2.api.core.DataLink;
import org.apache.taverna.scufl2.api.core.Workflow;
import org.apache.taverna.scufl2.api.core.Processor;
import org.apache.taverna.scufl2.api.container.WorkflowBundle;
@@ -36,6 +38,8 @@
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import org.apache.taverna.scufl2.api.port.ReceiverPort;
+import org.apache.taverna.scufl2.api.port.SenderPort;
import org.apache.taverna.scufl2.cwl.components.Process;
import org.apache.taverna.scufl2.cwl.components.*;
@@ -179,23 +183,44 @@
Set<OutputWorkflowPort> outputs = new HashSet<>(workflowProcess.getWorkflowOutputs().values());
workflow.setInputPorts(inputs);
workflow.setOutputPorts(outputs);
- Set<InputPort> inputPorts = workflowProcess.getInputPorts();
- Set<OutputPort> outputPorts = workflowProcess.getOutputPorts();
+ 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 processor = new Processor(workflow, childWorkflow.getName()); // TODO: Check if we want the processor to have the same name as the childworkflow
+ 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 processor = convertCommandLineTool((CommandLineTool) process);
+ processor = convertCommandLineTool((CommandLineTool) process);
workflow.getProcessors().add(processor);
} else {
assert(process instanceof Reference);
- Processor processor = convertReference((Reference) process);
+ 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;
diff --git a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/Process.java b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/Process.java
index 5447e8c..6276278 100644
--- a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/Process.java
+++ b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/Process.java
@@ -27,6 +27,10 @@
protected Set<InputPort> inputPorts = new HashSet<>();
protected Set<OutputPort> outputPorts = new HashSet<>();
+ protected Set<InputPort> insideInputPorts = new HashSet<>();
+
+ protected Set<OutputPort> insideOutputPorts = new HashSet<>();
+
public abstract void parse();
@@ -46,4 +50,20 @@
this.outputPorts = outputs;
}
+ public Set<InputPort> getInsideInputPorts() {
+ return insideInputPorts;
+ }
+
+ public void setInsideInputPorts(Set<InputPort> insideInputPorts) {
+ this.insideInputPorts = insideInputPorts;
+ }
+
+ public Set<OutputPort> getInsideOutputPorts() {
+ return insideOutputPorts;
+ }
+
+ public void setInsideOutputPorts(Set<OutputPort> insideOutputPorts) {
+ this.insideOutputPorts = insideOutputPorts;
+ }
+
}
\ No newline at end of file
diff --git a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/WorkflowProcess.java b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/WorkflowProcess.java
index 3a19d3a..263455d 100644
--- a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/WorkflowProcess.java
+++ b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/components/WorkflowProcess.java
@@ -104,6 +104,8 @@
Process process = step.getRun();
process.setInputPorts(step.getInputs());
process.setOutputPorts(step.getOutputs());
+ insideInputPorts.addAll(step.getInputs());
+ insideOutputPorts.addAll(step.getOutputs());
result.add(process);
}
diff --git a/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestConverting.java b/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestConverting.java
index 56885b2..a6a803f 100644
--- a/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestConverting.java
+++ b/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestConverting.java
@@ -19,6 +19,7 @@
package org.apache.taverna.scufl2.cwl;
+import org.apache.taverna.scufl2.api.core.DataLink;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@@ -86,5 +87,10 @@
Processor processor = workflow.getProcessors().iterator().next();
assertEquals(1, processor.getInputPorts().size());
assertEquals(0, processor.getOutputPorts().size());
+
+ assertEquals(1, workflow.getDataLinks().size());
+ DataLink dataLink = workflow.getDataLinks().iterator().next();
+ assertEquals("name", dataLink.getReceivesFrom().getName());
+ assertEquals("text", dataLink.getSendsTo().getName());
}
}
diff --git a/taverna-scufl2-cwl/src/test/resources/hello_world.cwl b/taverna-scufl2-cwl/src/test/resources/hello_world.cwl
index 4207afa..eee01dd 100644
--- a/taverna-scufl2-cwl/src/test/resources/hello_world.cwl
+++ b/taverna-scufl2-cwl/src/test/resources/hello_world.cwl
@@ -32,6 +32,6 @@
inputs:
- id: text
- source: "#x/name"
+ source: "name"
outputs: []