1 /*
2 * Copyright (c) 2002-2003 by OpenSymphony
3 * All rights reserved.
4 */
5 package com.opensymphony.oscache.base.algorithm;
6
7 import java.util;
8
9 /**
10 * FIFO (First In First Out) based queue algorithm for the cache.
11 *
12 * No synchronization is required in this class since the
13 * <code>AbstractConcurrentReadCache</code> already takes care of any
14 * synchronization requirements.
15 *
16 * @version $Revision: 427 $
17 * @author <a href="mailto:mike@atlassian.com">Mike Cannon-Brookes</a>
18 * @author <a href="mailto:abergevin@pyxis-tech.com">Alain Bergevin</a>
19 * @author <a href="mailto:chris@swebtec.com">Chris Miller</a>
20 */
21 public class FIFOCache extends AbstractConcurrentReadCache {
22
23 private static final long serialVersionUID = -10333778645392679L;
24
25 /**
26 * A queue containing all cache keys
27 */
28 private Collection list = new LinkedHashSet();
29
30 /**
31 * Constructs a FIFO Cache.
32 */
33 public FIFOCache() {
34 super();
35 }
36
37 /**
38 * Constructs a FIFO Cache of the specified capacity.
39 *
40 * @param capacity The maximum cache capacity.
41 */
42 public FIFOCache(int capacity) {
43 this();
44 maxEntries = capacity;
45 }
46
47 /**
48 * An object was retrieved from the cache. This implementation
49 * does noting since this event has no impact on the FIFO algorithm.
50 *
51 * @param key The cache key of the item that was retrieved.
52 */
53 protected void itemRetrieved(Object key) {
54 }
55
56 /**
57 * An object was put in the cache. This implementation just adds
58 * the key to the end of the list if it doesn't exist in the list
59 * already.
60 *
61 * @param key The cache key of the item that was put.
62 */
63 protected void itemPut(Object key) {
64 if (!list.contains(key)) {
65 list.add(key);
66 }
67 }
68
69 /**
70 * An item needs to be removed from the cache. The FIFO implementation
71 * removes the first element in the list (ie, the item that has been in
72 * the cache for the longest time).
73 *
74 * @return The key of whichever item was removed.
75 */
76 protected Object removeItem() {
77 Iterator it = list.iterator();
78 Object toRemove = it.next();
79 it.remove();
80
81 return toRemove;
82 }
83
84 /**
85 * Remove specified key since that object has been removed from the cache.
86 *
87 * @param key The cache key of the item that was removed.
88 */
89 protected void itemRemoved(Object key) {
90 list.remove(key);
91 }
92 }