package railo.runtime.cache.legacy;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.oro.text.regex.MalformedPatternException;
import railo.commons.io.IOUtil;
import railo.commons.io.res.Resource;
import railo.commons.io.res.util.ResourceUtil;
import railo.commons.lang.Md5;
import railo.runtime.PageContext;
import railo.runtime.type.dt.TimeSpan;
class CacheItemFS extends CacheItem {
private final Resource res,directory;
private String name;
public CacheItemFS(PageContext pc, HttpServletRequest req, String id, String key, boolean useId, Resource dir) throws IOException {
super(pc, req, id, key, useId);
// directory
directory= dir!=null?dir:getDirectory(pc);
// name
name=Md5.getDigestAsString(fileName)+".cache";
// res
res=directory.getRealResource(name);
}
private static Resource getDirectory(PageContext pc) throws IOException{
Resource dir= pc.getConfig().getCacheDir();
if(!dir.exists())dir.createDirectory(true);
return dir;
}
public boolean isValid() {
return res!=null;
}
public boolean isValid(TimeSpan timespan) {
return res!=null && res.exists() && (res.lastModified()+timespan.getMillis()>=System.currentTimeMillis());
}
public void writeTo(OutputStream os, String charset) throws IOException {
IOUtil.copy(res.getInputStream(),os,true,false);
}
public String getValue() throws IOException {
return IOUtil.toString(res,"UTF-8");
}
public void store(String result) throws IOException {
IOUtil.write(res, result,"UTF-8", false);
MetaData.getInstance(directory).add(name, fileName);
}
public void store(byte[] barr,boolean append) throws IOException {
IOUtil.copy(new ByteArrayInputStream(barr), res.getOutputStream(append),true,true);
MetaData.getInstance(directory).add(name, fileName);
}
protected static void _flushAll(PageContext pc, Resource dir) throws IOException {
if(dir==null)dir=getDirectory(pc);
ResourceUtil.removeChildrenEL(dir);
}
protected static void _flush(PageContext pc, Resource dir, String expireurl) throws IOException, MalformedPatternException {
if(dir==null)dir=getDirectory(pc);
List<String> names;
names = MetaData.getInstance(dir).get(expireurl);
Iterator<String> it = names.iterator();
String name;
while(it.hasNext()){
name=it.next();
if(dir.getRealResource(name).delete());
}
}
}