KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > icesoft > faces > async > render > SingleEntryQueue


1 /*
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * "The contents of this file are subject to the Mozilla Public License
5  * Version 1.1 (the "License"); you may not use this file except in
6  * compliance with the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * 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 JavaDoc objectToOffer) {
72         if (this.contains(objectToOffer)) {
73             if (log.isTraceEnabled()) {
74                 log.trace("object is already in work queue: " + objectToOffer);
75             }
76             //It may seem counter-intuitive but if we discover that the
77
//Renderable is already in the queue, we should not call offer()
78
//on the parent but we should return true. It should still be
79
//considered a successful operation as far as the thread pool is
80
//concerned - a successful coalescing of the render calls.
81
return true;
82         }
83         return super.offer(objectToOffer);
84     }
85 }
86
Popular Tags