You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sh...@apache.org on 2016/02/12 22:51:44 UTC

[1/2] airavata git commit: Build runtime model of workflow graph after parse the workflow description

Repository: airavata
Updated Branches:
  refs/heads/develop d3cf5bc61 -> 24587f9f8


Build runtime model of workflow graph after parse the workflow description


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/38c2c36e
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/38c2c36e
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/38c2c36e

Branch: refs/heads/develop
Commit: 38c2c36e717b7d60e9dbafd6f6bc235f8f52bf9d
Parents: 11ea501
Author: Shameera Rathnayaka <sh...@gmail.com>
Authored: Fri Feb 12 16:51:16 2016 -0500
Committer: Shameera Rathnayaka <sh...@gmail.com>
Committed: Fri Feb 12 16:51:16 2016 -0500

----------------------------------------------------------------------
 .../workflow/core/dag/nodes/InputNode.java      |   8 +-
 .../workflow/core/dag/nodes/InputNodeImpl.java  | 110 +++++++++++-
 .../workflow/core/dag/nodes/OutputNode.java     |   2 +-
 .../workflow/core/dag/nodes/OutputNodeImpl.java |  89 +++++++++-
 .../workflow/core/dag/port/InputPortIml.java    |  17 ++
 .../workflow/core/dag/port/OutPortImpl.java     |  17 ++
 .../airavata/workflow/core/dag/port/Port.java   |   7 +
 .../core/parser/JsonWorkflowParser.java         | 171 +++++++++++++++++--
 .../src/test/resources/TestWorkflow.json        |  28 +--
 9 files changed, 410 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNode.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNode.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNode.java
index 6dec125..9d26419 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNode.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNode.java
@@ -21,10 +21,12 @@
 
 package org.apache.airavata.workflow.core.dag.nodes;
 
+import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.workflow.core.dag.port.InPort;
 import org.apache.airavata.workflow.core.dag.port.OutPort;
 
