]>
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
2 * A simple Hello World applet for documentation purpose.
3 * The only associated command is the "Close" command.
5 qx
.Class
.define("org.argeo.slc.ria.NewLauncherApplet",
7 extend
: qx
.ui
.container
.Composite
,
8 implement
: [org
.argeo
.ria
.components
.IView
],
10 construct : function(){
12 this.setLayout(new qx
.ui
.layout
.Dock());
18 * The viewPane inside which this applet is added.
25 check
:"org.argeo.ria.components.ViewSelection"
27 instanceId
: {init
:""},
28 instanceLabel
: {init
:""},
34 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
39 label
: "Execute Batch On...",
40 icon
: "resource/slc/media-playback-start.png",
45 callback : function(e
){},
47 submenuCallback : function(commandId
){
48 //alert("Execute Batch on Agent "+commandId);
49 this.executeBatchOnAgent(commandId
);
54 label
: "Add to batch",
55 icon
: "resource/slc/list-add.png",
60 callback : function(e
){
61 this._addFlowToBatch();
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);
77 icon
: "resource/slc/document-open.png",
81 toggleInitialState
: true,
84 callback : function(event
){
85 var state
= event
.getTarget().getUserData("slc.command.toggleState");
86 this.setAutoOpen(state
);
90 "editexecutionspecs" : {
91 label
: "Edit Execution Specs",
92 icon
: "resource/slc/document-open.png",
97 callback : function(e
){
98 var sel
= this.list
.getSortedSelection();
100 var specEditor
= new org
.argeo
.slc
.ria
.execution
.SpecEditor(item
.getUserData("batchEntrySpec"));
101 specEditor
.attachAndShow();
103 selectionChange : function(viewId
, selection
){
104 if(viewId
!= "form:list") return;
105 this.setEnabled(false);
106 if((selection
&& selection
.length
== 1)) this.setEnabled(true);
110 "removefrombatch" : {
111 label
: "Remove from batch",
112 icon
: "resource/slc/edit-delete.png",
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
]);
126 modal
.attachAndShow();
128 selectionChange : function(viewId
, selection
){
129 if(viewId
!= "form:list") return;
130 this.setEnabled(false);
131 if((selection
&& selection
.length
> 0)) this.setEnabled(true);
136 label
: "Reload Agents",
137 icon
: "resource/slc/view-refresh.png",
138 shortcut
: "Control+r",
141 toolbar
: "launcher",
142 callback : function(e
){
143 var req
= org
.argeo
.slc
.ria
.SlcApi
.getListAgentsService("agents");
150 icon
: "resource/slc/view-refresh.png",
151 shortcut
: "Control+m",
154 toolbar
: "launcher",
155 callback : function(e
){
156 var selected
= this.tree
.getSelectedItem();
157 if(selected
.classname
== "org.argeo.ria.components.DynamicTreeFolder"){
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);
176 * A map containing all currently registered agents.
181 event
: "changeRegisteredTopics"
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
]);
200 folder
.setLoaded(true);
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");
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"]
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
);
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(
235 moduleFolder
.add(versionFolder
);
236 versionFolder
.setUserData("moduleData", {name
:key
, version
:mods
[key
][i
]});
238 folder
.setLoaded(true);
248 * Called at applet creation. Just registers viewPane.
249 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
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();
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");
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
+")";
275 this.setRegisteredTopics(newTopics
);
277 this.addListener("changeRegisteredTopics", function(event
){
278 //this._refreshTopicsSubscriptions(event);
279 this._feedSelector(event
);
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();
287 this._amqClient
.addListener("agentregister", "topic://agent.register", reloadHandler
, this);
288 this._amqClient
.addListener("agentunregister", "topic://agent.unregister", reloadHandler
, this);
291 this._amqClient
.addListener("modulesResponse", "modulesManager.response", function(message
){
296 addScroll : 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();
309 * Creates the main applet layout.
311 _createLayout : function(){
313 var splitPane
= new qx
.ui
.splitpane
.Pane("vertical");
314 splitPane
.setDecorator(null);
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);
321 this.tree
= new qx
.ui
.tree
.Tree();
322 this.tree
.setDecorator(null);
330 var root
= new org
.argeo
.ria
.components
.DynamicTreeFolder(
332 this.self(arguments
).modulesLoader
,
336 this.tree
.setRoot(root
);
338 this.tree
.setContextMenu(org
.argeo
.ria
.event
.CommandsManager
.getInstance().createMenuFromIds(["addtobatch", "reloadtree"]));
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
]);
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
);
355 var execButton
= this.getCommands()["submitform"].command
.getToolbarButton();
356 toolGroup
.add(execButton
);
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
);
367 this.listPane
.add(listToolBar
, {edge
:"north"});
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
);
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"]));
386 this.list
.addListener("dragstart", function(e
){
387 e
.addType(["items"]);
388 e
.addAction(["move"]);
390 this.list
.addListener("dragend", function(e
){
391 indicator
.setDomPosition(-1000,-1000);
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
);
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
);
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;
412 target
= this.list
.getSortedSelection()[0];
414 this._addFlowToBatch(target
, afterItem
);
416 this.listPane
.add(this.list
, {edge
:"center"});
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
]);
428 splitPane
.add(this.tree
, 0);
429 splitPane
.add(this.listPane
, 1);
432 _addFlowToBatch : function(target
, after
){
433 //this.debug(target);
435 target
= this.tree
.getSelectedItem();
437 }else if(target
.classname
== "qx.ui.form.ListItem"){
439 if(after
== "first") this.list
.addAt(target
, 0);
440 else this.list
.addAfter(target
, after
);
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);
453 if(after
== "first") this.list
.addAt(item
, 0);
454 else this.list
.addAfter(item
, after
);
458 this.list
.select(item
);
459 if(this.getAutoOpen()){
460 this.getCommands()["editexecutionspecs"].command
.execute();
465 * Refresh the selector when the topics are updated.
466 * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event.
468 _feedSelector : function(changeTopicsEvent
){
469 var topics
= changeTopicsEvent
.getData();
470 var command
= this.getCommands()["submitform"].command
;
471 command
.setEnabled(false);
473 for(var key
in topics
){
474 var submenu
= {"label":topics
[key
],"icon":"resource/slc/mime-xsl.png", "commandId":key
};
479 menu
.push({"label":"Fake Agent", "icon":"resource/slc/mime-xsl.png", "commandId":"fake_agent_uuid"});
481 command
.clearMenus();
482 command
.setMenu(menu
);
483 if(menu
.length
) command
.setEnabled(true);
486 currentBatchToXml : function(){
487 var selection
= this.list
.getChildren();
489 for(var i
=0;i
<selection
.length
;i
++){
490 var batchEntrySpec
= selection
[i
].getUserData("batchEntrySpec");
491 xmlString
+= batchEntrySpec
.toXml();
496 executeBatchOnAgent : function(agentUuid
){
497 //var xmlString = agentUuid + this.currentBatchToXml();
498 var xmlString
= "<slc:executionSpecs>"+this.currentBatchToXml()+"</slc:executionSpecs>";
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.
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());
516 slcExec
.addAttribute("ant.file", fields
["ant.file"].getValue());
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());
527 * Called when the user clicks the "Execute" button.
529 submitForm : function(){
530 var currentUuid
= this.agentSelector
.getValue();
531 if(!currentUuid
) return;
532 var slcExec
= new org
.argeo
.slc
.ria
.SlcExecutionMessage();
535 var hiddenFields
= {};
539 if(this.partChooser
){
540 crtPartId
= this.partChooser
.getValue();
542 crtPartId
= qx
.lang
.Object
.getKeys(this.parts
)[0];
544 var crtPart
= this.parts
[crtPartId
];
545 fields
= crtPart
.fields
;
546 hiddenFields
= crtPart
.hiddenFields
;
547 freeFields
= crtPart
.freeFields
;
550 this._prepareSlcExecutionMessage(crtPartId
, slcExec
, fields
, hiddenFields
, freeFields
);
552 this._amqClient
.sendMessage(
553 "topic://agent.newExecution",
555 {"slc-agentId":currentUuid
}
557 // Force logs refresh right now!
558 qx
.event
.Timer
.once(function(){
559 var command
= org
.argeo
.ria
.event
.CommandsManager
.getInstance().getCommandById("reloadlogs");