package org.codehaus.groovy.gjit.db;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.groovy.gjit.DebugUtils;
public class SiteTypePersistentCache implements Serializable {
private static final long serialVersionUID = 7031435017464448743L;
private Map<String, ClassEntry> classEntries = new HashMap<String, ClassEntry>();
// private static final String CACHE_FILE_NAME = "test.cache";
public SiteTypePersistentCache(){}
// public static void read() throws Throwable {
// FileInputStream f = new FileInputStream(CACHE_FILE_NAME);
// ObjectInputStream o = new ObjectInputStream(f);
// instance = (SiteTypePersistentCache) o.readObject();
// }
//
// public static void write() throws Throwable {
// FileOutputStream f = new FileOutputStream(CACHE_FILE_NAME);
// ObjectOutputStream o = new ObjectOutputStream(f);
// o.writeObject(SiteTypePersistentCache.v());
// }
private static SiteTypePersistentCache instance;
public static SiteTypePersistentCache v() {
if(instance==null) instance = new SiteTypePersistentCache();
return instance;
}
public Map<String, ClassEntry> getClassEntries() {
return classEntries;
}
public void setClassEntries(Map<String, ClassEntry> classEntries) {
this.classEntries = classEntries;
}
// TODO changed cache root
private static final String ROOT_DIR = "/temp/";
// private static final String ROOT_DIR = System.getProperty("user.home") + "/.gjit/";
private static final String CACHE_EXT = ".cache";
public ClassEntry find(String name) throws Throwable {
String filename = ROOT_DIR + name + CACHE_EXT;
if(new File(filename).exists()) {
FileInputStream f = new FileInputStream(filename);
ObjectInputStream o = new ObjectInputStream(f);
ClassEntry ce = (ClassEntry) o.readObject();
this.classEntries.put(name, ce);
return ce;
} else {
return null;
}
}
public ClassEntry add(String name, long stamp) {
int i = name.lastIndexOf('/');
boolean newlyCreated = false;
if(i!=-1) {
String dir = name.substring(0, i);
// System.out.println(dir);
File fdir = new File(ROOT_DIR + dir);
if(fdir.exists() == false) {
// System.out.println("fdir exists == false");
fdir.mkdirs();
newlyCreated = true;
}
}
ClassEntry ce = new ClassEntry(name, stamp);
String filename = ROOT_DIR + name + CACHE_EXT;
try {
if(newlyCreated) {
FileOutputStream f = new FileOutputStream(filename);
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(ce);
} else {
// read and compare
FileInputStream f = new FileInputStream(filename);
ObjectInputStream o = new ObjectInputStream(f);
ClassEntry objOnDisk = (ClassEntry) o.readObject();
if(objOnDisk.getTimeStamp() > ce.getTimeStamp()) {
throw new RuntimeException("Cache on disk is created from a compiled class file in the future: " + filename);
} else if(objOnDisk.getTimeStamp() == ce.getTimeStamp()){
ce = objOnDisk;
DebugUtils.println("reading from cache, instead of creating the new one");
}
}
this.classEntries.put(name, ce);
return ce;
} catch(Throwable e) {
return null;
}
}
}