]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcExecLoggerApplet.js
Poll logs, scroll to last row, and Copy As Text action.
[gpl/argeo-slc.git] / server / org.argeo.slc.ria / src / argeo-ria-lib / slc / class / org / argeo / slc / ria / SlcExecLoggerApplet.js
index f3b4ba8395184aa4efa8080576ff7035b56ff3c5..d928e4840ddf64e4129a482faa8e2626ecf5e340 100644 (file)
@@ -42,7 +42,43 @@ qx.Class.define("org.argeo.slc.ria.SlcExecLoggerApplet",
                                        this._reloadLogger();\r
                                },\r
                                command         : null\r
-                       }                       \r
+                       },\r
+                       "opendetail" : {\r
+                               label           : "Logs Detail",\r
+                               icon            : "org.argeo.slc.ria/mime-xls.png",\r
+                               shortcut        : null,\r
+                               enabled         : false,\r
+                               menu            : null,\r
+                               toolbar         : "slc_logs",\r
+                               callback        : function(e){\r
+                                       var selection = this.getViewSelection();\r
+                                       var rowData = selection.getNodes()[0];\r
+                                       this.openDetail(rowData);\r
+                               },\r
+                               selectionChange : function(viewId, selection){\r
+                                       if(viewId != "logger") return;\r
+                                       this.setEnabled((selection!=null && selection.length==1));\r
+                               },\r
+                               command         : null                                  \r
+                       },\r
+                       "reopenrealized" : {\r
+                               label           : "Re-open",\r
+                               icon            : "org.argeo.slc.ria/document-open.png",\r
+                               shortcut        : "Control+o",\r
+                               enabled         : false,\r
+                               menu            : null,\r
+                               toolbar         : "slc_logs",\r
+                               callback        : function(e){\r
+                                       var selection = this.getViewSelection();\r
+                                       var rowData = selection.getNodes()[0];\r
+                                       this.openRealized(rowData);\r
+                               },\r
+                               selectionChange : function(viewId, selection){\r
+                                       if(viewId != "logger") return;\r
+                                       this.setEnabled((selection!=null && selection.length==1));\r
+                               },\r
+                               command         : null\r
+                       }\r
                }\r
        }\r
   },\r
@@ -78,6 +114,188 @@ qx.Class.define("org.argeo.slc.ria.SlcExecLoggerApplet",
                this.UIBus.removeListener("updateSlcExecutionStatus", this._reloadLogger, this);\r
        },\r
                \r
