]> git.argeo.org Git - gpl/argeo-slc.git/blob - FlowsSelectorView.js
46cf61e15a0572ece1fa16a049d288791bea545e
[gpl/argeo-slc.git] / FlowsSelectorView.js
1 /**
2 * The selector view
3 *
4 */
5 qx.Class.define("org.argeo.slc.ria.monitor.FlowsSelectorView", {
6 extend : org.argeo.slc.ria.FlowsSelectorView,
7 implement : [org.argeo.ria.components.IView],
8
9 construct : function() {
10 this.base(arguments);
11 },
12
13 properties : {
14 /**
15 * Commands definition, see
16 * {@link org.argeo.ria.event.CommandsManager#definitions}
17 */
18 commands : {
19 refine : true,
20 init : {
21 "reloadtree" : {
22 label : "Reload",
23 icon : "org.argeo.slc.ria/view-refresh.png",
24 shortcut : "Control+m",
25 enabled : false,
26 menu : "Launcher",
27 toolbar : "launcher",
28 callback : function(e) {
29 if (this.tree.isSelectionEmpty()) { return; }
30 var selected = this.tree.getSelection()[0];
31 if (selected.classname == "org.argeo.ria.components.DynamicTreeFolder") {
32 if (selected.getUserData("moduleData")) {
33 // It's a "module" node, first trigger the
34 // reloadBundle.service
35 selected.setUserData("dataModel", {});
36 selected.setEnabled(false);
37 selected.setOpen(false);
38 var moduleData = selected
39 .getUserData("moduleData");
40 var bundleService = org.argeo.slc.ria.SlcApi
41 .getReloadBundleService(
42 moduleData.name,
43 moduleData.version);
44 bundleService.addListener("completed",
45 function(response) {
46 selected.setEnabled(true);
47 selected.setOpen(true);
48 selected.reload();
49 }, this);
50 // bundleService.send();
51 // Do not send, not implemented yet, false timer
52 // instead.
53 qx.event.Timer.once(function(response) {
54 selected.setEnabled(true);
55 selected.setOpen(true);
56 selected.reload();
57 }, this, 2000);
58 } else {
59 selected.reload();
60 }
61 }
62 },
63 selectionChange : function(viewId, selection) {
64 if (viewId != "form:tree")
65 return;
66 if (!selection)
67 return;
68 if (selection.length > 1) {
69 this.setEnabled(false);
70 return;
71 }
72 var item = selection[0];
73 if (!qx.Class.isSubClassOf(qx.Class
74 .getByName(item.classname),
75 qx.ui.tree.AbstractTreeItem))
76 return;
77 this.setEnabled(false);
78 if (qx.Class.isSubClassOf(qx.Class
79 .getByName(item.classname),
80 org.argeo.ria.components.DynamicTreeFolder)) {
81 this.setEnabled(true);
82 }
83 },
84 command : null
85 }
86 }
87 }
88 },
89
90 statics : {
91 /**
92 * Static loader for the "agent" level (first level)
93 *
94 * @param folder
95 * {org.argeo.ria.components.PersistentTreeFolder} The root Tree Folder.
96 */
97 agentLoader : function(folder) {
98
99 var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents");
100 var agents = {};
101 if(folder.getState() == "loaded" && folder.getUserData("agentsMap")){
102 // Diff loading, just add new nodes.
103 agents = folder.getUserData("agentsMap");
104 var newAgents = {};
105 }
106 req.addListener("completed", function(response) {
107 var xmlDoc = response.getContent();
108 var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc,
109 "//slc:slc-agent-descriptor");
110 var modulesLoader = org.argeo.slc.ria.FlowsSelectorView.modulesLoader;
111
112 for (var i = 0; i < nodes.length; i++) {
113 var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
114 var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
115 if(agents[uuid]){
116 newAgents[uuid] = host;
117 continue;
118 }
119 agents[uuid] = host;
120 if(newAgents) newAgents[uuid] = host;
121 var agentFolder = new org.argeo.ria.components.DynamicTreeFolder(
122 host + ' (' + uuid + ')', modulesLoader,
123 "Loading Modules...", folder.getDragData());
124 agentFolder.setUserData("agentUuid", uuid);
125 agentFolder.setIcon("org.argeo.slc.ria/mime-xsl-22.png");
126 folder.add(agentFolder);
127 }
128 if(newAgents){
129 // Make sure some agents should not be removed
130 for(var agentKey in agents){
131 if(!newAgents[agentKey]){
132 var node = org.argeo.slc.ria.FlowsSelectorView.findAgentNodeById(folder, agentKey);
133 if(node) folder.remove(node);
134 delete agents[agentKey];
135 var batchView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("batch").getContent();
136 if(batchView) batchView.clearBatchForAgentId(agentKey);
137 }
138 }
139 }
140 folder.setUserData("agentsMap", agents);
141 folder.setLoaded(true);
142 folder.getTree().fireEvent("changeSelection");
143 });
144 req.addListener("failed", function(response) {
145 folder.setLoaded(true);
146 });
147 req.send();
148
149 },
150
151 /**
152 * Loader for the "modules" level : takes any tree folder, currently the
153 * root folder.
154 *
155 * @param folder
156 * {org.argeo.ria.components.PersistentTreeFolder} The root folder
157 */
158 modulesLoader : function(folder) {
159 var agentId = folder.getUserData("agentUuid");
160 var req = org.argeo.slc.ria.SlcApi.getListModulesService(agentId);
161 req.addListener("completed", function(response) {
162 var descriptors = org.argeo.ria.util.Element.selectNodes(
163 response.getContent(),
164 "slc:object-list/slc:execution-module-descriptor");
165 var mods = {};
166 for (var i = 0; i < descriptors.length; i++) {
167 var name = org.argeo.ria.util.Element.getSingleNodeText(
168 descriptors[i], "slc:name");
169 var version = org.argeo.ria.util.Element.getSingleNodeText(
170 descriptors[i], "slc:version");
171 if (!mods[name])
172 mods[name] = [];
173 mods[name].push(version);
174 }
175 var flowLoader = org.argeo.slc.ria.FlowsSelectorView.flowLoader;
176 for (var key in mods) {
177 for (var i = 0; i < mods[key].length; i++) {
178 var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(
179 key + ' (' + mods[key][i] + ')', flowLoader,
180 "Loading Flows", folder.getDragData());
181 versionFolder.setUserData("moduleData", {
182 name : key,
183 version : mods[key][i]
184 });
185 versionFolder.setUserData("agentUuid", agentId);
186 // Warning, we must add it AFTER setting the user data,
187 // because of the persistent loading mechanism.
188 folder.add(versionFolder);
189 }
190 }
191 folder.setLoaded(true);
192 folder.getTree().fireEvent("changeSelection");
193 });
194 req.addListener("failed", function(response) {
195 folder.setLoaded(true);
196 });
197 req.send();
198 },
199
200 /**
201 * Loader for the "flow" level : takes a folder containing "moduleData"
202 * and create its children.
203 *
204 * @param folder
205 * {org.argeo.ria.components.PersistentTreeFolder} A Tree folder containing in the
206 * key "moduleData" of its user data a map containing the
207 * keys {name,version}
208 */
209 flowLoader : function(folder) {
210 var moduleData = folder.getUserData("moduleData");
211 var agentUuid = folder.getUserData("agentUuid");
212
213 var req = org.argeo.slc.ria.SlcApi
214 .getLoadExecutionDescriptorService(agentUuid,
215 moduleData.name, moduleData.version);
216 req.addListener("completed", function(response) {
217 var executionModule = new org.argeo.slc.ria.execution.Module();
218 try {
219 executionModule.setXmlNode(response.getContent());
220 } catch (e) {
221 this.error(e);
222 }
223 var execFlows = executionModule.getExecutionFlows();
224 for (var key in execFlows) {
225 var file = new qx.ui.tree.TreeFile(key);
226 var path = execFlows[key].getPath();
227 file.setUserData("executionModule", executionModule);
228 file.setUserData("executionFlow", execFlows[key]);
229 file.setUserData("agentUuid", agentUuid);
230 org.argeo.slc.ria.FlowsSelectorView.attachNodeByPath(folder, path, file, {
231 agentUuid : folder.getUserData("agentUuid")
232 });
233 folder.appendDragData(file);
234 }
235 folder.setLoaded(true);
236 folder.getTree().fireEvent("changeSelection");
237 });
238 req.addListener("failed", function(response) {
239 folder.setLoaded(true);
240 });
241 req.send();
242 }
243 },
244
245 members : {
246
247 /**
248 *
249 */
250 load : function() {
251 this._createLayout();
252 this.UIBus.addListener("agentRegistered", this._addAgentHandler, this);
253 this.UIBus.addListener("agentUnregistered", this._removeAgentHandler, this);
254 },
255
256 /**
257 * Creates the main applet layout.
258 */
259 _createLayout : function() {
260
261 this.tree = new qx.ui.tree.Tree();
262 this.tree.setDecorator(null);
263 this.tree.setSelectionMode("multi");
264
265 this.rootNode = new org.argeo.ria.components.DynamicTreeFolder(
266 "Tests", this.self(arguments).agentLoader,
267 "Loading Agents");
268 this.tree.setRoot(this.rootNode);
269 this.rootNode.setPersistentTreeID("org.argeo.slc.ria.monitor.FlowsSelector")
270 this.rootNode.setOpen(true);
271 this.tree.setContextMenu(org.argeo.ria.event.CommandsManager
272 .getInstance().createMenuFromIds(["reloadtree"]));
273
274 this.tree.addListener("changeSelection", function(e) {
275 var viewSelection = this.getViewSelection();
276 viewSelection.setViewId("form:tree");
277 viewSelection.clear();
278 var sel = this.tree.getSortedSelection();
279 for (var i = 0; i < sel.length; i++) {
280 viewSelection.addNode(sel[i]);
281 }
282 if(sel && sel[0]){
283 var propViewPane = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("properties");
284 propViewPane.getContent().updateData(sel[0]);
285 }
286 }, this);
287
288
289 this.add(this.tree);
290 }
291 }
292 });