Author: dmorozov
Date: 2008-11-10 12:04:25 -0500 (Mon, 10 Nov 2008)
New Revision: 11069
Modified:
trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js
Log:
https://jira.jboss.org/jira/browse/RF-4854
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js 2008-11-10 16:39:32 UTC (rev
11068)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js 2008-11-10 17:04:25 UTC (rev
11069)
@@ -4,9 +4,10 @@
A4J.AJAX._eventQueues = {};
//queue constructor
-A4J.AJAX.EventQueue = function(name, options) {
+A4J.AJAX.EventQueue = function(name, queueOptions, requestOptions) {
this.name = name;
- this.options = options;
+ this.queueOptions = queueOptions || {};
+ this.requestOptions = requestOptions || {};
this.queue = new Array();
};
@@ -45,6 +46,9 @@
if (!queue) {
name = queueName || requestId;
+ if (namespace) {
+ name = namespace + ":" + name;
+ }
LOG.debug("Creating new transient queue '" + name + "' with
default settings");
queue = new A4J.AJAX.EventQueue(name);
@@ -59,19 +63,25 @@
A4J.AJAX.EventQueue.prototype = function() {
- var EventQueueData = function(queue) {
+ var EventQueueData = function(queue, query, options) {
this.queue = queue;
- this.eventsCount = 0;
+ this.query = query;
+ this.options = options || {};
+
+ this.eventsCount = 1;
};
EventQueueData.prototype.setEventData = function(query, options) {
this.query = query;
this.options = options;
+ };
+ EventQueueData.prototype.increaseEventCounter = function() {
this.eventsCount++;
};
- EventQueueData.prototype.executeDelay = function(delay) {
+ EventQueueData.prototype.executeDelay = function() {
+ var delay = this.options.requestDelay;
LOG.debug("Queue will wait " + (delay || 0) + "ms before submit");
if (delay) {
@@ -114,9 +124,9 @@
opts[name] = options[name];
}
- for (var name in this.options) {
+ for (var name in this.requestOptions) {
if (!opts[name]) {
- opts[name] = this.options[name];
+ opts[name] = this.requestOptions[name];
}
}
@@ -126,21 +136,25 @@
return {
//TODO separate service functions
- submit: function() {
- if (this.inactive) {
- throw "Queue inactive";
+ getQueueSize: function() {
+ return this.queueOptions.size;
+ },
+
+ getSizeExceededBehavior: function() {
+ var policy = this.queueOptions.sizeExceededBehavior;
+ if (!policy) {
+ policy = 'dropNext';
}
+
+ return policy;
+ },
+ submit: function() {
if (!this.request) {
var queueData = this.queue.shift();
if (queueData) {
LOG.debug("Queue '" + this.name + "' will submit request
NOW");
- if (this.queue.length == 0) {
- LOG.debug("The last queue request is being submitted, resetting
requestId");
- this._requestId = undefined;
- }
-
this.request = queueData.submit();
this.request.queue = this;
} else {
@@ -151,37 +165,76 @@
}
},
- push: function(query, opts) {
- if (this.inactive) {
- throw "Queue inactive";
- }
+ push: function() {
+ var dropNew = function() {
+ this._requestId = undefined;
+ };
- var options = extendOptions.call(this, opts);
+ var fireNew = function(queueData) {
+ this._requestId = undefined;
+ queueData.submit();
+ };
- //TODO add processing for ignoreDupResponse
-
- var queueData;
-
- var requestId = options.requestId;
- var delay = options.requestDelay;
-
- if (!this._requestId || requestId != this._requestId) {
- queueData = new EventQueueData(this);
-
+ var addToQueue = function(queueData, requestId) {
this.queue.push(queueData);
this._requestId = requestId;
+ queueData.executeDelay();
LOG.debug("New event added to queue '" + this.name + "'. Queue
requestId changed to " + requestId);
- } else {
- queueData = this.queue[this.queue.length - 1];
- queueData.abortDelay();
+ };
- LOG.debug("Similar request already in queue '" + this.name +
"'");
+ var removeFirst = function() {
+ var nextQueueData = this.queue.shift();
+ if (nextQueueData) {
+ nextQueueData.abortDelay();
+ }
+
+ return nextQueueData;
+ };
+
+ return function(query, opts) {
+ var options = extendOptions.call(this, opts);
+
+ //TODO add processing for ignoreDupResponse
+
+ var queueData;
+
+ var requestId = options.requestId;
+
+ if (this.queue.length == 0 || requestId != this._requestId) {
+ queueData = new EventQueueData(this, query, options);
+
+ if (this.getQueueSize() == this.queue.length) {
+ var oversizeBehavior = this.getSizeExceededBehavior();
+ if ('dropNext' == oversizeBehavior) {
+ removeFirst.call(this);
+ addToQueue.call(this, queueData, requestId);
+ } else if ('fireNext' == oversizeBehavior) {
+ var firstQueueData = removeFirst.call(this);
+ if (firstQueueData) {
+ firstQueueData.submit();
+ }
+ addToQueue.call(this, queueData, requestId);
+ } else if ('dropNew' == oversizeBehavior) {
+ dropNew.call(this);
+ } else if ('fireNew' == oversizeBehavior) {
+ fireNew.call(this, queueData);
+ }
+ } else {
+ addToQueue.call(this, queueData, requestId);
+ }
+ } else {
+ queueData = this.queue[this.queue.length - 1];
+ queueData.setEventData(query, options);
+ queueData.increaseEventCounter();
+
+ queueData.abortDelay();
+ queueData.executeDelay();
+
+ LOG.debug("Similar request already in queue '" + this.name +
"'");
+ }
}
-
- queueData.setEventData(query, options);
- queueData.executeDelay(delay);
- },
+ }(),
pop: function() {
this.request = undefined;
@@ -190,8 +243,6 @@
LOG.debug("After request: queue '" + this.name + "' is empty
now");
if (this._transient) {
- this.inactive = true;
-
LOG.debug("Deleting transient queue '" + this.name + "' from
queues registry");
A4J.AJAX.EventQueue.removeQueue(this.name);
}