View Javadoc

1   /*
2    * Copyright (c) 2005, The K-Wf Grid Consortium
3    * Fraunhofer Institute for Computer Architecture and Software Technology
4    * See http://www.kwfgrid.eu and http://www.first.fraunhofer.de for more details.
5    */
6   package net.kwfgrid.gwui;
7   
8   import net.kwfgrid.gwui.workflow.XMLUtilities;
9   import net.kwfgrid.gworkflowdl.structure.*;
10  import net.kwfgrid.gworkflowdl.protocol.structure.*;
11  
12  import java.util.List;
13  
14  import org.glassbox.gui.*;
15  
16  import org.apache.log4j.Logger;
17  
18  /***
19     Widget that monitors the status of a workflow and publishes status changes to it's <code>WorkflowGroup</code>
20     by setting the value of the workflow-status property.
21     This widget must be member of a <code>WorkflowGroup</code>.
22   */
23  public class WorkflowStatusMonitor extends AbstractMember implements IStructureListener {
24      public static final String IDENTIFIER = "net.kwfgrid.gwui.WorkflowStatusMonitor";
25  
26      private static final Logger logger = Logger.getLogger(WorkflowStatusMonitor.class);
27  
28      private ProtocolWorkflow _workflow;
29  
30      public WorkflowStatusMonitor() {
31  	_workflow = null;
32      }
33  
34      public String getIdentifier() {
35  	return IDENTIFIER;
36      }
37      
38      /***
39         Checks if a workflow documente is already instantiated in the application.       
40       */
41      public void setGroup(Group g) throws IllegalArgumentException {
42  	super.setGroup(g);
43  
44  	if (getGroup() != null)
45  	    setActiveWorkflow((ProtocolWorkflow)getGroup().getProperty(WorkflowGroup.ACTIVE_WORKFLOW_DOCUMENT_KEY));
46  	else
47  	    setActiveWorkflow(null);
48      }
49  
50      /***
51         Checks if the workflow document of the application changed 
52         (group-property "ACTIVE_WORKFLOW_DOCUMENT_KEY").
53       */
54      public void groupPropertyChanged(String name, Object oldvalue, Object newvalue) {
55  	logger.debug("groupPropertyChanged("+name+", "+oldvalue+", "+newvalue+")");
56  	
57  	if (WorkflowGroup.ACTIVE_WORKFLOW_DOCUMENT_KEY.equals(name)) {
58  	    setActiveWorkflow((ProtocolWorkflow)newvalue);
59  	}
60  
61  	logger.debug("groupPropertyChanged.exit()");
62      }
63  
64      /***
65         Internally updates the current instance of the workflow document.
66      */
67      protected void setActiveWorkflow(ProtocolWorkflow doc) {
68  	logger.debug("setActiveWorkflow("+doc+")");
69  
70  	if (_workflow != null)
71  	    _workflow.removeStructureListener(this);
72  	
73  	_workflow = doc;
74  	
75  	if (_workflow != null) {
76  	    fireToGroup(getStatus(_workflow));
77  	    _workflow.addStructureListener(this);
78  	} else {
79  	    fireToGroup(XMLUtilities.WORKFLOW_STATUS_UNDEFINED);
80  	}
81  
82  	logger.debug("setActiveWorkflow() exited.");
83      }
84  
85      protected void fireToGroup(String status) {
86  	if (status.equals(XMLUtilities.WORKFLOW_STATUS_UNDEFINED)) {
87  	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_UNDEFINED);
88  	} else if (status.equals(XMLUtilities.WORKFLOW_STATUS_INITIATED)) {
89  	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_INITIATED);
90  	} else if (status.equals(XMLUtilities.WORKFLOW_STATUS_RUNNING)) {
91  	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_RUNNING);
92  	} else if (status.equals(XMLUtilities.WORKFLOW_STATUS_ACTIVE)) {
93  	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_ACTIVE);
94  	} else if (status.equals(XMLUtilities.WORKFLOW_STATUS_COMPLETED)) {
95  	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_COMPLETED);
96  	} else if (status.equals(XMLUtilities.WORKFLOW_STATUS_TERMINATED)) {
97  	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_TERMINATED);
98  	} else if (status.equals(XMLUtilities.WORKFLOW_STATUS_SUSPENDED)) {
99  	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_SUSPENDED);
100 	} else {
101 	    logger.warn("Got unknown workflow status: "+status+". Setting status to undefined.");
102 	    getGroup().setProperty(WorkflowGroup.WORKFLOW_STATUS_KEY, WorkflowGroup.STATUS_UNDEFINED);
103 	}
104     }
105 
106     ///
107     /// Implementation of IStructureListener
108     /// ....................................................................................................
109 
110     public void objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
111 	logger.debug("Objects added: {"+namespace+"}"+name+" at "+parent);
112 
113 	if (isWorkflowStatusProperty(parent, namespace, name, objects)) {
114 	    fireToGroup(getStatus(_workflow));
115 	} 
116     }
117 
118     public void objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
119 	if (isWorkflowStatusProperty(parent, namespace, name, objects)) {
120 	    fireToGroup(XMLUtilities.WORKFLOW_STATUS_UNDEFINED);
121 	} 
122     }
123 
124     public void propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
125 	if (isWorkflowStatusProperty(parent)) {
126 	    fireToGroup(newvalue==null?XMLUtilities.WORKFLOW_STATUS_UNDEFINED:(String)newvalue);
127 	}
128     }
129 
130     private String getStatus(Workflow wf) {
131 	String p = wf.getProperties().get(XMLUtilities.STATUS);
132 
133 	logger.debug("Got status "+p+" from workflow.");
134 
135 	if (p != null && !"".equals(p)) return p;
136 	else return XMLUtilities.WORKFLOW_STATUS_UNDEFINED;
137     }
138 
139     private boolean isWorkflowStatusProperty(IStructureObject object) {
140 	if (object instanceof Property && XMLUtilities.STATUS.equals(((Property)object).getKey())) {
141 	    IStructureObject owner = ((IChildObject)((IChildObject)object).getParent()).getParent();	    
142 	    if (_workflow == owner) {
143 		return true;
144 	    }
145 	} 
146 	return false;
147     }
148 
149     private boolean isWorkflowStatusProperty(IStructureObject parent, String namespace, String name, List objects) {
150 	if (objects.size() > 0  && 
151 	    ProtocolProperty.NAME.equals(name) && 
152 	    XMLUtilities.equalNamespace(ProtocolProperty.NAMESPACE, namespace)) {
153 	    IStructureObject owner = ((IChildObject)parent).getParent();
154 	    if (_workflow == owner) {
155 		return true;
156 	    }
157 	} else if (objects.size() > 0 &&
158 		   parent == _workflow &&
159 		   ProtocolProperties.NAME.equals(name) &&
160 		   XMLUtilities.equalNamespace(ProtocolProperties.NAMESPACE, namespace)) {
161 	    return true;
162 	}
163 	return false;
164     }
165 }