]> 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
Auto-open logger (with associated preference), add re-open button in logger toolbar...
[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 Process",
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 /*
171 req.addListener("failed", function(){
172 if(!window.xmlExecStub || !window.xmlExecStub[uuid]){
173 return;
174 }
175 var xmlDoc = window.xmlExecStub[uuid];
176 handler(xmlDoc);
177 });
178 */
179 req.send();
180 },
181
182 openDetail : function(logData){
183
184 var uuid = logData[2];
185 var window = new qx.ui.window.Window("Logs Detail", "org/argeo/slc/ria/mime-xls.png");
186 window.setLayout(new qx.ui.layout.VBox(0));
187 window.setContentPadding(0);
188 window.open();
189 org.argeo.ria.components.ViewsManager.getInstance().getApplicationRoot().add(window, {
190 top : '20%',
191 left : '20%',
192 width: '60%',
193 height: '60%'
194 });
195
196 var tBar = new qx.ui.toolbar.ToolBar();
197 window.add(tBar);
198 var menuButton = new qx.ui.toolbar.Button("Close", "org/argeo/slc/ria/window-close.png");
199 tBar.add(menuButton);
200 menuButton.addListener("execute", function(e){
201 window.close();
202 });
203
204 var tableModel = new qx.ui.table.model.Simple();
205 var table = new org.argeo.ria.components.ui.Table(tableModel, {
206 "date":{NAME : "Date", WIDTH:180},
207 "type":{NAME : "Type", WIDTH:90, ALIGN:"CENTER"},
208 "thread":{NAME : "Thread", WIDTH:90, ALIGN:"CENTER"},
209 "log":"Log"
210 });
211 table.setStatusBarVisible(true);
212 window.add(table, {flex:1});
213 window.setAllowMinimize(false);
214 window.setResizable(true, true, true, true);
215
216 tableModel.addListener("dataChanged", function(event){
217 if(!event.getData()) return;
218 var dataMap = event.getData();
219 table.scrollCellVisible(0, dataMap.lastRow);
220 });
221
222 var cpButton = new qx.ui.toolbar.Button("Download", "org/argeo/slc/ria/document-save-as.png");
223 tBar.add(cpButton);
224 cpButton.addListener("execute", function(e){
225 var downloadUrl = org.argeo.slc.ria.SlcApi.DEFAULT_CONTEXT+"/"+org.argeo.slc.ria.SlcApi.DOWNLOAD_SLCEXEC_STEPS + "?ext=log&uuid=" + uuid;
226 org.argeo.ria.Application.INSTANCE.javascriptDownloadLocation(downloadUrl);
227 });
228
229 var reopButton = new qx.ui.toolbar.Button("Re-open Process", "org/argeo/slc/ria/document-open.png");
230 tBar.add(reopButton);
231 reopButton.addListener("execute", function(e){
232 this.openRealized(logData);
233 }, this);
234
235 // Call service to load execution message
236 this._loadSlcExecutionSteps(uuid, tableModel, false);
237
238 var poller = new qx.event.Timer(3000);
239 poller.addListener("interval", function(e){
240 this._loadSlcExecutionSteps(uuid, tableModel, true);
241 }, this);
242
243 window.addListener("close", function(){
244 poller.stop();
245 }, this);
246 poller.start();
247 },
248
249 _loadSlcExecutionSteps : function(uuid, tableModel, poller){
250 var req;
251 var lastUuid = tableModel.getUserData("lastStepUuid");
252 if(!poller || !lastUuid){
253 req = org.argeo.slc.ria.SlcApi.getTailSlcExecutionStepService(uuid, 200, null);
254 }else{
255 req = org.argeo.slc.ria.SlcApi.getTailSlcExecutionStepService(uuid, null, lastUuid);
256 }
257 req.addListener("completed", function(response){
258 var xmlDoc = response.getContent();
259 var tableLines = (poller?tableModel.getData():[]);
260 var parser = org.argeo.ria.util.Element;
261 var slcSteps = parser.selectNodes(xmlDoc, "slc:object-list/slc:slc-execution-step");
262 for(var i=0;i<slcSteps.length;i++){
263 var step = slcSteps[i];
264 var stepUuid = parser.getSingleNodeText(step, "@uuid");
265 var date = parser.getSingleNodeText(step, "slc:timestamp");
266 var type = parser.getSingleNodeText(step, "slc:type");
267 var thread = parser.getSingleNodeText(step, "slc:thread");
268 var logLines = parser.selectNodes(step, "slc:log-lines/slc:log-line");
269 if(logLines.length > 0){
270 tableLines.push([date, type, thread, parser.getSingleNodeText(logLines[0], ".")]);
271 if(logLines.length>1){
272 for(var j=1;j<logLines.length;j++){
273 tableLines.push(["", "", "", parser.getSingleNodeText(logLines[j], ".")]);
274 }
275 }
276 }else{
277 tableLines.push([date, type, thread, ""]);
278 }
279 }
280 if(slcSteps.length){
281 tableModel.setUserData("lastStepUuid", stepUuid);
282 }
283 tableModel.setData(tableLines);
284 });
285 req.send();
286
287 },
288
289 /**
290 * Creates the applet layout
291 */
292 _createLayout : function(){
293 this.logModel = new qx.ui.table.model.Simple();
294 this.logModel.setColumns(["Date", "Host", "Id", "Status"]);
295 this.logPane = new qx.ui.table.Table(this.logModel, {
296 tableColumnModel: function(obj){
297 return new qx.ui.table.columnmodel.Resize(obj)
298 }
299 });
300 this.logPane.addListener("cellDblclick", function(e){
301 this.getCommands()["opendetail"].command.execute();
302 }, this);
303
304 var selectionModel = this.logPane.getSelectionModel();
305 selectionModel.addListener("changeSelection", function(e){
306 var viewSelection = this.getViewSelection();
307 viewSelection.setViewId("logger");
308 viewSelection.clear();
309 selectionModel.iterateSelection(function(index){
310 viewSelection.addNode(this.logModel.getRowData(index));
311 }, this);
312 }, this);
313
314 this.logPane.set({
315 decorator : null,
316 statusBarVisible: false,
317 showCellFocusIndicator:false
318 });
319 var columnModel = this.logPane.getTableColumnModel();
320 columnModel.getBehavior().setWidth(0, "30%");
321 columnModel.getBehavior().setWidth(1, "15%");
322 columnModel.getBehavior().setWidth(3, "12%");
323
324 this.add(this.logPane, {edge:'center'});
325 },
326
327 /**
328 * Refresh the data model.
329 */
330 reloadLogger : function(){
331 var request = org.argeo.slc.ria.SlcApi.getListSlcExecutionsService();
332 request.addListener("completed", function(response){
333 var messages = org.argeo.ria.util.Element.selectNodes(response.getContent(), "//slc:slc-execution");
334 this.logModel.setData([]);
335 for(var i=0;i<messages.length;i++){
336 var message = messages[i];
337 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
338 slcExec.fromXml(message);
339 this.logModel.addRows([
340 [slcExec.getDate(), slcExec.getHost(), slcExec.getUuid(), slcExec.getStatus()]
341 ]);
342 }
343 this.logModel.sortByColumn(0, false);
344 }, this);
345 request.send();
346 }
347
348 }
349 });