You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sa...@apache.org on 2012/11/20 17:06:25 UTC

svn commit: r1411717 - in /airavata/trunk/modules: workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/ workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/impl/ xbaya-gui/src/...

Author: samindaw
Date: Tue Nov 20 16:06:23 2012
New Revision: 1411717

URL: http://svn.apache.org/viewvc?rev=1411717&view=rev
Log:
decouple node body color dependency in workflow execution

Modified:
    airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/Node.java
    airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/impl/NodeImpl.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/graph/controller/NodeController.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/DoWhileHandler.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/StandaloneNotificationSender.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpreter.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpretorEventListener.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/jython/lib/StandaloneServiceNotificationSender.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/test/WorkflowModificationTestCase.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/dialogs/graph/system/DifferedInputConfigurationDialog.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/GraphCanvas.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/NodeGUI.java
    airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/monitor/MonitorEventHandler.java

Modified: airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/Node.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/Node.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/Node.java (original)
+++ airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/Node.java Tue Nov 20 16:06:23 2012
@@ -24,11 +24,18 @@ package org.apache.airavata.workflow.mod
 import java.awt.Point;
 import java.util.Collection;
 import java.util.List;
+import java.util.Observer;
 
 import org.apache.airavata.workflow.model.component.Component;
 
 public interface Node extends GraphPiece {
 
+	public static enum NodeExecutionState{
+		WAITING,
+		EXECUTING,
+		FAILED,
+		FINISHED
+	}
     /**
      * Returns the ID of the node.
      * 
@@ -194,4 +201,18 @@ public interface Node extends GraphPiece
      */
     public boolean getRequireJoin();
 
+    public NodeExecutionState getState();
+    
+    public void setState(NodeExecutionState state);
+    
+	public void registerObserver(NodeObserver o);
+	public void removeObserver(NodeObserver o);
+	
+	public static enum NodeUpdateType{
+		STATE_CHANGED,
+		OTHER
+	}
+	public static interface NodeObserver{
+		public void nodeUpdated(NodeUpdateType type);
+	} 
 }
\ No newline at end of file

Modified: airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/impl/NodeImpl.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/impl/NodeImpl.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/impl/NodeImpl.java (original)
+++ airavata/trunk/modules/workflow-model/workflow-model-core/src/main/java/org/apache/airavata/workflow/model/graph/impl/NodeImpl.java Tue Nov 20 16:06:23 2012
@@ -92,6 +92,10 @@ public abstract class NodeImpl implement
     protected String label;
 
     protected transient boolean requireJoin = false;
