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: []