]>
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
4fe18a4f8fe2503d7b26f528a1cd89a03d0b5e0e
2 * A simple Hello World applet for documentation purpose.
3 * The only associated command is the "Close" command.
5 qx
.Class
.define("org.argeo.slc.ria.SlcExecLoggerApplet",
7 extend
: qx
.ui
.container
.Composite
,
8 implement
: [org
.argeo
.ria
.components
.IView
],
10 construct : function(){
12 this.setLayout(new qx
.ui
.layout
.Dock());
18 * The viewPane inside which this applet is added.
25 check
:"org.argeo.ria.components.ViewSelection"
27 instanceId
: {init
:""},
28 instanceLabel
: {init
:""},
30 * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
35 label
: "Reload Logs",
36 icon
: "org/argeo/slc/ria/view-refresh.png",
37 shortcut
: "Control+r",
41 callback : function(e
){
47 label
: "Logs Detail",
48 icon
: "org/argeo/slc/ria/mime-xls.png",
53 callback : function(e
){
54 var selection
= this.getViewSelection();
55 var rowData
= selection
.getNodes()[0];
56 this.openDetail(rowData
);
58 selectionChange : function(viewId
, selection
){
59 if(viewId
!= "logger") return;
60 this.setEnabled((selection
!=null && selection
.length
==1));
65 label
: "Re-open Process",
66 icon
: "org/argeo/slc/ria/document-open.png",
67 shortcut
: "Control+o",
71 callback : function(e
){
72 var selection
= this.getViewSelection();
73 var rowData
= selection
.getNodes()[0];
74 this.openRealized(rowData
);
76 selectionChange : function(viewId
, selection
){
77 if(viewId
!= "logger") return;
78 this.setEnabled((selection
!=null && selection
.length
==1));
89 * Called at applet creation. Just registers viewPane.
90 * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
92 init : function(viewPane
){
93 this.setView(viewPane
);
94 this.setViewSelection(new org
.argeo
.ria
.components
.ViewSelection(viewPane
.getViewId()));
96 this.UIBus
= org
.argeo
.ria
.event
.UIBus
.getInstance();
104 this.UIBus
.addListener("newSlcExecution", this.reloadLogger
, this);
105 this.UIBus
.addListener("updateSlcExecutionStatus", this.reloadLogger
, this);
108 addScroll : function(){
113 this.UIBus
.removeListener("newSlcExecution", this.reloadLogger
, this);
114 this.UIBus
.removeListener("updateSlcExecutionStatus", this.reloadLogger
, this);
117 openRealized : function(logData
){
120 var CHECK_HOST
= false;
122 var uuid
= logData
[2];
123 var host
= logData
[1];
126 // 1. Check that both associated views are here
130 batchView
= org
.argeo
.ria
.components
.ViewsManager
.getInstance().getViewPaneById("batch").getContent();
131 flowsView
= org
.argeo
.ria
.components
.ViewsManager
.getInstance().getViewPaneById("selector").getContent();
133 this.debug("Cannot find either bath or flows IView!");
135 if(!batchView
|| !flowsView
) return;
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.");
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.");
151 //console.log(currentBatchId);
152 if(currentBatchId
== null){
153 var defaultId
= qx
.lang
.Object
.getKeyFromValue(agentsMap
, host
);
154 batchView
.setBatchAgentId(defaultId
);
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
);
166 req
.addListener("completed", function(response
){
167 handler(response
.getContent());
171 req.addListener("failed", function(){
172 if(!window.xmlExecStub || !window.xmlExecStub[uuid]){
175 var xmlDoc = window.xmlExecStub[uuid];
182 openDetail : function(logData
){
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);
189 org
.argeo
.ria
.components
.ViewsManager
.getInstance().getApplicationRoot().add(window
, {
196 var tBar
= new qx
.ui
.toolbar
.ToolBar();
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
){
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"},
211 table
.setStatusBarVisible(true);
212 window
.add(table
, {flex
:1});
213 window
.setAllowMinimize(false);
214 window
.setResizable(true, true, true, true);
216 tableModel
.addListener("dataChanged", function(event
){
217 if(!event
.getData()) return;
218 var dataMap
= event
.getData();
219 table
.scrollCellVisible(0, dataMap
.lastRow
);
222 var cpButton
= new qx
.ui
.toolbar
.Button("Download", "org/argeo/slc/ria/document-save-as.png");
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
);
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
);
235 // Call service to load execution message
236 this._loadSlcExecutionSteps(uuid
, tableModel
, false);
238 var poller
= new qx
.event
.Timer(3000);
239 poller
.addListener("interval", function(e
){
240 this._loadSlcExecutionSteps(uuid
, tableModel
, true);
243 window
.addListener("close", function(){
249 _loadSlcExecutionSteps : function(uuid
, tableModel
, poller
){
251 var lastUuid
= tableModel
.getUserData("lastStepUuid");
252 if(!poller
|| !lastUuid
){
253 req
= org
.argeo
.slc
.ria
.SlcApi
.getTailSlcExecutionStepService(uuid
, 200, null);
255 req
= org
.argeo
.slc
.ria
.SlcApi
.getTailSlcExecutionStepService(uuid
, null, lastUuid
);
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
], ".")]);
277 tableLines
.push([date
, type
, thread
, ""]);
281 tableModel
.setUserData("lastStepUuid", stepUuid
);
283 tableModel
.setData(tableLines
);
290 * Creates the applet layout
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
)
300 this.logPane
.addListener("cellDblclick", function(e
){
301 this.getCommands()["opendetail"].command
.execute();
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
));
316 statusBarVisible
: false,
317 showCellFocusIndicator
:false
319 var columnModel
= this.logPane
.getTableColumnModel();
320 columnModel
.getBehavior().setWidth(0, "30%");
321 columnModel
.getBehavior().setWidth(1, "15%");
322 columnModel
.getBehavior().setWidth(3, "12%");
324 this.add(this.logPane
, {edge
:'center'});
328 * Refresh the data model.
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()]
343 this.logModel
.sortByColumn(0, false);