Create a Taverna to Custom CWL Objects converter

- Convert basic workflow, process, input and outputs
diff --git a/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/TavernaConverter.java b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/TavernaConverter.java
new file mode 100644
index 0000000..da1ece3
--- /dev/null
+++ b/taverna-scufl2-cwl/src/main/java/org/apache/taverna/scufl2/cwl/TavernaConverter.java
@@ -0,0 +1,81 @@
+package org.apache.taverna.scufl2.cwl;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.apache.taverna.scufl2.api.common.NamedSet;
+import org.apache.taverna.scufl2.api.core.DataLink;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
+import org.apache.taverna.scufl2.api.port.InputProcessorPort;
+import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.SenderPort;
+import org.apache.taverna.scufl2.cwl.components.InputPort;
+import org.apache.taverna.scufl2.cwl.components.OutputPort;
+import org.apache.taverna.scufl2.cwl.components.Reference;
+import org.apache.taverna.scufl2.cwl.components.Step;
+import org.apache.taverna.scufl2.cwl.components.WorkflowProcess;
+
+public class TavernaConverter {
+
+    public WorkflowProcess convertWorkflow(Workflow workflow) {
+        WorkflowProcess process = new WorkflowProcess();
+        process.setName(workflow.getName());
+        Set<InputPort> inputs = convertInputPorts(workflow);
+        Set<OutputPort> outputs = convertOutputPorts(workflow);
+
+        process.setInputPorts(inputs);
+        process.setOutputPorts(outputs);
+
+        return process;
+    }
+
+    public Set<InputPort> convertInputPorts(Workflow workflow) {
+        Set<InputPort> result = new HashSet<>();
+        for(InputWorkflowPort workflowPort: workflow.getInputPorts()) {
+            InputPort port = new InputPort(workflowPort.getName(), "");
+            result.add(port);
+        }
+        return result;
+    }
+
+    public Set<OutputPort> convertOutputPorts(Workflow workflow) {
+        Set<OutputPort> result = new HashSet<>();
+        for(OutputWorkflowPort workflowPort: workflow.getOutputPorts()) {
+            OutputPort port = new OutputPort(workflowPort.getName());
+            result.add(port);
+        }
+        return result;
+    }
+
+    public Set<Step> convertProcessors(Workflow workflow) {
+        Set<Step> result = new HashSet<>();
+        NamedSet<Processor> processors = workflow.getProcessors();
+        Set<DataLink> dataLinks = workflow.getDataLinks();
+        Map<String, SenderPort> portNameToSource = new HashMap<>();
+        for(DataLink link: dataLinks) {
+            portNameToSource.put(link.getSendsTo().getName(), link.getReceivesFrom());
+        }
+
+        for(Processor processor: processors) {
+            Step step = convertProcessor(processor, portNameToSource);
+            result.add(step);
+        }
+        return result;
+    }
+
+    public Step convertProcessor(Processor processor, Map<String, SenderPort> portNameToSource) {
+        Step step = new Step();
+        step.setRun(new Reference(processor.getName())); // TODO: Support nested steps. Check name value.
+        for(InputProcessorPort port: processor.getInputPorts()) {
+            InputPort stepPort = new InputPort();
+            stepPort.setName(port.getName());
+            SenderPort senderPort = portNameToSource.get(port.getName());
+            stepPort.setSource(senderPort.getName());
+            step.getInputs().add(stepPort);
+        }
+        return step;
+    }
+}
diff --git a/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestTavernaConverter.java b/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestTavernaConverter.java
new file mode 100644
index 0000000..14bb8a0
--- /dev/null
+++ b/taverna-scufl2-cwl/src/test/java/org/apache/taverna/scufl2/cwl/TestTavernaConverter.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.scufl2.cwl;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
+import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
+import org.apache.taverna.scufl2.cwl.components.InputPort;
+import org.apache.taverna.scufl2.cwl.components.Reference;
+import org.apache.taverna.scufl2.cwl.components.Step;
+import org.apache.taverna.scufl2.cwl.components.WorkflowProcess;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+
+public class TestTavernaConverter {
+
+    @Test
+    public void testWorkflowToWorkflowProcess() {
+        Workflow workflow = new Workflow();
+        workflow.setName("workflowName");
+        workflow.getInputPorts().add(new InputWorkflowPort(workflow, "input1"));
+        workflow.getInputPorts().add(new InputWorkflowPort(workflow, "input2"));
+        workflow.getOutputPorts().add(new OutputWorkflowPort(workflow, "output"));
+
+        TavernaConverter converter = new TavernaConverter();
+
+        WorkflowProcess workflowProcess = converter.convertWorkflow(workflow);
+        assertEquals(workflow.getInputPorts().size(), workflowProcess.getInputPorts().size());
+        assertEquals(workflow.getOutputPorts().size(), workflowProcess.getOutputPorts().size());
+
+        Set<String> expectedInputNames = workflow.getInputPorts().stream().map(InputWorkflowPort::getName).collect(Collectors.toSet());
+        Set<String> convertedInputNames = workflowProcess.getInputPorts().stream().map(InputPort::getName).collect(Collectors.toSet());
+
+        assertEquals(expectedInputNames, convertedInputNames);
+
+        assertEquals("output", workflowProcess.getOutputPorts().iterator().next().getName());
+    }
+
+    @Test
+    public void testProcessorsToSteps() {
+        Workflow workflow = new Workflow();
+        workflow.setName("workflowName");
+        workflow.getProcessors().add(new Processor(workflow, "processor1"));
+        workflow.getProcessors().add(new Processor(workflow, "processor2"));
+
+        Step step1 = new Step();
+        step1.setRun(new Reference("processor1"));
+        Step step2 = new Step();
+        step2.setRun(new Reference("processor2"));
+        Set<Step> steps = new HashSet<>();
+        steps.add(step1);
+        steps.add(step2);
+
+        TavernaConverter converter = new TavernaConverter();
+        Set<Step> convertedSteps = converter.convertProcessors(workflow);
+
+        assertEquals(steps, convertedSteps);
+    }
+}