]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/LauncherApplet.js
Splitted the LauncherApplet into two different applets. The first one is a generic...
[gpl/argeo-slc.git] / org.argeo.slc.webapp / src / main / webapp / argeo-ria-lib / slc / class / org / argeo / slc / ria / LauncherApplet.js
1 /**
2 * A simple Hello World applet for documentation purpose.
3 * The only associated command is the "Close" command.
4 */
5 qx.Class.define("org.argeo.slc.ria.LauncherApplet",
6 {
7 extend : qx.ui.container.Composite,
8 implement : [org.argeo.ria.components.IView],
9
10 construct : function(){
11 this.base(arguments);
12 this.setLayout(new qx.ui.layout.Dock());
13
14 this.COMMON_FORM_HEADER_LABEL = "Choose Agent";
15 this.CHOOSE_AGENT_LABEL = "Agent Uuid";
16 this.CHOOSE_FORM_PART_LABEL = "Test Type";
17 },
18
19 properties :
20 {
21 /**
22 * The viewPane inside which this applet is added.
23 */
24 view : {
25 init : null
26 },
27 /**
28 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
29 */
30 commands : {
31 init : {
32 "submitform" : {
33 label : "Execute",
34 icon : "resource/slc/media-playback-start.png",
35 shortcut : "Control+e",
36 enabled : true,
37 menu : "Launcher",
38 toolbar : "launcher",
39 callback : function(e){
40 this.submitForm();
41 },
42 command : null
43 },
44 "reloadagents" : {
45 label : "Reload Agents",
46 icon : "resource/slc/view-refresh.png",
47 shortcut : "Control+r",
48 enabled : true,
49 menu : "Launcher",
50 toolbar : "launcher",
51 callback : function(e){
52 var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents");
53 req.send();
54 },
55 command : null
56 }
57 }
58 },
59 registeredTopics : {
60 init : {},
61 check : "Map",
62 event : "changeRegisteredTopics"
63 }
64 },
65
66 members :
67 {
68 /**
69 * Called at applet creation. Just registers viewPane.
70 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
71 */
72 init : function(viewPane){
73 this.setView(viewPane);
74 this._createLayout();
75 this._createForm();
76 this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
77 this._amqClient.startPolling();
78 },
79
80 /**
81 *
82 */
83 load : function(){
84 this.getView().setViewTitle("Execution Launcher");
85 this.addListener("changeRegisteredTopics", function(event){
86 this._refreshTopicsSubscriptions(event);
87 this._feedSelector(event);
88 }, this);
89 var reloadHandler = function(message){
90 // Delay reload to be sure the jms was first integrated by the db, then ask the db.
91 qx.event.Timer.once(function(){
92 org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadagents").execute();
93 }, this, 1000);
94 }
95 this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
96 this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
97 reloadHandler();
98 },
99
100 addScroll : function(){
101 return false;
102 },
103
104 close : function(){
105 this._amqClient.removeListener("agentregister", "topic://agent.register");
106 this._amqClient.removeListener("agentunregister", "topic://agent.unregister");
107
108 this.setRegisteredTopics({});
109 this._amqClient.stopPolling();
110 },
111
112 _createLayout : function(){
113 this.formPane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
114 this.scroll = new qx.ui.container.Scroll(this.formPane);
115 this.formPane.setPadding(10);
116 this.add(this.scroll, {edge:'center'});
117
118 },
119
120 _createForm : function(){
121 this.fields = {};
122 this.hiddenFields = {};
123 this.freeFields = [];
124
125 var execButtonPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
126 var execButton = new qx.ui.form.Button(
127 "Execute",
128 "resource/slc/media-playback-start-32.png"
129 )
130 execButton.addListener("click", function(){
131 this.submitForm();
132 }, this);
133 execButtonPane.setPadding(10, 80);
134 execButtonPane.add(execButton, {edge:"center"});
135 this.formPane.add(execButtonPane);
136
137 this.agentSelector = new qx.ui.form.SelectBox();
138 var serviceManager = org.argeo.ria.remote.RequestManager.getInstance();
139 serviceManager.addListener("reload", function(reloadEvent){
140 if(reloadEvent.getDataType()!= "agents") return ;
141 var xmlDoc = reloadEvent.getContent();
142 var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
143 var newTopics = {};
144 for(var i=0;i<nodes.length;i++){
145 var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
146 var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
147 newTopics[uuid] = host+" ("+uuid+")";
148 }
149 this.setRegisteredTopics(newTopics);
150 }, this);
151
152 var commonForm = {pane:this.formPane};
153 this._addFormHeader(commonForm, this.COMMON_FORM_HEADER_LABEL);
154 this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_AGENT_LABEL), this.agentSelector);
155 this._createFormVariableParts();
156 if(!this.parts) return;
157 if(qx.lang.Object.getLength(this.parts) > 1){
158 // Add chooser
159 this.partChooser = new qx.ui.form.SelectBox();
160 for(var key in this.parts){
161 this.partChooser.add(new qx.ui.form.ListItem(this.parts[key].label, null, key));
162 }
163 this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_FORM_PART_LABEL), this.partChooser);
164 this.partChooser.addListener("changeValue", function(ev){
165 this._showSelectedPart(ev.getData());
166 }, this);
167 }
168 this._showSelectedPart(qx.lang.Object.getKeys(this.parts)[0]);
169 },
170
171 _showSelectedPart : function(partId){
172 if(!this.parts) return;
173 if(!this.partsContainer){
174 this.partsContainer = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
175 this.formPane.add(this.partsContainer);
176 }
177 for(var i in this.parts){
178 var formObject = this.parts[i];
179 if(!formObject.added){
180 this.partsContainer.add(formObject.pane, {top:0, left:0});
181 formObject.added = true;
182 }
183 formObject.pane.hide();
184 }
185 if(this.parts[partId]){
186 this.parts[partId].pane.show();
187 }
188 },
189
190 _initFormPart : function(formId, label){
191 if(!this.parts) this.parts = {};
192 var formObject = {};
193 formObject.hiddenFields = {};
194 formObject.freeFields = [];
195 formObject.fields = {};
196 formObject.id = formId;
197 formObject.label = label;
198 this.parts[formId] = formObject;
199 formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
200 return formObject;
201 },
202
203 _createFormVariableParts : function(){
204 var standard = this._initFormPart("standard", "Canonical");
205 this._createStandardForm(standard);
206 var simple = this._initFormPart("simple", "SLC Sample");
207 this._createSimpleForm(simple);
208 },
209
210 _createSimpleForm : function(formObject){
211
212 this._addFormInputText(formObject, "ant.file", "File", "Category1/SubCategory2/build.xml");
213 var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
214 moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
215 moreButton.setCursor("pointer");
216 moreButton.addListener("click", function(){
217 this._addFormInputText();
218 }, this);
219 this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
220 this._addFormInputText(formObject);
221 this._addFormInputText(formObject);
222
223 },
224
225 _createStandardForm : function(formObject){
226
227 this._addFormHeader(formObject, "Set Execution Parameters");
228 this._addFormInputText(formObject, "status", "Status", "STARTED");
229 this._addFormInputText(formObject, "host", "Host", "localhost");
230 this._addFormInputText(formObject, "user", "User", "user");
231
232 var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
233 moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
234 moreButton.setCursor("pointer");
235 moreButton.addListener("click", function(){
236 this._addFormInputText();
237 }, this);
238 this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
239 this._addFormInputText(formObject);
240 this._addFormInputText(formObject);
241 },
242
243 _addFormHiddenField : function(formObject, fieldName, fieldValue){
244 formObject.hiddenFields[fieldName] = fieldValue;
245 },
246
247 _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, choiceValues){
248 var labelElement;
249 if(choiceValues){
250 var fieldElement = new qx.ui.form.SelectBox();
251 for(var key in choiceValues){
252 fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key));
253 }
254 }else{
255 var fieldElement = new qx.ui.form.TextField();
256 }
257 if(defaultValue){
258 fieldElement.setValue(defaultValue);
259 }
260 if(fieldName && fieldLabel){
261 labelElement = new qx.ui.basic.Label(fieldLabel);
262 formObject.fields[fieldName] = fieldElement;
263 }else{
264 labelElement = new qx.ui.form.TextField();
265 formObject.freeFields.push({
266 labelEl:labelElement,
267 valueEl:fieldElement
268 });
269 }
270 this._addFormEntry(formObject, labelElement, fieldElement);
271 },
272
273 _addFormHeader : function(formObject, content, additionnalButton){
274 var header = new qx.ui.basic.Label('<b>'+content+'</b>');
275 header.setRich(true);
276 if(!additionnalButton){
277 header.setPaddingTop(10);
278 formObject.pane.add(header);
279 }else{
280 var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
281 pane.setPaddingTop(10);
282 pane.setPaddingRight(10);
283 pane.add(header, {edge:'center'});
284 pane.add(additionnalButton, {edge:'east'});
285 formObject.pane.add(pane);
286 }
287 },
288
289 _addFormEntry : function(formObject, labelElement, fieldElement){
290 var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
291 labelElement.setWidth(100);
292 labelElement.setTextAlign("right");
293 entryPane.add(labelElement);
294 entryPane.add(new qx.ui.basic.Label(':'));
295 fieldElement.setWidth(150);
296 entryPane.add(fieldElement);
297 formObject.pane.add(entryPane);
298 },
299
300 _refreshTopicsSubscriptions : function(changeTopicsEvent){
301 var oldTopics = changeTopicsEvent.getOldData() || {};
302 var newTopics = changeTopicsEvent.getData();
303 var removed = [];
304 var added = [];
305 for(var key in oldTopics){
306 if(!newTopics[key]) {
307 //this._removeAmqListener(key);
308 }
309 }
310 for(var key in newTopics){
311 if(!oldTopics[key]) {
312 //this._addAmqListener(key);
313 }
314 }
315 },
316
317 _feedSelector : function(changeTopicsEvent){
318 var topics = changeTopicsEvent.getData();
319 this.agentSelector.removeAll();
320 var emptyItem = new qx.ui.form.ListItem("", null, "");
321 this.agentSelector.add(emptyItem);
322 this.agentSelector.setSelected(emptyItem);
323 for(var key in topics){
324 var listItem = new qx.ui.form.ListItem(topics[key], null, key);
325 this.agentSelector.add(listItem);
326 }
327 },
328
329 _addAmqListener: function(uuid){
330 this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){
331 var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution");
332 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
333 slcExec.fromXml(message);
334 this.logModel.addRows([
335 [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()]
336 ]);
337 }, this);
338 },
339
340 _removeAmqListener : function(uuid){
341 this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution");
342 },
343
344 _prepareSlcExecutionMessage : function(crtPartId, slcExec, fields, hiddenFields, freeFields){
345 if(crtPartId == "standard"){
346 slcExec.setStatus(fields.status.getValue());
347 slcExec.setHost(fields.host.getValue());
348 slcExec.setUser(fields.user.getValue());
349 }else{
350 slcExec.addAttribute("ant.file", fields["ant.file"].getValue());
351 }
352 for(var i=0;i<freeFields.length;i++){
353 var fF = freeFields[i];
354 if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
355 slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
356 }
357 }
358 },
359
360 submitForm : function(){
361 var currentUuid = this.agentSelector.getValue();
362 if(!currentUuid) return;
363 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(currentUuid);
364
365 var fields = {};
366 var hiddenFields = {};
367 var freeFields = {};
368 var crtPartId = "";
369 if(this.parts){
370 if(this.partChooser){
371 crtPartId = this.partChooser.getValue();
372 }else{
373 crtPartId = qx.lang.Object.getKeys(this.parts)[0];
374 }
375 var crtPart = this.parts[crtPartId];
376 fields = crtPart.fields;
377 hiddenFields = crtPart.hiddenFields;
378 freeFields = crtPart.freeFields;
379 }
380
381 this._prepareSlcExecutionMessage(crtPartId, slcExec, fields, hiddenFields, freeFields);
382
383 var destination = "topic://agent."+currentUuid+".newExecution";
384 this._amqClient.sendMessage(destination, slcExec.toXml());
385 // Force logs refresh right now!
386 qx.event.Timer.once(function(){
387 var command = org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadlogs");
388 if(command){
389 command.execute();
390 }
391 }, this, 2000);
392 }
393
394 }
395 });