+    
+    private NodeExecutionState state;
+    
+    private List<NodeObserver> observers;
 
     /**
      * Creates a Node.
@@ -109,6 +113,8 @@ public abstract class NodeImpl implement
         this.inputPortIDs = new ArrayList<String>();
         this.outputPortIDs = new ArrayList<String>();
         this.controlOutPortIDs = new ArrayList<String>();
+        
+        observers=new ArrayList<Node.NodeObserver>();
     }
 
     protected NodeImpl(Graph graph) {
@@ -674,5 +680,37 @@ public abstract class NodeImpl implement
     public boolean getRequireJoin() {
         return this.requireJoin;
     }
-
+    
+    @Override
+    public NodeExecutionState getState() {
+		return state;
+	}
+    
+    @Override
+    public void setState(NodeExecutionState state) {
+		this.state = state;
+		triggerNodeObservers(NodeUpdateType.STATE_CHANGED);
+	}
+    
+    @Override
+    public void registerObserver(NodeObserver o) {
+    	observers.add(o);
+    }
+    
+    @Override
+    public void removeObserver(NodeObserver o) {
+    	if (observers.contains(o)) {
+			observers.remove(o);
+		}
+    }
+    
+    private void triggerNodeObservers(NodeUpdateType type){
+    	for (NodeObserver o : observers) {
+			try {
+				o.nodeUpdated(type);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+    }
 }
\ No newline at end of file

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/graph/controller/NodeController.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/graph/controller/NodeController.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/graph/controller/NodeController.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/graph/controller/NodeController.java Tue Nov 20 16:06:23 2012
@@ -28,6 +28,7 @@ import org.apache.airavata.workflow.mode
 import org.apache.airavata.workflow.model.graph.Graph;
 import org.apache.airavata.workflow.model.graph.GraphPiece;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.Port;
 import org.apache.airavata.workflow.model.graph.amazon.InstanceNode;
 import org.apache.airavata.workflow.model.graph.amazon.TerminateInstanceNode;
@@ -80,7 +81,6 @@ import org.apache.airavata.xbaya.ui.grap
 import org.apache.airavata.xbaya.ui.graph.system.StreamSourceNodeGUI;
 import org.apache.airavata.xbaya.ui.graph.ws.WSNodeGUI;
 import org.apache.airavata.xbaya.ui.graph.ws.WorkflowNodeGUI;
-import org.apache.airavata.xbaya.ui.monitor.MonitorEventHandler;
 
 public class NodeController {
 	private static Map<GraphPiece,GraphPieceGUI> nodeMap=new HashMap<GraphPiece, GraphPieceGUI>();
@@ -185,15 +185,15 @@ public class NodeController {
 	}
 
 	public static boolean isFinished(Node node){
-		return ((NodeGUI)getGUI(node)).getBodyColor() == MonitorEventHandler.NodeState.FINISHED.color;
+		return node.getState() == NodeExecutionState.FINISHED;
 	}
 	public static boolean isWaiting(Node node){
-		return ((NodeGUI)getGUI(node)).getBodyColor() == MonitorEventHandler.NodeState.DEFAULT.color;
+		return node.getState() == NodeExecutionState.WAITING;
 	}
 	public static boolean isRunning(Node node){
-		return ((NodeGUI)getGUI(node)).getBodyColor() == MonitorEventHandler.NodeState.EXECUTING.color;
+		return node.getState() == NodeExecutionState.EXECUTING;
 	}
 	public static boolean isFailed(Node node){
-		return ((NodeGUI)getGUI(node)).getBodyColor() == MonitorEventHandler.NodeState.FAILED.color;
+		return node.getState() == NodeExecutionState.FAILED;
 	}
 }

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/DoWhileHandler.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/DoWhileHandler.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/DoWhileHandler.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/DoWhileHandler.java Tue Nov 20 16:06:23 2012
@@ -38,6 +38,7 @@ import org.apache.airavata.workflow.mode
 import org.apache.airavata.workflow.model.graph.ControlPort;
 import org.apache.airavata.workflow.model.graph.DataPort;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.impl.EdgeImpl;
 import org.apache.airavata.workflow.model.graph.system.DoWhileNode;
 import org.apache.airavata.workflow.model.graph.system.EndDoWhileNode;
@@ -47,7 +48,6 @@ import org.apache.airavata.xbaya.ui.moni
 import org.apache.airavata.xbaya.util.InterpreterUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.xmlpull.infoset.XmlElement;
 
 public class DoWhileHandler implements Callable<Boolean> {
 	private static Logger log = LoggerFactory.getLogger(DoWhileHandler.class);
@@ -196,7 +196,7 @@ public class DoWhileHandler implements C
 				} else if (NodeController.isFailed(donode)) {
 					log.info("Service " + donode.getName() + " Failed");
 					runflag = false;
-					NodeController.getGUI(dowhilenode).setBodyColor(NodeState.FAILED.color);
+					dowhilenode.setState(NodeExecutionState.FAILED);
 					this.threadExecutor.shutdown();
 					return false;
 				} else if (donode.isBreak()) {
@@ -220,14 +220,13 @@ public class DoWhileHandler implements C
 				}
 
 				Node whileNode = readyNodes.get(0);
-				// this.dowhilenode.getGUI().setBodyColor(NodeState.STARTING.color);
 				log.info("Expression evaluation is true so invoking service again " + whileNode.getName());
 
 				this.interpreter.handleWSComponent(whileNode);
 			}
 		}
 		// WS node should be done
-		NodeController.getGUI(dowhilenode).setBodyColor(NodeState.FINISHED.color);
+		dowhilenode.setState(NodeExecutionState.FINISHED);
 		EndDoWhileNode endDoWhileNode = this.dowhilenode.getEndDoWhileNode();
 
 		// /////////////////////////////////////////////////////////
@@ -245,7 +244,7 @@ public class DoWhileHandler implements C
 		this.invokerMap.put(endDoWhileNode, invoker);
 		// TODO send mail once the iterations have converged
 
-		NodeController.getGUI(endDoWhileNode).setBodyColor(NodeState.FINISHED.color);
+		endDoWhileNode.setState(NodeExecutionState.FINISHED);
 		this.threadExecutor.shutdown();
 		return true;
 	}

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/StandaloneNotificationSender.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/StandaloneNotificationSender.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/StandaloneNotificationSender.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/StandaloneNotificationSender.java Tue Nov 20 16:06:23 2012
@@ -25,6 +25,7 @@ import java.net.URI;
 import java.util.List;
 
 import org.apache.airavata.common.utils.StringUtil;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.system.InputNode;
 import org.apache.airavata.workflow.model.graph.system.OutputNode;
 import org.apache.airavata.workflow.model.graph.util.GraphUtil;
@@ -57,7 +58,7 @@ public class StandaloneNotificationSende
     public void workflowStarted(PyObject[] args, String[] keywords) {
         List<InputNode> inputs = GraphUtil.getInputNodes(this.workflow.getGraph());
         for (InputNode inputNode : inputs) {
-            NodeController.getGUI(inputNode).setBodyColor(NodeState.FINISHED.color);
+            inputNode.setState(NodeExecutionState.FINISHED);
         }
 
     }
@@ -66,7 +67,7 @@ public class StandaloneNotificationSende
     public void workflowStarted(Object[] args, String[] keywords) {
         List<InputNode> inputs = GraphUtil.getInputNodes(this.workflow.getGraph());
         for (InputNode inputNode : inputs) {
-            NodeController.getGUI(inputNode).setBodyColor(NodeState.FINISHED.color);
+            inputNode.setState(NodeExecutionState.FINISHED);
         }
     }
 
@@ -74,7 +75,7 @@ public class StandaloneNotificationSende
     public void workflowFinished(Object[] args, String[] keywords) {
         List<OutputNode> outputs = GraphUtil.getOutputNodes(this.workflow.getGraph());
         for (OutputNode outputNode : outputs) {
-        	NodeController.getGUI(outputNode).setBodyColor(NodeState.EXECUTING.color);
+        	outputNode.setState(NodeExecutionState.EXECUTING);
         }
 
     }
@@ -89,7 +90,7 @@ public class StandaloneNotificationSende
     public void workflowFinished(PyObject[] args, String[] keywords) {
         List<OutputNode> outputs = GraphUtil.getOutputNodes(this.workflow.getGraph());
         for (OutputNode outputNode : outputs) {
-        	NodeController.getGUI(outputNode).setBodyColor(NodeState.EXECUTING.color);
+        	outputNode.setState(NodeExecutionState.EXECUTING);
         }
 
     }

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpreter.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpreter.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpreter.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpreter.java Tue Nov 20 16:06:23 2012
@@ -21,7 +21,6 @@
 
 package org.apache.airavata.xbaya.interpretor;
 
-import java.awt.Color;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
@@ -43,10 +42,10 @@ import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
-import org.apache.airavata.registry.api.exception.RegistryException;
 import org.apache.airavata.common.utils.Pair;
 import org.apache.airavata.common.utils.WSDLUtil;
 import org.apache.airavata.common.utils.XMLUtil;
+import org.apache.airavata.registry.api.exception.RegistryException;
 import org.apache.airavata.registry.api.workflow.WorkflowInstanceStatus.ExecutionStatus;
 import org.apache.airavata.workflow.model.component.Component;
 import org.apache.airavata.workflow.model.component.amazon.InstanceComponent;
@@ -72,6 +71,7 @@ import org.apache.airavata.workflow.mode
 import org.apache.airavata.workflow.model.graph.ControlPort;
 import org.apache.airavata.workflow.model.graph.DataPort;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.amazon.InstanceNode;
 import org.apache.airavata.workflow.model.graph.dynamic.BasicTypeMapping;
 import org.apache.airavata.workflow.model.graph.dynamic.DynamicNode;
@@ -96,7 +96,6 @@ import org.apache.airavata.ws.monitor.Mo
 import org.apache.airavata.ws.monitor.MonitorException;
 import org.apache.airavata.xbaya.concurrent.PredicatedTaskRunner;
 import org.apache.airavata.xbaya.core.amazon.AmazonCredential;
-import org.apache.airavata.xbaya.graph.controller.NodeController;
 import org.apache.airavata.xbaya.invoker.DynamicInvoker;
 import org.apache.airavata.xbaya.invoker.EmbeddedGFacInvoker;
 import org.apache.airavata.xbaya.invoker.GenericInvoker;
@@ -105,8 +104,6 @@ import org.apache.airavata.xbaya.invoker
 import org.apache.airavata.xbaya.invoker.WorkflowInvokerWrapperForGFacInvoker;
 import org.apache.airavata.xbaya.provenance.ProvenanceReader;
 import org.apache.airavata.xbaya.provenance.ProvenanceWrite;
-import org.apache.airavata.xbaya.ui.graph.NodeGUI;
-import org.apache.airavata.xbaya.ui.monitor.MonitorEventHandler.NodeState;
 import org.apache.airavata.xbaya.util.AmazonUtil;
 import org.apache.airavata.xbaya.util.InterpreterUtil;
 import org.apache.airavata.xbaya.util.XBayaUtil;
@@ -185,7 +182,7 @@ public class WorkflowInterpreter {
 			String[] keywords = new String[inputNodes.size()];
 			for (int i = 0; i < inputNodes.size(); ++i) {
 				Node node = inputNodes.get(i);
-				NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+				node.setState(NodeExecutionState.FINISHED);
 				notifyViaInteractor(WorkflowExecutionMessage.NODE_STATE_CHANGED, null);
 				keywords[i] = ((InputNode) node).getName();
 				values[i] = ((InputNode) node).getDefaultValue();
@@ -353,7 +350,7 @@ public class WorkflowInterpreter {
 				}
 
 				this.invokerMap.put(node, invoker);
-				NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+				node.setState(NodeExecutionState.FINISHED);
 				return true;
 			} else {
 //				writeProvenanceLater(node);
@@ -445,7 +442,7 @@ public class WorkflowInterpreter {
 				// next run
 				// even if the next run runs before the notification arrives
 
-				NodeController.getGUI(node).setBodyColor(NodeState.EXECUTING.color);
+				node.setState(NodeExecutionState.EXECUTING);
 				// OutputNode node = (OutputNode) outputNode;
 				List<DataPort> inputPorts = node.getInputPorts();
 
@@ -482,7 +479,7 @@ public class WorkflowInterpreter {
 													// Templates.
 						}
 					}
-					NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+					node.setState(NodeExecutionState.FINISHED);
 				}
 				System.out.println("Looping");
 			}
@@ -496,7 +493,7 @@ public class WorkflowInterpreter {
 		List<NodeImpl> nodes = this.getGraph().getNodes();
 		for (Node node : nodes) {
 			if (node instanceof OutputNode) {
-				if (NodeController.getGUI(node.getInputPort(0).getFromNode()).getBodyColor().equals(NodeState.FINISHED.color)) {
+				if (node.getInputPort(0).getFromNode().getState()== NodeExecutionState.FINISHED) {
 					outoutNodes.add(node);
 				} else {
 					// The workflow is incomplete so return without sending
@@ -518,7 +515,7 @@ public class WorkflowInterpreter {
 					throw new WorkFlowInterpreterException("Unable to find output for the node:" + node.getID());
 				}
 				// Some node not yet updated
-				if (NodeController.getGUI(node).getBodyColor() != NodeState.FINISHED.color) {
+				if (node.getState() != NodeExecutionState.FINISHED) {
 					if (this.config.isActOnProvenance()) {
 						try {
 							if (val instanceof String) {
@@ -545,7 +542,7 @@ public class WorkflowInterpreter {
 					} else {
 						((OutputNode) node).setDescription(val.toString());
 					}
-					NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+					node.setState(NodeExecutionState.FINISHED);
 				}
 			}
 
@@ -557,7 +554,7 @@ public class WorkflowInterpreter {
 	}
 
 	private void executeDynamically(final Node node) throws WorkflowException {
-		NodeController.getGUI(node).setBodyColor(NodeState.EXECUTING.color);
+		node.setState(NodeExecutionState.EXECUTING);
 		Component component = node.getComponent();
 		if (component instanceof SubWorkflowComponent) {
 			handleSubWorkComponent(node);
@@ -597,7 +594,7 @@ public class WorkflowInterpreter {
 			AmazonUtil.terminateInstances(instanceId);
 
 			// set color to done
-			NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+			node.setState(NodeExecutionState.FINISHED);
 		} else {
 			throw new WorkFlowInterpreterException("Encountered Node that cannot be executed:" + node);
 		}
@@ -818,7 +815,7 @@ public class WorkflowInterpreter {
 		this.invokerMap.put(node, dynamicInvoker);
 		dynamicInvoker.setup();
 		dynamicInvoker.invoke();
-		NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+		node.setState(NodeExecutionState.FINISHED);
 	}
 
 	private void handleForEach(Node node) throws WorkflowException {
@@ -888,8 +885,8 @@ public class WorkflowInterpreter {
 						// Start reading input came for foreach node
 						int parallelRuns = listOfValues.size() * node1.getOutputPorts().size();
 						if (listOfValues.size() > 0) {
-							NodeController.getGUI(forEachNode).setBodyColor(NodeState.EXECUTING.color);
-							NodeController.getGUI(node1).setBodyColor(NodeState.EXECUTING.color);
+							forEachNode.setState(NodeExecutionState.EXECUTING);
+							node1.setState(NodeExecutionState.EXECUTING);
 							List<DataPort> outputPorts = node1.getOutputPorts();
 							final AtomicInteger counter = new AtomicInteger();
 							for (Node endFor : endForEachNodes) {
@@ -935,9 +932,9 @@ public class WorkflowInterpreter {
 				}
 				// we have finished execution so end foreach is finished
 				// todo this has to be done in a separate thread
-				NodeController.getGUI(endForEachNode).setBodyColor(NodeState.FINISHED.color);
-				NodeController.getGUI(middleNode).setBodyColor(NodeState.FINISHED.color);
-				NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+				endForEachNode.setState(NodeExecutionState.FINISHED);
+				middleNode.setState(NodeExecutionState.FINISHED);
+				node.setState(NodeExecutionState.FINISHED);
 
 			} else {
 
@@ -969,8 +966,8 @@ public class WorkflowInterpreter {
 				int parallelRuns = createInputValues(listOfValues, inputNumbers).size() * outputPorts1.size();
 				if (listOfValues.size() > 0) {
 
-					NodeController.getGUI(forEachNode).setBodyColor(NodeState.EXECUTING.color);
-					NodeController.getGUI(foreachWSNode).setBodyColor(NodeState.EXECUTING.color);
+					forEachNode.setState(NodeExecutionState.EXECUTING);
+					foreachWSNode.setState(NodeExecutionState.EXECUTING);
 					List<DataPort> outputPorts = middleNode.getOutputPorts();
 					final AtomicInteger counter = new AtomicInteger();
 					for (Node endFor : endForEachNodes) {
@@ -1000,9 +997,9 @@ public class WorkflowInterpreter {
 					}
 					// we have finished execution so end foreach is finished
 					// todo this has to be done in a separate thread
-					NodeController.getGUI(middleNode).setBodyColor(NodeState.FINISHED.color);
+					middleNode.setState(NodeExecutionState.FINISHED);
 					for (Node endForEach : endForEachNodes) {
-						NodeController.getGUI(endForEach).setBodyColor(NodeState.FINISHED.color);
+						endForEach.setState(NodeExecutionState.FINISHED);
 					}
 				} else {
 					throw new WorkFlowInterpreterException("No array values found for foreach");
@@ -1053,7 +1050,7 @@ public class WorkflowInterpreter {
 				}
 			}
 
-			NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+			node.setState(NodeExecutionState.FINISHED);
 
 		} catch (XPathExpressionException e) {
 			throw new WorkFlowInterpreterException("Cannot evaluate XPath in If Condition: " + booleanExpression);
@@ -1081,7 +1078,7 @@ public class WorkflowInterpreter {
 
 		this.invokerMap.put(node, invoker);
 
-		NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+		node.setState(NodeExecutionState.FINISHED);
 	}
 
 	private Invoker createInvokerForEachSingleWSNode(Node foreachWSNode, String gfacURLString, WSComponent wsComponent) throws WorkflowException {
@@ -1248,7 +1245,7 @@ public class WorkflowInterpreter {
 			}
 			i++;
 		}
-		NodeController.getGUI(forEachNode).setBodyColor(NodeState.FINISHED.color);
+		forEachNode.setState(NodeExecutionState.FINISHED);
 	}
 
 	private void invokeGFacService(LinkedList<String> listOfValues, Node middleNode, Integer[] inputNumber, String input, Invoker invoker)
@@ -1360,8 +1357,8 @@ public class WorkflowInterpreter {
 		ArrayList<Node> list = new ArrayList<Node>();
 		List<NodeImpl> nodes = this.getGraph().getNodes();
 		for (Node node : nodes) {
-			if (node instanceof OutputNode && NodeController.getGUI(node).getBodyColor().equals(NodeGUI.DEFAULT_BODY_COLOR)
-					&& NodeController.getGUI(node.getInputPort(0).getFromNode()).getBodyColor().equals(NodeState.FINISHED.color)) {
+			if (node instanceof OutputNode && node.getState()==NodeExecutionState.WAITING 
+					&& node.getInputPort(0).getFromNode().getState()== NodeExecutionState.FINISHED) {
 
 				list.add(node);
 			}
@@ -1530,18 +1527,18 @@ public class WorkflowInterpreter {
 	}
 
 	private ArrayList<Node> getFinishedNodesDynamically() {
-		return this.getNodesWithBodyColor(NodeState.FINISHED.color);
+		return this.getNodesWithState(NodeExecutionState.FINISHED);
 	}
 
 	private ArrayList<Node> getWaitingNodesDynamically() {
-		return this.getNodesWithBodyColor(NodeState.DEFAULT.color);
+		return this.getNodesWithState(NodeExecutionState.WAITING);
 	}
 
-	private ArrayList<Node> getNodesWithBodyColor(Color color) {
+	private ArrayList<Node> getNodesWithState(NodeExecutionState state) {
 		ArrayList<Node> list = new ArrayList<Node>();
 		List<NodeImpl> nodes = getGraph().getNodes();
 		for (Node node : nodes) {
-			if (color.equals(NodeController.getGUI(node).getBodyColor())) {
+			if (state==node.getState()) {
 				list.add(node);
 			}
 		}

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpretorEventListener.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpretorEventListener.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpretorEventListener.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/interpretor/WorkflowInterpretorEventListener.java Tue Nov 20 16:06:23 2012
@@ -31,6 +31,7 @@ import org.apache.airavata.workflow.mode
 import org.apache.airavata.workflow.model.graph.Edge;
 import org.apache.airavata.workflow.model.graph.Graph;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.Port;
 import org.apache.airavata.workflow.model.graph.impl.NodeImpl;
 import org.apache.airavata.workflow.model.graph.system.InputNode;
@@ -51,8 +52,6 @@ import org.apache.airavata.xbaya.XBayaCo
 import org.apache.airavata.xbaya.graph.controller.NodeController;
 import org.apache.airavata.xbaya.provenance.WorkflowNodeStatusUpdater;
 import org.apache.airavata.xbaya.provenance.WorkflowStatusUpdater;
-import org.apache.airavata.xbaya.ui.graph.NodeGUI;
-import org.apache.airavata.xbaya.ui.monitor.MonitorEventHandler.NodeState;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.addressing.EndpointReference;
 import org.slf4j.Logger;
@@ -296,19 +295,19 @@ public class WorkflowInterpretorEventLis
     }
 
     private void executeNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeState.EXECUTING.color);
+        node.setState(NodeExecutionState.EXECUTING);
     }
 
     private void finishNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+        node.setState(NodeExecutionState.FINISHED);
     }
 
     private void failNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeState.FAILED.color);
+        node.setState(NodeExecutionState.FAILED);
     }
 
     private void resetNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeGUI.DEFAULT_BODY_COLOR);
+        node.setState(NodeExecutionState.WAITING);
         NodeController.getGUI(node).resetTokens();
     }
 

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/jython/lib/StandaloneServiceNotificationSender.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/jython/lib/StandaloneServiceNotificationSender.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/jython/lib/StandaloneServiceNotificationSender.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/jython/lib/StandaloneServiceNotificationSender.java Tue Nov 20 16:06:23 2012
@@ -23,11 +23,10 @@ package org.apache.airavata.xbaya.jython
 
 import java.net.URI;
 
+import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.wf.Workflow;
 import org.apache.airavata.xbaya.XBayaConstants;
-import org.apache.airavata.xbaya.graph.controller.NodeController;
-import org.apache.airavata.xbaya.ui.graph.NodeGUI;
-import org.apache.airavata.xbaya.ui.monitor.MonitorEventHandler.NodeState;
 import org.apache.axis2.addressing.EndpointReference;
 
 import xsul.wsif.WSIFMessage;
@@ -62,35 +61,35 @@ public class StandaloneServiceNotificati
 
     @Override
     public void invokingService(WSIFMessage inputs) {
-        getNodeGUI().setBodyColor(NodeState.EXECUTING.color);
+        getNode().setState(NodeExecutionState.EXECUTING);
     }
 
     @Override
     public void serviceFinished(WSIFMessage outputs) {
-    	getNodeGUI().setBodyColor(NodeState.FINISHED.color);
+    	getNode().setState(NodeExecutionState.FINISHED);
 
     }
 
     @Override
     public void invocationFailed(String message, Throwable e) {
-    	getNodeGUI().setBodyColor(NodeState.FAILED.color);
+    	getNode().setState(NodeExecutionState.FAILED);
 
     }
 
     @Override
     public void receivedFault(String message) {
-    	getNodeGUI().setBodyColor(NodeState.FAILED.color);
+    	getNode().setState(NodeExecutionState.FAILED);
 
     }
 
     @Override
     public void receivedFault(WSIFMessage fault) {
-    	getNodeGUI().setBodyColor(NodeState.FAILED.color);
+    	getNode().setState(NodeExecutionState.FAILED);
 
     }
 
-	private NodeGUI getNodeGUI() {
-		return NodeController.getGUI(this.workflow.getGraph().getNode(this.serviceID));
+	private Node getNode() {
+		return this.workflow.getGraph().getNode(this.serviceID);
 	}
 
 }

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/test/WorkflowModificationTestCase.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/test/WorkflowModificationTestCase.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/test/WorkflowModificationTestCase.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/test/WorkflowModificationTestCase.java Tue Nov 20 16:06:23 2012
@@ -40,6 +40,7 @@ import org.apache.airavata.workflow.mode
 import org.apache.airavata.workflow.model.gpel.DSCUtil;
 import org.apache.airavata.workflow.model.graph.GraphException;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.impl.NodeImpl;
 import org.apache.airavata.workflow.model.graph.ws.WSGraph;
 import org.apache.airavata.workflow.model.wf.Workflow;
@@ -60,13 +61,11 @@ import org.apache.airavata.ws.monitor.ev
 import org.apache.airavata.xbaya.XBayaConstants;
 import org.apache.airavata.xbaya.XBayaEngine;
 import org.apache.airavata.xbaya.file.XBayaPathConstants;
-import org.apache.airavata.xbaya.graph.controller.NodeController;
 import org.apache.airavata.xbaya.modifier.WorkflowModifier;
 import org.apache.airavata.xbaya.test.service.adder.Adder;
 import org.apache.airavata.xbaya.test.service.multiplier.Multiplier;
 import org.apache.airavata.xbaya.test.util.WorkflowCreator;
 import org.apache.airavata.xbaya.ui.graph.GraphCanvas;
-import org.apache.airavata.xbaya.ui.monitor.MonitorEventHandler.NodeState;
 import org.apache.xmlbeans.XmlObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -202,9 +201,9 @@ public class WorkflowModificationTestCas
         sendNotification(adderWSDL, adder1ID, "add", inputMap1, outputMap1, notifier);
         // These are needed because without GUI, the nodes' color won't be
         // changed.
-        NodeController.getGUI(a).setBodyColor(NodeState.FINISHED.color);
-        NodeController.getGUI(b).setBodyColor(NodeState.FINISHED.color);
-        NodeController.getGUI(adder).setBodyColor(NodeState.FINISHED.color);
+        a.setState(NodeExecutionState.FINISHED);
+        b.setState(NodeExecutionState.FINISHED);
+        adder.setState(NodeExecutionState.FINISHED);
         repaintAndWait(3);
 
         HashMap<String, String> inputMap2 = new HashMap<String, String>();
@@ -214,9 +213,9 @@ public class WorkflowModificationTestCas
         outputMap2.put("z", "9");
         sendNotification(adderWSDL, adder2ID, "add", inputMap2, outputMap2, notifier);
 
-        NodeController.getGUI(c).setBodyColor(NodeState.FINISHED.color);
-        NodeController.getGUI(d).setBodyColor(NodeState.FINISHED.color);
-        NodeController.getGUI(adder2).setBodyColor(NodeState.FINISHED.color);
+        c.setState(NodeExecutionState.FINISHED);
+        d.setState(NodeExecutionState.FINISHED);
+        adder2.setState(NodeExecutionState.FINISHED);
         repaintAndWait(3);
     }
 

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/dialogs/graph/system/DifferedInputConfigurationDialog.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/dialogs/graph/system/DifferedInputConfigurationDialog.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/dialogs/graph/system/DifferedInputConfigurationDialog.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/dialogs/graph/system/DifferedInputConfigurationDialog.java Tue Nov 20 16:06:23 2012
@@ -30,13 +30,13 @@ import javax.xml.namespace.QName;
 
 import org.apache.airavata.common.utils.WSConstants;
 import org.apache.airavata.common.utils.XMLUtil;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.system.DifferedInputNode;
 import org.apache.airavata.xbaya.graph.controller.NodeController;
 import org.apache.airavata.xbaya.lead.LEADTypes;
 import org.apache.airavata.xbaya.ui.XBayaGUI;
 import org.apache.airavata.xbaya.ui.dialogs.XBayaDialog;
 import org.apache.airavata.xbaya.ui.graph.system.DifferedInputNodeGUI;
-import org.apache.airavata.xbaya.ui.monitor.MonitorEventHandler.NodeState;
 import org.apache.airavata.xbaya.ui.widgets.GridPanel;
 import org.apache.airavata.xbaya.ui.widgets.XBayaLabel;
 import org.apache.airavata.xbaya.ui.widgets.XBayaTextArea;
@@ -198,7 +198,7 @@ public class DifferedInputConfigurationD
         this.node.setDescription(description);
         this.node.setDefaultValue(value);
         this.node.setMetadata(metadata);
-        NodeController.getGUI(this.node).setBodyColor(NodeState.FINISHED.color);
+        this.node.setState(NodeExecutionState.FINISHED);
         
         hide();
         this.xbayaGUI.getGraphCanvas().repaint();

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/GraphCanvas.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/GraphCanvas.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/GraphCanvas.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/GraphCanvas.java Tue Nov 20 16:06:23 2012
@@ -69,6 +69,7 @@ import org.apache.airavata.workflow.mode
 import org.apache.airavata.workflow.model.graph.GraphException;
 import org.apache.airavata.workflow.model.graph.GraphPiece;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.Port;
 import org.apache.airavata.workflow.model.graph.Port.Kind;
 import org.apache.airavata.workflow.model.graph.dynamic.DynamicNode;
@@ -1256,7 +1257,7 @@ public class GraphCanvas implements XBay
                 for (DataPort dataPort : outputPorts) {
                     exploreNodes.addAll(dataPort.getToNodes());
                 }
-                NodeController.getGUI(node).setBodyColor(NodeGUI.DEFAULT_BODY_COLOR);
+                node.setState(NodeExecutionState.WAITING);
 
                 exploreNodes.remove(0);
             }

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/NodeGUI.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/NodeGUI.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/NodeGUI.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/graph/NodeGUI.java Tue Nov 20 16:06:23 2012
@@ -22,7 +22,6 @@
 package org.apache.airavata.xbaya.ui.graph;
 
 import java.awt.AlphaComposite;
-import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Composite;
 import java.awt.Dimension;
@@ -43,13 +42,15 @@ import java.util.List;
 
 import org.apache.airavata.workflow.model.graph.DataPort;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeObserver;
+import org.apache.airavata.workflow.model.graph.Node.NodeUpdateType;
 import org.apache.airavata.workflow.model.graph.Port;
 import org.apache.airavata.xbaya.XBayaEngine;
 import org.apache.airavata.xbaya.graph.controller.NodeController;
 import org.apache.airavata.xbaya.ui.monitor.MonitorEventHandler.NodeState;
 import org.apache.airavata.xbaya.ui.utils.DrawUtils;
 
-public abstract class NodeGUI implements GraphPieceGUI {
+public abstract class NodeGUI implements GraphPieceGUI, NodeObserver {
 
     /**
      * BREAK_POINT_BORDER_COLOR
@@ -117,6 +118,7 @@ public abstract class NodeGUI implements
         // The followings are just to make sure that it has some size.
         this.dimension = new Dimension(MINIMUM_WIDTH, MINIMUM_HEIGHT);
         this.paintables = new LinkedList<Paintable>();
+        node.registerObserver(this);
     }
 
     /**
@@ -506,4 +508,28 @@ public abstract class NodeGUI implements
     	return Color.white;
     }
     
+    @Override
+    public void nodeUpdated(NodeUpdateType type) {
+    	switch(type){
+    	case STATE_CHANGED:
+    		updateNodeColor();
+    		break;
+		default:
+			break;
+    	}
+    	
+    }
+
+	private void updateNodeColor() {
+		switch(node.getState()){
+		case WAITING:
+			setBodyColor(NodeState.DEFAULT.color); break;
+		case EXECUTING:
+			setBodyColor(NodeState.EXECUTING.color); break;
+		case FAILED:
+			setBodyColor(NodeState.FAILED.color); break;
+		case FINISHED:
+			setBodyColor(NodeState.FINISHED.color); break;
+		}
+	}
 }
\ No newline at end of file

Modified: airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/monitor/MonitorEventHandler.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/monitor/MonitorEventHandler.java?rev=1411717&r1=1411716&r2=1411717&view=diff
==============================================================================
--- airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/monitor/MonitorEventHandler.java (original)
+++ airavata/trunk/modules/xbaya-gui/src/main/java/org/apache/airavata/xbaya/ui/monitor/MonitorEventHandler.java Tue Nov 20 16:06:23 2012
@@ -39,6 +39,7 @@ import org.apache.airavata.workflow.mode
 import org.apache.airavata.workflow.model.graph.Edge;
 import org.apache.airavata.workflow.model.graph.Graph;
 import org.apache.airavata.workflow.model.graph.Node;
+import org.apache.airavata.workflow.model.graph.Node.NodeExecutionState;
 import org.apache.airavata.workflow.model.graph.Port;
 import org.apache.airavata.workflow.model.graph.amazon.InstanceNode;
 import org.apache.airavata.workflow.model.graph.impl.NodeImpl;
@@ -422,7 +423,7 @@ public class MonitorEventHandler impleme
 
     private void nodeStarted(Node node, boolean forward) {
         if (forward) {
-            if (!NodeController.getGUI(node).getBodyColor().equals(NodeState.FINISHED.color)) {
+            if (node.getState()!= NodeExecutionState.FINISHED) {
                 executeNode(node);
                 finishPredecessorNodes(node);
             }
@@ -497,19 +498,19 @@ public class MonitorEventHandler impleme
     }
 
     private void executeNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeState.EXECUTING.color);
+        node.setState(NodeExecutionState.EXECUTING);
     }
 
     private void finishNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeState.FINISHED.color);
+        node.setState(NodeExecutionState.FINISHED);
     }
 
     private void failNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeState.FAILED.color);
+        node.setState(NodeExecutionState.FAILED);
     }
 
     private void resetNode(Node node) {
-        NodeController.getGUI(node).setBodyColor(NodeState.DEFAULT.color);
+        node.setState(NodeExecutionState.WAITING);
         NodeController.getGUI(node).resetTokens();
     }