56 throw new IllegalArgumentException(
"\"maxElements\" must be greater than 0.");
59 throw new IllegalArgumentException(
"must provide a non-null cache name");
61 _maxElements = maxElements;
62 _defaultTimeoutMS = defaultTimeoutMS;
63 _map =
new HashMap<KeyType, RoleBasedCacheNode<KeyType, DataType>>(_maxElements);
64 _lruList =
new LRUList<KeyType, DataType>();
65 _timeoutList =
new TimeoutList<KeyType, DataType>();
102 public void put(KeyType key, DataType data,
long timeoutMS)
104 RoleBasedCacheNode<KeyType, DataType> newNode =
105 new RoleBasedCacheNode<KeyType, DataType>(key, data,
new Date(System.currentTimeMillis() + timeoutMS));
107 synchronized (_map) {
108 RoleBasedCacheNode<KeyType, DataType> oldNode = _map.remove(key);
109 if (oldNode !=
null) {
110 _lruList.remove(oldNode);
111 _timeoutList.remove(oldNode);
114 if (_map.size() >= _maxElements)
117 while (_map.size() >= _maxElements) {
118 RoleBasedCacheNode<KeyType, DataType> node = _lruList.removeFirst();
119 if (_logCacheEjection && _logger.isDebugEnabled())
120 _logger.debug(
debugPrefix() +
"overloaded cache: removing cached item with key: " + node.getKey());
121 _timeoutList.remove(node);
122 _map.remove(node.getKey());
125 _map.put(key, newNode);
126 _lruList.insert(newNode);
127 _timeoutList.insert(newNode);
149 synchronized (_map) {
150 RoleBasedCacheNode<KeyType, DataType> node = _map.get(key);
153 _lruList.remove(node);
154 node.setInvalidationDate(_defaultTimeoutMS);
156 _lruList.insert(node);
158 _timeoutList.remove(node);
159 _timeoutList.insert(node);
170 public DataType
get(KeyType key)
172 Date now =
new Date();
174 if (now.after(_nextDeepSizeCheck)) {
191 _nextDeepSizeCheck =
new Date((
new Date().getTime()) + CHECK_INTERVAL);
194 synchronized (_map) {
195 RoleBasedCacheNode<KeyType, DataType> node = _map.get(key);
198 _lruList.remove(node);
199 if (node.getInvalidationDate().before(now)) {
201 if (_logCacheEjection && _logger.isDebugEnabled())
202 _logger.debug(
debugPrefix() +
"timed-out entry in get: removing cached item with key: " + node.getKey());
204 _timeoutList.remove(node);
208 _lruList.insert(node);
209 return node.getData();
242 Date now =
new Date();
244 synchronized (_map) {
246 RoleBasedCacheNode<KeyType, DataType> node = _timeoutList.peekFirst();
250 if (node.getInvalidationDate().compareTo(now) <= 0) {
251 if (_logCacheEjection && _logger.isDebugEnabled())
252 _logger.debug(
debugPrefix() +
"removing timed-out node: " + node.getKey());
253 _map.remove(node.getKey());
254 _timeoutList.removeFirst();
255 _lruList.remove(node);