]> 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/LauncherApplet.js
New services
[gpl/argeo-slc.git] / org.argeo.slc.webapp / src / main / webapp / argeo-ria-lib / slc / class / org / argeo / slc / ria / LauncherApplet.js
index 619339608fd95775ccb2472c2414d4d06c328a5d..526fbd0bb3f07626fed8bf347cdb4f227e35b868 100644 (file)
@@ -9,7 +9,11 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
 
   construct : function(){
        this.base(arguments);
-       this.setLayout(new qx.ui.layout.Dock());        
+       this.setLayout(new qx.ui.layout.Dock());
+       
+       this.COMMON_FORM_HEADER_LABEL = "Choose Agent";
+       this.CHOOSE_AGENT_LABEL = "Agent Uuid";
+       this.CHOOSE_FORM_PART_LABEL = "Test Type";
   },
 
   properties : 
@@ -20,6 +24,12 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
        view : {
                init : null
        },
+       viewSelection : {
+               nullable:false, 
+               check:"org.argeo.ria.components.ViewSelection"
+       },              
+       instanceId : {init:""},
+       instanceLabel : {init:""},      
        /**
         * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions} 
         */
@@ -33,7 +43,7 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
                                menu            : "Launcher",
                                toolbar         : "launcher",
                                callback        : function(e){
-                                       this.getView().getContent().submitForm();
+                                       this.submitForm();
                                },
                                command         : null
                        },                      
@@ -49,21 +59,13 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
                                        req.send();
                                },
                                command         : null
-                       },                      
-                       "close" : {
-                               label           : "Close", 
-                               icon            : "resource/slc/window-close.png",
-                               shortcut        : "Control+w",
-                               enabled         : true,
-                               menu            : "Launcher",
-                               toolbar         : "launcher",
-                               callback        : function(e){
-                                       // Call service to delete
-                                       this.getView().empty();                                         
-                               },
-                               command         : null
-                       }                       
+                       }
                }
+       },
+       registeredTopics : {
+               init : {},
+               check : "Map", 
+               event : "changeRegisteredTopics"
        }
   },
 
@@ -75,53 +77,56 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
         */
        init : function(viewPane){
                this.setView(viewPane);
+               this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
                this._createLayout();
                this._createForm();
+               this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
+               this._amqClient.startPolling();
        },
        
        /**
-        * Load a given row : the data passed must be a simple data array.
-        * @param data {Element} The text xml description. 
+        *  
         */
        load : function(){
-               this.getView().setViewTitle("Slc Execution Launcher");
-               org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadagents").execute();
+               this.getView().setViewTitle("Execution Launcher");
+               this.addListener("changeRegisteredTopics", function(event){
+                       //this._refreshTopicsSubscriptions(event);
+                       this._feedSelector(event);
+               }, this);
+               var reloadHandler = function(message){
+                       // Delay reload to be sure the jms was first integrated by the db, then ask the db.
+                       qx.event.Timer.once(function(){
+                               org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadagents").execute();
+                       }, this, 1000);                 
+               }
+               this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
+               this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
+               reloadHandler();
        },
         
        addScroll : function(){
                return false;
        },
+       
+       close : function(){
+               this._amqClient.removeListener("agentregister", "topic://agent.register");
+               this._amqClient.removeListener("agentunregister", "topic://agent.unregister");
+               
+               this.setRegisteredTopics({});
+               this._amqClient.stopPolling();
+       },
                
        _createLayout : function(){
                this.formPane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));                
                this.scroll = new qx.ui.container.Scroll(this.formPane);
-               this.scroll.setWidth(290);
                this.formPane.setPadding(10);
-               this.add(this.scroll, {edge:'west'});
+               this.add(this.scroll, {edge:'center'});
                
-               this.logModel = new qx.ui.table.model.Simple();
-               this.logModel.setColumns(["Date", "Agent Uuid", "Status", "Type"]);
-               this.logPane = new qx.ui.table.Table(this.logModel,  {
-                       tableColumnModel: function(obj){
-                               return new qx.ui.table.columnmodel.Resize(obj)
-                       }
-               });
-               this._initLogger();
-               this.add(this.logPane, {edge:'center'});
        },
