]> git.argeo.org Git - gpl/argeo-slc.git/blob - server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcExecLoggerApplet.js
Add log4j for server JCR
[gpl/argeo-slc.git] / server / org.argeo.slc.ria / src / argeo-ria-lib / slc / class / org / argeo / slc / ria / SlcExecLoggerApplet.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.SlcExecLoggerApplet",
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 viewSelection : {
24 nullable:false,
25 check:"org.argeo.ria.components.ViewSelection"
26 },
27 instanceId : {init:""},
28 instanceLabel : {init:""},
29 /**
30 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
31 */
32 commands : {
33 init : {
34 "reloadlogs" : {
35 label : "Reload Logs",
36 icon : "org.argeo.slc.ria/view-refresh.png",
37 shortcut : "Control+r",
38 enabled : true,
39 menu : null,
40 toolbar : null,
41 callback : function(e){
42 this._reloadLogger();
43 },
44 command : null
45 },
46 "opendetail" : {
47 label : "Logs Detail",
48 icon : "org.argeo.slc.ria/mime-xls.png",
49 shortcut : null,
50 enabled : false,
51 menu : null,
52 toolbar : "slc_logs",
53 callback : function(e){
54 var selection = this.getViewSelection();
55 var rowData = selection.getNodes()[0];
56 this.openDetail(rowData);
57 },
58 selectionChange : function(viewId, selection){
59 if(viewId != "logger") return;
60 this.setEnabled((selection!=null && selection.length==1));
61 },
62 command : null
63 },
64 "reopenrealized" : {
65 label : "Re-open",
66 icon : "org.argeo.slc.ria/document-open.png",
67 shortcut : "Control+o",
68 enabled : false,
69 menu : null,
70 toolbar : "slc_logs",
71 callback : function(e){
72 var selection = this.getViewSelection();
73 var rowData = selection.getNodes()[0];
74 this.openRealized(rowData);
75 },
76 selectionChange : function(viewId, selection){
77 if(viewId != "logger") return;
78 this.setEnabled((selection!=null && selection.length==1));
79 },
80 command : null
81 }
82 }
83 }
84 },
85
86 members :
87 {
88 /**
89 * Called at applet creation. Just registers viewPane.
90 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
91 */
92 init : function(viewPane){
93 this.setView(viewPane);
94 this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
95 this._createLayout();
96 this.UIBus = org.argeo.ria.event.UIBus.getInstance();
97 },
98
99 /**
100 *
101 */
102 load : function(){
103 this._reloadLogger();
104 this.UIBus.addListener("newSlcExecution", this._reloadLogger, this);
105 this.UIBus.addListener("updateSlcExecutionStatus", this._reloadLogger, this);
106 },
107
108 addScroll : function(){
109 return false;
110 },
111
112 close : function(){
113 this.UIBus.removeListener("newSlcExecution", this._reloadLogger, this);
114 this.UIBus.removeListener("updateSlcExecutionStatus", this._reloadLogger, this);
115 },
116
117 openRealized : function(logData){
118
119 // DEBUG PURPOSE
120 var CHECK_HOST = false;
121
122 var uuid = logData[2];
123 var host = logData[1];
124
125
126 // 1. Check that both associated views are here
127 var batchView;
128 var flowsView;
129 try{
130 batchView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("batch").getContent();
131 flowsView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("selector").getContent();
132 }catch(e){
133 this.debug("Cannot find either bath or flows IView!");
134 }
135 if(!batchView || !flowsView) return;
136
137 // 2. Check that at least a host with the same name exists.
138 var agentsMap = flowsView.getAgentsMap();
139 var currentBatchId = batchView.getBatchAgentId();
140 if(currentBatchId != null){
141 var currentHost = agentsMap[currentBatchId];
142 if(currentHost != host){
143 this.error("Cannot re-open these flows on a different host. Please clear the batch first.");
144 return;
145 }
146 }
147 if(!qx.lang.Object.contains(agentsMap, host)){
148 this.error("Cannot find any agent running on '"+host+"'! Please start an agent on this host.");
149 return;
150 }
151 //console.log(currentBatchId);
152 if(currentBatchId == null){
153 var defaultId = qx.lang.Object.getKeyFromValue(agentsMap, host);
154 batchView.setBatchAgentId(defaultId);
155 }
156
157 // 3. Call service to load execution message
158 var req = org.argeo.slc.ria.SlcApi.getSlcExecutionService(uuid);
159 var handler = function(xmlDoc){
160 var realizedFlows = org.argeo.ria.util.Element.selectNodes(xmlDoc, "slc:slc-execution/slc:realized-flows/slc:realized-flow");
161 for(var i=0;i<realizedFlows.length;i++){
162 var newEntrySpec = new org.argeo.slc.ria.execution.BatchEntrySpec(null, null, realizedFlows[i]);
163 batchView.appendBatchEntrySpec(newEntrySpec);
164 }
165 };
166 req.addListener("completed", function(response){
167 handler(response.getContent());
168 });
169 // STUB CASE
170 req.addListener("failed", function(){
171 if(!window.xmlExecStub || !window.xmlExecStub[uuid]){
172 return;
173 }
174 var xmlDoc = window.xmlExecStub[uuid];
175 handler(xmlDoc);
176 });
177 req.send();
178 },
179
180 openDetail : function(logData){
181
182 var uuid = logData[2];
183 var window = new qx.ui.window.Window("Logs Detail", "org.argeo.slc.ria/mime-xls.png");
184 window.setLayout(new qx.ui.layout.VBox(0));
185 window.setContentPadding(0);
186 window.open();
187 org.argeo.ria.components.ViewsManager.getInstance().getApplicationRoot().add(window, {
188 top : '20%',
189 left : '20%',
190 width: '60%',
191 height: '60%'
192 });
193
194 var tBar = new qx.ui.toolbar.ToolBar();
195 window.add(tBar);
196 var menuButton = new qx.ui.toolbar.Button("Close", "org.argeo.slc.ria/window-close.png");
197 tBar.add(menuButton);
198 menuButton.addListener("execute", function(e){
199 window.close();
200 });
201
202 var tableModel = new qx.ui.table.model.Simple();
203 var table = new org.argeo.ria.components.ui.Table(tableModel, {
204 "date":{NAME : "Date", WIDTH:180},
205 "type":{NAME : "Type", WIDTH:90, ALIGN:"CENTER"},
206 "log":"Log"
207 });
208 table.setStatusBarVisible(true);
209 window.add(table, {flex:1});
210 window.setAllowMinimize(false);
211 window.setResizable(true, true, true, true);
212
213 tableModel.addListener("dataChanged", function(event){
214 if(!event.getData()) return;
215 var dataMap = event.getData();
216 table.scrollCellVisible(0, dataMap.lastRow);
217 });
218
219
220 var tA = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
221 tA.setHeight(120);
222
223 var textArea = new qx.ui.form.TextArea();
224 tA.add(textArea, {left:0,top:0, right:0,bottom:0});
225
226 var okButton = new qx.ui.form.Button("Done");
227 okButton.setZIndex(2000);
228 tA.add(okButton, {bottom:20,right:20});
229 okButton.addListener("execute", function(){
230 tA.setVisibility("excluded");
231 });
232
233 textArea.setNativeContextMenu(true);
234 window.add(tA);
235 var cpButton = new qx.ui.toolbar.Button("Copy As Text", "org.argeo.slc.ria/edit-copy.png");
236 tBar.add(cpButton);
237 cpButton.addListener("execute", function(e){
238 var all = tableModel.getData();
239 var string = "";
240 for(var i=0;i<all.length;i++){
241 for(var j=0;j<all[i].length;j++){
242 string += all[i][j] + "\t";
243 }
244 string += "\n";
245 }
246 tA.setVisibility("visible");
247 textArea.setValue(string);
248 new qx.util.DeferredCall(function(){
249 textArea.setSelection(0, string.length);
250 }).schedule();
251 });
252 tA.setVisibility("excluded");
253
254
255
256 // Call service to load execution message
257 this._loadSlcExecution(uuid, tableModel);
258
259 var poller = new qx.event.Timer(3000);
260 poller.addListener("interval", function(e){
261 this._loadSlcExecution(uuid, tableModel);
262 }, this);
263
264 window.addListener("close", function(){
265 poller.stop();
266 }, this);
267 poller.start();
268 },
269
270 _loadSlcExecution : function(uuid, tableModel){
271 var req = org.argeo.slc.ria.SlcApi.getSlcExecutionService(uuid);
272 req.addListener("completed", function(response){
273 var xmlDoc = response.getContent();
274 var tableLines = [];
275 var parser = org.argeo.ria.util.Element;
276 var slcSteps = parser.selectNodes(xmlDoc, "slc:slc-execution/slc:steps/slc:slc-execution-step");
277 for(var i=0;i<slcSteps.length;i++){
278 var step = slcSteps[i];
279 var date = parser.getSingleNodeText(step, "slc:begin");
280 var type = parser.getSingleNodeText(step, "slc:type");
281 var logLines = parser.selectNodes(step, "slc:log-lines/slc:log-line");
282 if(logLines.length > 0){
283 tableLines.push([date, type, parser.getSingleNodeText(logLines[0], ".")]);
284 if(logLines.length>1){
285 for(var j=1;j<logLines.length;j++){
286 tableLines.push(["", "", parser.getSingleNodeText(logLines[j], ".")]);
287 }
288 }
289 }else{
290 tableLines.push([date, type, ""]);
291 }
292 }
293 tableModel.setData(tableLines);
294 });
295 req.send();
296
297 },
298
299 /**
300 * Creates the applet layout
301 */
302 _createLayout : function(){
303 this.logModel = new qx.ui.table.model.Simple();
304 this.logModel.setColumns(["Date", "Host", "Id", "Status"]);
305 this.logPane = new qx.ui.table.Table(this.logModel, {
306 tableColumnModel: function(obj){
307 return new qx.ui.table.columnmodel.Resize(obj)
308 }
309 });
310 this.logPane.addListener("cellDblclick", function(e){
311 this.getCommands()["opendetail"].command.execute();
312 }, this);
313
314 var selectionModel = this.logPane.getSelectionModel();
315 selectionModel.addListener("changeSelection", function(e){
316 var viewSelection = this.getViewSelection();
317 viewSelection.setViewId("logger");
318 viewSelection.clear();
319 selectionModel.iterateSelection(function(index){
320 viewSelection.addNode(this.logModel.getRowData(index));
321 }, this);
322 }, this);
323
324 this.logPane.set({
325 decorator : null,
326 statusBarVisible: false,
327 showCellFocusIndicator:false
328 });
329 var columnModel = this.logPane.getTableColumnModel();
330 columnModel.getBehavior().setWidth(0, "30%");
331 columnModel.getBehavior().setWidth(1, "15%");
332 columnModel.getBehavior().setWidth(3, "12%");
333
334 this.add(this.logPane, {edge:'center'});
335 },
336
337 /**
338 * Refresh the data model.
339 */
340 _reloadLogger : function(){
341 var request = org.argeo.slc.ria.SlcApi.getListSlcExecutionsService();
342 request.addListener("completed", function(response){
343 var messages = org.argeo.ria.util.Element.selectNodes(response.getContent(), "//slc:slc-execution");
344 this.logModel.setData([]);
345 for(var i=0;i<messages.length;i++){
346 var message = messages[i];
347 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
348 slcExec.fromXml(message);
349 this.logModel.addRows([
350 [slcExec.getDate(), slcExec.getHost(), slcExec.getUuid(), slcExec.getStatus()]
351 ]);
352 }
353 this.logModel.sortByColumn(0, false);
354 }, this);
355 request.send();
356 }
357
358 }
359 });