]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Adapt to new services to get rid of Amq
authorCharles du Jeu <charles.dujeu@gmail.com>
Wed, 6 May 2009 20:35:29 +0000 (20:35 +0000)
committerCharles du Jeu <charles.dujeu@gmail.com>
Wed, 6 May 2009 20:35:29 +0000 (20:35 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@2409 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js
server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcApi.js
server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcExecLoggerApplet.js
server/org.argeo.slc.ria/src/argeo-ria-src/class/org/argeo/ria/event/UIBus.js [new file with mode: 0644]
server/org.argeo.slc.ria/src/argeo-ria-src/class/org/argeo/ria/remote/RemoteNotifier.js [new file with mode: 0644]

index e72bdf37e5382527b3e38730943a7ca365e628e0..feba478750eb294318d36a2d3bbd15b4e1218372 100644 (file)
@@ -376,9 +376,20 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
        init : function(viewPane){
                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();
+               this.remoteNotifier = new org.argeo.ria.remote.RemoteNotifier(
+                       "/org.argeo.slc.webapp/",
+                       "pollEvent.service",
+                       "addEventListener.service",
+                       "removeEventListener.service"
+               );
+               this.remoteNotifier.setEventParamName("slc_eventType");
+               this.remoteNotifier.setEventXPath("/slc:slc-event");
+               this.remoteNotifier.setEventTypeXPath('slc:headers/slc:header[@name="slc_eventType"]');
+               this.remoteNotifier.setEventDataXPath('slc:headers/slc:header[@name="slc_agentId"]');
+               this.remoteNotifier.startPolling();
+               this.UIBus = org.argeo.ria.event.UIBus.getInstance(); 
+               this.UIBus.registerNotifier(this.remoteNotifier);
+               
                this._emptyAgentString = "Empty Batch";
                this._crtAgentString = "Target Agent : ";               
        },
@@ -389,12 +400,11 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
        load : function(){
                this._createLayout();
                this.getView().setViewTitle("Execution Launcher");
-               var reloadHandler = function(message){
+               this.reloadHandler = function(message){                         
                        this.rootNode.reload();
                }
-               this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
-               this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
-               //reloadHandler();              
+               this.UIBus.addListener("agentRegistered", this.reloadHandler, this);
+               this.UIBus.addListener("agentUnregistered", this.reloadHandler, this);
        },
         
        addScroll : function(){
@@ -402,9 +412,9 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
        },
        
        close : function(){
-               this._amqClient.removeListener("agentregister", "topic://agent.register");
-               this._amqClient.removeListener("agentunregister", "topic://agent.unregister");
-               this._amqClient.stopPolling();
+               this.UIBus.removeListener("agentRegistered", this.reloadHandler, this);
+               this.UIBus.removeListener("agentUnregistered", this.reloadHandler, this);
+               this.remoteNotifier.stopPolling();
        },
                
        /**
@@ -643,11 +653,9 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                        var batchEntrySpec = selection[i].getUserData("batchEntrySpec");
                        slcExecMessage.addBatchEntrySpec(batchEntrySpec);
                }               
-               this._amqClient.sendMessage(
-                       "topic://agent.newExecution", 
-                       slcExecMessage.toXml(), 
-                       {"slc_agentId":agentUuid}
-               );
+               console.log(slcExecMessage.toXml());
+               var req = org.argeo.slc.ria.SlcApi.getNewSlcExecutionService(agentUuid, slcExecMessage.toXml());
+               req.send();
                // Force logs refresh right now!
                qx.event.Timer.once(function(){
                        var command = org.argeo.ria.event.CommandsManager.getInstance().getCommandById("reloadlogs");
index e598db51eb83bc3508a62de6e0ccb44d9d263c6a..7d4a647b824ae9132de2d4759ac6afc4f39f92b5 100644 (file)
@@ -21,6 +21,7 @@ qx.Class.define("org.argeo.slc.ria.SlcApi",
        LIST_RESULTS_SERVICE : "listResultAttributes.service",\r
        GET_RESULT_SERVICE : "getResult.service",\r
        LIST_SLCEXEC_SERVICE : "listSlcExecutions.service",\r
+       NEW_SLCEXEC_SERVICE : "newSlcExecution.service",\r
        \r
        LIST_AGENTS_SERVICE : "listAgents.service",\r
        LIST_MODULES_SERVICE : "listModulesDescriptors.service",\r
@@ -196,6 +197,27 @@ qx.Class.define("org.argeo.slc.ria.SlcApi",
                );\r
        },\r
        \r
+\r
+       /**\r
+        * New SlcExecution\r
+        * @param agentId {String} Agent id target\r
+        * @param xmlDescription {String} XML of the Slc Execution\r
+        * @param fireReloadEventType {String} Event type to trigger (optionnal)\r
+        * @param iLoadStatusables {org.argeo.ria.components.ILoadStatusables[]} Gui parts to update \r
+        * @return {qx.io.remote.Request}\r
+        */\r
+       getNewSlcExecutionService:function(agentId, xmlDescription, fireReloadEventType, iLoadStatusables){\r
+               var req = org.argeo.slc.ria.SlcApi.getServiceRequest(\r
+                       org.argeo.slc.ria.SlcApi.NEW_SLCEXEC_SERVICE + "?slc_agentId="+agentId,\r
+                       fireReloadEventType,\r
+                       iLoadStatusables\r
+               );\r
+               req.setMethod("POST");\r
+               req.setRequestHeader("Content-Type", "text/xml");\r
+               req.setData("body=" + encodeURIComponent(xmlDescription));\r
+               return req;\r
+       },\r
+       \r
        \r
        /**\r
         * List currently available agents queues.\r
index 7d644316e325e7b86b10e68a328d5025d4a15214..46c327442ce9fbbf657cfe9e8c3ee4c31edef9f6 100644 (file)
@@ -57,16 +57,16 @@ qx.Class.define("org.argeo.slc.ria.SlcExecLoggerApplet",
                this.setView(viewPane);\r
                this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));                \r
                this._createLayout();\r
+               this.UIBus = org.argeo.ria.event.UIBus.getInstance();\r
        },\r
        \r
        /**\r
         *  \r
         */\r
        load : function(){\r
-               this._reloadLogger();   \r
-               this.timer = new qx.event.Timer(15000);\r
-               this.timer.addListener("interval", this._reloadLogger, this);\r
-               this.timer.start();             \r
+               this._reloadLogger();\r
+               this.UIBus.addListener("newSlcExecution", this._reloadLogger, this);\r
+               this.UIBus.addListener("updateSlcExecutionStatus", this._reloadLogger, this);\r
        },\r
         \r
        addScroll : function(){\r
@@ -74,7 +74,8 @@ qx.Class.define("org.argeo.slc.ria.SlcExecLoggerApplet",
        },\r
        \r
        close : function(){\r
-               this.timer.stop();\r
+               this.UIBus.removeListener("newSlcExecution", this._reloadLogger, this);\r
+               this.UIBus.removeListener("updateSlcExecutionStatus", this._reloadLogger, this);\r
        },\r
                \r
        /**\r
diff --git a/server/org.argeo.slc.ria/src/argeo-ria-src/class/org/argeo/ria/event/UIBus.js b/server/org.argeo.slc.ria/src/argeo-ria-src/class/org/argeo/ria/event/UIBus.js
new file mode 100644 (file)
index 0000000..f174279
--- /dev/null
@@ -0,0 +1,69 @@
+/**\r
+ * A generic channel for posting reload events.\r
+ */\r
+qx.Class.define("org.argeo.ria.event.UIBus",\r
+{      \r
+       type : "singleton",\r
+       extend : qx.core.Object,\r
+  \r
+       properties :{\r
+               listeners : {\r
+                       check : "Map"\r
+               },\r
+               notifiers : {\r
+                       check : "Array"\r
+               }\r
+       },\r
+       construct : function(){\r
+               this.base(arguments);\r
+               this.setListeners({});\r
+               this.setNotifiers([]);\r
+       },\r
+       members : {\r
+               addListener : function(eventType, listenerFunction, contextObject){\r
+                       var notifiers = this.getNotifiers();\r
+                       for(var i=0;i<notifiers.length;i++){\r
+                               notifiers[i].addListener(eventType);\r
+                       }\r
+                       var typeListeners = this.getListeners()[eventType];\r
+                       if(!typeListeners) {\r
+                               typeListeners = new Array();\r
+                               this.getListeners()[eventType] = typeListeners;\r
+                       }\r
+                       var func = listenerFunction;\r
+                       if(contextObject){\r
+                               func = qx.lang.Function.bind(listenerFunction, contextObject);\r
+                       }\r
+                       typeListeners.push(func);\r
+               },\r
+               removeListener : function(eventType, listenerFunction, contextObject){\r
+                       var notifiers = this.getNotifiers();\r
+                       for(var i=0;i<notifiers.length;i++){\r
+                               notifiers[i].removeListener(eventType);\r
+                       }\r
+                       var typeListeners = this.getListeners()[eventType];\r
+                       if(!typeListeners) return;\r
+                       var func = listenerFunction;\r
+                       if(contextObject){\r
+                               func = qx.lang.Function.bind(listenerFunction, contextObject);\r
+                       }\r
+                       for(var i=0;i<typeListeners.length;i++){\r
+                               if(typeListeners[i] == func){\r
+                                       delete(typeListeners[i]);\r
+                                       return;\r
+                               }\r
+                       }\r
+               },\r
+               dispatchEvent : function(eventType, eventData){\r
+                       var listeners = this.getListeners()[eventType];\r
+                       if(listeners && listeners.length){\r
+                               for(var i=0;i<listeners.length;i++){\r
+                                       listeners[i](eventData);\r
+                               }\r
+                       }\r
+               },\r
+               registerNotifier : function(notifier){\r
+                       this.getNotifiers().push(notifier);\r
+               }\r
+       }\r
+});
\ No newline at end of file
diff --git a/server/org.argeo.slc.ria/src/argeo-ria-src/class/org/argeo/ria/remote/RemoteNotifier.js b/server/org.argeo.slc.ria/src/argeo-ria-src/class/org/argeo/ria/remote/RemoteNotifier.js
new file mode 100644 (file)
index 0000000..d5630b7
--- /dev/null
@@ -0,0 +1,89 @@
+/**\r
+ * This can be triggered at the end of a IO Request. In that case, it contains\r
+ * a data type as an identifier, and the request response itself.\r
+ * Can be used this way to listen for data changes from various parts of the application.\r
+ */\r
+qx.Class.define("org.argeo.ria.remote.RemoteNotifier",\r
+{\r
+       extend : qx.core.Object,\r
+  \r
+       construct : function(uri, pollService, addService, removeService){\r
+               this.base(arguments);\r
+               this.setUri(uri);\r
+               this.setPollService(pollService);\r
+               this.setAddService(addService);\r
+               this.setRemoveService(removeService);\r
+       },\r
+       properties :{\r
+               uri : {\r
+                       check : "String"                        \r
+               },\r
+               pollService : {check : "String"},\r
+               addService : {check : "String"},\r
+               removeService : {check : "String"},\r
+               eventParamName : {check : "String", init:"eventType"},\r
+               eventXPath : {check : "String", init:"//event"},\r
+               eventTypeXPath : {check : "String", init:"@type"},\r
+               eventDataXPath : {check : "String", init:"@data"},\r
+               timeout : {                     \r
+                       init : 20000\r
+               },\r
+               interrupt : {\r
+                       check : "Boolean",\r
+                       init : false\r
+               }\r
+       },\r
+       members : {\r
+               addListener : function(eventType, eventParamName){\r
+                       var req = this._getRequest(this.getAddService());\r
+                       req.setParameter(this.getEventParamName(), eventType);\r
+                       req.send();\r
+               },              \r
+               removeListener : function(eventType, eventParamName){\r
+                       var req = this._getRequest(this.getRemoveService());\r
+                       req.setParameter(this.getEventParamName(), eventType);\r
+                       req.send();\r
+               },\r
+               startPolling : function(){\r
+                       this.setInterrupt(false);\r
+                       var req = this._getRequest(this.getPollService());\r
+                       req.setParameter("timeout", "10");\r
+                       req.addListener("completed", this._pollHandler, this);\r
+                       req.send();                     \r
+               },\r
+               stopPolling : function(){\r
+                       this.setInterrupt(true);\r
+               },\r
+               _poll : function(){\r
+                       if(this.getInterrupt()) return;\r
+                       var req = this._getRequest(this.getPollService());\r
+                       req.setParameter("timeout", this.getTimeout());\r
+                       req.setTimeout(this.getTimeout() + 5000);\r
+                       req.addListener("completed", this._pollHandler, this);\r
+                       req.send();\r
+               },\r
+               _pollHandler : function(response){\r
+                       // Parse response\r
+                       var messages = org.argeo.ria.util.Element.selectNodes(response.getContent(), this.getEventXPath());\r
+                       if(messages){\r
+                               for(var i=0;i<messages.length;i++){\r
+                                       try{\r
+                                               var eventType = org.argeo.ria.util.Element.getSingleNodeText(messages[i], this.getEventTypeXPath());\r
+                                               var eventData = org.argeo.ria.util.Element.getSingleNodeText(messages[i], this.getEventDataXPath());\r
+                                               org.argeo.ria.event.UIBus.getInstance().dispatchEvent(eventType, eventData);\r
+                                       }catch(e){\r
+                                               this.error(e);\r
+                                       }\r
+                               }\r
+                       }\r
+                       this._poll();\r
+               },\r
+               _getRequest : function(service, method, type){\r
+                       return new qx.io.remote.Request(\r
+                               this.getUri()+service, \r
+                               method || "GET", \r
+                               type||"application/xml"\r
+                       );\r
+               }\r
+       }\r
+});
\ No newline at end of file