+       openRealized : function(logData){\r
+               \r
+               // DEBUG PURPOSE\r
+               var CHECK_HOST = false;\r
+               \r
+               var uuid = logData[2];\r
+               var host = logData[1];\r
+               \r
+               \r
+               // 1. Check that both associated views are here\r
+               var batchView;\r
+               var flowsView;\r
+               try{\r
+                       batchView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("batch").getContent();\r
+                       flowsView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("selector").getContent();\r
+               }catch(e){\r
+                       this.debug("Cannot find either bath or flows IView!");\r
+               }\r
+               if(!batchView || !flowsView) return;            \r
+               \r
+               // 2. Check that at least a host with the same name exists.\r
+               var agentsMap = flowsView.getAgentsMap();               \r
+               var currentBatchId = batchView.getBatchAgentId();\r
+               if(currentBatchId != null){\r
+                       var currentHost = agentsMap[currentBatchId];\r
+                       if(currentHost != host){\r
+                               this.error("Cannot re-open these flows on a different host. Please clear the batch first.");\r
+                               return;\r
+                       }\r
+               }                               \r
+               if(!qx.lang.Object.contains(agentsMap, host)){\r
+                       this.error("Cannot find any agent running on '"+host+"'! Please start an agent on this host.");\r
+                       return;\r
+               }\r
+               //console.log(currentBatchId);\r
+               if(currentBatchId == null){\r
+                       var defaultId = qx.lang.Object.getKeyFromValue(agentsMap, host);\r
+                       batchView.setBatchAgentId(defaultId);\r
+               }\r
+               \r
+               // 3. Call service to load execution message\r
+               var req = org.argeo.slc.ria.SlcApi.getSlcExecutionService(uuid);\r
+               var handler = function(xmlDoc){                                         \r
+                       var realizedFlows = org.argeo.ria.util.Element.selectNodes(xmlDoc, "slc:slc-execution/slc:realized-flows/slc:realized-flow");\r
+                       for(var i=0;i<realizedFlows.length;i++){                                \r
+                               var newEntrySpec = new org.argeo.slc.ria.execution.BatchEntrySpec(null, null, realizedFlows[i]);\r
+                               batchView.appendBatchEntrySpec(newEntrySpec);\r
+                       }                       \r
+               };\r
+               req.addListener("completed", function(response){                        \r
+                       handler(response.getContent());\r
+               });\r
+               // STUB CASE\r
+               req.addListener("failed", function(){\r
+                       if(!window.xmlExecStub || !window.xmlExecStub[uuid]){                           \r
+                               return;\r
+                       }\r
+                       var xmlDoc = window.xmlExecStub[uuid];\r
+                       handler(xmlDoc);\r
+               });     \r
+               req.send();\r
+       },\r
+       \r
+       openDetail : function(logData){\r
+                               \r
+               var uuid = logData[2];\r
+               var window = new qx.ui.window.Window("Logs Detail", "org.argeo.slc.ria/mime-xls.png");\r
+               window.setLayout(new qx.ui.layout.VBox(0));\r
+               window.setContentPadding(0);            \r
+               window.open();\r
+               org.argeo.ria.components.ViewsManager.getInstance().getApplicationRoot().add(window, {\r
+                       top : '20%',\r
+                       left : '20%',\r
+                       width: '60%',\r
+                       height: '60%'\r
+               });\r
+               \r
+               var tBar = new qx.ui.toolbar.ToolBar();\r
+               window.add(tBar);\r
+               var menuButton = new qx.ui.toolbar.Button("Close", "org.argeo.slc.ria/window-close.png");\r
+               tBar.add(menuButton);\r
+               menuButton.addListener("execute", function(e){\r
+                       window.close();\r
+               });\r
+               \r
+               var tableModel = new qx.ui.table.model.Simple();\r
+               var table = new org.argeo.ria.components.ui.Table(tableModel, {\r
+                       "date":{NAME : "Date", WIDTH:180}, \r
+                       "type":{NAME : "Type", WIDTH:90, ALIGN:"CENTER"}, \r
+                       "log":"Log"\r
+               });\r
+               table.setStatusBarVisible(true);\r
+               window.add(table, {flex:1});\r
+               window.setAllowMinimize(false);\r
+               window.setResizable(true, true, true, true);\r
+               \r
+               tableModel.addListener("dataChanged", function(event){\r
+                       if(!event.getData()) return;\r
+                       var dataMap = event.getData();\r
+                       table.scrollCellVisible(0, dataMap.lastRow);\r
+               });\r
+               \r
+               \r
+               var tA = new qx.ui.container.Composite(new qx.ui.layout.Canvas());              \r
+               tA.setHeight(120);\r
+               \r
+               var textArea = new qx.ui.form.TextArea();               \r
+               tA.add(textArea, {left:0,top:0, right:0,bottom:0});\r
+               \r
+               var okButton = new qx.ui.form.Button("Done");\r
+               okButton.setZIndex(2000);\r
+               tA.add(okButton, {bottom:20,right:20});\r
+               okButton.addListener("execute", function(){\r
+                       tA.setVisibility("excluded");\r
+               });\r
+               \r
+               textArea.setNativeContextMenu(true);\r
+               window.add(tA);\r
+               var cpButton = new qx.ui.toolbar.Button("Copy As Text", "org.argeo.slc.ria/edit-copy.png");\r
+               tBar.add(cpButton);\r
+               cpButton.addListener("execute", function(e){\r
+                       var all = tableModel.getData();\r
+                       var string = "";\r
+                       for(var i=0;i<all.length;i++){\r
+                               for(var j=0;j<all[i].length;j++){\r
+                                       string += all[i][j] + "\t";\r
+                               }\r
+                               string += "\n";\r
+                       }\r
+                       tA.setVisibility("visible");\r
+                       textArea.setValue(string);\r
+                       new qx.util.DeferredCall(function(){\r
+                               textArea.setSelection(0, string.length);\r
+                       }).schedule();                  \r
+               });\r
+               tA.setVisibility("excluded");\r
+               \r
+               \r
+               \r
+               // Call service to load execution message\r
+               this._loadSlcExecution(uuid, tableModel);\r
+               \r
+               var poller = new qx.event.Timer(3000);\r
+               poller.addListener("interval", function(e){\r
+                       this._loadSlcExecution(uuid, tableModel);\r
+               }, this);\r
+               \r
+               window.addListener("close", function(){\r
+                       poller.stop();\r
+               }, this);\r
+               poller.start();\r
+       },      \r
+\r
+       _loadSlcExecution : function(uuid, tableModel){\r
+               var req = org.argeo.slc.ria.SlcApi.getSlcExecutionService(uuid);\r
+               req.addListener("completed", function(response){                        \r
+                       var xmlDoc = response.getContent();\r
+                       var tableLines = [];\r
+                       var parser = org.argeo.ria.util.Element;\r
+                       var slcSteps = parser.selectNodes(xmlDoc, "slc:slc-execution/slc:steps/slc:slc-execution-step");\r
+                       for(var i=0;i<slcSteps.length;i++){                             \r
+                               var step = slcSteps[i];\r
+                               var date = parser.getSingleNodeText(step, "slc:begin");\r
+                               var type = parser.getSingleNodeText(step, "slc:type");\r
+                               var logLines = parser.selectNodes(step, "slc:log-lines/slc:log-line");\r
+                               if(logLines.length > 0){\r
+                                       tableLines.push([date, type, parser.getSingleNodeText(logLines[0], ".")]);\r
+                                       if(logLines.length>1){\r
+                                               for(var j=1;j<logLines.length;j++){\r
+                                                       tableLines.push(["", "", parser.getSingleNodeText(logLines[j], ".")]);  \r
+                                               }\r
+                                       }\r
+                               }else{\r
+                                       tableLines.push([date, type, ""]);\r
+                               }\r
+                       }\r
+                       tableModel.setData(tableLines);\r
+               });\r
+               req.send();\r
+               \r
+       },\r
+       \r
        /**\r
         * Creates the applet layout\r
         */\r
