package czd.lib.cache;
import czd.lib.application.ApplicationUtil;
import czd.lib.data.FileUtil;
import czd.lib.data.PreferenceUtil;
import java.io.File;
import java.io.FilenameFilter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created with IntelliJ IDEA.
* User: chenzhidong
* Date: 13-12-30
* Time: 上午11:49
*/
interface CacheI<T> {
abstract public boolean save(String key, T value);
abstract public long gettime(String key);
abstract public boolean exists(String key);
abstract public T get(String key);
abstract public boolean delete(String key);
abstract public long size();
abstract public String getRealName(String key);
abstract public void clean();
abstract String genKey(String key);
}
abstract class AbsFileCache<T> implements CacheI<T> {
protected String path = "";
protected String name = "";
protected ExecutorService writer;
public AbsFileCache() {
this.path = FileUtil.getCacheDirectory(false).getAbsolutePath() + "/";
writer = Executors.newCachedThreadPool();
}
@Override
public boolean exists(String key) {
File file = genFile(key);
return file.exists() && file.isFile() && file.canRead() && file.length()>0;
}
@Override
public boolean delete(String key) {
if (key.endsWith("*"))
{
final String start=key.substring(0,key.length()-1);
boolean result = true;
File parent = genFile(key).getParentFile();
if (parent.isDirectory() && parent.canWrite())
{
File[] files = parent.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return filename.startsWith(start);
}
});
if (files != null && files.length > 0)
{
for (File file : files){
result &= !(file.exists() && file.isFile()) || file.delete();
PreferenceUtil.deletePreference(ApplicationUtil.application_context,this.name,file.getName());
}
}
}
return result;
}
else
{
File file = genFile(key);
PreferenceUtil.deletePreference(ApplicationUtil.application_context, this.name, genKey(key));
return !(file.exists() && file.isFile()) || file.delete();
}
}
@Override
public long size() {
return FileUtil.getSize(new File(this.path + this.name));
}
@Override
public String getRealName(String key) {
return genFile(key).getAbsolutePath();
}
@Override
public void clean() {
File file = new File(this.path + this.name);
if (file.exists() && file.isDirectory())
FileUtil.rm(file);
PreferenceUtil.cleanPreference(ApplicationUtil.application_context, this.name);
}
@Override
public long gettime(String key) {
return PreferenceUtil.getLongPreference(ApplicationUtil.application_context, this.name, genKey(key));
}
@Override
public String genKey(String key) {
return key;
}
protected File genFile(String key) {
File file = new File(this.path + this.name + "/" + key);
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();
return file;
}
protected void cleanOld() {
final File cachedir = new File(this.path + this.name);
new Thread() {
@Override
public void run() {
super.run();
if (FileUtil.getSize(cachedir) > 50 * 1024 * 1024)
FileUtil.removeExpiredFile(cachedir);
}
}.start();
}
}