]> 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/LauncherApplet.js
Adapt to IView interface changes / Update basic applets for testing new feature ...
[gpl/argeo-slc.git] / org.argeo.slc.webapp / src / main / webapp / argeo-ria-lib / slc / class / org / argeo / slc / ria / LauncherApplet.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.LauncherApplet",
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 }
64 },
65 registeredTopics : {
66 init : {},
67 check : "Map",
68 event : "changeRegisteredTopics"
69 }
70 },
71
72 members :
73 {
74 /**
75 * Called at applet creation. Just registers viewPane.
76 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
77 */
78 init : function(viewPane){
79 this.setView(viewPane);
80 this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
81 this._createLayout();
82 this._createForm();
83 this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
84 this._amqClient.startPolling();
85 },
86
87 /**
88 *
89 */
90 load : function(){
91 this.getView().setViewTitle("Execution Launcher");
92 this.addListener("changeRegisteredTopics", function(event){
93 this._refreshTopicsSubscriptions(event);
94 this._feedSelector(event);
95 }, this);
96 var reloadHandler = function(message){
97 // Delay reload to be sure the jms was first integrated by the db, then ask the db.
98 qx.event.Timer.once(function(){
99 org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadagents").execute();
100 }, this, 1000);
101 }
102 this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
103 this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
104 reloadHandler();
105 },
106
107 addScroll : function(){
108 return false;
109 },
110
111 close : function(){
112 this._amqClient.removeListener("agentregister", "topic://agent.register");
113 this._amqClient.removeListener("agentunregister", "topic://agent.unregister");
114
115 this.setRegisteredTopics({});
116 this._amqClient.stopPolling();
117 },
118
119 _createLayout : function(){
120 this.formPane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
121 this.scroll = new qx.ui.container.Scroll(this.formPane);
122 this.formPane.setPadding(10);
123 this.add(this.scroll, {edge:'center'});
124
125 },
126
127 _createForm : function(){
128 this.fields = {};
129 this.hiddenFields = {};
130 this.freeFields = [];
131
132 var execButtonPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
133 var execButton = new qx.ui.form.Button(
134 "Execute",
135 "resource/slc/media-playback-start-32.png"
136 )
137 execButton.addListener("click", function(){
138 this.submitForm();
139 }, this);
140 execButtonPane.setPadding(10, 80);
141 execButtonPane.add(execButton, {edge:"center"});
142 this.formPane.add(execButtonPane);
143
144 this.agentSelector = new qx.ui.form.SelectBox();
145 var serviceManager = org.argeo.ria.remote.RequestManager.getInstance();
146 serviceManager.addListener("reload", function(reloadEvent){
147 if(reloadEvent.getDataType()!= "agents") return ;
148 var xmlDoc = reloadEvent.getContent();
149 var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
150 var newTopics = {};
151 for(var i=0;i<nodes.length;i++){
152 var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
153 var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
154 newTopics[uuid] = host+" ("+uuid+")";
155 }
156 this.setRegisteredTopics(newTopics);
157 }, this);
158
159 var commonForm = {pane:this.formPane};
160 this._addFormHeader(commonForm, this.COMMON_FORM_HEADER_LABEL);
161 this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_AGENT_LABEL), this.agentSelector);
162 this._createFormVariableParts();
163 if(!this.parts) return;
164 if(qx.lang.Object.getLength(this.parts) > 1){
165 // Add chooser
166 this.partChooser = new qx.ui.form.SelectBox();
167 for(var key in this.parts){
168 this.partChooser.add(new qx.ui.form.ListItem(this.parts[key].label, null, key));
169 }
170 this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_FORM_PART_LABEL), this.partChooser);
171 this.partChooser.addListener("changeValue", function(ev){
172 this._showSelectedPart(ev.getData());
173 }, this);
174 }
175 this._showSelectedPart(qx.lang.Object.getKeys(this.parts)[0]);
176 },
177
178 _showSelectedPart : function(partId){
179 if(!this.parts) return;
180 if(!this.partsContainer){
181 this.partsContainer = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
182 this.formPane.add(this.partsContainer);
183 }
184 for(var i in this.parts){
185 var formObject = this.parts[i];
186 if(!formObject.added){
187 this.partsContainer.add(formObject.pane, {top:0, left:0});
188 formObject.added = true;
189 }
190 formObject.pane.hide();
191 }
192 if(this.parts[partId]){
193 this.parts[partId].pane.show();
194 }
195 },
196
197 _initFormPart : function(formId, label){
198 if(!this.parts) this.parts = {};
199 var formObject = {};
200 formObject.hiddenFields = {};
201 formObject.freeFields = [];
202 formObject.fields = {};
203 formObject.id = formId;
204 formObject.label = label;
205 this.parts[formId] = formObject;
206 formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
207 return formObject;
208 },
209
210 _createFormVariableParts : function(){
211 var standard = this._initFormPart("standard", "Canonical");
212 this._createStandardForm(standard);
213 var simple = this._initFormPart("simple", "SLC Sample");
214 this._createSimpleForm(simple);
215 },
216
217 _createSimpleForm : function(formObject){
218
219 this._addFormInputText(formObject, "ant.file", "File", "Category1/SubCategory2/build.xml");
220 var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
221 moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
222 moreButton.setCursor("pointer");
223 moreButton.addListener("click", function(){
224 this._addFormInputText();
225 }, this);
226 this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
227 this._addFormInputText(formObject);
228 this._addFormInputText(formObject);
229
230 },
231
232 _createStandardForm : function(formObject){
233
234 this._addFormHeader(formObject, "Set Execution Parameters");
235 this._addFormInputText(formObject, "status", "Status", "STARTED");
236 this._addFormInputText(formObject, "host", "Host", "localhost");
237 this._addFormInputText(formObject, "user", "User", "user");
238
239 var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
240 moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
241 moreButton.setCursor("pointer");
242 moreButton.addListener("click", function(){
243 this._addFormInputText();
244 }, this);
245 this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
246 this._addFormInputText(formObject);
247 this._addFormInputText(formObject);
248 },
249
250 _addFormHiddenField : function(formObject, fieldName, fieldValue){
251 formObject.hiddenFields[fieldName] = fieldValue;
252 },
253
254 _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, choiceValues){
255 var labelElement;
256 if(choiceValues){
257 var fieldElement = new qx.ui.form.SelectBox();
258 for(var key in choiceValues){
259 fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key));
260 }
261 }else{
262 var fieldElement = new qx.ui.form.TextField();
263 }
264 if(defaultValue){
265 fieldElement.setValue(defaultValue);
266 }
267 if(fieldName && fieldLabel){
268 labelElement = new qx.ui.basic.Label(fieldLabel);
269 formObject.fields[fieldName] = fieldElement;
270 }else{
271 labelElement = new qx.ui.form.TextField();
272 formObject.freeFields.push({
273 labelEl:labelElement,
274 valueEl:fieldElement
275 });
276 }
277 this._addFormEntry(formObject, labelElement, fieldElement);
278 },
279
280 _addFormHeader : function(formObject, content, additionnalButton){
281 var header = new qx.ui.basic.Label('<b>'+content+'</b>');
282 header.setRich(true);
283 if(!additionnalButton){
284 header.setPaddingTop(10);
285 formObject.pane.add(header);
286 }else{
287 var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
288 pane.setPaddingTop(10);
289 pane.setPaddingRight(10);
290 pane.add(header, {edge:'center'});
291 pane.add(additionnalButton, {edge:'east'});
292 formObject.pane.add(pane);
293 }
294 },
295
296 _addFormEntry : function(formObject, labelElement, fieldElement){
297 var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
298 labelElement.setWidth(100);
299 labelElement.setTextAlign("right");
300 entryPane.add(labelElement);
301 entryPane.add(new qx.ui.basic.Label(':'));
302 fieldElement.setWidth(150);
303 entryPane.add(fieldElement);
304 formObject.pane.add(entryPane);
305 },
306
307 _refreshTopicsSubscriptions : function(changeTopicsEvent){
308 var oldTopics = changeTopicsEvent.getOldData() || {};
309 var newTopics = changeTopicsEvent.getData();
310 var removed = [];
311 var added = [];
312 for(var key in oldTopics){
313 if(!newTopics[key]) {
314 //this._removeAmqListener(key);
315 }
316 }
317 for(var key in newTopics){
318 if(!oldTopics[key]) {
319 //this._addAmqListener(key);
320 }
321 }
322 },
323
324 _feedSelector : function(changeTopicsEvent){
325 var topics = changeTopicsEvent.getData();
326 this.agentSelector.removeAll();
327 var emptyItem = new qx.ui.form.ListItem("", null, "");
328 this.agentSelector.add(emptyItem);
329 this.agentSelector.setSelected(emptyItem);
330 for(var key in topics){
331 var listItem = new qx.ui.form.ListItem(topics[key], null, key);
332 this.agentSelector.add(listItem);
333 }
334 },
335
336 _addAmqListener: function(uuid){
337 this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){
338 var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution");
339 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
340 slcExec.fromXml(message);
341 this.logModel.addRows([
342 [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()]
343 ]);
344 }, this);
345 },
346
347 _removeAmqListener : function(uuid){
348 this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution");
349 },
350
351 _prepareSlcExecutionMessage : function(crtPartId, slcExec, fields, hiddenFields, freeFields){
352 if(crtPartId == "standard"){
353 slcExec.setStatus(fields.status.getValue());
354 slcExec.setHost(fields.host.getValue());
355 slcExec.setUser(fields.user.getValue());
356 }else{
357 slcExec.addAttribute("ant.file", fields["ant.file"].getValue());
358 }
359 for(var i=0;i<freeFields.length;i++){
360 var fF = freeFields[i];
361 if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
362 slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
363 }
364 }
365 },
366
367 submitForm : function(){
368 var currentUuid = this.agentSelector.getValue();
369 if(!currentUuid) return;
370 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage();
371
372 var fields = {};
373 var hiddenFields = {};
374 var freeFields = {};
375 var crtPartId = "";
376 if(this.parts){
377 if(this.partChooser){
378 crtPartId = this.partChooser.getValue();
379 }else{
380 crtPartId = qx.lang.Object.getKeys(this.parts)[0];
381 }
382 var crtPart = this.parts[crtPartId];
383 fields = crtPart.fields;
384 hiddenFields = crtPart.hiddenFields;
385 freeFields = crtPart.freeFields;
386 }
387
388 this._prepareSlcExecutionMessage(crtPartId, slcExec, fields, hiddenFields, freeFields);
389
390 var destination = "topic://agent."+currentUuid+".newExecution";
391 this._amqClient.sendMessage(destination, slcExec.toXml());
392 // Force logs refresh right now!
393 qx.event.Timer.once(function(){
394 var command = org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadlogs");
395 if(command){
396 command.execute();
397 }
398 }, this, 2000);
399 }
400
401 }
402 });