1 package org.apache.turbine.util;
2
3 /* ====================================================================
4 * The Apache Software License, Version 1.1
5 *
6 * Copyright (c) 2001 The Apache Software Foundation. All rights
7 * reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
19 * distribution.
20 *
21 * 3. The end-user documentation included with the redistribution,
22 * if any, must include the following acknowledgment:
23 * "This product includes software developed by the
24 * Apache Software Foundation (http://www.apache.org/)."
25 * Alternately, this acknowledgment may appear in the software itself,
26 * if and wherever such third-party acknowledgments normally appear.
27 *
28 * 4. The names "Apache" and "Apache Software Foundation" and
29 * "Apache Turbine" must not be used to endorse or promote products
30 * derived from this software without prior written permission. For
31 * written permission, please contact apache@apache.org.
32 *
33 * 5. Products derived from this software may not be called "Apache",
34 * "Apache Turbine", nor may "Apache" appear in their name, without
35 * prior written permission of the Apache Software Foundation.
36 *
37 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48 * SUCH DAMAGE.
49 * ====================================================================
50 *
51 * This software consists of voluntary contributions made by many
52 * individuals on behalf of the Apache Software Foundation. For more
53 * information on the Apache Software Foundation, please see
54 * <http://www.apache.org/>.
55 */
56
57
58 /***
59 * A fixed length object cache implementing the LRU algorithm. Convenient for
60 * buffering recently used objects.
61 *
62 * @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
63 * @version $Id: BufferCache.java,v 1.2 2002/07/11 16:53:21 mpoeschl Exp $
64 */
65 public class BufferCache extends SequencedHashtable
66 {
67 /***
68 * The default maximum cache size.
69 */
70 private static final int DEFAULT_MAX_SIZE = 35;
71
72 /***
73 * The size of the cache. The newest elements in the sequence are kept
74 * toward the end.
75 */
76 private int maxSize;
77
78 /***
79 * Creates a new instance with default storage buffer pre-allocated.
80 */
81 public BufferCache()
82 {
83 this(DEFAULT_MAX_SIZE);
84 }
85
86 /***
87 * Creates a new instance with the specified storage buffer pre-allocated.
88 *
89 * @param maxSize The maximum size of the cache.
90 */
91 public BufferCache(int maxSize)
92 {
93 super(maxSize);
94 this.maxSize = maxSize;
95 }
96
97 /***
98 * Stores the provided key/value pair, freshening its list index if the
99 * specified key already exists.
100 *
101 * @param key The key to the provided value.
102 * @param value The value to store.
103 * @return The previous value for the specified key, or
104 * <code>null</code> if none.
105 */
106 public synchronized Object put(Object key, Object value)
107 {
108 int size = size();
109 if (size > 0 && size + 1 >= maxSize)
110 {
111 // Stay within constraints of allocated buffer by releasing the
112 // eldest buffered object.
113 remove(0);
114 }
115 return super.put(key, value);
116 }
117
118 /***
119 * Retrieves the value associated with the provided key, freshening the
120 * sequence of the key as well.
121 *
122 * @param key The key whose value to retrieve.
123 * @return The keyed value.
124 */
125 public synchronized Object get(Object key)
126 {
127 Object value = super.get(key);
128 if (value != null)
129 {
130 freshenSequence(key, value);
131 }
132 return value;
133 }
134 }
This page was automatically generated by Maven