use of org.apache.airavata.workflow.model.graph.impl.EdgeImpl in project airavata by apache.
the class WorkflowInterpreter method getReadyNodesDynamically.
private ArrayList<Node> getReadyNodesDynamically() {
ArrayList<Node> list = new ArrayList<Node>();
ArrayList<Node> waiting = InterpreterUtil.getWaitingNodesDynamically(this.getGraph());
// ArrayList<Node> finishedNodes = InterpreterUtil.getFinishedNodesDynamically(this.getGraph());
// This is to support repeat the same application in the workflow.
List<String> finishedNodeIds = InterpreterUtil.getFinishedNodesIds(this.getGraph());
for (Node node : waiting) {
Component component = node.getComponent();
if (component instanceof WSComponent || component instanceof DynamicComponent || component instanceof SubWorkflowComponent || component instanceof ForEachComponent || component instanceof EndForEachComponent || component instanceof IfComponent || component instanceof InstanceComponent) {
/*
* Check for control ports from other node
*/
ControlPort control = node.getControlInPort();
boolean controlDone = true;
if (control != null) {
for (EdgeImpl edge : control.getEdges()) {
controlDone = controlDone && (finishedNodeIds.contains(edge.getFromPort().getNode().getID()) || // that makes sense and if anyone found a scenario it should be otherwise pls fix
((ControlPort) edge.getFromPort()).isConditionMet());
}
}
/*
* Check for input ports
*/
List<DataPort> inputPorts = node.getInputPorts();
boolean inputsDone = true;
for (DataPort dataPort : inputPorts) {
inputsDone = inputsDone && finishedNodeIds.contains(dataPort.getFromNode().getID());
}
if (inputsDone && controlDone) {
list.add(node);
}
} else if (component instanceof EndifComponent) {
/*
* EndIfComponent can run if number of input equals to number of
* output that it expects
*/
int expectedOutput = node.getOutputPorts().size();
int actualInput = 0;
List<DataPort> inputPorts = node.getInputPorts();
for (DataPort dataPort : inputPorts) {
if (finishedNodeIds.contains(dataPort.getFromNode().getID()))
actualInput++;
}
if (expectedOutput == actualInput) {
list.add(node);
}
} else if (component instanceof TerminateInstanceComponent) {
/*
* All node connected to controlIn port must be done
*/
ControlPort control = node.getControlInPort();
boolean controlDone = true;
if (control != null) {
for (EdgeImpl edge : control.getEdges()) {
controlDone = controlDone && finishedNodeIds.contains(edge.getFromPort().getFromNode().getID());
}
}
/*
* Check for input ports
*/
List<DataPort> inputPorts = node.getInputPorts();
boolean inputsDone = true;
for (DataPort dataPort : inputPorts) {
inputsDone = inputsDone && finishedNodeIds.contains(dataPort.getFromNode().getID());
}
if (inputsDone && controlDone) {
list.add(node);
}
} else if (InputComponent.NAME.equals(component.getName()) || DifferedInputComponent.NAME.equals(component.getName()) || S3InputComponent.NAME.equals(component.getName()) || OutputComponent.NAME.equals(component.getName()) || MemoComponent.NAME.equals(component.getName()) || component instanceof EndDoWhileComponent) {
// no op
} else if (component instanceof DoWhileComponent) {
ControlPort control = node.getControlInPort();
boolean controlDone = true;
if (control != null) {
for (EdgeImpl edge : control.getEdges()) {
controlDone = controlDone && finishedNodeIds.contains(edge.getFromPort().getFromNode().getID());
}
}
if (controlDone) {
list.add(node);
}
} else {
throw new WorkFlowInterpreterException("Component Not handled :" + component.getName());
}
}
notifyViaInteractor(WorkflowExecutionMessage.HANDLE_DEPENDENT_NODES_DIFFERED_INPUTS, this.getGraph());
return list;
}
use of org.apache.airavata.workflow.model.graph.impl.EdgeImpl in project airavata by apache.
the class WSGraph method topologicalSort.
/**
* @return
* @throws GraphException
*/
private LinkedList<Node> topologicalSort() throws GraphException {
List<EdgeImpl> alledges = this.getEdges();
HashSet<EdgeImpl> edgeSet = new HashSet<EdgeImpl>(alledges);
List<Node> workQueue = new LinkedList<Node>(GraphUtil.getInputNodes(this));
workQueue.addAll(GraphUtil.getStreamSourceNodes(this));
LinkedList<Node> sortedOrder = new LinkedList<Node>();
while (!workQueue.isEmpty()) {
Node currentNode = workQueue.remove(0);
sortedOrder.add(currentNode);
List<DataPort> outputPorts = currentNode.getOutputPorts();
for (DataPort dataPort : outputPorts) {
List<DataEdge> curentEdges = dataPort.getEdges();
for (DataEdge dataEdge : curentEdges) {
edgeSet.remove(dataEdge);
if (isAllEdgesRemoved(edgeSet, dataEdge.getToPort().getNode())) {
workQueue.add(dataEdge.getToPort().getNode());
}
}
}
}
if (edgeSet.isEmpty()) {
return sortedOrder;
} else {
throw new GraphException("Graph Topological sorting failed, Graph has at least one cycle");
}
}
use of org.apache.airavata.workflow.model.graph.impl.EdgeImpl in project airavata by apache.
the class WSGraphFactory method createEdge.
/**
* @see org.apache.airavata.workflow.model.graph.GraphFactory#createEdge(org.xmlpull.infoset.XmlElement)
*/
public EdgeImpl createEdge(XmlElement edgeElement) {
String type = edgeElement.attributeValue(GraphSchema.NS, GraphSchema.EDGE_TYPE_ATTRIBUTE);
EdgeImpl edge;
if (GraphSchema.EDGE_TYPE_DATA.equals(type)) {
edge = new DataEdge(edgeElement);
} else if (GraphSchema.PORT_TYPE_CONTROL.equals(type)) {
edge = new ControlEdge(edgeElement);
} else {
// Default is WsPort because of backword compatibility
edge = new DataEdge(edgeElement);
}
return edge;
}
use of org.apache.airavata.workflow.model.graph.impl.EdgeImpl in project airavata by apache.
the class WSGraphFactory method createEdge.
public EdgeImpl createEdge(JsonObject edgeObject) {
String type = edgeObject.getAsJsonPrimitive(GraphSchema.EDGE_TYPE_ATTRIBUTE).getAsString();
EdgeImpl edge;
if (GraphSchema.EDGE_TYPE_DATA.equals(type)) {
edge = new DataEdge(edgeObject);
} else if (GraphSchema.PORT_TYPE_CONTROL.equals(type)) {
edge = new ControlEdge(edgeObject);
} else {
// Default is WsPort because of backword compatibility
edge = new DataEdge(edgeObject);
}
return edge;
}
use of org.apache.airavata.workflow.model.graph.impl.EdgeImpl in project airavata by apache.
the class WSGraphFactory method createEdge.
/**
* @see org.apache.airavata.workflow.model.graph.GraphFactory#createEdge(org.apache.airavata.workflow.model.graph.Port,
* org.apache.airavata.workflow.model.graph.Port)
*/
public EdgeImpl createEdge(Port fromPort, Port toPort) {
Kind fromKind = fromPort.getKind();
Kind toKind = toPort.getKind();
if (!((fromKind == Kind.DATA_OUT && toKind == Kind.DATA_IN) || (fromKind == Kind.CONTROL_OUT && toKind == Kind.CONTROL_IN) || (fromKind == Kind.EPR && toKind == Kind.DATA_IN))) {
throw new WorkflowRuntimeException();
}
EdgeImpl edge;
if (toKind == Kind.DATA_IN) {
edge = new DataEdge();
} else if (toKind == Kind.CONTROL_IN) {
edge = new ControlEdge();
} else {
// Should not happen.
throw new WorkflowRuntimeException();
}
return edge;
}
Aggregations