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 : ";
},
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(){
},
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();
},
/**
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");
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
);\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
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
},\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
--- /dev/null
+/**\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
--- /dev/null
+/**\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