use of org.apache.airavata.workflow.model.graph.Node in project airavata by apache.
the class WorkflowHarvester method harvest.
public Workflow[] harvest(Workflow workflow, QName dataType) {
LinkedList<Workflow> harvest = new LinkedList<Workflow>();
LinkedList<Pair<String, String>> candidates = getCandidates(workflow, dataType);
for (Pair<String, String> pair : candidates) {
Workflow clone = workflow.clone();
NodeImpl node = clone.getGraph().getNode(pair.getLeft());
if (null == node) {
throw new WorkflowRuntimeException("Specified node not found:" + pair.getLeft());
}
Port candidatePort = null;
List<DataPort> inPorts = node.getInputPorts();
for (DataPort dataPort : inPorts) {
if (pair.getRight().equals(dataPort.getID())) {
candidatePort = dataPort;
break;
}
}
if (null == candidatePort) {
throw new WorkflowRuntimeException("Specifies Port was not found:" + pair.getRight());
}
if (!(candidatePort.getFromNode() instanceof InputNode)) {
removeUnnecessaryNodes(node, candidatePort, clone);
Node input = clone.addNode(new InputComponent());
input.setPosition(new Point(Math.max(0, node.getPosition().x - 150), node.getPosition().y));
// original
if (clone.getGraph().getNodes().size() < workflow.getGraph().getNodes().size() && // its not the same as one already harvested
!isWorkflowAlreadyHarvested(harvest, clone)) {
try {
clone.getGraph().addEdge(input.getOutputPort(0), candidatePort);
cleanLeftOverInputNodes(clone);
} catch (GraphException e) {
throw new RuntimeException(e);
}
harvest.add(clone);
}
}
}
return harvest.toArray(new Workflow[0]);
}
use of org.apache.airavata.workflow.model.graph.Node in project airavata by apache.
the class Workflow method getWorkflowServiceNodeIDs.
public List<String> getWorkflowServiceNodeIDs() {
List<NodeImpl> nodes = getGraph().getNodes();
ArrayList<String> nodeIDs = new ArrayList<String>();
for (Node node : nodes) {
if (node instanceof WSNode) {
nodeIDs.add(node.getID());
}
}
return nodeIDs;
}
use of org.apache.airavata.workflow.model.graph.Node in project airavata by apache.
the class WorkflowInterpreter method finish.
private void finish() throws WorkflowException, RegistryException {
ArrayList<Node> outoutNodes = new ArrayList<Node>();
List<NodeImpl> nodes = this.getGraph().getNodes();
for (Node node : nodes) {
if (node instanceof OutputNode) {
if (node.getInputPort(0).getFromNode().getState() == NodeExecutionState.FINISHED) {
outoutNodes.add(node);
} else {
// workflowFinished
return;
}
}
}
LinkedList<Object> outputValues = new LinkedList<Object>();
LinkedList<String> outputKeywords = new LinkedList<String>();
for (Node outputNode : outoutNodes) {
OutputNode node = (OutputNode) outputNode;
List<DataPort> inputPorts = node.getInputPorts();
for (DataPort dataPort : inputPorts) {
Object val = InterpreterUtil.findInputFromPort(dataPort, this.invokerMap);
;
if (null == val) {
throw new WorkFlowInterpreterException("Unable to find output for the node:" + node.getID());
}
WorkflowNodeDetails workflowNodeDetails = nodeInstanceList.get(node);
OutputDataObjectType elem = new OutputDataObjectType();
elem.setName(node.getName());
elem.setValue(val.toString());
workflowNodeDetails.addToNodeOutputs(elem);
try {
getExperimentCatalog().update(ExperimentCatalogModelType.WORKFLOW_NODE_DETAIL, workflowNodeDetails, workflowNodeDetails.getNodeInstanceId());
} catch (RegistryException e) {
log.error(e.getMessage(), e);
}
updateWorkflowNodeStatus(workflowNodeDetails, WorkflowNodeState.COMPLETED);
}
}
}
use of org.apache.airavata.workflow.model.graph.Node in project airavata by apache.
the class WorkflowInterpreter method setupNodeDetailsInput.
private void setupNodeDetailsInput(Node node, WorkflowNodeDetails nodeDetails) {
List<DataPort> inputPorts = node.getInputPorts();
for (DataPort dataPort : inputPorts) {
Node fromNode = dataPort.getFromNode();
String portInputValue = null;
if (fromNode instanceof InputNode) {
portInputValue = (String) ((InputNode) fromNode).getDefaultValue();
} else if (fromNode instanceof WSNode) {
Map<String, String> outputData = nodeOutputData.get(fromNode);
portInputValue = outputData.get(dataPort.getName());
if (portInputValue == null) {
portInputValue = outputData.get(dataPort.getEdge(0).getFromPort().getName());
}
}
// 123456789
InputDataObjectType elem = new InputDataObjectType();
elem.setName(dataPort.getName());
elem.setValue(portInputValue);
if (dataPort instanceof WSPort) {
WSPort port = (WSPort) dataPort;
elem.setInputOrder(port.getComponentPort().getInputOrder());
elem.setApplicationArgument((port.getComponentPort().getApplicationArgument() != null ? port.getComponentPort().getApplicationArgument() : ""));
elem.setType(port.getType());
}
nodeDetails.addToNodeInputs(elem);
}
try {
getExperimentCatalog().update(ExperimentCatalogModelType.WORKFLOW_NODE_DETAIL, nodeDetails, nodeDetails.getNodeInstanceId());
} catch (RegistryException e) {
log.error(e.getMessage(), e);
}
}
use of org.apache.airavata.workflow.model.graph.Node in project airavata by apache.
the class WorkflowInterpreter method runInThread.
private void runInThread(final LinkedList<String> listOfValues, ForEachNode forEachNode, final Node middleNode, List<Node> endForEachNodes, Map<Node, Invoker> tempInvoker, AtomicInteger counter, final Integer[] inputNumber) throws WorkflowException, RegistryException, TException {
final LinkedList<String> taskIdList = new LinkedList<String>();
if (inputNumber.length > 1) {
List<String> inputValues = createInputValues(listOfValues, inputNumber);
for (final Iterator<String> iterator = inputValues.iterator(); iterator.hasNext(); ) {
final String input = iterator.next();
WSComponent wsComponent = (WSComponent) middleNode.getComponent();
final String invoker2 = createInvokerForEachSingleWSNode(middleNode, wsComponent);
taskIdList.add(invoker2);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
log.error(e.getLocalizedMessage(), e);
}
}
} else {
String invoker = null;
for (Iterator<String> iterator = listOfValues.iterator(); iterator.hasNext(); ) {
String input = iterator.next();
WSComponent wsComponent = (WSComponent) middleNode.getComponent();
taskIdList.add(invoker);
// find inputs
List<DataPort> inputPorts = middleNode.getInputPorts();
// for (DataPort port : inputPorts) {
// Object inputVal = InterpreterUtil.findInputFromPort(port, this.invokerMap);
// /*
// * Handle ForEachNode
// */
// Node fromNode = port.getFromNode();
// // if (fromNode instanceof ForEachNode) {
// inputVal = WorkflowInputUtil.parseValue((WSComponentPort) port.getComponentPort(), input);
// // }
//
// if (null == inputVal) {
// throw new WorkFlowInterpreterException("Unable to find inputs for the node:" + middleNode.getID());
// }
// }
invoker = createInvokerForEachSingleWSNode(middleNode, wsComponent);
}
}
// String arrayElementName = foreachWSNode.getOperationName() +
// "ArrayResponse";
// String outputStr = "<" + arrayElementName + ">";
// invokerMap size and endForEachNodes size can be difference
// because we can create endForEachNode with n number of input/output
// ports so always have to use
// middleNode.getOutputPorts when iterate
String[] outputStr = new String[middleNode.getOutputPorts().size()];
int i = 0;
for (DataPort port : middleNode.getOutputPorts()) {
String outputString = "";
// for (Iterator<Invoker> iterator = taskIdList.iterator(); iterator.hasNext();) {
// Invoker workflowInvoker = iterator.next();
//
// // /
// Object output = workflowInvoker.getOutput(port.getName());
// if (output instanceof org.xmlpull.v1.builder.XmlElement) {
// org.xmlpull.v1.builder.XmlElement element = (org.xmlpull.v1.builder.XmlElement) ((org.xmlpull.v1.builder.XmlElement) output).children()
// .next();
// outputString += "\n" + XMLUtil.xmlElementToString(element);
// } else {
// outputString += "\n<value>" + output + "</value>";
// }
// counter.incrementAndGet();
// }
outputStr[i] = outputString;
System.out.println(outputStr[i]);
i++;
}
i = 0;
// outputStr += "\n</" + arrayElementName + ">";
int outputPortIndex = 0;
for (DataPort port : middleNode.getOutputPorts()) {
for (Node endForEachNode : endForEachNodes) {
if (tempInvoker.get(endForEachNode) != null) {
if (!(endForEachNode instanceof OutputNode)) {
((SystemComponentInvoker) tempInvoker.get(endForEachNode)).addOutput(port.getName(), outputStr[i]);
}
}
outputPortIndex++;
}
i++;
}
forEachNode.setState(NodeExecutionState.FINISHED);
}
Aggregations