-       
-       _initLogger : function(){
-               this.logPane.set({              
-                       statusBarVisible: false,
-                       showCellFocusIndicator:false
-               });
-               var columnModel = this.logPane.getTableColumnModel(); 
-               columnModel.getBehavior().setWidth(2, "12%");
-               columnModel.getBehavior().setWidth(3, "12%");           
-       },
-       
+               
        _createForm : function(){
                this.fields = {};
+               this.hiddenFields = {};
                this.freeFields = [];
                
                var execButtonPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
@@ -140,16 +145,96 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
                var serviceManager = org.argeo.ria.remote.RequestManager.getInstance();
                serviceManager.addListener("reload", function(reloadEvent){
                        if(reloadEvent.getDataType()!= "agents") return ;
-                       this._xmlListToSelector(reloadEvent.getContent(), this.agentSelector);
+                       var xmlDoc = reloadEvent.getContent();
+                       var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
+                       var newTopics = {};
+                       for(var i=0;i<nodes.length;i++){
+                               var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
+                               var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
+                               newTopics[uuid] = host+" ("+uuid+")";
+                       }
+                       this.setRegisteredTopics(newTopics);
+               }, this);
+               
+               var commonForm = {pane:this.formPane};          
+               this._addFormHeader(commonForm, this.COMMON_FORM_HEADER_LABEL);
+               this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_AGENT_LABEL), this.agentSelector);
+               this._createFormVariableParts();
+               if(!this.parts) return;
+               if(qx.lang.Object.getLength(this.parts) > 1){
+                       // Add chooser
+                       this.partChooser = new qx.ui.form.SelectBox();
+                       for(var key in this.parts){
+                               this.partChooser.add(new qx.ui.form.ListItem(this.parts[key].label, null, key));
+                       }
+                       this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_FORM_PART_LABEL), this.partChooser);
+                       this.partChooser.addListener("changeValue", function(ev){
+                               this._showSelectedPart(ev.getData());
+                       }, this);
+               }
+               this._showSelectedPart(qx.lang.Object.getKeys(this.parts)[0]);          
+       },
+       
+       _showSelectedPart : function(partId){
+               if(!this.parts) return;
+               if(!this.partsContainer){
+                       this.partsContainer = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
+                       this.formPane.add(this.partsContainer);                 
+               }
+               for(var i in this.parts){
+                       var formObject = this.parts[i];
+                       if(!formObject.added){
+                               this.partsContainer.add(formObject.pane, {top:0, left:0});
+                               formObject.added = true;
+                       }
+                       formObject.pane.hide();
+               }
+               if(this.parts[partId]){
+                       this.parts[partId].pane.show();
+               }
+       },
+       
+       _initFormPart : function(formId, label){
+               if(!this.parts) this.parts = {};                
+               var formObject = {};
+               formObject.hiddenFields = {};
+               formObject.freeFields = [];
+               formObject.fields = {};
+               formObject.id = formId;
+               formObject.label = label;
+               this.parts[formId] = formObject;
+               formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
+               return formObject;
+       },
+       
+       _createFormVariableParts : function(){
+               var standard = this._initFormPart("standard", "Canonical");
+               this._createStandardForm(standard);
+               var simple = this._initFormPart("simple", "SLC Sample");
+               this._createSimpleForm(simple);
+       },
+       
+       _createSimpleForm : function(formObject){
+
+               this._addFormInputText(formObject, "ant.file", "File", "Category1/SubCategory2/build.xml");
+               var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
+               moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
+               moreButton.setCursor("pointer");
+               moreButton.addListener("click", function(){
+                       this._addFormInputText();
                }, this);
+               this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
+               this._addFormInputText(formObject);
+               this._addFormInputText(formObject);             
+               
+       },
+       
+       _createStandardForm : function(formObject){
                
-               this._addFormHeader("Choose Agent Uuid");
-               this._addFormEntry(new qx.ui.basic.Label("Agent Uuid"), this.agentSelector);
-               this._addFormHeader("Set SlcExecution Parameters");
-               this._addFormInputText("status", "Status", "STARTED");
-               this._addFormInputText("type", "Type", "slcAnt");
-               this._addFormInputText("host", "Host", "localhost");
-               this._addFormInputText("user", "User", "user");
+               this._addFormHeader(formObject, "Set Execution Parameters");
+               this._addFormInputText(formObject, "status", "Status", "STARTED");
+               this._addFormInputText(formObject, "host", "Host", "localhost");
+               this._addFormInputText(formObject, "user", "User", "user");
                
                var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
                moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
@@ -157,47 +242,58 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
                moreButton.addListener("click", function(){
                        this._addFormInputText();
                }, this);
-               this._addFormHeader("Add optionnal parameters", moreButton);
-               this._addFormInputText();
-               this._addFormInputText();
+               this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
+               this._addFormInputText(formObject);
+               this._addFormInputText(formObject);             
+       },
+       
+       _addFormHiddenField : function(formObject, fieldName, fieldValue){
+               formObject.hiddenFields[fieldName] = fieldValue;
        },
        
