01: /*
02: * Copyright (c) 2002-2003 by OpenSymphony
03: * All rights reserved.
04: */
05: package com.opensymphony.oscache.base.algorithm;
06:
07: import java.util.*;
08:
09: /**
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: }
|