//$Id: CacheStatistics.java,v 1.5 2007-05-24 13:51:05 tigran Exp $
package diskCacheV111.vehicles;
import java.io.Serializable;
import java.util.StringTokenizer;
public class CacheStatistics implements Serializable, Comparable<CacheStatistics> {
private int _version = 1;
private int _totalAccesses;
private long _accessTime;
private float _score;
private float _halfLife;
private static final double __logOneHalf = Math.log(0.5);
private static final long serialVersionUID = 3951762169312269595L;
public CacheStatistics(int totalAccesses,
long accessTime,
float score,
float halfLife ){
_totalAccesses = totalAccesses;
_accessTime = accessTime;
_score = score;
_halfLife = halfLife;
}
public CacheStatistics(){
this(0,(long)0,(float)0,(float)0);
}
public CacheStatistics(String pnfsString) {
StringTokenizer st = new StringTokenizer(pnfsString,",");
try {
_version = Integer.parseInt(st.nextToken());
} catch (Exception e){
throw new IllegalArgumentException(pnfsString);
}
if (_version > 2){
throw new
IllegalArgumentException("statistics version mismatch, got "
+_version+" expected <= 2");
}
if (st.countTokens() != 4){
throw new
IllegalArgumentException(pnfsString);
}
try {
_totalAccesses = Integer.parseInt(st.nextToken());
_accessTime = Long.parseLong(st.nextToken());
_score = new Float(st.nextToken());
_halfLife = new Float(st.nextToken());
} catch (Exception e){
throw new IllegalArgumentException(pnfsString);
}
}
public CacheStatistics(int version, int totalAccesses, long accessTime,
float score, float halfLife){
_version = version;
_totalAccesses = totalAccesses;
_accessTime = accessTime;
_score = score;
_halfLife = halfLife;
}
public int getTotalAccesses(){
return _totalAccesses;
}
public void setTotalAccesses(int totalAccesses){
_totalAccesses = totalAccesses;
}
public long getAccessTime(){
return _accessTime;
}
public void setAccessTime(long accessTime){
_accessTime = accessTime;
}
public float getScore(){
return _score;
}
public void setScore(float score){
_score = score;
}
public float getHalfLife(){
return _halfLife;
}
public void setHalfLife(float halfLife){
_halfLife = halfLife;
}
public void setVersion( int version ){
_version = version ;
}
public int getVersion(){ return _version ; }
public String toPnfsString(){
return _version + "," + _totalAccesses + "," + _accessTime + "," + _score + ',' + _halfLife;
}
public String toString(){
return this.toPnfsString();
}
public double age(float then, float now){
if (_halfLife==0){
return 0;
} else {
return Math.exp(__logOneHalf*(now-then)/_halfLife);
}
}
public float currentValue(){
return currentValue(System.currentTimeMillis());
}
public float currentValue(long now){
if (_accessTime==0){
return 0;
} else {
return (float)(_score * age(_accessTime, now));
}
}
public void markAccessed(long accessTime){
++_totalAccesses;
if (_accessTime==0){
_score = 1;
} else {
_score = (float)(_score * age(_accessTime, accessTime) + 1);
_accessTime = accessTime;
}
}
@Override
public int compareTo(CacheStatistics other ){
//
//XXX this needs to use the half-life algorithm
//
if (_totalAccesses == other.getTotalAccesses()){
return _accessTime>other.getAccessTime()?-1:_accessTime==other.getAccessTime()?0:1;
// return (new Long(_accessTime)).compareTo(new Long(other.getAccessTime()));
} else {
return _totalAccesses>other.getTotalAccesses()?
-1:_totalAccesses==other.getTotalAccesses()?0:1;
// return (new Integer(_totalAccesses)).compareTo(new Integer(other.getTotalAccesses()));
}
}
public static void main(String[] args){
CacheStatistics s = new CacheStatistics(args[0]);
System.out.println(s.toPnfsString());
}
}