]> 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/NewLauncherApplet.js
Unused
[gpl/argeo-slc.git] / org.argeo.slc.webapp / src / main / webapp / argeo-ria-lib / slc / class / org / argeo / slc / ria / NewLauncherApplet.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.NewLauncherApplet",
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 viewSelection : {
28 nullable:false,
29 check:"org.argeo.ria.components.ViewSelection"
30 },
31 instanceId : {init:""},
32 instanceLabel : {init:""},
33 /**
34 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
35 */
36 commands : {
37 init : {
38 "submitform" : {
39 label : "Execute",
40 icon : "resource/slc/media-playback-start.png",
41 shortcut : "Control+e",
42 enabled : true,
43 menu : "Launcher",
44 toolbar : "launcher",
45 callback : function(e){
46 this.submitForm();
47 },
48 command : null
49 },
50 "reloadagents" : {
51 label : "Reload Agents",
52 icon : "resource/slc/view-refresh.png",
53 shortcut : "Control+r",
54 enabled : true,
55 menu : "Launcher",
56 toolbar : "launcher",
57 callback : function(e){
58 var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents");
59 req.send();
60 },
61 command : null
62 },
63 "testloadmodules" : {
64 label : "Load Modules",
65 icon : "resource/slc/view-refresh.png",
66 shortcut : "Control+m",
67 enabled : true,
68 menu : "Launcher",
69 toolbar : "launcher",
70 callback : function(e){
71 var req = org.argeo.ria.remote.RequestManager.getInstance().getRequest("stub.xml", "GET", "application/xml");
72 req.addListener("completed", function(response){
73 var executionModule = new org.argeo.slc.ria.module.ExecutionModule();
74 executionModule.setXmlNode(response.getContent());
75 this.debug(executionModule.getName());
76 this.debug(qx.lang.Object.getLength(executionModule.getExecutionFlows()));
77 this.debug(qx.lang.Object.getLength(executionModule.getExecutionSpecs()));
78 }, this);
79 req.send();
80 /*
81 this._amqClient.sendMessage("modulesManager.request", "", {
82 "action":"getExecutionModuleDescriptor",
83 "name" : "org.argeo.slc.demo.basic",
84 "version" : "WHATEVER"
85 });
86 */
87 },
88 command : null
89 }
90 }
91 },
92 /**
93 * A map containing all currently registered agents.
94 */
95 registeredTopics : {
96 init : {},
97 check : "Map",
98 event : "changeRegisteredTopics"
99 }
100 },
101
102 members :
103 {
104 /**
105 * Called at applet creation. Just registers viewPane.
106 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
107 */
108 init : function(viewPane){
109 this.setView(viewPane);
110 this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
111 this._createLayout();
112 //this._createForm();
113 this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
114 this._amqClient.startPolling();
115 },
116
117 /**
118 *
119 */
120 load : function(){
121 this.getView().setViewTitle("Execution Launcher");
122 this.addListener("changeRegisteredTopics", function(event){
123 //this._refreshTopicsSubscriptions(event);
124 this._feedSelector(event);
125 }, this);
126 var reloadHandler = function(message){
127 // Delay reload to be sure the jms was first integrated by the db, then ask the db.
128 qx.event.Timer.once(function(){
129 org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadagents").execute();
130 }, this, 1000);
131 }
132 this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
133 this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
134 reloadHandler();
135
136 this._amqClient.addListener("modulesResponse", "modulesManager.response", function(message){
137 this.info(message);
138 }, this);
139 },
140
141 addScroll : function(){
142 return false;
143 },
144
145 close : function(){
146 this._amqClient.removeListener("agentregister", "topic://agent.register");
147 this._amqClient.removeListener("agentunregister", "topic://agent.unregister");
148 this._amqClient.removeListener("modulesResponse", "topic://modulesManager.response");
149 this.setRegisteredTopics({});
150 this._amqClient.stopPolling();
151 },
152
153 /**
154 * Creates the main applet layout.
155 */
156 _createLayout : function(){
157
158 var splitPane = new qx.ui.splitpane.Pane("vertical");
159 splitPane.setDecorator(null);
160 this.add(splitPane);
161
162 this.formPane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
163 this.scroll = new qx.ui.container.Scroll(this.formPane);
164 this.formPane.setPadding(10);
165
166 this.tree = new qx.ui.tree.Tree();
167 var root = new qx.ui.tree.TreeFolder("All Tests");
168 this.tree.setRoot(root);
169 var module1 = new qx.ui.tree.TreeFolder("Module 1");
170 var module2 = new qx.ui.tree.TreeFolder("Module 2");
171 var module3 = new qx.ui.tree.TreeFolder("Module 3");
172 root.add(module1, module2, module3);
173 root.setOpen(true);
174 for(var i=0;i<100;i++){
175 var file1 = new qx.ui.tree.TreeFile("1-"+i);
176 file1.setHeight(15);
177 file1.setDraggable(true);
178 file1.addListener("dragstart", function(e){
179 e.addType("items");
180 e.addAction("move");
181 });
182 module1.add(file1);
183 var file2 = new qx.ui.tree.TreeFile("2-"+i)
184 module2.add(file2);
185 var file3 = new qx.ui.tree.TreeFile("3-"+i);
186 module3.add(file3);
187 }
188 //tree.add()
189 this.listPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
190 var listToolBar = new qx.ui.toolbar.ToolBar();
191 var toolGroup = new qx.ui.toolbar.Part();
192 listToolBar.add(toolGroup);
193 var execButton = new qx.ui.toolbar.Button("Execute","resource/slc/media-playback-start.png");
194 toolGroup.add(execButton);
195 execButton.addListener("execute", function(e){
196 this.getCommands()["submitform"].command.execute();
197 }, this);
198
199 this.listPane.add(toolGroup, {edge:"north"});
200
201 this.list = new qx.ui.form.List();
202 this.list.setDroppable(true);
203 this.list.addListener("drop", function(e){
204 var label = e.getRelatedTarget().getLabel();
205 var li = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
206 li.add(new qx.ui.basic.Label(label));
207 //var item = new qx.ui.form.ListItem(label);
208 var item = new org.argeo.slc.ria.module.FlowListItem(label,e.getRelatedTarget().getIcon());
209 item.setPaddingTop(1);
210 item.setPaddingBottom(2);
211 this.list.add(item);
212 this.list.select(item);
213 }, this);
214 this.listPane.add(this.list, {edge:"center"});
215
216 splitPane.add(this.tree, 0);
217 splitPane.add(this.listPane, 1);
218 //this.add(this.scroll, {edge:'center'});
219
220 },
221
222 /**
223 * Creates the form.
224 */
225 _createForm : function(){
226 this.fields = {};
227 this.hiddenFields = {};
228 this.freeFields = [];
229
230 var execButtonPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
231 var execButton = new qx.ui.form.Button(
232 "Execute",
233 "resource/slc/media-playback-start-32.png"
234 )
235 execButton.addListener("click", function(){
236 this.submitForm();
237 }, this);
238 execButtonPane.setPadding(10, 80);
239 execButtonPane.add(execButton, {edge:"center"});
240 this.formPane.add(execButtonPane);
241
242 this.agentSelector = new qx.ui.form.SelectBox();
243 var serviceManager = org.argeo.ria.remote.RequestManager.getInstance();
244 serviceManager.addListener("reload", function(reloadEvent){
245 if(reloadEvent.getDataType()!= "agents") return ;
246 var xmlDoc = reloadEvent.getContent();
247 var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
248 var newTopics = {};
249 for(var i=0;i<nodes.length;i++){
250 var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
251 var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
252 newTopics[uuid] = host+" ("+uuid+")";
253 }
254 this.setRegisteredTopics(newTopics);
255 }, this);
256
257 var commonForm = {pane:this.formPane};
258 this._addFormHeader(commonForm, this.COMMON_FORM_HEADER_LABEL);
259 this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_AGENT_LABEL), this.agentSelector);
260 this._createFormVariableParts();
261 if(!this.parts) return;
262 if(qx.lang.Object.getLength(this.parts) > 1){
263 // Add chooser
264 this.partChooser = new qx.ui.form.SelectBox();
265 for(var key in this.parts){
266 this.partChooser.add(new qx.ui.form.ListItem(this.parts[key].label, null, key));
267 }
268 this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_FORM_PART_LABEL), this.partChooser);
269 this.partChooser.addListener("changeValue", function(ev){
270 this._showSelectedPart(ev.getData());
271 }, this);
272 }
273 this._showSelectedPart(qx.lang.Object.getKeys(this.parts)[0]);
274 },
275
276 /**
277 * Show a form part given its id.
278 * @param partId {String} The part id
279 */
280 _showSelectedPart : function(partId){
281 if(!this.parts) return;
282 if(!this.partsContainer){
283 this.partsContainer = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
284 this.formPane.add(this.partsContainer);
285 }
286 for(var i in this.parts){
287 var formObject = this.parts[i];
288 if(!formObject.added){
289 this.partsContainer.add(formObject.pane, {top:0, left:0});
290 formObject.added = true;
291 }
292 formObject.pane.hide();
293 }
294 if(this.parts[partId]){
295 this.parts[partId].pane.show();
296 }
297 },
298
299 /**
300 * Init a form part : creates a pane, a set of fields, etc.
301 * @param formId {String} A unique ID
302 * @param label {String} A label
303 * @return {Map} The form part.
304 */
305 _initFormPart : function(formId, label){
306 if(!this.parts) this.parts = {};
307 var formObject = {};
308 formObject.hiddenFields = {};
309 formObject.freeFields = [];
310 formObject.fields = {};
311 formObject.id = formId;
312 formObject.label = label;
313 this.parts[formId] = formObject;
314 formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
315 return formObject;
316 },
317
318 /**
319 * To be overriden by this class children.
320 */
321 _createFormVariableParts : function(){
322 var standard = this._initFormPart("standard", "Canonical");
323 this._createStandardForm(standard);
324 var simple = this._initFormPart("simple", "SLC Sample");
325 this._createSimpleForm(simple);
326 },
327
328 /**
329 * Creates a form for SLC demo
330 * @param formObject {Map} The form part
331 */
332 _createSimpleForm : function(formObject){
333
334 this._addFormInputText(formObject, "ant.file", "File", "Category1/SubCategory2/build.xml");
335 var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
336 moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
337 moreButton.setCursor("pointer");
338 moreButton.addListener("click", function(){
339 this._addFormInputText(formObject);
340 }, this);
341 this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
342 this._addFormInputText(formObject);
343 this._addFormInputText(formObject);
344
345 },
346
347 /**
348 * Create a canonical form.
349 * @param formObject {Map} The form part
350 */
351 _createStandardForm : function(formObject){
352
353 this._addFormHeader(formObject, "Set Execution Parameters");
354 this._addFormInputText(formObject, "status", "Status", "STARTED");
355 this._addFormInputText(formObject, "host", "Host", "localhost");
356 this._addFormInputText(formObject, "user", "User", "user");
357
358 var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
359 moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
360 moreButton.setCursor("pointer");
361 moreButton.addListener("click", function(){
362 this._addFormInputText(formObject);
363 }, this);
364 this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
365 this._addFormInputText(formObject);
366 this._addFormInputText(formObject);
367 },
368
369 /**
370 * Add an hidden field to the form
371 * @param formObject {Map} The form part
372 * @param fieldName {String} Name
373 * @param fieldValue {String} Value
374 */
375 _addFormHiddenField : function(formObject, fieldName, fieldValue){
376 formObject.hiddenFields[fieldName] = fieldValue;
377 },
378
379 /**
380 * Creates a simple label/input form entry.
381 * @param formObject {Map} The form part
382 * @param fieldName {String} Name
383 * @param fieldLabel {String} Label of the field
384 * @param defaultValue {String} The default value
385 * @param choiceValues {Map} An map of values
386 */
387 _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, choiceValues){
388 var labelElement;
389 if(choiceValues){
390 var fieldElement = new qx.ui.form.SelectBox();
391 for(var key in choiceValues){
392 fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key));
393 }
394 }else{
395 var fieldElement = new qx.ui.form.TextField();
396 }
397 if(defaultValue){
398 fieldElement.setValue(defaultValue);
399 }
400 if(fieldName && fieldLabel){
401 labelElement = new qx.ui.basic.Label(fieldLabel);
402 formObject.fields[fieldName] = fieldElement;
403 }else{
404 labelElement = new qx.ui.form.TextField();
405 formObject.freeFields.push({
406 labelEl:labelElement,
407 valueEl:fieldElement
408 });
409 }
410 this._addFormEntry(formObject, labelElement, fieldElement);
411 },
412
413 /**
414 * Add an header
415 * @param formObject {Map} The form part
416 * @param content {Mixed} Content to add.
417 * @param additionnalButton {Mixed} Any widget to add on the east.
418 */
419 _addFormHeader : function(formObject, content, additionnalButton){
420 var header = new qx.ui.basic.Label('<b>'+content+'</b>');
421 header.setRich(true);
422 if(!additionnalButton){
423 header.setPaddingTop(10);
424 formObject.pane.add(header);
425 }else{
426 var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
427 pane.setPaddingTop(10);
428 pane.setPaddingRight(10);
429 pane.add(header, {edge:'center'});
430 pane.add(additionnalButton, {edge:'east'});
431 formObject.pane.add(pane);
432 }
433 },
434
435 /**
436 * Adds a label/input like entry in the form.
437 * @param formObject {Map} The form part
438 * @param labelElement {Object} Either a label or an input
439 * @param fieldElement {Object} Any form input.
440 */
441 _addFormEntry : function(formObject, labelElement, fieldElement){
442 var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
443 labelElement.setWidth(100);
444 labelElement.setTextAlign("right");
445 entryPane.add(labelElement);
446 entryPane.add(new qx.ui.basic.Label(':'));
447 fieldElement.setWidth(150);
448 entryPane.add(fieldElement);
449 formObject.pane.add(entryPane);
450 },
451
452 /*
453 _refreshTopicsSubscriptions : function(changeTopicsEvent){
454 var oldTopics = changeTopicsEvent.getOldData() || {};
455 var newTopics = changeTopicsEvent.getData();
456 var removed = [];
457 var added = [];
458 for(var key in oldTopics){
459 if(!newTopics[key]) {
460 //this._removeAmqListener(key);
461 }
462 }
463 for(var key in newTopics){
464 if(!oldTopics[key]) {
465 //this._addAmqListener(key);
466 }
467 }
468 },
469 */
470
471 /**
472 * Refresh the selector when the topics are updated.
473 * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event.
474 */
475 _feedSelector : function(changeTopicsEvent){
476 var topics = changeTopicsEvent.getData();
477 this.agentSelector.removeAll();
478 var emptyItem = new qx.ui.form.ListItem("", null, "");
479 this.agentSelector.add(emptyItem);
480 this.agentSelector.setSelected(emptyItem);
481 for(var key in topics){
482 var listItem = new qx.ui.form.ListItem(topics[key], null, key);
483 this.agentSelector.add(listItem);
484 }
485 },
486
487 /*
488 _addAmqListener: function(uuid){
489 this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){
490 var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution");
491 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
492 slcExec.fromXml(message);
493 this.logModel.addRows([
494 [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()]
495 ]);
496 }, this);
497 },
498
499 _removeAmqListener : function(uuid){
500 this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution");
501 },
502 */
503
504 /**
505 * Make an SlcExecutionMessage from the currently displayed form.
506 * @param crtPartId {String} The form part currently displayed
507 * @param slcExec {org.argeo.slc.ria.SlcExecutionMessage} The message to fill.
508 * @param fields {Map} The fields of the form
509 * @param hiddenFields {Map} The hidden ones
510 * @param freeFields {Array} The free fields.
511 */
512 _prepareSlcExecutionMessage : function(crtPartId, slcExec, fields, hiddenFields, freeFields){
513 if(crtPartId == "standard"){
514 slcExec.setStatus(fields.status.getValue());
515 slcExec.setHost(fields.host.getValue());
516 slcExec.setUser(fields.user.getValue());
517 }else{
518 slcExec.addAttribute("ant.file", fields["ant.file"].getValue());
519 }
520 for(var i=0;i<freeFields.length;i++){
521 var fF = freeFields[i];
522 if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
523 slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
524 }
525 }
526 },
527
528 /**
529 * Called when the user clicks the "Execute" button.
530 */
531 submitForm : function(){
532 var currentUuid = this.agentSelector.getValue();
533 if(!currentUuid) return;
534 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage();
535
536 var fields = {};
537 var hiddenFields = {};
538 var freeFields = {};
539 var crtPartId = "";
540 if(this.parts){
541 if(this.partChooser){
542 crtPartId = this.partChooser.getValue();
543 }else{
544 crtPartId = qx.lang.Object.getKeys(this.parts)[0];
545 }
546 var crtPart = this.parts[crtPartId];
547 fields = crtPart.fields;
548 hiddenFields = crtPart.hiddenFields;
549 freeFields = crtPart.freeFields;
550 }
551
552 this._prepareSlcExecutionMessage(crtPartId, slcExec, fields, hiddenFields, freeFields);
553
554 this._amqClient.sendMessage(
555 "topic://agent.newExecution",
556 slcExec.toXml(),
557 {"slc-agentId":currentUuid}
558 );
559 // Force logs refresh right now!
560 qx.event.Timer.once(function(){
561 var command = org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadlogs");
562 if(command){
563 command.execute();
564 }
565 }, this, 2000);
566 }
567
568 }
569 });