-       _addFormInputText : function(fieldName, fieldLabel, defaultValue){
+       _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, choiceValues){
                var labelElement;
-               var fieldElement = new qx.ui.form.TextField();
+               if(choiceValues){
+                       var fieldElement = new qx.ui.form.SelectBox();
+                       for(var key in choiceValues){
+                               fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key));
+                       }
+               }else{
+                       var fieldElement = new qx.ui.form.TextField();
+               }
                if(defaultValue){
                        fieldElement.setValue(defaultValue);
                }
                if(fieldName && fieldLabel){
                        labelElement = new qx.ui.basic.Label(fieldLabel);
-                       this.fields[fieldName] = fieldElement;
+                       formObject.fields[fieldName] = fieldElement;
                }else{
                        labelElement = new qx.ui.form.TextField();
-                       this.freeFields.push({
+                       formObject.freeFields.push({
                                labelEl:labelElement, 
                                valueEl:fieldElement
                        });
                }
-               this._addFormEntry(labelElement, fieldElement);
+               this._addFormEntry(formObject, labelElement, fieldElement);
        },
        
-       _addFormHeader : function(content, additionnalButton){
+       _addFormHeader : function(formObject, content, additionnalButton){
                var header = new qx.ui.basic.Label('<b>'+content+'</b>');
                header.setRich(true);           
                if(!additionnalButton){
                        header.setPaddingTop(10);
-                       this.formPane.add(header);
+                       formObject.pane.add(header);
                }else{
                        var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
                        pane.setPaddingTop(10);
                        pane.setPaddingRight(10);
                        pane.add(header, {edge:'center'});
                        pane.add(additionnalButton, {edge:'east'});
-                       this.formPane.add(pane);
+                       formObject.pane.add(pane);
                }
        },
        
-       _addFormEntry : function(labelElement, fieldElement){
+       _addFormEntry : function(formObject, labelElement, fieldElement){
                var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
                labelElement.setWidth(100);
                labelElement.setTextAlign("right");             
@@ -205,43 +301,108 @@ qx.Class.define("org.argeo.slc.ria.LauncherApplet",
                entryPane.add(new qx.ui.basic.Label(':'));
                fieldElement.setWidth(150);
                entryPane.add(fieldElement);
-               this.formPane.add(entryPane);
-       },
-       
-       _xmlListToSelector : function(xmlDoc, selector){
-               selector.removeAll();
-               var NSMap = {slc:"http://argeo.org/projects/slc/schemas"};
-               var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor", NSMap);
-               for(var i=0;i<nodes.length;i++){
-                       var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid", NSMap);
-                       var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host", NSMap);
-                       var listItem = new qx.ui.form.ListItem(uuid+' ('+host+')', null, uuid);
-                       selector.add(listItem);
+               formObject.pane.add(entryPane);
+       },
+       
+       /*
+       _refreshTopicsSubscriptions : function(changeTopicsEvent){
+               var oldTopics = changeTopicsEvent.getOldData() || {};
+               var newTopics = changeTopicsEvent.getData();
+               var removed = [];
+               var added = [];
+               for(var key in oldTopics){
+                       if(!newTopics[key]) {
+                               //this._removeAmqListener(key);
+                       }
+               }
+               for(var key in newTopics){
+                       if(!oldTopics[key]) {
+                               //this._addAmqListener(key);
+                       }                       
+               }
+       },
+       */
+               
+       _feedSelector : function(changeTopicsEvent){
+               var topics = changeTopicsEvent.getData();
+               this.agentSelector.removeAll();
+               var emptyItem = new qx.ui.form.ListItem("", null, "");
+               this.agentSelector.add(emptyItem);
+               this.agentSelector.setSelected(emptyItem);
+               for(var key in topics){
+                       var listItem = new qx.ui.form.ListItem(topics[key], null, key);
+                       this.agentSelector.add(listItem);
+               }
+       },
+       
+       /*
+       _addAmqListener: function(uuid){
+               this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){
+                       var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution");                               
+                       var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
+                       slcExec.fromXml(message);
+                       this.logModel.addRows([
+                               [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()]
+                       ]);                             
+               }, this);
+       },
+       
+       _removeAmqListener : function(uuid){
+               this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution");
+       },
+       */
+       
+       _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());
+                       }
+               }               
        },
        
        submitForm : function(){
                var currentUuid = this.agentSelector.getValue();
                if(!currentUuid) return;
-               var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(currentUuid);
-               slcExec.setStatus(this.fields.status.getValue());
-               slcExec.setType(this.fields.type.getValue());
-               slcExec.setHost(this.fields.host.getValue());
-               slcExec.setUser(this.fields.user.getValue());
-               for(var i=0;i<this.freeFields.length;i++){
-                       var fF = this.freeFields[i];
-                       if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
-                               slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
+               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;
                }
-               var destination = "topic://agent."+currentUuid+".newExecution";
-               var req = org.argeo.slc.ria.SlcApi.getSendAmqMessageRequest(destination, slcExec);
-               req.addListener("completed", function(e){                       
-                       this.logModel.addRows([
-                               [new Date().toString(), slcExec.getUuid(), slcExec.getStatus(), slcExec.getType()]
-                       ]);
-               }, this);
-               req.send();
+               
+               this._prepareSlcExecutionMessage(crtPartId, slcExec, fields, hiddenFields, freeFields);
+                               
+               this._amqClient.sendMessage(
+                       "topic://agent.newExecution", 
+                       slcExec.toXml(), 
+                       {"slc-agentId":currentUuid}
+               );
+               // Force logs refresh right now!
+               qx.event.Timer.once(function(){
+                       var command = org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadlogs");
+                       if(command){
+                               command.execute();
+                       }
+               }, this, 2000);
        }
                
   }