blob: da1ece3d10552ee4d25f331de80b6a7b2d983268 [file] [log] [blame]
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;
}
}