Author: nbelaevski
Date: 2008-10-16 13:37:26 -0400 (Thu, 16 Oct 2008)
New Revision: 10783
Added:
trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js
Modified:
trunk/framework/impl/generatescript.xml
trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
Log:
Draft implementation of queues checked in
Modified: trunk/framework/impl/generatescript.xml
===================================================================
--- trunk/framework/impl/generatescript.xml 2008-10-16 17:31:38 UTC (rev 10782)
+++ trunk/framework/impl/generatescript.xml 2008-10-16 17:37:26 UTC (rev 10783)
@@ -70,7 +70,7 @@
files="prolog.js,dnd.js,epilog.js">
</filelist>
- <filelist id="ajaxjsf"
dir="${basedir}/src/main/javascript/ajaxjsf"
files="prolog.js,sarissa.js,JSFAJAX.js,log4ajax.js,epilog.js,../memory.js"></filelist>
+ <filelist id="ajaxjsf"
dir="${basedir}/src/main/javascript/ajaxjsf"
files="prolog.js,sarissa.js,JSFAJAX.js,queue.js,log4ajax.js,epilog.js,../memory.js"></filelist>
<!-- =================================
target: assemble
================================= -->
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-10-16 17:31:38 UTC
(rev 10782)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-10-16 17:37:26 UTC
(rev 10783)
@@ -544,8 +544,6 @@
}
};
-// eventsQueues for ajax submit events.
-A4J.AJAX._eventsQueues={};
//Listeners should be notified
A4J.AJAX.Listener = function(onafterajax){
@@ -708,53 +706,20 @@
}
LOG.debug("Have Event "+domEvt+" with properties: target:
"+domEvt.target+", srcElement: "+domEvt.srcElement+", type:
"+domEvt.type);
}
- if(options.eventsQueue){
- var eventsQueue = A4J.AJAX._eventsQueues[options.eventsQueue];
- if( eventsQueue ) {
- var eventsCount = eventsQueue.options.eventsCount||1;
- eventsQueue.wait=true;
- eventsQueue.containerId=containerId;
- eventsQueue.form=form;
- eventsQueue.domEvt=domEvt;
- eventsQueue.options=options;
- eventsQueue.options.eventsCount = eventsCount+1;
- if(options.ignoreDupResponses && eventsQueue.request){
- LOG.debug("Abort uncompleted request in queue
"+options.eventsQueue);
- eventsQueue.request.abort();
- eventsQueue.request=false;
- eventsQueue.wait=false;
- if( options.requestDelay ){
- window.setTimeout(function() {
- LOG.debug("End delay waiting, make request in queue
"+options.eventsQueue);
- A4J.AJAX.SubmiteventsQueue(A4J.AJAX._eventsQueues[options.eventsQueue]);
- },options.requestDelay);
- LOG.debug("Create new waiting for request in queue
"+options.eventsQueue);
- return;
- }
- } else {
- LOG.debug("Put new event to queue "+options.eventsQueue);
- return;
- }
- } else {
- var queue = { wait : false, containerId : containerId , form : form, domEvt :
domEvt, options : options};
- A4J.AJAX._eventsQueues[options.eventsQueue] = queue;
- if( options.requestDelay ){
- window.setTimeout(function() {
- LOG.debug("End delay waiting, make request in queue
"+options.eventsQueue);
- A4J.AJAX.SubmiteventsQueue(A4J.AJAX._eventsQueues[options.eventsQueue]);
- },options.requestDelay);
- LOG.debug("Event occurs, create waiting for request in queue
"+options.eventsQueue);
- return;
- }
- }
- }
- A4J.AJAX.SubmitRequest( containerId, form, domEvt , options );
+
+ var queue = A4J.AJAX.EventQueue.getOrCreateQueue(options.eventsQueue);
+ if (queue) {
+ queue.push(containerId, form, evt, options);
+ } else {
+ A4J.AJAX.SubmitRequest(containerId, form, evt, options);
+ }
};
+/**
+ * This method should be deprecated and maybe even removed?
+ */
A4J.AJAX.SubmiteventsQueue = function( eventsQueue ) {
- // Clear wait flag to avoid resend same request.
- eventsQueue.wait=false;
- A4J.AJAX.SubmitRequest( eventsQueue.containerId, eventsQueue.form ,eventsQueue.domEvt ,
eventsQueue.options );
+ eventsQueue.immediateSubmit();
};
// Main request submitting functions.
// parameters :
@@ -827,13 +792,12 @@
A4J.AJAX.status(containerId,options.status,true);
req.send();
- if(options.eventsQueue){
- var eventsQueue = A4J.AJAX._eventsQueues[options.eventsQueue];
- if( eventsQueue ) {
- eventsQueue.request=req;
- }
- }
-
+
+ var queue = A4J.AJAX.EventQueue.getQueue(options.eventsQueue);
+ if (queue) {
+ queue.request = req;
+ }
+
return false;
};
@@ -1112,20 +1076,13 @@
// mark status object ( if any ) for complete request ;
A4J.AJAX.status(request.containerId,options.status,false);
}
- // If we have events in queue - send next request.
- if(options.eventsQueue){
- var eventsQueue = A4J.AJAX._eventsQueues[options.eventsQueue];
- if( eventsQueue ) {
- if(eventsQueue.wait){
- LOG.debug("Queue not empty, execute next request in queue
"+options.eventsQueue);
- A4J.AJAX.SubmiteventsQueue(eventsQueue);
- } else {
- A4J.AJAX._eventsQueues[options.eventsQueue]=false;
- }
- }
- }
- };
+ var queue = A4J.AJAX.EventQueue.getQueue(options.eventsQueue);
+ if (queue) {
+ queue.pop();
+ }
+ };
+
A4J.AJAX.getCursorPos = function(inp){
if(inp.selectionEnd != null)
Added: trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js (rev
0)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js 2008-10-16 17:37:26 UTC (rev
10783)
@@ -0,0 +1,177 @@
+A4J.AJAX._eventQueues = {};
+
+//queue constructor
+A4J.AJAX.EventQueue = function(name, size) {
+ LOG.debug("Creating new queue " + name + " with settings: [size= " +
size + "]");
+
+ this.eventCounter = 0;
+ this.name = name;
+ this.size = size || 1;
+ this.queue = new Array();
+};
+
+A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME = "org.richfaces.queue.global";
+
+A4J.AJAX.EventQueue.addQueue = function(queue) {
+ var name = queue.name;
+
+ if (A4J.AJAX._eventQueues[name]) {
+ throw "Queue already registered";
+ } else {
+ A4J.AJAX._eventQueues[name] = queue;
+ }
+};
+
+A4J.AJAX.EventQueue.getQueue = function(name) {
+ //uncomment to switch on global queue
+ //name = name || A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME;
+
+ return A4J.AJAX._eventQueues[name];
+};
+
+A4J.AJAX.EventQueue.getOrCreateQueue = function(name) {
+ //uncomment to switch on global queue
+ //name = name || A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME;
+
+ if (name) {
+ var queue = A4J.AJAX._eventQueues[name];
+ if (!queue) {
+ LOG.debug("Creating new queue " + name + " with default
settings");
+ queue = new A4J.AJAX.EventQueue(name);
+ A4J.AJAX.EventQueue.addQueue(queue);
+ }
+
+ return queue;
+ }
+};
+
+
+A4J.AJAX.EventQueue.prototype = function() {
+
+ var replaceForDupResponse = function(event) {
+ this.queue = new Array();
+ this.queue.push(event);
+ };
+
+ var replaceForOversize = function(event) {
+ this.queue.shift();
+ this.queue.push(event);
+ };
+
+ return {
+ //TODO separate service functions
+
+ replace: function(event, policy) {
+ if (this.request) {
+ LOG.debug("Abort uncompleted request in queue " + this.name);
+
+ this.request.abort();
+ this.request = undefined;
+
+ policy.call(this, event);
+
+ if (this.queue.length == 1) {
+ this.delayedSubmit();
+ } else {
+ this.immediateSubmit();
+ }
+ } else {
+ //there should be waiting request, let's wait for it
+ policy.call(this, event);
+ }
+ },
+
+ push: function(containerId, form, evt, options) {
+ var eventInfo = {containerId: containerId, form: form, domEvt: evt, options:
options};
+
+ this.eventCounter++;
+
+ if (this.queue.length == 0) {
+ LOG.debug("New event added to empty queue " + this.name);
+
+ this.queue.push(eventInfo);
+ this.delayedSubmit();
+ } else {
+ if (options.ignoreDupResponses) {
+ LOG.debug("Doing replace due to ignoreDupResponses event in queue " +
this.name);
+
+ this.replace(eventInfo, replaceForDupResponse);
+ } else {
+ //size != 0
+ if (this.size == this.queue.length) {
+ LOG.debug("Doing replace due to queue's " + this.name + "
oversize");
+
+ this.replace(eventInfo, replaceForOversize);
+ } else {
+ LOG.debug("New event added to queue " + this.name);
+
+ //there should be waiting request, let's wait for it
+ this.queue.push(eventInfo);
+ }
+ }
+ }
+ },
+
+ immediateSubmit: function() {
+ var packet = this.queue[0];
+ if (packet) {
+ if (!this.request) {
+ //TODO externalize this?
+ packet.options.eventsCount = this.eventCounter;
+ A4J.AJAX.SubmitRequest(packet.containerId, packet.form, packet.domEvt,
packet.options);
+
+ if (!this.request) {
+ //ajax submission stopped by onsubmit form handler
+ this.pop();
+ }
+ } else {
+ LOG.debug("Submit method called for queue " + this.name +
+ " processing another request right now. Method call has been ignored");
+ }
+ } else {
+ LOG.debug("Submit method called for empty queue " + this.name);
+ }
+ },
+
+ delayedSubmit: function() {
+ var packet = this.queue[0];
+ if (packet) {
+ var options = packet.options;
+ if (options.requestDelay) {
+ var _this = this;
+
+ window.setTimeout(function() {
+ try {
+ LOG.debug("End delay waiting, make request in queue " + _this.name);
+ _this.immediateSubmit();
+ } finally {
+ _this = undefined;
+ }
+ }, options.requestDelay);
+
+ LOG.debug("Create new waiting for request in queue " + this.name);
+ } else {
+ LOG.debug("No request delay, submit " + this.name + " queue's
request just now");
+
+ this.immediateSubmit();
+ }
+ }
+ },
+
+ pop: function() {
+ this.request = undefined;
+ this.queue.shift();
+ if (this.queue.length == 0) {
+ LOG.debug("Queue " + this.name + " is empty now");
+
+ this.eventCounter = 0;
+ } else {
+ LOG.debug("Queue not empty, execute next request in queue " + this.name);
+
+ this.eventCounter--;
+ //TODO - check that counter is still greater than zero
+ this.immediateSubmit();
+ }
+ }
+ }
+}();