blob: 2a90f0b5a7df2245d8a84b3951e6341f0617d42e [file] [log] [blame]
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -08001/**
Ray Milkey269ffb92014-04-03 14:43:30 -07002 * Copyright 2011, Big Switch Networks, Inc.
3 * Originally created by David Erickson, Stanford University
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
6 * not use this file except in compliance with the License. You may obtain
7 * a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations
15 * under the License.
16 **/
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080017
18package net.floodlightcontroller.util;
19
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080020import java.util.concurrent.ConcurrentMap;
21
Jonathan Harta99ec672014-04-03 11:30:34 -070022import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
23
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080024/**
25 * The key is any object/hash-code
26 * The value is time-stamp in milliseconds
27 * The time interval denotes the interval for which the entry should remain in the hashmap.
28 * If an entry is present in the Linkedhashmap, it does not mean that it's valid (recently seen)
Ray Milkey269ffb92014-04-03 14:43:30 -070029 *
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080030 * @param <K> Type of the values in this cache
31 */
Ray Milkey269ffb92014-04-03 14:43:30 -070032public class TimedCache<K> {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080033 private final long timeoutInterval; //specified in milliseconds.
Ray Milkey269ffb92014-04-03 14:43:30 -070034 private ConcurrentMap<K, Long> cache;
35
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080036 /**
Ray Milkey269ffb92014-04-03 14:43:30 -070037 * @param capacity the maximum number of entries in the cache before the
38 * oldest entry is evicted.
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080039 * @param timeToLive specified in milliseconds
40 */
Ray Milkey269ffb92014-04-03 14:43:30 -070041 public TimedCache(int capacity, int timeToLive) {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080042 cache = new ConcurrentLinkedHashMap.Builder<K, Long>()
Ray Milkey269ffb92014-04-03 14:43:30 -070043 .maximumWeightedCapacity(capacity)
44 .build();
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080045 this.timeoutInterval = timeToLive;
46 }
Ray Milkey269ffb92014-04-03 14:43:30 -070047
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080048 public long getTimeoutInterval() {
49 return this.timeoutInterval;
50 }
Ray Milkey269ffb92014-04-03 14:43:30 -070051
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080052 /**
53 * Always try to update the cache and set the last-seen value for this key.
Ray Milkey269ffb92014-04-03 14:43:30 -070054 * <p/>
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080055 * Return true, if a valid existing field was updated, else return false.
56 * (note: if multiple threads update simultaneously, one of them will succeed,
Ray Milkey269ffb92014-04-03 14:43:30 -070057 * other wills return false)
58 *
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080059 * @param key
60 * @return boolean
61 */
Ray Milkey269ffb92014-04-03 14:43:30 -070062 public boolean update(K key) {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080063 Long curr = new Long(System.currentTimeMillis());
64 Long prev = cache.putIfAbsent(key, curr);
Ray Milkey269ffb92014-04-03 14:43:30 -070065
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080066 if (prev == null) {
Ray Milkey269ffb92014-04-03 14:43:30 -070067 return false;
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080068 }
69
70 if (curr - prev > this.timeoutInterval) {
71 if (cache.replace(key, prev, curr)) {
Ray Milkey269ffb92014-04-03 14:43:30 -070072 return false;
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080073 }
74 }
Ray Milkey269ffb92014-04-03 14:43:30 -070075
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080076 return true;
77 }
78}