package com.sleepycat.je.log;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.config.EnvironmentParams;
import com.sleepycat.je.dbi.DbConfigManager;
import de.ovgu.cide.jakutil.*;
class FileCache {
private Map fileMap;
private LinkedList fileList;
private int fileCacheSize;
FileCache( DbConfigManager configManager) throws DatabaseException {
fileMap=new Hashtable();
fileList=new LinkedList();
fileCacheSize=configManager.getInt(EnvironmentParams.LOG_FILE_CACHE_SIZE);
}
FileHandle get( Long fileId){
return (FileHandle)fileMap.get(fileId);
}
void add( Long fileId, FileHandle fileHandle) throws DatabaseException {
if (fileList.size() >= fileCacheSize) {
Iterator iter=fileList.iterator();
boolean done=false;
while (!done && iter.hasNext()) {
Long evictId=(Long)iter.next();
FileHandle evictTarget=(FileHandle)fileMap.get(evictId);
this.hook438(iter,done,evictId,evictTarget);
}
}
fileList.add(fileId);
fileMap.put(fileId,fileHandle);
}
/**
* Take any file handles corresponding to this file name out of the cache. A
* file handle could be there twice, in rd only and in r/w mode.
*/
void remove( long fileNum) throws IOException, DatabaseException {
Iterator iter=fileList.iterator();
while (iter.hasNext()) {
Long evictId=(Long)iter.next();
if (evictId.longValue() == fileNum) {
FileHandle evictTarget=(FileHandle)fileMap.get(evictId);
this.hook439(iter,evictId,evictTarget);
}
}
}
void clear() throws IOException, DatabaseException {
Iterator iter=fileMap.values().iterator();
while (iter.hasNext()) {
FileHandle fileHandle=(FileHandle)iter.next();
this.hook440(iter,fileHandle);
}
fileMap.clear();
fileList.clear();
}
Set getCacheKeys(){
return fileMap.keySet();
}
protected void hook438( Iterator iter, boolean done, Long evictId, FileHandle evictTarget) throws DatabaseException {
try {
fileMap.remove(evictId);
iter.remove();
evictTarget.close();
}
catch ( IOException e) {
throw new DatabaseException(e);
}
finally {
this.hook441(evictTarget);
}
done=true;
}
protected void hook439( Iterator iter, Long evictId, FileHandle evictTarget) throws IOException, DatabaseException {
this.hook442(evictTarget);
fileMap.remove(evictId);
iter.remove();
evictTarget.close();
}
protected void hook440( Iterator iter, FileHandle fileHandle) throws IOException, DatabaseException {
this.hook443(fileHandle);
fileHandle.close();
iter.remove();
}
protected void hook441( FileHandle evictTarget) throws DatabaseException {
}
protected void hook442( FileHandle evictTarget) throws IOException, DatabaseException {
}
protected void hook443( FileHandle fileHandle) throws IOException, DatabaseException {
}
}