01: /*
02: * Version: MPL 1.1/GPL 2.0/LGPL 2.1
03: *
04: * "The contents of this file are subject to the Mozilla Public License
05: * Version 1.1 (the "License"); you may not use this file except in
06: * compliance with the License. You may obtain a copy of the License at
07: * http://www.mozilla.org/MPL/
08: *
09: * Software distributed under the License is distributed on an "AS IS"
10: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
11: * License for the specific language governing rights and limitations under
12: * the License.
13: *
14: * The Original Code is ICEfaces 1.5 open source software code, released
15: * November 5, 2006. The Initial Developer of the Original Code is ICEsoft
16: * Technologies Canada, Corp. Portions created by ICEsoft are Copyright (C)
17: * 2004-2006 ICEsoft Technologies Canada, Corp. All Rights Reserved.
18: *
19: * Contributor(s): _____________________.
20: *
21: * Alternatively, the contents of this file may be used under the terms of
22: * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"
23: * License), in which case the provisions of the LGPL License are
24: * applicable instead of those above. If you wish to allow use of your
25: * version of this file only under the terms of the LGPL License and not to
26: * allow others to use your version of this file under the MPL, indicate
27: * your decision by deleting the provisions above and replace them with
28: * the notice and other provisions required by the LGPL License. If you do
29: * not delete the provisions above, a recipient may use your version of
30: * this file under either the MPL or the LGPL License."
31: *
32: */
33:
34: package com.icesoft.faces.async.render;
35:
36: import edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue;
37: import org.apache.commons.logging.Log;
38: import org.apache.commons.logging.LogFactory;
39:
40: /**
41: * The SingleEntryQueue is used by the {@link RenderHub} to queue up {@link
42: * Renderable}s for render calls. The queue is a specialized version of a
43: * LinkedBlockingQueue that holds, at most, one instance of a Renderable.
44: * <p/>
45: * To clarify, let's say a Renderable is initially offered to the queue. It is
46: * the first one so there is no rendering calls being executed and the queue is
47: * empty. The Renderable is accepted into the queue and then is removed from
48: * the queue and a render call is executed.
49: * <p/>
50: * While that render call is underway, the same Renderable is again offered to
51: * the queue. Since it is not in the queue yet, it is again accepted.
52: * <p/>
53: * But now we suppose that it's waiting to be pulled off the queue (the thread
54: * pools is busy) and the same Renderable is again offered (Renderable equality
55: * is based on the equality of the internal {@link com.icesoft.faces.webapp.xmlhttp.PersistentFacesState
56: * PersistentFacesState} it contains). This time it is not accepted because the
57: * Renderable is already on the queue and any subsequent render calls should
58: * take care of all changes to the underlying DOM. This is how the render calls
59: * for a given Renderable are efficiently coalesced.
60: *
61: * @author ICEsoft Technologies, Inc.
62: */
63: class SingleEntryQueue extends LinkedBlockingQueue {
64:
65: private static Log log = LogFactory.getLog(SingleEntryQueue.class);
66:
67: public SingleEntryQueue(int capacity) {
68: super (capacity);
69: }
70:
71: public boolean offer(Object objectToOffer) {
72: if (this .contains(objectToOffer)) {
73: if (log.isTraceEnabled()) {
74: log.trace("object is already in work queue: "
75: + objectToOffer);
76: }
77: //It may seem counter-intuitive but if we discover that the
78: //Renderable is already in the queue, we should not call offer()
79: //on the parent but we should return true. It should still be
80: //considered a successful operation as far as the thread pool is
81: //concerned - a successful coalescing of the render calls.
82: return true;
83: }
84: return super.offer(objectToOffer);
85: }
86: }
|