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.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      /// Protected API
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     /// Implementation of UserTaskProducer
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 	    // find the transitions which could be enabled by the new token.
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