]> 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
162453861e6d23dc6c3d20f685ff65d9f2d5aff6
[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
15 properties :
16 {
17 /**
18 * The viewPane inside which this applet is added.
19 */
20 view : {
21 init : null
22 },
23 /**
24 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
25 */
26 commands : {
27 init : {
28 "submitform" : {
29 label : "Execute",
30 icon : "resource/slc/media-playback-start.png",
31 shortcut : "Control+e",
32 enabled : true,
33 menu : "Launcher",
34 toolbar : "launcher",
35 callback : function(e){
36 this.getView().getContent().submitForm();
37 },
38 command : null
39 },
40 "reloadagents" : {
41 label : "Reload Agents",
42 icon : "resource/slc/view-refresh.png",
43 shortcut : "Control+r",
44 enabled : true,
45 menu : "Launcher",
46 toolbar : "launcher",
47 callback : function(e){
48 var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents");
49 req.send();
50 },
51 command : null
52 }
53 }
54 },
55 registeredTopics : {
56 init : {},
57 check : "Map",
58 event : "changeRegisteredTopics"
59 }
60 },
61
62 members :
63 {
64 /**
65 * Called at applet creation. Just registers viewPane.
66 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
67 */
68 init : function(viewPane){
69 this.setView(viewPane);
70 this._createLayout();
71 this._createForm();
72 this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
73 this._amqClient.startPolling();
74 },
75
76 /**
77 *
78 */
79 load : function(){
80 this.getView().setViewTitle("Execution Launcher");
81 this.addListener("changeRegisteredTopics", function(event){
82 this._refreshTopicsSubscriptions(event);
83 this._feedSelector(event);
84 }, this);
85 var reloadHandler = function(message){
86 org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadagents").execute();
87 }
88 this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
89 //qx.event.Timer.once(function(){
90 this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
91 //}, this, 500);
92 reloadHandler();
93 },
94
95 addScroll : function(){
96 return false;
97 },
98
99 close : function(){
100 this._amqClient.removeListener("agentregister", "topic://agent.register");
101 this._amqClient.removeListener("agentunregister", "topic://agent.unregister");
102
103 this.setRegisteredTopics({});
104 this._amqClient.stopPolling();
105 },
106
107 _createLayout : function(){
108 this.formPane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
109 this.scroll = new qx.ui.container.Scroll(this.formPane);
110 this.scroll.setWidth(290);
111 this.formPane.setPadding(10);
112 this.add(this.scroll, {edge:'west'});
113
114 this.logModel = new qx.ui.table.model.Simple();
115 this.logModel.setColumns(["Date", "Agent Uuid", "Status"]);
116 this.logPane = new qx.ui.table.Table(this.logModel, {
117 tableColumnModel: function(obj){
118 return new qx.ui.table.columnmodel.Resize(obj)
119 }
120 });
121 this._initLogger();
122 this.add(this.logPane, {edge:'center'});
123 },
124
125 _initLogger : function(){
126 this.logPane.set({
127 statusBarVisible: false,
128 showCellFocusIndicator:false
129 });
130 var columnModel = this.logPane.getTableColumnModel();
131 columnModel.getBehavior().setWidth(2, "12%");
132 },
133
134 _createForm : function(){
135 this.fields = {};
136 this.freeFields = [];
137
138 var execButtonPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
139 var execButton = new qx.ui.form.Button(
140 "Execute",
141 "resource/slc/media-playback-start-32.png"
142 )
143 execButton.addListener("click", function(){
144 this.submitForm();
145 }, this);
146 execButtonPane.setPadding(10, 80);
147 execButtonPane.add(execButton, {edge:"center"});
148 this.formPane.add(execButtonPane);
149
150 this.agentSelector = new qx.ui.form.SelectBox();
151 var serviceManager = org.argeo.ria.remote.RequestManager.getInstance();
152 serviceManager.addListener("reload", function(reloadEvent){
153 if(reloadEvent.getDataType()!= "agents") return ;
154 var xmlDoc = reloadEvent.getContent();
155 var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
156 var newTopics = {};
157 for(var i=0;i<nodes.length;i++){
158 var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
159 var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
160 newTopics[uuid] = host+" ("+uuid+")";
161 }
162 this.setRegisteredTopics(newTopics);
163 }, this);
164
165 this._addFormHeader("Choose Agent Uuid");
166 this._addFormEntry(new qx.ui.basic.Label("Agent Uuid"), this.agentSelector);
167 this._addFormHeader("Set Execution Parameters");
168 this._addFormInputText("status", "Status", "STARTED");
169 this._addFormInputText("host", "Host", "localhost");
170 this._addFormInputText("user", "User", "user");
171
172 var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
173 moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
174 moreButton.setCursor("pointer");
175 moreButton.addListener("click", function(){
176 this._addFormInputText();
177 }, this);
178 this._addFormHeader("Add optionnal parameters", moreButton);
179 this._addFormInputText();
180 this._addFormInputText();
181 },
182
183 _addFormInputText : function(fieldName, fieldLabel, defaultValue){
184 var labelElement;
185 var fieldElement = new qx.ui.form.TextField();
186 if(defaultValue){
187 fieldElement.setValue(defaultValue);
188 }
189 if(fieldName && fieldLabel){
190 labelElement = new qx.ui.basic.Label(fieldLabel);
191 this.fields[fieldName] = fieldElement;
192 }else{
193 labelElement = new qx.ui.form.TextField();
194 this.freeFields.push({
195 labelEl:labelElement,
196 valueEl:fieldElement
197 });
198 }
199 this._addFormEntry(labelElement, fieldElement);
200 },
201
202 _addFormHeader : function(content, additionnalButton){
203 var header = new qx.ui.basic.Label('<b>'+content+'</b>');
204 header.setRich(true);
205 if(!additionnalButton){
206 header.setPaddingTop(10);
207 this.formPane.add(header);
208 }else{
209 var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
210 pane.setPaddingTop(10);
211 pane.setPaddingRight(10);
212 pane.add(header, {edge:'center'});
213 pane.add(additionnalButton, {edge:'east'});
214 this.formPane.add(pane);
215 }
216 },
217
218 _addFormEntry : function(labelElement, fieldElement){
219 var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
220 labelElement.setWidth(100);
221 labelElement.setTextAlign("right");
222 entryPane.add(labelElement);
223 entryPane.add(new qx.ui.basic.Label(':'));
224 fieldElement.setWidth(150);
225 entryPane.add(fieldElement);
226 this.formPane.add(entryPane);
227 },
228
229 _refreshTopicsSubscriptions : function(changeTopicsEvent){
230 var oldTopics = changeTopicsEvent.getOldData() || {};
231 var newTopics = changeTopicsEvent.getData();
232 var removed = [];
233 var added = [];
234 for(var key in oldTopics){
235 if(!newTopics[key]) {
236 this._removeAmqListener(key);
237 }
238 }
239 for(var key in newTopics){
240 if(!oldTopics[key]) {
241 this._addAmqListener(key);
242 }
243 }
244 },
245
246 _feedSelector : function(changeTopicsEvent){
247 var topics = changeTopicsEvent.getData();
248 this.agentSelector.removeAll();
249 var emptyItem = new qx.ui.form.ListItem("", null, "");
250 this.agentSelector.add(emptyItem);
251 this.agentSelector.setSelected(emptyItem);
252 for(var key in topics){
253 var listItem = new qx.ui.form.ListItem(topics[key], null, key);
254 this.agentSelector.add(listItem);
255 }
256 },
257
258 _addAmqListener: function(uuid){
259 this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){
260 var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution");
261 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
262 slcExec.fromXml(message);
263 this.logModel.addRows([
264 [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()]
265 ]);
266 }, this);
267 },
268
269 _removeAmqListener : function(uuid){
270 this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution");
271 },
272
273 submitForm : function(){
274 var currentUuid = this.agentSelector.getValue();
275 if(!currentUuid) return;
276 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(currentUuid);
277 slcExec.setStatus(this.fields.status.getValue());
278 slcExec.setHost(this.fields.host.getValue());
279 slcExec.setUser(this.fields.user.getValue());
280 for(var i=0;i<this.freeFields.length;i++){
281 var fF = this.freeFields[i];
282 if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
283 slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
284 }
285 }
286 var destination = "topic://agent."+currentUuid+".newExecution";
287 this._amqClient.sendMessage(destination, slcExec.toXml());
288 }
289
290 }
291 });