--- /dev/null
+/**\r
+ * IPerspective Implementation : Horizontal split pane defining two panes, "list" and "applet".\r
+ */\r
+ \r
+/* ************************************************************************\r
+\r
+#asset(argeo-ria-lib/slc/resource/org.argeo.slc.ria/*)\r
+\r
+************************************************************************ */ \r
+qx.Class.define("org.argeo.slc.web.MonitorPerspective",\r
+{\r
+ extend : qx.core.Object,\r
+ implement : [org.argeo.ria.components.IPerspective], \r
+ \r
+ construct : function(){\r
+ this.base(arguments);\r
+ org.argeo.ria.util.Element.DEFAULT_NAMESPACE_MAP = {slc:"http://argeo.org/projects/slc/schemas"};\r
+ },\r
+ \r
+ statics : {\r
+ LABEL : "SLC Monitoring",\r
+ ICON : "ria/system-run.png"\r
+ },\r
+ \r
+ members : {\r
+ _splitPane : null, \r
+ \r
+ initViewPanes : function(viewsManager){\r
+ \r
+ this._splitPane = new qx.ui.splitpane.Pane("horizontal");\r
+ \r
+ this._secondSplitPane = new qx.ui.splitpane.Pane("vertical");\r
+ this._splitPane.add(this._secondSplitPane, 0);\r
+ \r
+ var topLeft = new org.argeo.ria.components.ViewPane("selector", "Fows and Modules");\r
+ topLeft.set({width:300, height:400});\r
+ viewsManager.registerViewPane(topLeft);\r
+ this._secondSplitPane.add(topLeft, 0);\r
+ this._secondSplitPane.setDecorator(null);\r
+ \r
+ var bottomLeft = new org.argeo.ria.components.ViewPane("properties", "Properties"); \r
+ viewsManager.registerViewPane(bottomLeft);\r
+ this._secondSplitPane.add(bottomLeft, 1);\r
+ \r
+ var rightPane = new org.argeo.ria.components.TabbedViewPane("applet", "Detail"); \r
+ viewsManager.registerViewPane(rightPane);\r
+ \r
+ \r
+ \r
+ \r
+ this._splitPane.add(rightPane, 1);\r
+ \r
+ viewsManager.getViewPanesContainer().add(this._splitPane, {flex:1});\r
+ \r
+ },\r
+ \r
+ initViews : function(viewsManager){\r
+ var view = viewsManager.initIViewClass(org.argeo.slc.ria.monitor.FlowsSelectorView, "selector");\r
+ view.load();\r
+ var pView = viewsManager.initIViewClass(org.argeo.slc.ria.monitor.PropertiesView, "properties");\r
+ pView.load();\r
+ },\r
+ \r
+ remove : function(viewsManager){\r
+ viewsManager.getViewPanesContainer().remove(this._splitPane); \r
+ }\r
+ \r
+ }\r
+\r
+});
\ No newline at end of file
--- /dev/null
+/**\r
+ * The selector view\r
+ * \r
+ */\r
+qx.Class.define("org.argeo.slc.ria.monitor.FlowsSelectorView", {\r
+ extend : org.argeo.slc.ria.FlowsSelectorView,\r
+ implement : [org.argeo.ria.components.IView],\r
+\r
+ construct : function() {\r
+ this.base(arguments);\r
+ },\r
+\r
+ properties : {\r
+ /**\r
+ * Commands definition, see\r
+ * {@link org.argeo.ria.event.CommandsManager#definitions}\r
+ */\r
+ commands : {\r
+ refine : true,\r
+ init : {\r
+ "reloadtree" : {\r
+ label : "Reload",\r
+ icon : "org.argeo.slc.ria/view-refresh.png",\r
+ shortcut : "Control+m",\r
+ enabled : false,\r
+ menu : "Launcher",\r
+ toolbar : "launcher",\r
+ callback : function(e) {\r
+ if (this.tree.isSelectionEmpty()) { return; } \r
+ var selected = this.tree.getSelection()[0];\r
+ if (selected.classname == "org.argeo.ria.components.DynamicTreeFolder") {\r
+ if (selected.getUserData("moduleData")) {\r
+ // It's a "module" node, first trigger the\r
+ // reloadBundle.service\r
+ selected.setUserData("dataModel", {});\r
+ selected.setEnabled(false);\r
+ selected.setOpen(false);\r
+ var moduleData = selected\r
+ .getUserData("moduleData");\r
+ var bundleService = org.argeo.slc.ria.SlcApi\r
+ .getReloadBundleService(\r
+ moduleData.name,\r
+ moduleData.version);\r
+ bundleService.addListener("completed",\r
+ function(response) {\r
+ selected.setEnabled(true);\r
+ selected.setOpen(true);\r
+ selected.reload();\r
+ }, this);\r
+ // bundleService.send();\r
+ // Do not send, not implemented yet, false timer\r
+ // instead.\r
+ qx.event.Timer.once(function(response) {\r
+ selected.setEnabled(true);\r
+ selected.setOpen(true);\r
+ selected.reload();\r
+ }, this, 2000);\r
+ } else {\r
+ selected.reload();\r
+ }\r
+ }\r
+ },\r
+ selectionChange : function(viewId, selection) {\r
+ if (viewId != "form:tree")\r
+ return;\r
+ if (!selection)\r
+ return;\r
+ if (selection.length > 1) {\r
+ this.setEnabled(false);\r
+ return;\r
+ }\r
+ var item = selection[0];\r
+ if (!qx.Class.isSubClassOf(qx.Class\r
+ .getByName(item.classname),\r
+ qx.ui.tree.AbstractTreeItem))\r
+ return;\r
+ this.setEnabled(false);\r
+ if (qx.Class.isSubClassOf(qx.Class\r
+ .getByName(item.classname),\r
+ org.argeo.ria.components.DynamicTreeFolder)) {\r
+ this.setEnabled(true);\r
+ }\r
+ },\r
+ command : null\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ statics : {\r
+ /**\r
+ * Static loader for the "agent" level (first level)\r
+ * \r
+ * @param folder\r
+ * {org.argeo.ria.components.PersistentTreeFolder} The root Tree Folder.\r
+ */\r
+ agentLoader : function(folder) {\r
+\r
+ var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents"); \r
+ var agents = {};\r
+ if(folder.getState() == "loaded" && folder.getUserData("agentsMap")){\r
+ // Diff loading, just add new nodes.\r
+ agents = folder.getUserData("agentsMap");\r
+ var newAgents = {};\r
+ }\r
+ req.addListener("completed", function(response) {\r
+ var xmlDoc = response.getContent();\r
+ var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc,\r
+ "//slc:slc-agent-descriptor");\r
+ var modulesLoader = org.argeo.slc.ria.FlowsSelectorView.modulesLoader;\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");\r
+ var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");\r
+ if(agents[uuid]){\r
+ newAgents[uuid] = host;\r
+ continue;\r
+ }\r
+ agents[uuid] = host;\r
+ if(newAgents) newAgents[uuid] = host;\r
+ var agentFolder = new org.argeo.ria.components.DynamicTreeFolder(\r
+ host + ' (' + uuid + ')', modulesLoader,\r
+ "Loading Modules...", folder.getDragData());\r
+ agentFolder.setUserData("agentUuid", uuid);\r
+ agentFolder.setIcon("org.argeo.slc.ria/mime-xsl-22.png");\r
+ folder.add(agentFolder);\r
+ }\r
+ if(newAgents){\r
+ // Make sure some agents should not be removed\r
+ for(var agentKey in agents){\r
+ if(!newAgents[agentKey]){\r
+ var node = org.argeo.slc.ria.FlowsSelectorView.findAgentNodeById(folder, agentKey);\r
+ if(node) folder.remove(node);\r
+ delete agents[agentKey];\r
+ var batchView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("batch").getContent();\r
+ if(batchView) batchView.clearBatchForAgentId(agentKey);\r
+ }\r
+ }\r
+ }\r
+ folder.setUserData("agentsMap", agents);\r
+ folder.setLoaded(true);\r
+ folder.getTree().fireEvent("changeSelection"); \r
+ });\r
+ req.addListener("failed", function(response) {\r
+ folder.setLoaded(true);\r
+ });\r
+ req.send();\r
+\r
+ },\r
+\r
+ /**\r
+ * Loader for the "modules" level : takes any tree folder, currently the\r
+ * root folder.\r
+ * \r
+ * @param folder\r
+ * {org.argeo.ria.components.PersistentTreeFolder} The root folder\r
+ */\r
+ modulesLoader : function(folder) {\r
+ var agentId = folder.getUserData("agentUuid");\r
+ var req = org.argeo.slc.ria.SlcApi.getListModulesService(agentId);\r
+ req.addListener("completed", function(response) {\r
+ var descriptors = org.argeo.ria.util.Element.selectNodes(\r
+ response.getContent(),\r
+ "slc:object-list/slc:execution-module-descriptor");\r
+ var mods = {};\r
+ for (var i = 0; i < descriptors.length; i++) {\r
+ var name = org.argeo.ria.util.Element.getSingleNodeText(\r
+ descriptors[i], "slc:name");\r
+ var version = org.argeo.ria.util.Element.getSingleNodeText(\r
+ descriptors[i], "slc:version");\r
+ if (!mods[name])\r
+ mods[name] = [];\r
+ mods[name].push(version);\r
+ }\r
+ var flowLoader = org.argeo.slc.ria.FlowsSelectorView.flowLoader;\r
+ for (var key in mods) {\r
+ for (var i = 0; i < mods[key].length; i++) {\r
+ var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(\r
+ key + ' (' + mods[key][i] + ')', flowLoader,\r
+ "Loading Flows", folder.getDragData());\r
+ versionFolder.setUserData("moduleData", {\r
+ name : key,\r
+ version : mods[key][i]\r
+ });\r
+ versionFolder.setUserData("agentUuid", agentId);\r
+ // Warning, we must add it AFTER setting the user data, \r
+ // because of the persistent loading mechanism.\r
+ folder.add(versionFolder);\r
+ }\r
+ }\r
+ folder.setLoaded(true);\r
+ folder.getTree().fireEvent("changeSelection");\r
+ });\r
+ req.addListener("failed", function(response) {\r
+ folder.setLoaded(true);\r
+ });\r
+ req.send();\r
+ },\r
+\r
+ /**\r
+ * Loader for the "flow" level : takes a folder containing "moduleData"\r
+ * and create its children.\r
+ * \r
+ * @param folder\r
+ * {org.argeo.ria.components.PersistentTreeFolder} A Tree folder containing in the\r
+ * key "moduleData" of its user data a map containing the\r
+ * keys {name,version}\r
+ */\r
+ flowLoader : function(folder) {\r
+ var moduleData = folder.getUserData("moduleData");\r
+ var agentUuid = folder.getUserData("agentUuid");\r
+\r
+ var req = org.argeo.slc.ria.SlcApi\r
+ .getLoadExecutionDescriptorService(agentUuid,\r
+ moduleData.name, moduleData.version);\r
+ req.addListener("completed", function(response) {\r
+ var executionModule = new org.argeo.slc.ria.execution.Module();\r
+ try {\r
+ executionModule.setXmlNode(response.getContent());\r
+ } catch (e) {\r
+ this.error(e);\r
+ }\r
+ var execFlows = executionModule.getExecutionFlows();\r
+ for (var key in execFlows) {\r
+ var file = new qx.ui.tree.TreeFile(key);\r
+ var path = execFlows[key].getPath();\r
+ file.setUserData("executionModule", executionModule);\r
+ file.setUserData("executionFlow", execFlows[key]);\r
+ file.setUserData("agentUuid", agentUuid);\r
+ org.argeo.slc.ria.FlowsSelectorView.attachNodeByPath(folder, path, file, {\r
+ agentUuid : folder.getUserData("agentUuid")\r
+ });\r
+ folder.appendDragData(file);\r
+ }\r
+ folder.setLoaded(true);\r
+ folder.getTree().fireEvent("changeSelection");\r
+ });\r
+ req.addListener("failed", function(response) {\r
+ folder.setLoaded(true);\r
+ });\r
+ req.send();\r
+ } \r
+ },\r
+\r
+ members : {\r
+ \r
+ /**\r
+ * \r
+ */\r
+ load : function() {\r
+ this._createLayout();\r
+ this.UIBus.addListener("agentRegistered", this._addAgentHandler, this);\r
+ this.UIBus.addListener("agentUnregistered", this._removeAgentHandler, this);\r
+ }, \r
+\r
+ /**\r
+ * Creates the main applet layout.\r
+ */\r
+ _createLayout : function() {\r
+\r
+ this.tree = new qx.ui.tree.Tree();\r
+ this.tree.setDecorator(null);\r
+ this.tree.setSelectionMode("multi");\r
+\r
+ this.rootNode = new org.argeo.ria.components.DynamicTreeFolder(\r
+ "Tests", this.self(arguments).agentLoader,\r
+ "Loading Agents");\r
+ this.tree.setRoot(this.rootNode);\r
+ this.rootNode.setPersistentTreeID("org.argeo.slc.ria.monitor.FlowsSelector")\r
+ this.rootNode.setOpen(true);\r
+ this.tree.setContextMenu(org.argeo.ria.event.CommandsManager\r
+ .getInstance().createMenuFromIds(["reloadtree"]));\r
+\r
+ this.tree.addListener("changeSelection", function(e) {\r
+ var viewSelection = this.getViewSelection();\r
+ viewSelection.setViewId("form:tree");\r
+ viewSelection.clear();\r
+ var sel = this.tree.getSortedSelection();\r
+ for (var i = 0; i < sel.length; i++) {\r
+ viewSelection.addNode(sel[i]);\r
+ }\r
+ if(sel && sel[0]){\r
+ var propViewPane = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("properties");\r
+ propViewPane.getContent().updateData(sel[0]);\r
+ }\r
+ }, this);\r
+\r
+\r
+ this.add(this.tree);\r
+ } \r
+ }\r
+});
\ No newline at end of file