-public interface InputNode extends WorkflowNode {
+public interface InputNode extends WorkflowNode , OutPort{
 
     public InputDataObjectType getInputObject();
 
@@ -34,4 +36,8 @@ public interface InputNode extends WorkflowNode {
 
     public void setOutPort(OutPort outPort);
 
+    public void setValue(String value);
+
+    public String getValue();
+
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNodeImpl.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNodeImpl.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNodeImpl.java
index 59984d7..e8e46e5 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNodeImpl.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/InputNodeImpl.java
@@ -22,17 +22,29 @@ package org.apache.airavata.workflow.core.dag.nodes;
 import org.apache.airavata.model.ComponentState;
 import org.apache.airavata.model.ComponentStatus;
 import org.apache.airavata.model.NodeModel;
+import org.apache.airavata.model.PortModel;
+import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.workflow.core.dag.edge.Edge;
 import org.apache.airavata.workflow.core.dag.port.OutPort;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class InputNodeImpl implements InputNode {
 
     private NodeModel nodeModel;
-    private OutPort outPort;
     private InputDataObjectType inputDataObjectType;
+    private PortModel portModel;
+    private List<Edge> edges = new ArrayList<>();
+    private String value;
+    private DataType dataType;
+
 
     public InputNodeImpl(NodeModel nodeModel) {
         this.nodeModel = nodeModel;
+        setPortModel(convert(nodeModel));
     }
 
     @Override
@@ -76,14 +88,42 @@ public class InputNodeImpl implements InputNode {
     }
 
     @Override
+    public void setPortModel(PortModel portModel) {
+        this.portModel = portModel;
+    }
+
+    @Override
+    public PortModel getPortModel() {
+        return portModel;
+    }
+
+    @Override
     public boolean isReady() {
         return (inputDataObjectType.getValue() != null && !inputDataObjectType.getValue().equals(""))
                 || !inputDataObjectType.isIsRequired();
     }
 
     @Override
+    public WorkflowNode getNode() {
+        return this;
+    }
+
+    @Override
+    public void setNode(WorkflowNode workflowNode) {
+        // InputNode itself a workflowNode
+    }
+
+    @Override
     public InputDataObjectType getInputObject() {
-        return this.inputDataObjectType;
+        if (inputDataObjectType == null) {
+            inputDataObjectType = new InputDataObjectType(getName());
+            inputDataObjectType.setValue(getValue());
+            inputDataObjectType.setType(getDataType());
+            inputDataObjectType.setIsRequired(true);
+            inputDataObjectType.setDataStaged(true);
+            inputDataObjectType.setInputOrder(0);
+        }
+        return inputDataObjectType;
     }
 
     @Override
@@ -93,13 +133,75 @@ public class InputNodeImpl implements InputNode {
 
     @Override
     public OutPort getOutPort() {
-        return this.outPort;
+        return this;
     }
 
     @Override
     public void setOutPort(OutPort outPort) {
-        this.outPort = outPort;
+        // InputNode is a outPort
     }
 
+    @Override
+    public void setValue(String value) {
+        this.value = value;
+    }
 
+    @Override
+    public DataType getDataType() {
+        return dataType;
+    }
+
+    @Override
+    public void setDataType(DataType dataType) {
+        this.dataType = dataType;
+    }
+
+    @Override
+    public String getNodeId() {
+        return getNode().getId();
+    }
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public void setOutputObject(OutputDataObjectType outputObject) {
+
+    }
+
+
+    @Override
+    public OutputDataObjectType getOutputObject() {
+        return convert(getInputObject());
+    }
+
+    @Override
+    public List<Edge> getEdges() {
+        return edges;
+    }
+
+    @Override
+    public void addEdge(Edge edge) {
+        edges.add(edge);
+    }
+
+    private PortModel convert(NodeModel nodeModel) {
+        PortModel portModel = new PortModel(nodeModel.getNodeId());
+        portModel.setName(nodeModel.getName());
+        portModel.setDescription(nodeModel.getDescription());
+        return portModel;
+    }
+
+    private OutputDataObjectType convert(InputDataObjectType inputObject) {
+        OutputDataObjectType output = new OutputDataObjectType(inputObject.getName());
+        output.setType(inputObject.getType());
+        output.setValue(inputObject.getValue());
+        output.setIsRequired(inputObject.isIsRequired());
+        output.setApplicationArgument(inputObject.getApplicationArgument());
+        output.setOutputStreaming(false);
+//        output.setDataMovement(true);
+        return output;
+    }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNode.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNode.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNode.java
index 7378c96..6cbf231 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNode.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNode.java
@@ -24,7 +24,7 @@ package org.apache.airavata.workflow.core.dag.nodes;
 import org.apache.airavata.model.application.io.OutputDataObjectType;
 import org.apache.airavata.workflow.core.dag.port.InPort;
 
-public interface OutputNode extends WorkflowNode {
+public interface OutputNode extends WorkflowNode, InPort {
 
     public OutputDataObjectType getOutputObject();
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNodeImpl.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNodeImpl.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNodeImpl.java
index 5eada1c..d4c8780 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNodeImpl.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/nodes/OutputNodeImpl.java
@@ -24,14 +24,21 @@ package org.apache.airavata.workflow.core.dag.nodes;
 import org.apache.airavata.model.ComponentState;
 import org.apache.airavata.model.ComponentStatus;
 import org.apache.airavata.model.NodeModel;
+import org.apache.airavata.model.PortModel;
+import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.InputDataObjectType;
 import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.workflow.core.dag.edge.Edge;
 import org.apache.airavata.workflow.core.dag.port.InPort;
 
 public class OutputNodeImpl implements OutputNode {
 
     private NodeModel nodeModel;
     private OutputDataObjectType outputDataObjectType;
-    private InPort inPort;
+    private InputDataObjectType inputDataObjectType;
+    private PortModel portModel;
+    private String value;
+    private DataType dataType;
 
     public OutputNodeImpl(NodeModel nodeModel) {
         this.nodeModel = nodeModel;
@@ -53,6 +60,21 @@ public class OutputNodeImpl implements OutputNode {
     }
 
     @Override
+    public DataType getDataType() {
+        return dataType;
+    }
+
+    @Override
+    public void setDataType(DataType dataType) {
+        this.dataType = dataType;
+    }
+
+    @Override
+    public String getNodeId() {
+        return getNode().getId();
+    }
+
+    @Override
     public String getName() {
         return getNodeModel().getName();
     }
@@ -79,9 +101,29 @@ public class OutputNodeImpl implements OutputNode {
 
 
     @Override
+    public void setPortModel(PortModel portModel) {
+        this.portModel = portModel;
+    }
+
+    @Override
+    public PortModel getPortModel() {
+        return portModel;
+    }
+
+    @Override
     public boolean isReady() {
-        return !(inPort.getInputObject() == null || inPort.getInputObject().getValue() == null
-                || inPort.getInputObject().getValue().equals(""));
+        return !(getInputObject() == null || getInputObject().getValue() == null
+                || getInputObject().getValue().equals(""));
+    }
+
+    @Override
+    public WorkflowNode getNode() {
+        return this;
+    }
+
+    @Override
+    public void setNode(WorkflowNode workflowNode) {
+        // OutputNode is a workflow Node.
     }
 
     @Override
@@ -96,13 +138,50 @@ public class OutputNodeImpl implements OutputNode {
 
     @Override
     public InPort getInPort() {
-        return this.inPort;
+        return this;
     }
 
     @Override
     public void setInPort(InPort inPort) {
-        this.inPort = inPort;
+        // outputNode is an inPort.
     }
 
+    @Override
+    public void setInputObject(InputDataObjectType inputObject) {
+        this.inputDataObjectType = inputObject;
+        setOutputObject(convert(inputObject));
+    }
+
+    private OutputDataObjectType convert(InputDataObjectType inputObject) {
+        OutputDataObjectType output = new OutputDataObjectType(getName());
+        output.setValue(inputObject.getValue());
+        output.setType(inputObject.getType());
+        return output;
+    }
+
+    @Override
+    public InputDataObjectType getInputObject() {
+        return inputDataObjectType;
+    }
+
+    @Override
+    public Edge getEdge() {
+        return null;
+    }
+
+    @Override
+    public void addEdge(Edge edge) {
+
+    }
+
+    @Override
+    public String getDefaultValue() {
+        return value;
+    }
+
+    @Override
+    public void setDefaultValue(String defaultValue) {
+        value = defaultValue;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/InputPortIml.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/InputPortIml.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/InputPortIml.java
index 3f5d036..8373c4b 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/InputPortIml.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/InputPortIml.java
@@ -20,6 +20,7 @@
 package org.apache.airavata.workflow.core.dag.port;
 
 import org.apache.airavata.model.PortModel;
+import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.model.application.io.InputDataObjectType;
 import org.apache.airavata.workflow.core.dag.edge.Edge;
 import org.apache.airavata.workflow.core.dag.nodes.WorkflowNode;
@@ -31,6 +32,7 @@ public class InputPortIml implements InPort {
     private Edge edge;
     private WorkflowNode node;
     private PortModel portModel;
+    private DataType dataType;
 
     public InputPortIml(PortModel portModel) {
         this.portModel = portModel;
@@ -98,4 +100,19 @@ public class InputPortIml implements InPort {
         return getPortModel().getPortId();
     }
 
+    @Override
+    public DataType getDataType() {
+        return dataType;
+    }
+
+    @Override
+    public void setDataType(DataType dataType) {
+        this.dataType = dataType;
+    }
+
+    @Override
+    public String getNodeId() {
+        return getNode().getId();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/OutPortImpl.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/OutPortImpl.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/OutPortImpl.java
index c261279..e8c8e74 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/OutPortImpl.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/OutPortImpl.java
@@ -22,6 +22,7 @@
 package org.apache.airavata.workflow.core.dag.port;
 
 import org.apache.airavata.model.PortModel;
+import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.model.application.io.OutputDataObjectType;
 import org.apache.airavata.workflow.core.dag.edge.Edge;
 import org.apache.airavata.workflow.core.dag.nodes.WorkflowNode;
@@ -36,6 +37,7 @@ public class OutPortImpl implements OutPort {
     private boolean isSatisfy = false;
     private WorkflowNode node;
     private PortModel portModel;
+    private DataType dataType;
 
     public OutPortImpl(PortModel portModel) {
         this.portModel = portModel;
@@ -91,4 +93,19 @@ public class OutPortImpl implements OutPort {
     public String getId() {
         return getPortModel().getPortId();
     }
+
+    @Override
+    public DataType getDataType() {
+        return dataType;
+    }
+
+    @Override
+    public void setDataType(DataType dataType) {
+        this.dataType = dataType;
+    }
+
+    @Override
+    public String getNodeId() {
+        return getNode().getId();
+    }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/Port.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/Port.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/Port.java
index 9fda882..0b37911 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/Port.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/dag/port/Port.java
@@ -22,6 +22,7 @@
 package org.apache.airavata.workflow.core.dag.port;
 
 import org.apache.airavata.model.PortModel;
+import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.workflow.core.dag.nodes.WorkflowNode;
 
 public interface Port {
@@ -37,5 +38,11 @@ public interface Port {
     public void setNode(WorkflowNode workflowNode);
 
     public String getId();
+
+    public DataType getDataType();
+
+    public void setDataType(DataType dataType);
+
+    public String getNodeId();
     
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java
index 7484f7e..37e82c0 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java
@@ -27,6 +27,7 @@ import com.google.gson.stream.JsonToken;
 import org.apache.airavata.model.EdgeModel;
 import org.apache.airavata.model.NodeModel;
 import org.apache.airavata.model.PortModel;
+import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.workflow.core.WorkflowInfo;
 import org.apache.airavata.workflow.core.dag.edge.DirectedEdge;
 import org.apache.airavata.workflow.core.dag.edge.Edge;
@@ -49,8 +50,12 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
 
 public class JsonWorkflowParser implements WorkflowParser {
 
@@ -110,15 +115,132 @@ public class JsonWorkflowParser implements WorkflowParser {
         }
         jsonReader.endObject();
 
-        buildWorkflowDAG();
+        buildWorkflowGraph();
         return workflowInfo;
     }
 
-    private void buildWorkflowDAG() {
+    private void buildWorkflowGraph() throws Exception {
         // TODO construct runtime model
+        Queue<WorkflowNode> queue = new LinkedList<>();
+        queue.addAll(inputs);
+
+        Map<String, List<Link>> linkMap = getEdgesMap(links);
+        Map<String, InPort> nodeInportMap = getNodeInPortsMap(getApplicationNodes());
+        nodeInportMap.putAll(getNodeInPortMap(getOutputNodes()));
+        Set<String> processedNodes = new HashSet<>();
+
+        while (!queue.isEmpty()) {
+            WorkflowNode node = queue.poll();
+            if (processedNodes.contains(node.getId())) {
+                continue;
+            }
+
+            if (node instanceof InputNode) {
+                InputNode input = ((InputNode) node);
+                OutPort outPort = ((OutPort) node);
+                Map<String,Edge> edgeMap = addEdges(outPort, linkMap.get(outPort.getNodeId() + "," + outPort.getId()));
+
+                for (Map.Entry<String, Edge> entry : edgeMap.entrySet()) {
+                    InPort inPort = nodeInportMap.get(entry.getKey());
+                    if (inPort != null) {
+                        inPort.addEdge(entry.getValue());
+                        entry.getValue().setToPort(inPort);
+
+                        queue.add(inPort.getNode());
+                    }
+                }
+
+            } else if (node instanceof ApplicationNode) {
+                ApplicationNode appNode = ((ApplicationNode) node);
+                for (OutPort outPort : appNode.getOutputPorts()) {
+                    outPort.setNode(appNode);
+                    Map<String, Edge> edgeMap = addEdges(outPort, linkMap.get(outPort.getNodeId() + "," + outPort.getId()));
+
+                    for (Map.Entry<String, Edge> entry : edgeMap.entrySet()) {
+                        InPort inPort = nodeInportMap.get(entry.getKey());
+                        if (inPort != null) {
+                            inPort.addEdge(entry.getValue());
+                            entry.getValue().setToPort(inPort);
+
+                            queue.add(inPort.getNode());
+                        }
+                    }
+                }
+            } else if (node instanceof OutputNode) {
+                OutputNode outputNode = ((OutputNode) node);
+                InPort inPort = ((InPort) node);
+                outputNode.setInputObject(inPort.getInputObject());
+
+            }
+            // marke node as precessed node, we don't need to process it again.
+            processedNodes.add(node.getId());
+        }
+
+    }
+
+    private Map<String, InPort> getNodeInPortMap(List<OutputNode> outputNodes) {
+        Map<String, InPort> nodeInPortsMap = new HashMap<>();
+        if (outputNodes != null) {
+            for (OutputNode outputNode : outputNodes) {
+                InPort inPort = outputNode.getInPort();
+                inPort.setNode(outputNode);
+                nodeInPortsMap.put(outputNode.getId() + "," + inPort.getId(), inPort);
+            }
+        }
+        return nodeInPortsMap;
+    }
+
+    private Map<String, InPort> getNodeInPortsMap(List<ApplicationNode> applicationNodes) {
+        Map<String, InPort> nodeInPortsMap = new HashMap<>();
+        if (applicationNodes != null) {
+            for (ApplicationNode applicationNode : applicationNodes) {
+                for (InPort inPort : applicationNode.getInputPorts()) {
+                    inPort.setNode(applicationNode);
+                    nodeInPortsMap.put(applicationNode.getId() + "," + inPort.getId(), inPort);
+                }
+            }
+        }
 
+        return nodeInPortsMap;
+    }
+
+    /**
+     *
+     * @param outPort -
+     * @param links  -
+     * @return key: nodeId,inportId  value : link
+     */
+    private Map<String, Edge> addEdges(OutPort outPort, List<Link> links) {
+        Map<String, Edge> inPortMap = new HashMap<>();
+        if (links != null) {
+            for (Link link : links) {
+                EdgeModel edgeModel = new EdgeModel(link.getId());
+                Edge edge = new DirectedEdge(edgeModel);
+                edge.setFromPort(outPort);
+                outPort.addEdge(edge);
+                inPortMap.put(link.getTo().getNodeId() + "," + link.getTo().getPortId(), edge);
+            }
+        }
+        return inPortMap;
+    }
+
+    private Map<String, List<Link>> getEdgesMap(List<Link> links) {
+        Map<String, List<Link>> map = new HashMap<>();
+        List<Link> linkList;
+        for (Link link : links) {
+            linkList = map.get(link.from.getNodeId() + "," + link.from.getPortId());
+            if (linkList == null) {
+                linkList = new ArrayList<>();
+            }
+
+            linkList.add(link);
+            map.put(link.from.getNodeId() + "," + link.from.getPortId(), linkList);
+        }
+
+        return map;
     }
 
+
     private void readWorkflowInfo(JsonReader jsonReader) throws IOException, ParserException {
         jsonReader.beginObject();
         String name;
@@ -178,13 +300,15 @@ public class JsonWorkflowParser implements WorkflowParser {
                     } else if (name.equals(ID)) {
                         nodeModel.setNodeId(jsonReader.nextString());
                     } else if (name.equals(DATATYPE)) {
-                        jsonReader.skipValue();
+                        inputNode.setDataType(DataType.valueOf(jsonReader.nextString()));
                     } else if (name.equals(DESCRIPTION)) {
                         nodeModel.setDescription(jsonReader.nextString());
                     } else if (name.equals(POSITION)) {
                         readPosition(jsonReader);
                     } else if (name.equals(NODE_ID)) {
                         nodeModel.setNodeId(jsonReader.nextString());
+                    } else if (name.equals(DEFAULT_VALUE)) {
+                        inputNode.setValue(jsonReader.nextString());
                     } else {
                         jsonReader.skipValue();
                     }
@@ -263,7 +387,7 @@ public class JsonWorkflowParser implements WorkflowParser {
     private Link readLink(JsonReader jsonReader) throws IOException {
         jsonReader.beginObject();
         String name = null;
-        Link link = new Link(null, null);
+        Link link = new Link();
         while (jsonReader.hasNext()) {
             name = jsonReader.nextName();
             if (name.equals(DESCRIPTION)) {
@@ -272,6 +396,8 @@ public class JsonWorkflowParser implements WorkflowParser {
                 link.setFrom(readLinkHelper(jsonReader));
             } else if (name.equals(TO)) {
                 link.setTo(readLinkHelper(jsonReader));
+            } else if (name.equals(ID)) {
+                link.setId(jsonReader.nextString());
             } else {
                 jsonReader.skipValue();
             }
@@ -288,8 +414,8 @@ public class JsonWorkflowParser implements WorkflowParser {
             name = jsonReader.nextName();
             if (name.equals(NODE_ID)) {
                 helper.setNodeId(jsonReader.nextString());
-            } else if (name.equals(OUTPUT_ID)) {
-                helper.setOutputId(jsonReader.nextString());
+            } else if (name.equals(OUTPUT_ID) || name.equals(INPUT_ID)) {
+                helper.setPortId(jsonReader.nextString());
             } else {
                 jsonReader.skipValue();
             }
@@ -549,17 +675,14 @@ public class JsonWorkflowParser implements WorkflowParser {
     public static final String FROM = "from";
     public static final String TO = "to";
     public static final String OUTPUT_ID = "outputId";
+    public static final String INPUT_ID = "inputId";
 
 
     class Link {
         private LinkHelper from;
         private LinkHelper to;
         private String description;
-
-        public Link(LinkHelper from, LinkHelper to) {
-            this.from = from;
-            this.to = to;
-        }
+        private String id;
 
         public String getDescription() {
             return description;
@@ -576,11 +699,27 @@ public class JsonWorkflowParser implements WorkflowParser {
         public void setTo(LinkHelper to) {
             this.to = to;
         }
+
+        public LinkHelper getFrom() {
+            return from;
+        }
+
+        public LinkHelper getTo() {
+            return to;
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
     }
 
     class LinkHelper {
         private String nodeId;
-        private String outputId;
+        private String portId;
 
         public String getNodeId() {
             return nodeId;
@@ -590,12 +729,12 @@ public class JsonWorkflowParser implements WorkflowParser {
             this.nodeId = nodeId;
         }
 
-        public String getOutputId() {
-            return outputId;
+        public String getPortId() {
+            return portId;
         }
 
-        public void setOutputId(String outputId) {
-            this.outputId = outputId;
+        public void setPortId(String portId) {
+            this.portId = portId;
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/38c2c36e/modules/workflow/workflow-core/src/test/resources/TestWorkflow.json
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/test/resources/TestWorkflow.json b/modules/workflow/workflow-core/src/test/resources/TestWorkflow.json
index 0dd4b35..d9c3a0c 100644
--- a/modules/workflow/workflow-core/src/test/resources/TestWorkflow.json
+++ b/modules/workflow/workflow-core/src/test/resources/TestWorkflow.json
@@ -68,18 +68,22 @@
         "nodeId" : "defaultOutputNodeId_2" }
     ],
     "links" : [
-      { "description" : "link desc",
-         "from" : { "nodeId" : "" , "outputId" : "" },
-         "to" : { "nodeId" : "" , "outputId" : "" }},
-      { "description" : "link desc",
-         "from" : { "nodeId" : "" , "outputId" : "" },
-         "to" : { "nodeId" : "" , "outputId" : "" }},
-      { "description" : "link desc",
-         "from" : { "nodeId" : "" , "outputId" : "" },
-         "to" : { "nodeId" : "" , "outputId" : "" }},
-      { "description" : "link desc",
-         "from" : { "nodeId" : "" , "outputId" : "" },
-         "to" : { "nodeId" : "" , "outputId" : "" }}
+      { "id" : "link_1",
+        "description" : "link desc",
+        "from" : { "nodeId" : "" , "outputId" : "" },
+        "to" : { "nodeId" : "" , "inputId" : "" }},
+      { "id" : "link_2",
+        "description" : "link desc",
+        "from" : { "nodeId" : "" , "outputId" : "" },
+        "to" : { "nodeId" : "" , "inputId" : "" }},
+      { "id" : "link_3",
+        "description" : "link desc",
+        "from" : { "nodeId" : "" , "outputId" : "" },
+        "to" : { "nodeId" : "" , "inputId" : "" }},
+      { "id" : "link_4",
+        "description" : "link desc",
+        "from" : { "nodeId" : "" , "outputId" : "" },
+        "to" : { "nodeId" : "" , "inputId" : "" }}
     ]
   }
 }


[2/2] airavata git commit: Merge branch 'develop' of https://git-wip-us.apache.org/repos/asf/airavata into develop

Posted by sh...@apache.org.
Merge branch 'develop' of https://git-wip-us.apache.org/repos/asf/airavata into develop


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/24587f9f
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/24587f9f
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/24587f9f

Branch: refs/heads/develop
Commit: 24587f9f88172c276f354c7fb2d92f1017d180a3
Parents: 38c2c36 d3cf5bc
Author: Shameera Rathnayaka <sh...@gmail.com>
Authored: Fri Feb 12 16:51:29 2016 -0500
Committer: Shameera Rathnayaka <sh...@gmail.com>
Committed: Fri Feb 12 16:51:29 2016 -0500

----------------------------------------------------------------------
 .../server/handler/AiravataServerHandler.java   |  18 +-
 .../java/org/apache/airavata/api/Airavata.java  | 268 ++++++++++++++-----
 .../main/resources/lib/airavata/Airavata.cpp    | 193 +++++++------
 .../src/main/resources/lib/airavata/Airavata.h  |  37 +--
 .../lib/airavata/Airavata_server.skeleton.cpp   |   5 +-
 .../resources/lib/Airavata/API/Airavata.php     |  53 +++-
 .../lib/apache/airavata/api/Airavata-remote     |   8 +-
 .../lib/apache/airavata/api/Airavata.py         |  56 ++--
 .../apache/airavata/model/ComponentStatus.java  |   2 +-
 .../org/apache/airavata/model/EdgeModel.java    |   2 +-
 .../org/apache/airavata/model/NodeModel.java    |   2 +-
 .../org/apache/airavata/model/PortModel.java    |   2 +-
 .../apache/airavata/model/WorkflowModel.java    |   2 +-
 .../apache/airavata/model/WorkflowStatus.java   |   2 +-
 .../ApplicationDeploymentDescription.java       |   2 +-
 .../appdeployment/ApplicationModule.java        |   2 +-
 .../appcatalog/appdeployment/CommandObject.java |   2 +-
 .../appcatalog/appdeployment/SetEnvPaths.java   |   2 +-
 .../ApplicationInterfaceDescription.java        |   2 +-
 .../appcatalog/computeresource/BatchQueue.java  |   2 +-
 .../computeresource/CloudJobSubmission.java     |   2 +-
 .../ComputeResourceDescription.java             |   2 +-
 .../computeresource/GlobusJobSubmission.java    |   2 +-
 .../computeresource/JobSubmissionInterface.java |   2 +-
 .../computeresource/LOCALSubmission.java        |   2 +-
 .../computeresource/ResourceJobManager.java     |   2 +-
 .../computeresource/SSHJobSubmission.java       |   2 +-
 .../computeresource/UnicoreJobSubmission.java   |   2 +-
 .../ComputeResourcePreference.java              |   2 +-
 .../gatewayprofile/GatewayResourceProfile.java  |   2 +-
 .../gatewayprofile/StoragePreference.java       |   2 +-
 .../StorageResourceDescription.java             |   2 +-
 .../application/io/InputDataObjectType.java     |   2 +-
 .../application/io/OutputDataObjectType.java    |   2 +-
 .../airavata/model/commons/ErrorModel.java      |   2 +-
 .../model/commons/ValidationResults.java        |   2 +-
 .../airavata/model/commons/ValidatorResult.java |   2 +-
 .../data/movement/DataMovementInterface.java    |   2 +-
 .../data/movement/GridFTPDataMovement.java      |   2 +-
 .../model/data/movement/LOCALDataMovement.java  |   2 +-
 .../model/data/movement/SCPDataMovement.java    |   2 +-
 .../data/movement/UnicoreDataMovement.java      |   2 +-
 .../data/resource/DataReplicaLocationModel.java |   2 +-
 .../model/data/resource/DataResourceModel.java  |   2 +-
 .../model/error/AiravataClientException.java    |   2 +-
 .../model/error/AiravataSystemException.java    |   2 +-
 .../model/error/AuthenticationException.java    |   2 +-
 .../model/error/AuthorizationException.java     |   2 +-
 .../error/ExperimentNotFoundException.java      |   2 +-
 .../model/error/InvalidRequestException.java    |   2 +-
 .../model/error/LaunchValidationException.java  |   2 +-
 .../model/error/ProjectNotFoundException.java   |   2 +-
 .../airavata/model/error/TimedOutException.java |   2 +-
 .../airavata/model/error/ValidationResults.java |   2 +-
 .../airavata/model/error/ValidatorResult.java   |   2 +-
 .../model/experiment/ExperimentModel.java       |   2 +-
 .../model/experiment/ExperimentStatistics.java  |   2 +-
 .../experiment/ExperimentSummaryModel.java      |   2 +-
 .../experiment/UserConfigurationDataModel.java  |   2 +-
 .../org/apache/airavata/model/job/JobModel.java |   2 +-
 .../event/ExperimentStatusChangeEvent.java      |   2 +-
 .../model/messaging/event/JobIdentifier.java    |   2 +-
 .../messaging/event/JobStatusChangeEvent.java   |   2 +-
 .../event/JobStatusChangeRequestEvent.java      |   2 +-
 .../airavata/model/messaging/event/Message.java |   2 +-
 .../messaging/event/ProcessIdentifier.java      |   2 +-
 .../event/ProcessStatusChangeEvent.java         |   2 +-
 .../event/ProcessStatusChangeRequestEvent.java  |   2 +-
 .../messaging/event/ProcessSubmitEvent.java     |   2 +-
 .../messaging/event/ProcessTerminateEvent.java  |   2 +-
 .../model/messaging/event/TaskIdentifier.java   |   2 +-
 .../messaging/event/TaskOutputChangeEvent.java  |   2 +-
 .../messaging/event/TaskStatusChangeEvent.java  |   2 +-
 .../event/TaskStatusChangeRequestEvent.java     |   2 +-
 .../airavata/model/process/ProcessModel.java    |   2 +-
 .../ComputationalResourceSchedulingModel.java   |   2 +-
 .../airavata/model/security/AuthzToken.java     |   2 +-
 .../airavata/model/status/ExperimentStatus.java |   2 +-
 .../apache/airavata/model/status/JobStatus.java |   2 +-
 .../airavata/model/status/ProcessStatus.java    |   2 +-
 .../airavata/model/status/TaskStatus.java       |   2 +-
 .../model/task/DataStagingTaskModel.java        |   2 +-
 .../model/task/EnvironmentSetupTaskModel.java   |   2 +-
 .../model/task/JobSubmissionTaskModel.java      |   2 +-
 .../airavata/model/task/MonitorTaskModel.java   |   2 +-
 .../apache/airavata/model/task/TaskModel.java   |   2 +-
 .../airavata/model/workspace/Gateway.java       |   2 +-
 .../apache/airavata/model/workspace/Group.java  |   2 +-
 .../airavata/model/workspace/Project.java       |   2 +-
 .../apache/airavata/model/workspace/User.java   |   2 +-
 .../server/src/main/resources/gfac-config.yaml  |   2 +-
 .../gfac/core/cluster/RemoteCluster.java        |   3 +
 .../airavata/gfac/impl/BESRemoteCluster.java    |   6 +
 .../org/apache/airavata/gfac/impl/Factory.java  |  30 ++-
 .../airavata/gfac/impl/HPCRemoteCluster.java    |   8 +-
 .../airavata/gfac/impl/LocalRemoteCluster.java  |   6 +
 .../app/catalog/impl/StorageResourceImpl.java   |  14 +
 .../resources/StorageInterfaceResource.java     |   4 +-
 .../airavata/registry/cpi/StorageResource.java  |   2 +
 .../airavata-apis/airavata_api.thrift           |   5 +-
 100 files changed, 577 insertions(+), 305 deletions(-)
----------------------------------------------------------------------