1
2
3
4
5
6 package net.kwfgrid.gwui.taskframework;
7
8 import java.util.*;
9 import javax.swing.Icon;
10
11 import net.kwfgrid.gwui.*;
12 import net.kwfgrid.gwui.workflow.*;
13 import net.kwfgrid.gwui.gui.*;
14 import net.kwfgrid.gwui.util.HashMapOfLists;
15 import net.kwfgrid.gworkflowdl.structure.*;
16 import net.kwfgrid.gworkflowdl.protocol.structure.*;
17
18 import org.glassbox.Theme;
19
20 /***
21 Theme properties:
22 <ul>
23 <li>kwfgrid.InputTaskProducer4WCTRefinementFailed.icon</li>
24 </ul>
25 */
26 public class InputTaskProducer4WCTRefinementFailed implements UserTaskProducer {
27 private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(InputTaskProducer4WCTRefinementFailed.class);
28
29 protected static final String TASK_ICON_KEY = "kwfgrid.InputTaskProducer4WCTRefinementFailed.icon";
30 protected static final Icon TASK_ICON = Theme.getIcon(TASK_ICON_KEY);
31
32 private org.glassbox.executor.Executor _executor;
33 private UAA _uaa;
34 private ProtocolWorkflow _workflow;
35 private Browser _browser;
36 private HashMapOfLists _tasksbytransition;
37
38 public InputTaskProducer4WCTRefinementFailed(org.glassbox.executor.Executor executor, UAA uaa, Browser browser) {
39 _executor = executor;
40 _uaa = uaa;
41 _workflow = null;
42 _browser = browser;
43 _tasksbytransition = new HashMapOfLists();
44 }
45
46
47
48
49
50 protected void setTaskInvalid(InputTask4WCTRefinementFailed task) {
51 _tasksbytransition.getList(task.getTransition()).remove(task);
52 }
53
54 protected void setTaskDone(InputTask4WCTRefinementFailed task) {
55 _tasksbytransition.getList(task.getTransition()).remove(task);
56 }
57
58 protected boolean hasValidTask(Transition t) {
59 return !_tasksbytransition.getList(t).isEmpty();
60 }
61
62 protected List getValidTasks(Transition t) {
63 return _tasksbytransition.getList(t);
64 }
65
66 protected InputTask4WCTRefinementFailed createInputTask4WCTRefinementFailed(ProtocolWorkflow wf, ProtocolTransition t) {
67 logger.debug("Checking Transition "+t.getID());
68
69 boolean enabled = t.isEnabled();
70 boolean wctfailed = false;
71 boolean conflict = false;
72
73 if (enabled) {
74 Property[] props = t.getProperties().getProperties();;
75 for (int i=0; i<props.length; i++) {
76 if (!wctfailed && props[i].getKey().indexOf("wct.refinement.failed")==0) {
77 wctfailed = true;
78 }
79 if (!conflict && props[i].getKey().indexOf("decision")==0) {
80 conflict = true;
81 }
82 if (wctfailed && conflict)
83 break;
84 }
85 if (wctfailed && !conflict) {
86 logger.debug("Transition needs user input.");
87
88 String tit = t.getProperties().get("token.form.title");
89 if (tit == null || "".equals(tit)) tit = t.getDescription();
90
91 if (tit == null || "".equals(tit)) {
92 StringBuffer title = new StringBuffer("Provide input data: ");
93 Edge[] outedges = t.getOutEdges();
94 for (int i=0; i<outedges.length; i++) {
95 Place outputplace = outedges[i].getPlace();
96 String[] owls = outputplace.getOwls();
97 String dataname = null;
98 if (owls != null && owls.length>0) dataname = XMLUtilities.parseName(owls[0]);
99 if (dataname == null) dataname = "unknown";
100 title.append(dataname);
101 if (i<outedges.length-1) title.append(", ");
102 }
103 tit = title.toString();
104 }
105
106 Form form = new HTMLDataInputFormWrapper((net.kwfgrid.gworkflowdl.protocol.client.ClientWorkflow)wf, t, _browser);
107 InputTask4WCTRefinementFailed task = new InputTask4WCTRefinementFailed(this, tit, tit, form, t, _uaa);
108 _tasksbytransition.put(t, task);
109 return task;
110 }
111 }
112
113 return null;
114 }
115
116
117
118
119
120 public UserTask[] newDocument(IRootObject document) {
121 _workflow =(ProtocolWorkflow) document;
122 LinkedList tasks = new LinkedList();
123 Transition[] t = _workflow.getTransitions();
124 for (int i=0; i<t.length; i++) {
125 UserTask task = createInputTask4WCTRefinementFailed(_workflow, (ProtocolTransition)t[i]);
126 if (task != null) tasks.add(task);
127 }
128 return toUserTaskArray(tasks);
129 }
130
131 public UserTask[] objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
132 if (isTransition(namespace, name)) {
133 LinkedList tasks = new LinkedList();
134 Iterator transitions = objects.iterator(); while(transitions.hasNext()) {
135 UserTask task = createInputTask4WCTRefinementFailed(_workflow, (ProtocolTransition)transitions.next());
136 if (task != null) tasks.add(task);
137 }
138 return toUserTaskArray(tasks);
139 } else if (isToken(namespace, name)) {
140
141 Place place = (Place)parent;
142 if (place == null) {
143 logger.error("No place in path of added token.");
144 return null;
145 }
146 Transition[] ts = _workflow.getTransitions();
147 LinkedList tasks = new LinkedList();
148 for (int i=0; i<ts.length; i++) {
149 ProtocolTransition t = (ProtocolTransition)ts[i];
150 if (t.getInEdge(place.getID()) != null) {
151 UserTask task = createInputTask4WCTRefinementFailed(_workflow, t);
152 if (task != null) tasks.add(task);
153 }
154 }
155 return toUserTaskArray(tasks);
156 } else if (isTransitionProperty(parent, namespace, name) &&
157 isWCTRefinementFailedProperty(objects)) {
158 UserTask task = createInputTask4WCTRefinementFailed(_workflow, (ProtocolTransition)parent);
159 if (task != null) return new UserTask[] { task };
160 }
161 return null;
162 }
163
164 public UserTask[] objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
165 if (isTransitionProperty(parent, namespace, name) &&
166 isDecisionProperty(objects)) {
167 UserTask task = createInputTask4WCTRefinementFailed(_workflow, (ProtocolTransition)((ProtocolProperties)parent).getParent());
168 if (task != null) return new UserTask[] { task };
169 }
170 return null;
171 }
172
173 public UserTask[] propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
174 if (isValueOfTransitionProperty(parent, namespace, name) ||
175 isKeyOfTransitionProperty(parent, namespace, name)) {
176 if (isDecisionProperty(parent) ||
177 isWCTRefinementFailedProperty(parent)) {
178 UserTask task = createInputTask4WCTRefinementFailed(_workflow,
179 (ProtocolTransition)((ProtocolProperties)((ProtocolProperty)parent).getParent()).getParent());
180
181 if (task != null) return new UserTask[] { task };
182 }
183 }
184 return null;
185 }
186
187 protected boolean isTransition(String namespace, String name) {
188 return (ProtocolTransition.NAME.equals(name) &&
189 XMLUtilities.equalNamespace(ProtocolTransition.NAMESPACE, namespace));
190 }
191
192 protected boolean isToken(String namespace, String name) {
193 return (ProtocolToken.NAME.equals(name) &&
194 XMLUtilities.equalNamespace(ProtocolToken.NAMESPACE, namespace));
195 }
196
197 protected boolean isTransitionProperty(IStructureObject parent, String namespace, String name) {
198 if (ProtocolProperty.NAME.equals(name) &&
199 XMLUtilities.equalNamespace(ProtocolProperty.NAMESPACE, namespace)) {
200 if (parent instanceof ProtocolProperties) {
201 Object pp = ((ProtocolProperties)parent).getParent();
202 return (pp instanceof Transition);
203 }
204 }
205 return false;
206 }
207
208 protected boolean isValueOfTransitionProperty(IStructureObject parent, String namespace, String name) {
209 if (ProtocolProperty.NAME.equals(name) &&
210 XMLUtilities.equalNamespace(ProtocolProperty.NAMESPACE, namespace)) {
211 if (parent instanceof ProtocolProperty) {
212 ProtocolProperties pp = (ProtocolProperties)((ProtocolProperty)parent).getParent();
213 Object ppp = pp.getParent();
214 return (ppp instanceof Transition);
215 }
216 }
217 return false;
218 }
219
220 protected boolean isKeyOfTransitionProperty(IStructureObject parent, String namespace, String name) {
221 if (ProtocolProperty.NAME_KEY.equals(name) &&
222 XMLUtilities.equalNamespace(ProtocolProperty.NAMESPACE_PROPERTIES, namespace)) {
223 if (parent instanceof ProtocolProperty) {
224 ProtocolProperties pp = (ProtocolProperties)((ProtocolProperty)parent).getParent();
225 Object ppp = pp.getParent();
226 return (ppp instanceof Transition);
227 }
228 }
229 return false;
230 }
231
232 protected boolean isDecisionProperty(Object value) {
233 return ((Property)value).getKey().indexOf("decision")==0;
234 }
235
236 protected boolean isWCTRefinementFailedProperty(Object value) {
237 return ((Property)value).getKey().indexOf("wct.refinement.failed")==0;
238 }
239
240 protected boolean isDecisionProperty(List objects) {
241 Iterator i = objects.iterator(); while (i.hasNext()) {
242 if (isDecisionProperty(i.next())) return true;
243 }
244 return false;
245 }
246
247 protected boolean isWCTRefinementFailedProperty(List objects) {
248 Iterator i = objects.iterator(); while (i.hasNext()) {
249 if (isWCTRefinementFailedProperty(i.next())) return true;
250 }
251 return false;
252 }
253
254 protected UserTask[] toUserTaskArray(Collection tasks) {
255 return tasks.size()==0?null:(UserTask[])tasks.toArray(new UserTask[tasks.size()]);
256 }
257 }
258