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();
     }
 


Reply via email to