]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js
Path implementation
[gpl/argeo-slc.git] / org.argeo.slc.webapp / src / main / webapp / argeo-ria-lib / slc / class / org / argeo / slc / ria / NewLauncherApplet.js
index d91a4a98d2b8be68c8070190adb048ba6ddff018..640712e9afc362c883773fa287068aaf379db325 100644 (file)
@@ -25,7 +25,10 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                check:"org.argeo.ria.components.ViewSelection"
        },              
        instanceId : {init:""},
-       instanceLabel : {init:""},  
+       instanceLabel : {init:""},
+       /**
+        * A boolean registering whether the SpecEditor must autoOpen or not when a spec is added to the Batch. 
+        */
        autoOpen : {
                init : true,
                check : "Boolean"
@@ -155,7 +158,28 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                                callback        : function(e){
                                        var selected = this.tree.getSelectedItem();
                                        if(selected.classname == "org.argeo.ria.components.DynamicTreeFolder"){
-                                               selected.reload();
+                                               if(selected.getUserData("moduleData")){
+                                                       // It's a "module" node, first trigger the reloadBundle.service
+                                                       selected.setUserData("dataModel", {});
+                                                       selected.setEnabled(false);
+                                                       selected.setOpen(false);
+                                                       var moduleData = selected.getUserData("moduleData");
+                                                       var bundleService = org.argeo.slc.ria.SlcApi.getReloadBundleService(moduleData.name, moduleData.version);
+                                                       bundleService.addListener("completed", function(response){
+                                                               selected.setEnabled(true);
+                                                               selected.setOpen(true);
+                                                               selected.reload();
+                                                       }, this);
+                                                       //bundleService.send();
+                                                       //Do not send, not implemented yet, false timer instead.
+                                                       qx.event.Timer.once(function(response){
+                                                               selected.setEnabled(true);
+                                                               selected.setOpen(true);
+                                                               selected.reload();
+                                                       }, this, 2000);
+                                               }else{
+                                                       selected.reload();
+                                               }
                                        }
                                },  
                                selectionChange : function(viewId, selection){
@@ -183,53 +207,100 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
   },
 
   statics : {
+       /**
+        * Loader for the "flow" level : takes a folder containing "moduleData" and create its children. 
+        * @param folder {qx.ui.tree.TreeFolder} A Tree folder containing in the key "moduleData" of its user data a map containing the keys {name,version} 
+        */
        flowLoader : function(folder){
-               var moduleData = folder.getUserData("moduleData");
-               var req = org.argeo.ria.remote.RequestManager.getInstance().getRequest("../argeo-ria-src/stub.xml", "GET", "application/xml");
+               var moduleData = folder.getUserData("moduleData");              
+               //var pathStub = ["", "/test/toto/zobi", "loop"];
+               //var indexStub = 0;
+               
+               var req = org.argeo.slc.ria.SlcApi.getLoadExecutionDescriptorService(moduleData.name, moduleData.version);
                req.addListener("completed", function(response){
                        var executionModule = new org.argeo.slc.ria.execution.Module();                                         
                        executionModule.setXmlNode(response.getContent());
-                       //
-                       // ARTIFIALLY REPLACE MODULE NAME / VERSION, FOR TESTS PURPOSES
-                       //
-                       executionModule.setName(moduleData.name);
-                       executionModule.setVersion(moduleData.version);
-                       // END
                        var execFlows = executionModule.getExecutionFlows();
                        for(var key in execFlows){
                                var file = new qx.ui.tree.TreeFile(key);
+                               var path = execFlows[key].getPath();
+                               //path = pathStub[indexStub];
+                               //indexStub ++;
                                file.setUserData("executionModule", executionModule);
                                file.setUserData("executionFlow", execFlows[key]);
-                               folder.add(file);
+                               org.argeo.slc.ria.NewLauncherApplet.attachNodeByPath(folder, path, file);
+                               folder.appendDragData(file);
                        }
                        folder.setLoaded(true);
                });
                req.send();             
        },
        
+       /**
+        * Loader for the "modules" level : takes any tree folder, currently the root folder. 
+        * @param folder {qx.ui.tree.TreeFolder} The root folder
+        */
        modulesLoader : function(folder){
-               // Call service, and parse
-               var mods = {
-                       "Module 1":["ver1.1", "ver1.2", "ver1.3"], 
-                       "Module 2":["ver2.1", "ver2.2", "ver2.3", "ver2.4"], 
-                       "Module 3":["ver3.1", "ver3.2"]
-               };
-               var flowLoader = org.argeo.slc.ria.NewLauncherApplet.flowLoader;
-               for(var key in mods){
-                       var moduleFolder = new qx.ui.tree.TreeFolder(key);
-                       folder.add(moduleFolder);
-                       for(var i=0;i<mods[key].length;i++){
-                               var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(
-                                       mods[key][i],
-                                       flowLoader,
-                                       "Loading Flows",
-                                       folder.getDragData()
-                               );
-                               moduleFolder.add(versionFolder);
-                               versionFolder.setUserData("moduleData", {name:key, version:mods[key][i]});
+               var req = org.argeo.slc.ria.SlcApi.getListModulesService();
+               req.addListener("completed", function(response){
+                       var descriptors = org.argeo.ria.util.Element.selectNodes(response.getContent(), "slc:object-list/slc:execution-module-descriptor");
+                       var mods = {};
+                       for(var i=0;i<descriptors.length; i++){
+                               var name = org.argeo.ria.util.Element.getSingleNodeText(descriptors[i], "slc:name");
+                               var version = org.argeo.ria.util.Element.getSingleNodeText(descriptors[i], "slc:version");
+                               if(!mods[name]) mods[name] = [];
+                               mods[name].push(version);
+                       }
+                       var flowLoader = org.argeo.slc.ria.NewLauncherApplet.flowLoader;
+                       for(var key in mods){
+                               for(var i=0;i<mods[key].length;i++){
+                                       var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(
+                                               key + ' ('+mods[key][i]+')',
+                                               flowLoader,
+                                               "Loading Flows",
+                                               folder.getDragData()
+                                       );
+                                       folder.add(versionFolder);
+                                       versionFolder.setUserData("moduleData", {name:key, version:mods[key][i]});
+                               }
+                               folder.setLoaded(true);
+                       }
+               });
+               req.send();             
+       },
+       
+       /**
+        * Parse a string path and search if there is a root node.
+        * @param rootNode {qx.ui.tree.AbstractTreeItem} The parent node (containing data model)
+        * @param path {String} The path of the node to attach.
+        */
+       attachNodeByPath : function(rootNode, path, childNode){
+               if(!path || path=="" || path == "/" ){
+                       rootNode.add(childNode);
+                       return;
+               }
+               var model = rootNode.getUserData("dataModel");
+               if(!model){
+                       model = {};
+                       rootNode.setUserData("dataModel", model);
+               }
+               var parts = path.split("/");            
+               var keys = qx.lang.Object.getKeys(model);
+               var crtPath = "/";
+               var crtFolder = rootNode;
+               for(var i=0;i<parts.length;i++){
+                       if(parts[i] == "") continue;
+                       crtPath += parts[i];
+                       if(!model[parts[i]]) {
+                               var virtualFolder = new qx.ui.tree.TreeFolder(parts[i]);
+                               model[parts[i]] = virtualFolder;
+                               crtFolder.add(virtualFolder);
+                               crtFolder = virtualFolder;
+                       }else{
+                               crtFolder = model[parts[i]];
                        }
-                       folder.setLoaded(true);
                }
+               crtFolder.add(childNode);
        }
   },
   
@@ -243,6 +314,7 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                this.setView(viewPane);
                this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
                this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
+               this._amqClient.uri = "/org.argeo.slc.webapp/amq";
                this._amqClient.startPolling();
        },
        
@@ -276,11 +348,7 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                }
                this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
                this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
-               reloadHandler();
-               
-               this._amqClient.addListener("modulesResponse", "modulesManager.response", function(message){
-                       this.info(message);
-               }, this);               
+               reloadHandler();                
        },
         
        addScroll : function(){
@@ -418,9 +486,14 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                splitPane.add(this.tree, 0);
                splitPane.add(this.listPane, 1);                
        },
