/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.core.cachepool;
import java.io.Serializable;
import com.jinhe.tss.core.exception.BusinessException;
/**
* <p> TimeWrapper.java </p>
*
* @author Jon.King 2006-12-30
*/
public class TimeWrapper implements Cacheable, Serializable {
private static final long serialVersionUID = 430479804348050166L;
private Object key, value;
private long death = 0; //如果death=0,则元素永不过期
private long accessed = System.currentTimeMillis(); //记录元素最后一次被访问的时间
private int hit = 0; //对象的点击次数
/**
* 创建一个新的wrapped对象.
* @param id
* @param obj
* @param cycleLife
* 存活时间( > 0)
*/
public TimeWrapper(Object key, Object value) {
this(key, value, new Long(0));
}
public TimeWrapper(Object key, Object value, Long cycleLife) {
if(!(key instanceof CacheableKey))
key = new DefaultCacheableKey(key.toString());
this.key = key;
this.value = value;
if (cycleLife.longValue() > 0)
this.death = System.currentTimeMillis() + cycleLife.longValue();
}
public Object getKey() {
return key;
}
public Object getValue() {
return value;
}
/**
* 设置元素的有效期。
* @param expiryTime
*/
public synchronized void setCyclelife(long expiryTime) {
if (expiryTime < 0)
throw new BusinessException("缓存项的生命周期值不能小于0");
else if (expiryTime > 0)
this.death = System.currentTimeMillis() + expiryTime;
else
death = 0;
}
/**
* 判断元素是否已过期。如果death=0,则元素永不过期
*/
public synchronized boolean isExpired() {
return death > 0 && System.currentTimeMillis() > death;
}
public synchronized void updateAccessed() {
long cycleLife = this.getCyclelife();
this.accessed = System.currentTimeMillis();
this.death = cycleLife + this.accessed;
}
public long getAccessed() {
return accessed;
}
public int getHit() {
return hit;
}
public void addHit(){
hit++;
}
public boolean equals(Object o){
if(o instanceof TimeWrapper){
TimeWrapper temp = (TimeWrapper) o;
return this.key != null && this.key.equals(temp.getKey());
}
return false;
}
public int hashCode(){
return key.hashCode();
}
public void update(Object value) {
this.value = value;
}
public long getCyclelife() {
return this.death - this.accessed;
}
/**
* 创建一个指定前缀 + 当前时间 + 随机值 的 key
* @param prefix
* @return
*/
public static String createRandomKey(String prefix){
return prefix + "_" + System.currentTimeMillis() + "_" + (int)(2007 * Math.random());
}
}