1
2
3
4
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
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 }