]>
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
:""},
30 * A boolean registering whether the SpecEditor must autoOpen or not when a spec is added to the Batch.
37 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
42 label
: "Execute Batch On...",
43 icon
: "resource/slc/media-playback-start.png",
48 callback : function(e
){},
50 submenuCallback : function(commandId
){
51 //alert("Execute Batch on Agent "+commandId);
52 this.executeBatchOnAgent(commandId
);
57 label
: "Add to batch",
58 icon
: "resource/slc/list-add.png",
63 callback : function(e
){
64 this._addFlowToBatch();
66 selectionChange : function(viewId
, selection
){
67 if(viewId
!= "form:tree") return;
68 if(!selection
|| selection
.length
!= 1) return;
69 var item
= selection
[0];
70 this.setEnabled(false);
71 if(qx
.Class
.isSubClassOf(qx
.Class
.getByName(item
.classname
), qx
.ui
.tree
.TreeFile
)){
72 this.setEnabled(true);
80 icon
: "resource/slc/document-open.png",
84 toggleInitialState
: true,
87 callback : function(event
){
88 var state
= event
.getTarget().getUserData("slc.command.toggleState");
89 this.setAutoOpen(state
);
93 "editexecutionspecs" : {
94 label
: "Edit Execution Specs",
95 icon
: "resource/slc/document-open.png",
100 callback : function(e
){
101 var sel
= this.list
.getSortedSelection();
103 var specEditor
= new org
.argeo
.slc
.ria
.execution
.SpecEditor(item
.getUserData("batchEntrySpec"));
104 specEditor
.attachAndShow();
106 selectionChange : function(viewId
, selection
){
107 if(viewId
!= "form:list") return;
108 this.setEnabled(false);
109 if((selection
&& selection
.length
== 1)) this.setEnabled(true);
113 "removefrombatch" : {
114 label
: "Remove from batch",
115 icon
: "resource/slc/edit-delete.png",
120 callback : function(e
){
121 var sel
= this.list
.getSortedSelection();
122 var modal
= new org
.argeo
.ria
.components
.Modal("Confirm", null);
123 modal
.addConfirm("Are you sure you want to remove<br> the selected test" + (sel
.length
>1?"s":"") + " from the Batch?");
124 modal
.addListener("ok", function(){
125 for(var i
=0;i
<sel
.length
;i
++){
126 this.list
.remove(sel
[i
]);
129 modal
.attachAndShow();
131 selectionChange : function(viewId
, selection
){
132 if(viewId
!= "form:list") return;
133 this.setEnabled(false);
134 if((selection
&& selection
.length
> 0)) this.setEnabled(true);
139 label
: "Reload Agents",
140 icon
: "resource/slc/view-refresh.png",
141 shortcut
: "Control+r",
144 toolbar
: "launcher",
145 callback : function(e
){
146 var req
= org
.argeo
.slc
.ria
.SlcApi
.getListAgentsService("agents");
153 icon
: "resource/slc/view-refresh.png",
154 shortcut
: "Control+m",
157 toolbar
: "launcher",
158 callback : function(e
){
159 var selected
= this.tree
.getSelectedItem();
160 if(selected
.classname
== "org.argeo.ria.components.DynamicTreeFolder"){
164 selectionChange : function(viewId
, selection
){
165 if(viewId
!= "form:tree") return;
166 if(!selection
|| selection
.length
!= 1) return;
167 var item
= selection
[0];
168 if(!qx
.Class
.isSubClassOf(qx
.Class
.getByName(item
.classname
), qx
.ui
.tree
.AbstractTreeItem
)) return;
169 this.setEnabled(false);
170 if(qx
.Class
.isSubClassOf(qx
.Class
.getByName(item
.classname
), org
.argeo
.ria
.components
.DynamicTreeFolder
)){
171 this.setEnabled(true);
179 * A map containing all currently registered agents.
184 event
: "changeRegisteredTopics"
190 * Loader for the "flow" level : takes a folder containing "moduleData" and create its children.
191 * @param folder {qx.ui.tree.TreeFolder} A Tree folder containing in the key "moduleData" of its user data a map containing the keys {name,version}
193 flowLoader : function(folder
){
194 var moduleData
= folder
.getUserData("moduleData");
195 //var req = org.argeo.ria.remote.RequestManager.getInstance().getRequest("../argeo-ria-src/stub.xml", "GET", "application/xml");
196 var req
= org
.argeo
.slc
.ria
.SlcApi
.getLoadExecutionDescriptorService(moduleData
.name
, moduleData
.version
);
197 req
.addListener("completed", function(response
){
198 var executionModule
= new org
.argeo
.slc
.ria
.execution
.Module();
199 executionModule
.setXmlNode(response
.getContent());
200 var execFlows
= executionModule
.getExecutionFlows();
201 for(var key
in execFlows
){
202 var file
= new qx
.ui
.tree
.TreeFile(key
);
203 file
.setUserData("executionModule", executionModule
);
204 file
.setUserData("executionFlow", execFlows
[key
]);
207 folder
.setLoaded(true);
213 * Loader for the "modules" level : takes any tree folder, currently the root folder.
214 * @param folder {qx.ui.tree.TreeFolder} The root folder
216 modulesLoader : function(folder
){
217 var req
= org
.argeo
.slc
.ria
.SlcApi
.getListModulesService();
218 req
.addListener("completed", function(response
){
219 var descriptors
= org
.argeo
.ria
.util
.Element
.selectNodes(response
.getContent(), "slc:object-list/slc:execution-module-descriptor");
224 "Module 1":["ver1.1", "ver1.2", "ver1.3"],
225 "Module 2":["ver2.1", "ver2.2", "ver2.3", "ver2.4"],
226 "Module 3":["ver3.1", "ver3.2"]
229 for(var i
=0;i
<descriptors
.length
; i
++){
230 var name
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(descriptors
[i
], "slc:name");
231 var version
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(descriptors
[i
], "slc:version");
232 if(!mods
[name
]) mods
[name
] = [];
233 mods
[name
].push(version
);
235 var flowLoader
= org
.argeo
.slc
.ria
.NewLauncherApplet
.flowLoader
;
236 for(var key
in mods
){
237 var moduleFolder
= new qx
.ui
.tree
.TreeFolder(key
);
238 folder
.add(moduleFolder
);
239 for(var i
=0;i
<mods
[key
].length
;i
++){
240 var versionFolder
= new org
.argeo
.ria
.components
.DynamicTreeFolder(
246 moduleFolder
.add(versionFolder
);
247 versionFolder
.setUserData("moduleData", {name
:key
, version
:mods
[key
][i
]});
249 folder
.setLoaded(true);
259 * Called at applet creation. Just registers viewPane.
260 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
262 init : function(viewPane
){
263 this.setView(viewPane
);
264 this.setViewSelection(new org
.argeo
.ria
.components
.ViewSelection(viewPane
.getViewId()));
265 this._amqClient
= org
.argeo
.ria
.remote
.JmsClient
.getInstance();
266 this._amqClient
.uri
= "/org.argeo.slc.webapp/amq";
267 this._amqClient
.startPolling();
274 this._createLayout();
275 this.getView().setViewTitle("Execution Launcher");
276 org
.argeo
.ria
.remote
.RequestManager
.getInstance().addListener("reload", function(reloadEvent
){
277 if(reloadEvent
.getDataType()!= "agents") return ;
278 var xmlDoc
= reloadEvent
.getContent();
279 var nodes
= org
.argeo
.ria
.util
.Element
.selectNodes(xmlDoc
, "//slc:slc-agent-descriptor");
281 for(var i
=0;i
<nodes
.length
;i
++){
282 var uuid
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(nodes
[i
], "@uuid");
283 var host
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(nodes
[i
], "slc:host");
284 newTopics
[uuid
] = host
+" ("+uuid
+")";
286 this.setRegisteredTopics(newTopics
);
288 this.addListener("changeRegisteredTopics", function(event
){
289 //this._refreshTopicsSubscriptions(event);
290 this._feedSelector(event
);
292 var reloadHandler = function(message
){
293 // Delay reload to be sure the jms was first integrated by the db, then ask the db.
294 qx
.event
.Timer
.once(function(){
295 org
.argeo
.ria
.event
.CommandsManager
.getInstance().getCommandById("reloadagents").execute();
298 this._amqClient
.addListener("agentregister", "topic://agent.register", reloadHandler
, this);
299 this._amqClient
.addListener("agentunregister", "topic://agent.unregister", reloadHandler
, this);
303 addScroll : function(){
308 this._amqClient
.removeListener("agentregister", "topic://agent.register");
309 this._amqClient
.removeListener("agentunregister", "topic://agent.unregister");
310 this._amqClient
.removeListener("modulesResponse", "topic://modulesManager.response");
311 this.setRegisteredTopics({});
312 this._amqClient
.stopPolling();
316 * Creates the main applet layout.
318 _createLayout : function(){
320 var splitPane
= new qx
.ui
.splitpane
.Pane("vertical");
321 splitPane
.setDecorator(null);
324 this.formPane
= new qx
.ui
.container
.Composite(new qx
.ui
.layout
.VBox(5));
325 this.scroll
= new qx
.ui
.container
.Scroll(this.formPane
);
326 this.formPane
.setPadding(10);
328 this.tree
= new qx
.ui
.tree
.Tree();
329 this.tree
.setDecorator(null);
337 var root
= new org
.argeo
.ria
.components
.DynamicTreeFolder(
339 this.self(arguments
).modulesLoader
,
343 this.tree
.setRoot(root
);
345 this.tree
.setContextMenu(org
.argeo
.ria
.event
.CommandsManager
.getInstance().createMenuFromIds(["addtobatch", "reloadtree"]));
347 this.tree
.addListener("changeSelection", function(e
){
348 var viewSelection
= this.getViewSelection();
349 viewSelection
.setViewId("form:tree");
350 viewSelection
.clear();
351 var sel
= this.tree
.getSortedSelection();
352 for(var i
=0;i
<sel
.length
;i
++){
353 viewSelection
.addNode(sel
[i
]);
357 this.listPane
= new qx
.ui
.container
.Composite(new qx
.ui
.layout
.Dock());
358 var listToolBar
= new qx
.ui
.toolbar
.ToolBar();
359 var toolGroup
= new qx
.ui
.toolbar
.Part();
360 listToolBar
.add(toolGroup
);
362 var execButton
= this.getCommands()["submitform"].command
.getToolbarButton();
363 toolGroup
.add(execButton
);
365 listToolBar
.addSpacer();
366 listToolBar
.setPaddingRight(4);
367 var delButton
= this.getCommands()["removefrombatch"].command
.getToolbarButton();
368 var formButton
= this.getCommands()["editexecutionspecs"].command
.getToolbarButton();
369 delButton
.setShow("icon");
370 formButton
.setShow("icon");
371 listToolBar
.add(formButton
);
372 listToolBar
.add(delButton
);
374 this.listPane
.add(listToolBar
, {edge
:"north"});
376 var indicator
= new qx
.ui
.core
.Widget();
377 indicator
.setDecorator(new qx
.ui
.decoration
.Single().set({top
:[1,"solid","#33508D"]}));
378 indicator
.setHeight(0);
379 indicator
.setOpacity(0.5);
380 indicator
.setZIndex(100);
381 indicator
.setLayoutProperties({left
:-1000,top
:-1000});
382 org
.argeo
.ria
.Application
.INSTANCE
.getRoot().add(indicator
);
385 this.list
= new qx
.ui
.form
.List();
386 this.list
.setDecorator(null);
387 this.list
.setSelectionMode("multi");
388 this.list
.setDroppable(true);
389 this.list
.setDraggable(true);
390 this.list
.setContextMenu(org
.argeo
.ria
.event
.CommandsManager
.getInstance().createMenuFromIds(["editexecutionspecs", "removefrombatch"]));
393 this.list
.addListener("dragstart", function(e
){
394 e
.addType(["items"]);
395 e
.addAction(["move"]);
397 this.list
.addListener("dragend", function(e
){
398 indicator
.setDomPosition(-1000,-1000);
400 this.list
.addListener("dragover", function(e
){
401 var orig
= e
.getOriginalTarget();
402 var origCoords
= orig
.getContainerLocation();
403 indicator
.setWidth(orig
.getBounds().width
);
404 indicator
.setDomPosition(origCoords
.left
, origCoords
.bottom
);
406 this.list
.addListener("drag", function(e
){
407 var orig
= e
.getOriginalTarget();
408 var origCoords
= orig
.getContainerLocation();
409 indicator
.setWidth(orig
.getBounds().width
);
410 indicator
.setDomPosition(origCoords
.left
, origCoords
.bottom
);
413 this.list
.addListener("drop", function(e
){
414 var target
= e
.getRelatedTarget();
415 var afterItem
= e
.getOriginalTarget();
416 indicator
.setDomPosition(-1000,-1000);
417 if(afterItem
.classname
!= "qx.ui.form.ListItem") afterItem
= null;
419 target
= this.list
.getSortedSelection()[0];
421 this._addFlowToBatch(target
, afterItem
);
423 this.listPane
.add(this.list
, {edge
:"center"});
425 this.list
.addListener("changeSelection", function(e
){
426 var viewSelection
= this.getViewSelection();
427 viewSelection
.setViewId("form:list");
428 viewSelection
.clear();
429 var listSel
= this.list
.getSortedSelection();
430 for(var i
=0;i
<listSel
.length
;i
++){
431 viewSelection
.addNode(listSel
[i
]);
435 splitPane
.add(this.tree
, 0);
436 splitPane
.add(this.listPane
, 1);
440 * Adds a given ExecutionFlow to the batch
441 * @param target {mixed} The dropped target, can be a TreeFile (add) or a ListItem (reorder).
442 * @param after {qx.ui.form.ListItem} Optional list item : if set, the flow will be added as a new list item positionned after this one.
444 _addFlowToBatch : function(target
, after
){
445 //this.debug(target);
447 target
= this.tree
.getSelectedItem();
449 }else if(target
.classname
== "qx.ui.form.ListItem"){
451 if(after
== "first") this.list
.addAt(target
, 0);
452 else this.list
.addAfter(target
, after
);
455 var executionModule
= target
.getUserData("executionModule");
456 var executionFlow
= target
.getUserData("executionFlow");
457 var batchEntry
= new org
.argeo
.slc
.ria
.execution
.BatchEntrySpec(executionModule
, executionFlow
);
458 var label
= batchEntry
.getLabel();
459 var icon
= target
.getIcon();
460 var item
= new qx
.ui
.form
.ListItem(label
, icon
);
461 item
.setUserData("batchEntrySpec", batchEntry
);
462 item
.setPaddingTop(1);
463 item
.setPaddingBottom(2);
465 if(after
== "first") this.list
.addAt(item
, 0);
466 else this.list
.addAfter(item
, after
);
470 this.list
.select(item
);
471 if(this.getAutoOpen()){
472 this.getCommands()["editexecutionspecs"].command
.execute();
477 * Refresh the selector when the topics are updated.
478 * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event.
480 _feedSelector : function(changeTopicsEvent
){
481 var topics
= changeTopicsEvent
.getData();
482 var command
= this.getCommands()["submitform"].command
;
483 command
.setEnabled(false);
485 for(var key
in topics
){
486 var submenu
= {"label":topics
[key
],"icon":"resource/slc/mime-xsl.png", "commandId":key
};
491 menu
.push({"label":"Fake Agent", "icon":"resource/slc/mime-xsl.png", "commandId":"fake_agent_uuid"});
493 command
.clearMenus();
494 command
.setMenu(menu
);
495 if(menu
.length
) command
.setEnabled(true);
500 * Called at execution
501 * @param agentUuid {String} The id of the target agent
503 executeBatchOnAgent : function(agentUuid
){
504 var selection
= this.list
.getChildren();
505 if(!selection
.length
) return;
506 var slcExecMessage
= new org
.argeo
.slc
.ria
.execution
.Message();
507 for(var i
=0;i
<selection
.length
;i
++){
508 var batchEntrySpec
= selection
[i
].getUserData("batchEntrySpec");
509 slcExecMessage
.addBatchEntrySpec(batchEntrySpec
);
511 this._amqClient
.sendMessage(
512 "topic://agent.newExecution",
513 slcExecMessage
.toXml(),
514 {"slc-agentId":agentUuid
}
516 // Force logs refresh right now!
517 qx
.event
.Timer
.once(function(){
518 var command
= org
.argeo
.ria
.event
.CommandsManager
.getInstance().getCommandById("reloadlogs");