]> 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
Check if the flow name contains slashes and if not path is set, and use the name...
[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
212 // Call service to load execution message
213 var req = org.argeo.slc.ria.SlcApi.getSlcExecutionService(uuid);
214 req.addListener("completed", function(response){
215 var xmlDoc = response.getContent();
216 var tableLines = [];
217 var parser = org.argeo.ria.util.Element;
218 var slcSteps = parser.selectNodes(xmlDoc, "slc:slc-execution/slc:steps/slc:slc-execution-step");
219 for(var i=0;i<slcSteps.length;i++){
220 var step = slcSteps[i];
221 var date = parser.getSingleNodeText(step, "slc:begin");
222 var type = parser.getSingleNodeText(step, "slc:type");
223 var logLines = parser.selectNodes(step, "slc:log-lines/slc:log-line");
224 if(logLines.length > 0){
225 tableLines.push([date, type, parser.getSingleNodeText(logLines[0], ".")]);
226 if(logLines.length>1){
227 for(var j=1;j<logLines.length;j++){
228 tableLines.push(["", "", parser.getSingleNodeText(logLines[j], ".")]);
229 }
230 }
231 }else{
232 tableLines.push([date, type, ""]);
233 }
234 }
235 tableModel.setData(tableLines);
236 });
237 req.send();
238
239 },
240
241 /**
242 * Creates the applet layout
243 */
244 _createLayout : function(){
245 this.logModel = new qx.ui.table.model.Simple();
246 this.logModel.setColumns(["Date", "Host", "Id", "Status"]);
247 this.logPane = new qx.ui.table.Table(this.logModel, {
248 tableColumnModel: function(obj){
249 return new qx.ui.table.columnmodel.Resize(obj)
250 }
251 });
252 this.logPane.addListener("cellDblclick", function(e){
253 this.getCommands()["opendetail"].command.execute();
254 }, this);
255
256 var selectionModel = this.logPane.getSelectionModel();
257 selectionModel.addListener("changeSelection", function(e){
258 var viewSelection = this.getViewSelection();
259 viewSelection.setViewId("logger");
260 viewSelection.clear();
261 selectionModel.iterateSelection(function(index){
262 viewSelection.addNode(this.logModel.getRowData(index));
263 }, this);
264 }, this);
265
266 this.logPane.set({
267 decorator : null,
268 statusBarVisible: false,
269 showCellFocusIndicator:false
270 });
271 var columnModel = this.logPane.getTableColumnModel();
272 columnModel.getBehavior().setWidth(0, "30%");
273 columnModel.getBehavior().setWidth(1, "15%");
274 columnModel.getBehavior().setWidth(3, "12%");
275
276 this.add(this.logPane, {edge:'center'});
277 },
278
279 /**
280 * Refresh the data model.
281 */
282 _reloadLogger : function(){
283 var request = org.argeo.slc.ria.SlcApi.getListSlcExecutionsService();
284 request.addListener("completed", function(response){
285 var messages = org.argeo.ria.util.Element.selectNodes(response.getContent(), "//slc:slc-execution");
286 this.logModel.setData([]);
287 for(var i=0;i<messages.length;i++){
288 var message = messages[i];
289 var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
290 slcExec.fromXml(message);
291 this.logModel.addRows([
292 [slcExec.getDate(), slcExec.getHost(), slcExec.getUuid(), slcExec.getStatus()]
293 ]);
294 }
295 this.logModel.sortByColumn(0, false);
296 }, this);
297 request.send();
298 }
299
300 }
301 });