@@ -89,16 +307,22 @@ qx.Class.define("org.argeo.slc.ria.SlcExecLoggerApplet",
                                return new qx.ui.table.columnmodel.Resize(obj)\r
                        }\r
                });\r
-               this.logPane.setDecorator(null);\r
-               this._initLogger();\r
-               this.add(this.logPane, {edge:'center'});\r
-       },\r
-       \r
-       /**\r
-        * Initialize the log table.\r
-        */\r
-       _initLogger : function(){\r
-               this.logPane.set({              \r
+               this.logPane.addListener("cellDblclick", function(e){\r
+                       this.getCommands()["opendetail"].command.execute();\r
+               }, this);\r
+               \r
+               var selectionModel = this.logPane.getSelectionModel();\r
+               selectionModel.addListener("changeSelection", function(e){                      \r
+                       var viewSelection = this.getViewSelection();                    \r
+                       viewSelection.setViewId("logger");                      \r
+                       viewSelection.clear();                  \r
+                       selectionModel.iterateSelection(function(index){                                \r
+                               viewSelection.addNode(this.logModel.getRowData(index));\r
+                       }, this);\r
+               }, this);\r
+               \r
+               this.logPane.set({      \r
+                       decorator : null,\r
                        statusBarVisible: false,\r
                        showCellFocusIndicator:false\r
                });\r
@@ -106,6 +330,8 @@ qx.Class.define("org.argeo.slc.ria.SlcExecLoggerApplet",
                columnModel.getBehavior().setWidth(0, "30%");\r
                columnModel.getBehavior().setWidth(1, "15%");\r
                columnModel.getBehavior().setWidth(3, "12%");           \r
+               \r
+               this.add(this.logPane, {edge:'center'});\r
        },\r
        \r
        /**\r
@@ -124,6 +350,7 @@ qx.Class.define("org.argeo.slc.ria.SlcExecLoggerApplet",
                                        [slcExec.getDate(), slcExec.getHost(), slcExec.getUuid(), slcExec.getStatus()]\r
                                ]);                             \r
                        }\r
+                       this.logModel.sortByColumn(0, false);\r
                }, this);\r
                request.send();         \r
        }\r