]>
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());
14 this.COMMON_FORM_HEADER_LABEL
= "Choose Agent";
15 this.CHOOSE_AGENT_LABEL
= "Agent Uuid";
16 this.CHOOSE_FORM_PART_LABEL
= "Test Type";
22 * The viewPane inside which this applet is added.
29 check
:"org.argeo.ria.components.ViewSelection"
31 instanceId
: {init
:""},
32 instanceLabel
: {init
:""},
34 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
40 icon
: "resource/slc/media-playback-start.png",
41 shortcut
: "Control+e",
45 callback : function(e
){
51 label
: "Reload Agents",
52 icon
: "resource/slc/view-refresh.png",
53 shortcut
: "Control+r",
57 callback : function(e
){
58 var req
= org
.argeo
.slc
.ria
.SlcApi
.getListAgentsService("agents");
64 label
: "Load Modules",
65 icon
: "resource/slc/view-refresh.png",
66 shortcut
: "Control+m",
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()));
81 this._amqClient.sendMessage("modulesManager.request", "", {
82 "action":"getExecutionModuleDescriptor",
83 "name" : "org.argeo.slc.demo.basic",
84 "version" : "WHATEVER"
93 * A map containing all currently registered agents.
98 event
: "changeRegisteredTopics"
105 * Called at applet creation. Just registers viewPane.
106 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
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();
121 this.getView().setViewTitle("Execution Launcher");
122 this.addListener("changeRegisteredTopics", function(event
){
123 //this._refreshTopicsSubscriptions(event);
124 this._feedSelector(event
);
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();
132 this._amqClient
.addListener("agentregister", "topic://agent.register", reloadHandler
, this);
133 this._amqClient
.addListener("agentunregister", "topic://agent.unregister", reloadHandler
, this);
136 this._amqClient
.addListener("modulesResponse", "modulesManager.response", function(message
){
141 addScroll : 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();
154 * Creates the main applet layout.
156 _createLayout : function(){
158 var splitPane
= new qx
.ui
.splitpane
.Pane("vertical");
159 splitPane
.setDecorator(null);
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);
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
);
174 for(var i
=0;i
<100;i
++){
175 var file1
= new qx
.ui
.tree
.TreeFile("1-"+i
);
177 file1
.setDraggable(true);
178 file1
.addListener("dragstart", function(e
){
183 var file2
= new qx
.ui
.tree
.TreeFile("2-"+i
)
185 var file3
= new qx
.ui
.tree
.TreeFile("3-"+i
);
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();
199 this.listPane
.add(toolGroup
, {edge
:"north"});
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);
212 this.list
.select(item
);
214 this.listPane
.add(this.list
, {edge
:"center"});
216 splitPane
.add(this.tree
, 0);
217 splitPane
.add(this.listPane
, 1);
218 //this.add(this.scroll, {edge:'center'});
225 _createForm : function(){
227 this.hiddenFields
= {};
228 this.freeFields
= [];
230 var execButtonPane
= new qx
.ui
.container
.Composite(new qx
.ui
.layout
.Dock());
231 var execButton
= new qx
.ui
.form
.Button(
233 "resource/slc/media-playback-start-32.png"
235 execButton
.addListener("click", function(){
238 execButtonPane
.setPadding(10, 80);
239 execButtonPane
.add(execButton
, {edge
:"center"});
240 this.formPane
.add(execButtonPane
);
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");
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
+")";
254 this.setRegisteredTopics(newTopics
);
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){
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
));
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());
273 this._showSelectedPart(qx
.lang
.Object
.getKeys(this.parts
)[0]);
277 * Show a form part given its id.
278 * @param partId {String} The part id
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
);
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;
292 formObject
.pane
.hide();
294 if(this.parts
[partId
]){
295 this.parts
[partId
].pane
.show();
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.
305 _initFormPart : function(formId
, label
){
306 if(!this.parts
) this.parts
= {};
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));
319 * To be overriden by this class children.
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
);
329 * Creates a form for SLC demo
330 * @param formObject {Map} The form part
332 _createSimpleForm : function(formObject
){
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
);
341 this._addFormHeader(formObject
, "Add optionnal parameters", moreButton
);
342 this._addFormInputText(formObject
);
343 this._addFormInputText(formObject
);
348 * Create a canonical form.
349 * @param formObject {Map} The form part
351 _createStandardForm : function(formObject
){
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");
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
);
364 this._addFormHeader(formObject
, "Add optionnal parameters", moreButton
);
365 this._addFormInputText(formObject
);
366 this._addFormInputText(formObject
);
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
375 _addFormHiddenField : function(formObject
, fieldName
, fieldValue
){
376 formObject
.hiddenFields
[fieldName
] = fieldValue
;
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
387 _addFormInputText : function(formObject
, fieldName
, fieldLabel
, defaultValue
, 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
));
395 var fieldElement
= new qx
.ui
.form
.TextField();
398 fieldElement
.setValue(defaultValue
);
400 if(fieldName
&& fieldLabel
){
401 labelElement
= new qx
.ui
.basic
.Label(fieldLabel
);
402 formObject
.fields
[fieldName
] = fieldElement
;
404 labelElement
= new qx
.ui
.form
.TextField();
405 formObject
.freeFields
.push({
406 labelEl
:labelElement
,
410 this._addFormEntry(formObject
, labelElement
, fieldElement
);
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.
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
);
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
);
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.
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
);
453 _refreshTopicsSubscriptions : function(changeTopicsEvent){
454 var oldTopics = changeTopicsEvent.getOldData() || {};
455 var newTopics = changeTopicsEvent.getData();
458 for(var key in oldTopics){
459 if(!newTopics[key]) {
460 //this._removeAmqListener(key);
463 for(var key in newTopics){
464 if(!oldTopics[key]) {
465 //this._addAmqListener(key);
472 * Refresh the selector when the topics are updated.
473 * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event.
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
);
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()]
499 _removeAmqListener : function(uuid){
500 this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution");
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.
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());
518 slcExec
.addAttribute("ant.file", fields
["ant.file"].getValue());
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());
529 * Called when the user clicks the "Execute" button.
531 submitForm : function(){
532 var currentUuid
= this.agentSelector
.getValue();
533 if(!currentUuid
) return;
534 var slcExec
= new org
.argeo
.slc
.ria
.SlcExecutionMessage();
537 var hiddenFields
= {};
541 if(this.partChooser
){
542 crtPartId
= this.partChooser
.getValue();
544 crtPartId
= qx
.lang
.Object
.getKeys(this.parts
)[0];
546 var crtPart
= this.parts
[crtPartId
];
547 fields
= crtPart
.fields
;
548 hiddenFields
= crtPart
.hiddenFields
;
549 freeFields
= crtPart
.freeFields
;
552 this._prepareSlcExecutionMessage(crtPartId
, slcExec
, fields
, hiddenFields
, freeFields
);
554 this._amqClient
.sendMessage(
555 "topic://agent.newExecution",
557 {"slc-agentId":currentUuid
}
559 // Force logs refresh right now!
560 qx
.event
.Timer
.once(function(){
561 var command
= org
.argeo
.ria
.event
.CommandsManager
.getInstance().getCommandById("reloadlogs");