Search in sources :

Example 1 with NodeImpl

use of org.apache.airavata.workflow.model.graph.impl.NodeImpl in project airavata by apache.

the class WorkflowInterpreter method handleForEach.

private void handleForEach(Node node) throws WorkflowException {
    final ForEachNode forEachNode = (ForEachNode) node;
    EndForEachNode endForEachNode = null;
    Collection<Node> repeatNodes = node.getOutputPort(0).getToNodes();
    // we will support only one for now
    if (repeatNodes.size() != 1) {
        throw new WorkFlowInterpreterException("Only one node allowed inside foreach");
    }
    Iterator<Node> iterator = repeatNodes.iterator();
    if (iterator.hasNext()) {
        Node middleNode = iterator.next();
        // output
        if ((!(middleNode instanceof WSNode)) && (!(middleNode instanceof SubWorkflowNode))) {
            throw new WorkFlowInterpreterException("Encountered Node inside foreach that is not a WSNode" + middleNode);
        } else if (middleNode instanceof SubWorkflowNode) {
            /* Get the EndforEach Node of the Subworkflow */
            Iterator<Node> subWorkflowOut = middleNode.getOutputPort(0).getToNodes().iterator();
            while (subWorkflowOut.hasNext()) {
                Node node2 = subWorkflowOut.next();
                if (node2 instanceof EndForEachNode) {
                    endForEachNode = (EndForEachNode) node2;
                }
            }
            final LinkedList<String> listOfValues = new LinkedList<String>();
            InterpreterUtil.getInputsForForEachNode(forEachNode, listOfValues, this.invokerMap);
            final Integer[] inputNumbers = InterpreterUtil.getNumberOfInputsForForEachNode(forEachNode, this.invokerMap);
            Workflow workflow1 = ((SubWorkflowNode) middleNode).getWorkflow();
            List<NodeImpl> nodes = workflow1.getGraph().getNodes();
            List<Node> wsNodes = new ArrayList<Node>();
            /* Take the List of WSNodes in the subworkflow */
            for (NodeImpl subWorkflowNode : nodes) {
                if (subWorkflowNode instanceof WSNode) {
                    wsNodes.add(subWorkflowNode);
                }
            }
            for (int i = 0; i < wsNodes.size(); i++) {
                final WSNode node1 = (WSNode) wsNodes.get(i);
                SystemComponentInvoker systemInvoker = null;
                List<DataPort> outputPorts1 = node1.getOutputPorts();
                List<Node> endForEachNodes = new ArrayList<Node>();
                for (DataPort port : outputPorts1) {
                    Iterator<Node> endForEachNodeItr1 = port.getToNodes().iterator();
                    while (endForEachNodeItr1.hasNext()) {
                        Node node2 = endForEachNodeItr1.next();
                        if (node2 instanceof EndForEachNode) {
                            endForEachNodes.add(node2);
                        } else if (node2 instanceof OutputNode) {
                        // intentionally left noop
                        } else {
                            throw new WorkFlowInterpreterException("Found More than one node inside foreach");
                        }
                    }
                }
                final List<Node> finalEndForEachNodes = endForEachNodes;
                Iterator<Node> endForEachNodeItr1 = node1.getOutputPort(0).getToNodes().iterator();
                while (endForEachNodeItr1.hasNext()) {
                    Node node2 = endForEachNodeItr1.next();
                    // Start reading input came for foreach node
                    int parallelRuns = listOfValues.size() * node1.getOutputPorts().size();
                    if (listOfValues.size() > 0) {
                        forEachNode.setState(NodeExecutionState.EXECUTING);
                        node1.setState(NodeExecutionState.EXECUTING);
                        List<DataPort> outputPorts = node1.getOutputPorts();
                        final AtomicInteger counter = new AtomicInteger();
                        for (Node endFor : endForEachNodes) {
                            systemInvoker = new SystemComponentInvoker();
                            this.invokerMap.put(endFor, systemInvoker);
                        }
                        final Map<Node, Invoker> finalMap = this.invokerMap;
                        new Thread() {

                            @Override
                            public void run() {
                                try {
                                    runInThread(listOfValues, forEachNode, node1, finalEndForEachNodes, finalMap, counter, inputNumbers);
                                } catch (WorkflowException e) {
                                    log.error(e.getLocalizedMessage(), e);
                                } catch (RegistryException e) {
                                    log.error(e.getMessage(), e);
                                } catch (TException e) {
                                    log.error(e.getMessage(), e);
                                }
                            }
                        }.start();
                        while (counter.intValue() < parallelRuns) {
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                Thread.currentThread().interrupt();
                            }
                        }
                    // if (!(node2 instanceof OutputNode)) {
                    // listOfValues.removeAll(listOfValues);
                    // String output = (String) systemInvoker.getOutput(node1.getOutputPort(0).getName());
                    // XmlElement xmlElement = XMLUtil.stringToXmlElement("<result>" + output + "</result>");
                    // Iterator iterator1 = xmlElement.children().iterator();
                    // while (iterator1.hasNext()) {
                    // Object next1 = iterator1.next();
                    // if (next1 instanceof XmlElement) {
                    // listOfValues.add((String) ((XmlElement) next1).children().iterator().next());
                    // }
                    // }
                    // }
                    }
                }
            }
            // we have finished execution so end foreach is finished
            // todo this has to be done in a separate thread
            endForEachNode.setState(NodeExecutionState.FINISHED);
            middleNode.setState(NodeExecutionState.FINISHED);
            node.setState(NodeExecutionState.FINISHED);
        } else {
            // First node after foreach should end with EndForEachNode
            List<DataPort> outputPorts1 = middleNode.getOutputPorts();
            List<Node> endForEachNodes = new ArrayList<Node>();
            for (DataPort port : outputPorts1) {
                Iterator<Node> endForEachNodeItr1 = port.getToNodes().iterator();
                while (endForEachNodeItr1.hasNext()) {
                    Node node2 = endForEachNodeItr1.next();
                    if (node2 instanceof EndForEachNode) {
                        endForEachNodes.add(node2);
                    } else if (node2 instanceof OutputNode) {
                    // intentionally left noop
                    } else {
                        throw new WorkFlowInterpreterException("Found More than one node inside foreach");
                    }
                }
            }
            final List<Node> finalEndForEachNodes = endForEachNodes;
            final Node foreachWSNode = middleNode;
            final LinkedList<String> listOfValues = new LinkedList<String>();
            // Start reading input came for foreach node
            InterpreterUtil.getInputsForForEachNode(forEachNode, listOfValues, this.invokerMap);
            final Integer[] inputNumbers = InterpreterUtil.getNumberOfInputsForForEachNode(forEachNode, this.invokerMap);
            int parallelRuns = createInputValues(listOfValues, inputNumbers).size() * outputPorts1.size();
            if (listOfValues.size() > 0) {
                forEachNode.setState(NodeExecutionState.EXECUTING);
                foreachWSNode.setState(NodeExecutionState.EXECUTING);
                List<DataPort> outputPorts = middleNode.getOutputPorts();
                final AtomicInteger counter = new AtomicInteger();
                for (Node endFor : endForEachNodes) {
                    final SystemComponentInvoker systemInvoker = new SystemComponentInvoker();
                    this.invokerMap.put(endFor, systemInvoker);
                }
                final Map<Node, Invoker> finalInvokerMap = this.invokerMap;
                new Thread() {

                    @Override
                    public void run() {
                        try {
                            runInThread(listOfValues, forEachNode, foreachWSNode, finalEndForEachNodes, finalInvokerMap, counter, inputNumbers);
                        } catch (WorkflowException e) {
                            log.error(e.getLocalizedMessage(), e);
                        } catch (RegistryException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (TException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }.start();
                while (counter.intValue() < parallelRuns) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
                // we have finished execution so end foreach is finished
                // todo this has to be done in a separate thread
                middleNode.setState(NodeExecutionState.FINISHED);
                for (Node endForEach : endForEachNodes) {
                    endForEach.setState(NodeExecutionState.FINISHED);
                }
            } else {
                throw new WorkFlowInterpreterException("No array values found for foreach");
            }
        }
    }
}
Also used : TException(org.apache.thrift.TException) DynamicNode(org.apache.airavata.workflow.model.graph.dynamic.DynamicNode) Node(org.apache.airavata.workflow.model.graph.Node) SubWorkflowNode(org.apache.airavata.workflow.model.graph.subworkflow.SubWorkflowNode) WSNode(org.apache.airavata.workflow.model.graph.ws.WSNode) DataPort(org.apache.airavata.workflow.model.graph.DataPort) WSNode(org.apache.airavata.workflow.model.graph.ws.WSNode) SubWorkflowNode(org.apache.airavata.workflow.model.graph.subworkflow.SubWorkflowNode) NodeImpl(org.apache.airavata.workflow.model.graph.impl.NodeImpl) WorkflowException(org.apache.airavata.workflow.model.exceptions.WorkflowException) Workflow(org.apache.airavata.workflow.model.wf.Workflow) RegistryException(org.apache.airavata.registry.cpi.RegistryException) AtomicInteger(java.util.concurrent.atomic.AtomicInteger)

Example 2 with NodeImpl

use of org.apache.airavata.workflow.model.graph.impl.NodeImpl in project airavata by apache.

the class WorkflowInterpreter method getInputNodes.

private ArrayList<Node> getInputNodes(Workflow wf) {
    ArrayList<Node> list = new ArrayList<Node>();
    List<NodeImpl> nodes = wf.getGraph().getNodes();
    for (Node node : nodes) {
        String name = node.getComponent().getName();
        if (InputComponent.NAME.equals(name) || ConstantComponent.NAME.equals(name) || S3InputComponent.NAME.equals(name)) {
            list.add(node);
        }
    }
    return list;
}
Also used : NodeImpl(org.apache.airavata.workflow.model.graph.impl.NodeImpl) DynamicNode(org.apache.airavata.workflow.model.graph.dynamic.DynamicNode) Node(org.apache.airavata.workflow.model.graph.Node) SubWorkflowNode(org.apache.airavata.workflow.model.graph.subworkflow.SubWorkflowNode) WSNode(org.apache.airavata.workflow.model.graph.ws.WSNode)

Example 3 with NodeImpl

use of org.apache.airavata.workflow.model.graph.impl.NodeImpl in project airavata by apache.

the class WorkflowInterpreter method getReadyOutputNodesDynamically.

private ArrayList<Node> getReadyOutputNodesDynamically() {
    ArrayList<Node> list = new ArrayList<Node>();
    List<NodeImpl> nodes = this.getGraph().getNodes();
    for (Node node : nodes) {
        if (node instanceof OutputNode && node.getState() == NodeExecutionState.WAITING && node.getInputPort(0).getFromNode().getState() == NodeExecutionState.FINISHED) {
            list.add(node);
        }
    }
    return list;
}
Also used : NodeImpl(org.apache.airavata.workflow.model.graph.impl.NodeImpl) DynamicNode(org.apache.airavata.workflow.model.graph.dynamic.DynamicNode) Node(org.apache.airavata.workflow.model.graph.Node) SubWorkflowNode(org.apache.airavata.workflow.model.graph.subworkflow.SubWorkflowNode) WSNode(org.apache.airavata.workflow.model.graph.ws.WSNode)

Example 4 with NodeImpl

use of org.apache.airavata.workflow.model.graph.impl.NodeImpl in project airavata by apache.

the class WorkflowHarvester method getCandidates.

/**
 * @param workflow
 * @param dataType
 * @return pair of nodeid and portid
 */
private LinkedList<Pair<String, String>> getCandidates(Workflow workflow, QName dataType) {
    LinkedList<Pair<String, String>> candidates = new LinkedList<Pair<String, String>>();
    List<NodeImpl> nodes = workflow.getGraph().getNodes();
    for (NodeImpl node : nodes) {
        if (node instanceof WSNode) {
            List<DataPort> inputPorts = ((WSNode) node).getInputPorts();
            for (DataPort dataPort : inputPorts) {
                if (dataType.equals(dataPort.getType())) {
                    candidates.add(new Pair<String, String>(node.getID(), dataPort.getID()));
                }
            }
        }
    }
    return candidates;
}
Also used : DataPort(org.apache.airavata.workflow.model.graph.DataPort) WSNode(org.apache.airavata.workflow.model.graph.ws.WSNode) NodeImpl(org.apache.airavata.workflow.model.graph.impl.NodeImpl) LinkedList(java.util.LinkedList) Pair(org.apache.airavata.common.utils.Pair)

Example 5 with NodeImpl

use of org.apache.airavata.workflow.model.graph.impl.NodeImpl in project airavata by apache.

the class WorkflowHarvester method getCandidates.

/**
 * @param workflow
 * @param dataType
 * @return pair of nodeid and portid
 */
private LinkedList<Pair<String, String>> getCandidates(Workflow workflow, QName dataType) {
    LinkedList<Pair<String, String>> candidates = new LinkedList<Pair<String, String>>();
    List<NodeImpl> nodes = workflow.getGraph().getNodes();
    for (NodeImpl node : nodes) {
        if (node instanceof WSNode) {
            List<DataPort> inputPorts = ((WSNode) node).getInputPorts();
            for (DataPort dataPort : inputPorts) {
                if (dataType.equals(dataPort.getType())) {
                    candidates.add(new Pair<String, String>(node.getID(), dataPort.getID()));
                }
            }
        }
    }
    return candidates;
}
Also used : DataPort(org.apache.airavata.workflow.model.graph.DataPort) WSNode(org.apache.airavata.workflow.model.graph.ws.WSNode) NodeImpl(org.apache.airavata.workflow.model.graph.impl.NodeImpl) LinkedList(java.util.LinkedList) Pair(org.apache.airavata.common.utils.Pair)

Aggregations

NodeImpl (org.apache.airavata.workflow.model.graph.impl.NodeImpl)24 Node (org.apache.airavata.workflow.model.graph.Node)14 WSNode (org.apache.airavata.workflow.model.graph.ws.WSNode)14 InputNode (org.apache.airavata.workflow.model.graph.system.InputNode)12 LinkedList (java.util.LinkedList)11 DataPort (org.apache.airavata.workflow.model.graph.DataPort)8 OutputNode (org.apache.airavata.workflow.model.graph.system.OutputNode)6 GraphException (org.apache.airavata.workflow.model.graph.GraphException)5 DynamicNode (org.apache.airavata.workflow.model.graph.dynamic.DynamicNode)5 SubWorkflowNode (org.apache.airavata.workflow.model.graph.subworkflow.SubWorkflowNode)5 Pair (org.apache.airavata.common.utils.Pair)4 WorkflowRuntimeException (org.apache.airavata.workflow.model.exceptions.WorkflowRuntimeException)4 EndForEachNode (org.apache.airavata.workflow.model.graph.system.EndForEachNode)4 ForEachNode (org.apache.airavata.workflow.model.graph.system.ForEachNode)4 StreamSourceNode (org.apache.airavata.workflow.model.graph.system.StreamSourceNode)4 Workflow (org.apache.airavata.workflow.model.wf.Workflow)3 Point (java.awt.Point)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 RegistryException (org.apache.airavata.registry.cpi.RegistryException)2