1.1 --- a/src/org/sonews/util/TimeoutMap.java Sun Aug 29 17:28:58 2010 +0200
1.2 +++ b/src/org/sonews/util/TimeoutMap.java Sun Sep 11 15:05:04 2011 +0200
1.3 @@ -31,115 +31,99 @@
1.4 * @author Christian Lins
1.5 * @since sonews/0.5.0
1.6 */
1.7 -public class TimeoutMap<K,V> extends ConcurrentHashMap<K, V>
1.8 +public class TimeoutMap<K, V> extends ConcurrentHashMap<K, V>
1.9 {
1.10 -
1.11 - private static final long serialVersionUID = 453453467700345L;
1.12
1.13 - private int timeout = 60000; // 60 sec
1.14 - private transient Map<K, Long> timeoutMap = new HashMap<K, Long>();
1.15 -
1.16 - /**
1.17 - * Constructor.
1.18 - * @param timeout Timeout in milliseconds
1.19 - */
1.20 - public TimeoutMap(final int timeout)
1.21 - {
1.22 - this.timeout = timeout;
1.23 - }
1.24 -
1.25 - /**
1.26 - * Uses default timeout (60 sec).
1.27 - */
1.28 - public TimeoutMap()
1.29 - {
1.30 - }
1.31 -
1.32 - /**
1.33 - *
1.34 - * @param key
1.35 - * @return true if key is still valid.
1.36 - */
1.37 - protected boolean checkTimeOut(Object key)
1.38 - {
1.39 - synchronized(this.timeoutMap)
1.40 - {
1.41 - if(this.timeoutMap.containsKey(key))
1.42 - {
1.43 - long keytime = this.timeoutMap.get(key);
1.44 - if((System.currentTimeMillis() - keytime) < this.timeout)
1.45 - {
1.46 - return true;
1.47 - }
1.48 - else
1.49 - {
1.50 - remove(key);
1.51 - return false;
1.52 - }
1.53 - }
1.54 - else
1.55 - {
1.56 - return false;
1.57 - }
1.58 - }
1.59 - }
1.60 -
1.61 - @Override
1.62 - public boolean containsKey(Object key)
1.63 - {
1.64 - return checkTimeOut(key);
1.65 - }
1.66 + private static final long serialVersionUID = 453453467700345L;
1.67 + private int timeout = 60000; // 60 sec
1.68 + private transient Map<K, Long> timeoutMap = new HashMap<K, Long>();
1.69
1.70 - @Override
1.71 - public synchronized V get(Object key)
1.72 - {
1.73 - if(checkTimeOut(key))
1.74 - {
1.75 - return super.get(key);
1.76 - }
1.77 - else
1.78 - {
1.79 - return null;
1.80 - }
1.81 - }
1.82 + /**
1.83 + * Constructor.
1.84 + * @param timeout Timeout in milliseconds
1.85 + */
1.86 + public TimeoutMap(final int timeout)
1.87 + {
1.88 + this.timeout = timeout;
1.89 + }
1.90
1.91 - @Override
1.92 - public V put(K key, V value)
1.93 - {
1.94 - synchronized(this.timeoutMap)
1.95 - {
1.96 - removeStaleKeys();
1.97 - this.timeoutMap.put(key, System.currentTimeMillis());
1.98 - return super.put(key, value);
1.99 - }
1.100 - }
1.101 + /**
1.102 + * Uses default timeout (60 sec).
1.103 + */
1.104 + public TimeoutMap()
1.105 + {
1.106 + }
1.107
1.108 - /**
1.109 - * @param arg0
1.110 - * @return
1.111 - */
1.112 - @Override
1.113 - public V remove(Object arg0)
1.114 - {
1.115 - synchronized(this.timeoutMap)
1.116 - {
1.117 - this.timeoutMap.remove(arg0);
1.118 - V val = super.remove(arg0);
1.119 - return val;
1.120 - }
1.121 - }
1.122 + /**
1.123 + *
1.124 + * @param key
1.125 + * @return true if key is still valid.
1.126 + */
1.127 + protected boolean checkTimeOut(Object key)
1.128 + {
1.129 + synchronized (this.timeoutMap) {
1.130 + if (this.timeoutMap.containsKey(key)) {
1.131 + long keytime = this.timeoutMap.get(key);
1.132 + if ((System.currentTimeMillis() - keytime) < this.timeout) {
1.133 + return true;
1.134 + } else {
1.135 + remove(key);
1.136 + return false;
1.137 + }
1.138 + } else {
1.139 + return false;
1.140 + }
1.141 + }
1.142 + }
1.143
1.144 - protected void removeStaleKeys()
1.145 - {
1.146 - synchronized(this.timeoutMap)
1.147 - {
1.148 - Set<Object> keySet = new HashSet<Object>(this.timeoutMap.keySet());
1.149 - for(Object key : keySet)
1.150 - {
1.151 - // The key/value is removed by the checkTimeOut() method if true
1.152 - checkTimeOut(key);
1.153 - }
1.154 - }
1.155 - }
1.156 -
1.157 + @Override
1.158 + public boolean containsKey(Object key)
1.159 + {
1.160 + return checkTimeOut(key);
1.161 + }
1.162 +
1.163 + @Override
1.164 + public synchronized V get(Object key)
1.165 + {
1.166 + if (checkTimeOut(key)) {
1.167 + return super.get(key);
1.168 + } else {
1.169 + return null;
1.170 + }
1.171 + }
1.172 +
1.173 + @Override
1.174 + public V put(K key, V value)
1.175 + {
1.176 + synchronized (this.timeoutMap) {
1.177 + removeStaleKeys();
1.178 + this.timeoutMap.put(key, System.currentTimeMillis());
1.179 + return super.put(key, value);
1.180 + }
1.181 + }
1.182 +
1.183 + /**
1.184 + * @param arg0
1.185 + * @return
1.186 + */
1.187 + @Override
1.188 + public V remove(Object arg0)
1.189 + {
1.190 + synchronized (this.timeoutMap) {
1.191 + this.timeoutMap.remove(arg0);
1.192 + V val = super.remove(arg0);
1.193 + return val;
1.194 + }
1.195 + }
1.196 +
1.197 + protected void removeStaleKeys()
1.198 + {
1.199 + synchronized (this.timeoutMap) {
1.200 + Set<Object> keySet = new HashSet<Object>(this.timeoutMap.keySet());
1.201 + for (Object key : keySet) {
1.202 + // The key/value is removed by the checkTimeOut() method if true
1.203 + checkTimeOut(key);
1.204 + }
1.205 + }
1.206 + }
1.207 }