-               
+       
+       /**
+        * Adds a given ExecutionFlow to the batch
+        * @param target {mixed} The dropped target, can be a TreeFile (add) or a ListItem (reorder).
+        * @param after {qx.ui.form.ListItem} Optional list item : if set, the flow will be added as a new list item positionned after this one. 
+        */
        _addFlowToBatch : function(target, after){
-               this.debug(target);
+               //this.debug(target);
                if(!target){
                         target = this.tree.getSelectedItem();
                         if(!target) return;
@@ -436,6 +509,9 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                var label = batchEntry.getLabel();
                var icon = target.getIcon();
                var item = new qx.ui.form.ListItem(label, icon);
+               item.addListener("dblclick", function(e){
+                       this.getCommands()["editexecutionspecs"].command.execute();
+               }, this);
                item.setUserData("batchEntrySpec", batchEntry);
                item.setPaddingTop(1);
                item.setPaddingBottom(2);
@@ -473,75 +549,23 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                if(menu.length) command.setEnabled(true);
        },
                
-       currentBatchToXml : function(){
-               var selection = this.list.getChildren();
-               var xmlString = "";
-               for(var i=0;i<selection.length;i++){
-                       var batchEntrySpec = selection[i].getUserData("batchEntrySpec");
-                       xmlString += batchEntrySpec.toXml();
-               }
-               return xmlString;
-       },
-       
-       executeBatchOnAgent : function(agentUuid){
-               var xmlString = agentUuid + this.currentBatchToXml();
-               alert(xmlString);
-       },
        
        /**
-        * Make an SlcExecutionMessage from the currently displayed form.
-        * @param crtPartId {String} The form part currently displayed
-        * @param slcExec {org.argeo.slc.ria.SlcExecutionMessage} The message to fill.
-        * @param fields {Map} The fields of the form
-        * @param hiddenFields {Map} The hidden ones 
-        * @param freeFields {Array} The free fields.
+        * Called at execution
+        * @param agentUuid {String} The id of the target agent
         */
-       _prepareSlcExecutionMessage : function(crtPartId, slcExec, fields, hiddenFields, freeFields){
-               if(crtPartId == "standard"){
-                       slcExec.setStatus(fields.status.getValue());            
-                       slcExec.setHost(fields.host.getValue());
-                       slcExec.setUser(fields.user.getValue());
-               }else{
-                       slcExec.addAttribute("ant.file", fields["ant.file"].getValue());
-               }
-               for(var i=0;i<freeFields.length;i++){
-                       var fF = freeFields[i];
-                       if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
-                               slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
-                       }
+       executeBatchOnAgent : function(agentUuid){
+               var selection = this.list.getChildren();
+               if(!selection.length) return;
+               var slcExecMessage = new org.argeo.slc.ria.execution.Message();
+               for(var i=0;i<selection.length;i++){
+                       var batchEntrySpec = selection[i].getUserData("batchEntrySpec");
+                       slcExecMessage.addBatchEntrySpec(batchEntrySpec);
                }               
-       },
-       
-       /**
-        * Called when the user clicks the "Execute" button.
-        */
-       submitForm : function(){
-               var currentUuid = this.agentSelector.getValue();
-               if(!currentUuid) return;
-               var slcExec = new org.argeo.slc.ria.SlcExecutionMessage();
-               
-               var fields = {};
-               var hiddenFields = {};
-               var freeFields = {};
-               var crtPartId = "";
-               if(this.parts){
-                       if(this.partChooser){
-                               crtPartId = this.partChooser.getValue();
-                       }else{
-                               crtPartId = qx.lang.Object.getKeys(this.parts)[0];
-                       }
-                       var crtPart = this.parts[crtPartId];
-                       fields = crtPart.fields;
-                       hiddenFields = crtPart.hiddenFields;
-                       freeFields = crtPart.freeFields;
-               }
-               
-               this._prepareSlcExecutionMessage(crtPartId, slcExec, fields, hiddenFields, freeFields);
-                               
                this._amqClient.sendMessage(
                        "topic://agent.newExecution", 
-                       slcExec.toXml(), 
-                       {"slc-agentId":currentUuid}
+                       slcExecMessage.toXml(), 
+                       {"slc-agentId":agentUuid}
                );
                // Force logs refresh right now!
                qx.event.Timer.once(function(){
@@ -549,8 +573,8 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                        if(command){
                                command.execute();
                        }
-               }, this, 2000);
-       }
+               }, this, 2000);         
+       }       
                
   }
 });
\ No newline at end of file