]> 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
Remove debug instruction and commented code
[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
15 properties :
16 {
17 /**
18 * The viewPane inside which this applet is added.
19 */
20 view : {
21 init : null
22 },
23 viewSelection : {
24 nullable:false,
25 check:"org.argeo.ria.components.ViewSelection"
26 },
27 instanceId : {init:""},
28 instanceLabel : {init:""},
29 autoOpen : {
30 init : true,
31 check : "Boolean"
32 },
33 /**
34 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
35 */
36 commands : {
37 init : {
38 "submitform" : {
39 label : "Execute Batch On...",
40 icon : "resource/slc/media-playback-start.png",
41 shortcut : null,
42 enabled : true,
43 menu : "Launcher",
44 toolbar : null,
45 callback : function(e){},
46 submenu : [],
47 submenuCallback : function(commandId){
48 //alert("Execute Batch on Agent "+commandId);
49 this.executeBatchOnAgent(commandId);
50 },
51 command : null
52 },
53 "addtobatch" : {
54 label : "Add to batch",
55 icon : "resource/slc/list-add.png",
56 shortcut : null,
57 enabled : true,
58 menu : null,
59 toolbar : null,
60 callback : function(e){
61 this._addFlowToBatch();
62 },
63 selectionChange : function(viewId, selection){
64 if(viewId != "form:tree") return;
65 if(!selection || selection.length != 1) return;
66 var item = selection[0];
67 this.setEnabled(false);
68 if(qx.Class.isSubClassOf(qx.Class.getByName(item.classname), qx.ui.tree.TreeFile)){
69 this.setEnabled(true);
70 }
71
72 },
73 command : null
74 },
75 "toggleopenonadd" : {
76 label : "Auto Open",
77 icon : "resource/slc/document-open.png",
78 shortcut : null,
79 enabled : true,
80 toggle : true,
81 toggleInitialState : true,
82 menu : "Launcher",
83 toolbar : "launcher",
84 callback : function(event){
85 var state = event.getTarget().getUserData("slc.command.toggleState");
86 this.setAutoOpen(state);
87 },
88 command : null
89 },
90 "editexecutionspecs" : {
91 label : "Edit Execution Specs",
92 icon : "resource/slc/document-open.png",
93 shortcut : null,
94 enabled : false,
95 menu : "Launcher",
96 toolbar : null,
97 callback : function(e){
98 var sel = this.list.getSortedSelection();
99 var item = sel[0];
100 var specEditor = new org.argeo.slc.ria.execution.SpecEditor(item.getUserData("batchEntrySpec"));
101 specEditor.attachAndShow();
102 },
103 selectionChange : function(viewId, selection){
104 if(viewId != "form:list") return;
105 this.setEnabled(false);
106 if((selection && selection.length == 1)) this.setEnabled(true);
107 },
108 command : null
109 },
110 "removefrombatch" : {
111 label : "Remove from batch",
112 icon : "resource/slc/edit-delete.png",
113 shortcut : null,
114 enabled : false,
115 menu : "Launcher",
116 toolbar : null,
117 callback : function(e){
118 var sel = this.list.getSortedSelection();
119 var modal = new org.argeo.ria.components.Modal("Confirm", null);
120 modal.addConfirm("Are you sure you want to remove<br> the selected test" + (sel.length>1?"s":"") + " from the Batch?");
121 modal.addListener("ok", function(){
122 for(var i=0;i<sel.length;i++){
123 this.list.remove(sel[i]);
124 }
125 }, this);
126 modal.attachAndShow();
127 },
128 selectionChange : function(viewId, selection){
129 if(viewId != "form:list") return;
130 this.setEnabled(false);
131 if((selection && selection.length > 0)) this.setEnabled(true);
132 },
133 command : null
134 },
135 "reloadagents" : {
136 label : "Reload Agents",
137 icon : "resource/slc/view-refresh.png",
138 shortcut : "Control+r",
139 enabled : true,
140 menu : "Launcher",
141 toolbar : "launcher",
142 callback : function(e){
143 var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents");
144 req.send();
145 },
146 command : null
147 },
148 "reloadtree" : {
149 label : "Reload",
150 icon : "resource/slc/view-refresh.png",
151 shortcut : "Control+m",
152 enabled : false,
153 menu : "Launcher",
154 toolbar : "launcher",
155 callback : function(e){
156 var selected = this.tree.getSelectedItem();
157 if(selected.classname == "org.argeo.ria.components.DynamicTreeFolder"){
158 selected.reload();
159 }
160 },
161 selectionChange : function(viewId, selection){
162 if(viewId != "form:tree") return;
163 if(!selection || selection.length != 1) return;
164 var item = selection[0];
165 if(!qx.Class.isSubClassOf(qx.Class.getByName(item.classname), qx.ui.tree.AbstractTreeItem)) return;
166 this.setEnabled(false);
167 if(qx.Class.isSubClassOf(qx.Class.getByName(item.classname), org.argeo.ria.components.DynamicTreeFolder)){
168 this.setEnabled(true);
169 }
170 },
171 command : null
172 }
173 }
174 },
175 /**
176 * A map containing all currently registered agents.
177 */
178 registeredTopics : {
179 init : {},
180 check : "Map",
181 event : "changeRegisteredTopics"
182 }
183 },
184
185 statics : {
186 flowLoader : function(folder){
187 var moduleData = folder.getUserData("moduleData");
188 //var req = org.argeo.ria.remote.RequestManager.getInstance().getRequest("../argeo-ria-src/stub.xml", "GET", "application/xml");
189 var req = org.argeo.slc.ria.SlcApi.getLoadExecutionDescriptorService(moduleData.name, moduleData.version);
190 req.addListener("completed", function(response){
191 var executionModule = new org.argeo.slc.ria.execution.Module();
192 executionModule.setXmlNode(response.getContent());
193 var execFlows = executionModule.getExecutionFlows();
194 for(var key in execFlows){
195 var file = new qx.ui.tree.TreeFile(key);
196 file.setUserData("executionModule", executionModule);
197 file.setUserData("executionFlow", execFlows[key]);
198 folder.add(file);
199 }
200 folder.setLoaded(true);
201 });
202 req.send();
203 },
204
205 modulesLoader : function(folder){
206 var req = org.argeo.slc.ria.SlcApi.getListModulesService();
207 req.addListener("completed", function(response){
208 var descriptors = org.argeo.ria.util.Element.selectNodes(response.getContent(), "slc:object-list/slc:execution-module-descriptor");
209 var mods = {};
210 // STUB
211 /*
212 var mods = {
213 "Module 1":["ver1.1", "ver1.2", "ver1.3"],
214 "Module 2":["ver2.1", "ver2.2", "ver2.3", "ver2.4"],
215 "Module 3":["ver3.1", "ver3.2"]
216 };
217 */
218 for(var i=0;i<descriptors.length; i++){
219 var name = org.argeo.ria.util.Element.getSingleNodeText(descriptors[i], "slc:name");
220 var version = org.argeo.ria.util.Element.getSingleNodeText(descriptors[i], "slc:version");
221 if(!mods[name]) mods[name] = [];
222 mods[name].push(version);
223 }
224 var flowLoader = org.argeo.slc.ria.NewLauncherApplet.flowLoader;
225 for(var key in mods){
226 var moduleFolder = new qx.ui.tree.TreeFolder(key);
227 folder.add(moduleFolder);
228 for(var i=0;i<mods[key].length;i++){
229 var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(
230 mods[key][i],
231 flowLoader,
232 "Loading Flows",
233 folder.getDragData()
234 );
235 moduleFolder.add(versionFolder);
236 versionFolder.setUserData("moduleData", {name:key, version:mods[key][i]});
237 }
238 folder.setLoaded(true);
239 }
240 });
241 req.send();
242 }
243 },
244
245 members :
246 {
247 /**
248 * Called at applet creation. Just registers viewPane.
249 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
250 */
251 init : function(viewPane){
252 this.setView(viewPane);
253 this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
254 this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
255 this._amqClient.uri = "/org.argeo.slc.webapp/amq";
256 this._amqClient.startPolling();
257 },
258
259 /**
260 *
261 */
262 load : function(){
263 this._createLayout();
264 this.getView().setViewTitle("Execution Launcher");
265 org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(reloadEvent){
266 if(reloadEvent.getDataType()!= "agents") return ;
267 var xmlDoc = reloadEvent.getContent();
268 var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
269 var newTopics = {};
270 for(var i=0;i<nodes.length;i++){
271 var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
272 var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
273 newTopics[uuid] = host+" ("+uuid+")";
274 }
275 this.setRegisteredTopics(newTopics);
276 }, this);
277 this.addListener("changeRegisteredTopics", function(event){
278 //this._refreshTopicsSubscriptions(event);
279 this._feedSelector(event);
280 }, this);
281 var reloadHandler = function(message){
282 // Delay reload to be sure the jms was first integrated by the db, then ask the db.
283 qx.event.Timer.once(function(){
284 org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadagents").execute();
285 }, this, 1000);
286 }
287 this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
288 this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
289 reloadHandler();
290
291 this._amqClient.addListener("modulesResponse", "modulesManager.response", function(message){
292 this.info(message);
293 }, this);
294 },
295
296 addScroll : function(){
297 return false;
298 },
299
300 close : function(){
301 this._amqClient.removeListener("agentregister", "topic://agent.register");
302 this._amqClient.removeListener("agentunregister", "topic://agent.unregister");
303 this._amqClient.removeListener("modulesResponse", "topic://modulesManager.response");
304 this.setRegisteredTopics({});
305 this._amqClient.stopPolling();
306 },
307
308 /**
309 * Creates the main applet layout.
310 */
311 _createLayout : function(){
312
313 var splitPane = new qx.ui.splitpane.Pane("vertical");
314 splitPane.setDecorator(null);
315 this.add(splitPane);
316
317 this.formPane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
318 this.scroll = new qx.ui.container.Scroll(this.formPane);
319 this.formPane.setPadding(10);
320
321 this.tree = new qx.ui.tree.Tree();
322 this.tree.setDecorator(null);
323 var dragData = {
324 "file" : {
325 "type" : ["items"],
326 "action":["move"]
327 }
328 };
329
330 var root = new org.argeo.ria.components.DynamicTreeFolder(
331 "All Tests",
332 this.self(arguments).modulesLoader,
333 "Loading Modules",
334 dragData
335 );
336 this.tree.setRoot(root);
337 root.setOpen(true);
338 this.tree.setContextMenu(org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["addtobatch", "reloadtree"]));
339
340 this.tree.addListener("changeSelection", function(e){
341 var viewSelection = this.getViewSelection();
342 viewSelection.setViewId("form:tree");
343 viewSelection.clear();
344 var sel = this.tree.getSortedSelection();
345 for(var i=0;i<sel.length;i++){
346 viewSelection.addNode(sel[i]);
347 }
348 }, this);
349
350 this.listPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
351 var listToolBar = new qx.ui.toolbar.ToolBar();
352 var toolGroup = new qx.ui.toolbar.Part();
353 listToolBar.add(toolGroup);
354
355 var execButton = this.getCommands()["submitform"].command.getToolbarButton();
356 toolGroup.add(execButton);
357
358 listToolBar.addSpacer();
359 listToolBar.setPaddingRight(4);
360 var delButton = this.getCommands()["removefrombatch"].command.getToolbarButton();
361 var formButton = this.getCommands()["editexecutionspecs"].command.getToolbarButton();
362 delButton.setShow("icon");
363 formButton.setShow("icon");
364 listToolBar.add(formButton);
365 listToolBar.add(delButton);
366
367 this.listPane.add(listToolBar, {edge:"north"});
368
369 var indicator = new qx.ui.core.Widget();
370 indicator.setDecorator(new qx.ui.decoration.Single().set({top:[1,"solid","#33508D"]}));
371 indicator.setHeight(0);
372 indicator.setOpacity(0.5);
373 indicator.setZIndex(100);
374 indicator.setLayoutProperties({left:-1000,top:-1000});
375 org.argeo.ria.Application.INSTANCE.getRoot().add(indicator);
376
377
378 this.list = new qx.ui.form.List();
379 this.list.setDecorator(null);
380 this.list.setSelectionMode("multi");
381 this.list.setDroppable(true);
382 this.list.setDraggable(true);
383 this.list.setContextMenu(org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["editexecutionspecs", "removefrombatch"]));
384
385
386 this.list.addListener("dragstart", function(e){
387 e.addType(["items"]);
388 e.addAction(["move"]);
389 },this);
390 this.list.addListener("dragend", function(e){
391 indicator.setDomPosition(-1000,-1000);
392 });
393 this.list.addListener("dragover", function(e){
394 var orig = e.getOriginalTarget();
395 var origCoords = orig.getContainerLocation();
396 indicator.setWidth(orig.getBounds().width);
397 indicator.setDomPosition(origCoords.left, origCoords.bottom);
398 });
399 this.list.addListener("drag", function(e){
400 var orig = e.getOriginalTarget();
401 var origCoords = orig.getContainerLocation();
402 indicator.setWidth(orig.getBounds().width);
403 indicator.setDomPosition(origCoords.left, origCoords.bottom);
404 });
405
406 this.list.addListener("drop", function(e){
407 var target = e.getRelatedTarget();
408 var afterItem = e.getOriginalTarget();
409 indicator.setDomPosition(-1000,-1000);
410 if(afterItem.classname != "qx.ui.form.ListItem") afterItem = null;
411 if(!target){
412 target = this.list.getSortedSelection()[0];
413 }
414 this._addFlowToBatch(target, afterItem);
415 }, this);
416 this.listPane.add(this.list, {edge:"center"});
417
418 this.list.addListener("changeSelection", function(e){
419 var viewSelection = this.getViewSelection();
420 viewSelection.setViewId("form:list");
421 viewSelection.clear();
422 var listSel = this.list.getSortedSelection();
423 for(var i=0;i<listSel.length;i++){
424 viewSelection.addNode(listSel[i]);
425 }
426 }, this);
427
428 splitPane.add(this.tree, 0);
429 splitPane.add(this.listPane, 1);
430 },
431
432 _addFlowToBatch : function(target, after){
433 //this.debug(target);
434 if(!target){
435 target = this.tree.getSelectedItem();
436 if(!target) return;
437 }else if(target.classname == "qx.ui.form.ListItem"){
438 if(!after) return;
439 if(after == "first") this.list.addAt(target, 0);
440 else this.list.addAfter(target, after);
441 return;
442 }
443 var executionModule = target.getUserData("executionModule");
444 var executionFlow = target.getUserData("executionFlow");
445 var batchEntry = new org.argeo.slc.ria.execution.BatchEntrySpec(executionModule, executionFlow);
446 var label = batchEntry.getLabel();
447 var icon = target.getIcon();
448 var item = new qx.ui.form.ListItem(label, icon);
449 item.setUserData("batchEntrySpec", batchEntry);
450 item.setPaddingTop(1);
451 item.setPaddingBottom(2);
452 if(after){
453 if(after == "first") this.list.addAt(item, 0);
454 else this.list.addAfter(item, after);
455 }else{
456 this.list.add(item);
457 }
458 this.list.select(item);
459 if(this.getAutoOpen()){
460 this.getCommands()["editexecutionspecs"].command.execute();
461 }
462 },
463
464 /**
465 * Refresh the selector when the topics are updated.
466 * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event.
467 */
468 _feedSelector : function(changeTopicsEvent){
469 var topics = changeTopicsEvent.getData();
470 var command = this.getCommands()["submitform"].command;
471 command.setEnabled(false);
472 var menu = [];
473 for(var key in topics){
474 var submenu = {"label":topics[key],"icon":"resource/slc/mime-xsl.png", "commandId":key};
475 menu.push(submenu);
476 }
477 // FAKE!!
478 if(!menu.length){
479 menu.push({"label":"Fake Agent", "icon":"resource/slc/mime-xsl.png", "commandId":"fake_agent_uuid"});
480 }
481 command.clearMenus();
482 command.setMenu(menu);
483 if(menu.length) command.setEnabled(true);
484 },
485
486 currentBatchToXml : function(){
487 var selection = this.list.getChildren();
488 var xmlString = "";
489 for(var i=0;i<selection.length;i++){
490 var batchEntrySpec = selection[i].getUserData("batchEntrySpec");
491 xmlString += batchEntrySpec.toXml();
492 }
493 return xmlString;
494 },
495
496 executeBatchOnAgent : function(agentUuid){
497 //var xmlString = agentUuid + this.currentBatchToXml();
498 var xmlString = "<slc:executionSpecs>"+this.currentBatchToXml()+"</slc:executionSpecs>";
499 alert(xmlString);
500 },
501
502 /**
503 * Make an SlcExecutionMessage from the currently displayed form.
504 * @param crtPartId {String} The form part currently displayed
505 * @param slcExec {org.argeo.slc.ria.SlcExecutionMessage} The message to fill.
506 * @param fields {Map} The fields of the form
507 * @param hiddenFields {Map} The hidden ones
508 * @param freeFields {Array} The free fields.
509 */
510 _prepareSlcExecutionMessage : function(crtPartId, slcExec, fields, hiddenFields, freeFields){
511 if(crtPartId == "standard"){
512 slcExec.setStatus(fields.status.getValue());
513 slcExec.setHost(fields.host.getValue());
514 slcExec.setUser(fields.user.getValue());
515 }else{
516 slcExec.addAttribute("ant.file", fields["ant.file"].getValue());
517 }
518 for(var i=0;i<freeFields.length;i++){
519 var fF = freeFields[i];
520 if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
521 slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
522 }
523 }
524 },
525
526 /**
527 * Called when the user clicks the "Execute" button.
528 */
529 submitForm : function(){
530 var currentUuid = this.agentSelector.getValue();
531 if(!currentUuid) return;
532 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage();
533
534 var fields = {};
535 var hiddenFields = {};
536 var freeFields = {};
537 var crtPartId = "";
538 if(this.parts){
539 if(this.partChooser){
540 crtPartId = this.partChooser.getValue();
541 }else{
542 crtPartId = qx.lang.Object.getKeys(this.parts)[0];
543 }
544 var crtPart = this.parts[crtPartId];
545 fields = crtPart.fields;
546 hiddenFields = crtPart.hiddenFields;
547 freeFields = crtPart.freeFields;
548 }
549
550 this._prepareSlcExecutionMessage(crtPartId, slcExec, fields, hiddenFields, freeFields);
551
552 this._amqClient.sendMessage(
553 "topic://agent.newExecution",
554 slcExec.toXml(),
555 {"slc-agentId":currentUuid}
556 );
557 // Force logs refresh right now!
558 qx.event.Timer.once(function(){
559 var command = org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadlogs");
560 if(command){
561 command.execute();
562 }
563 }, this, 2000);
564 }
565
566 }
567 });