001 package railo.runtime.type.scope.storage.clean; 002 003 import java.io.IOException; 004 005 import railo.commons.io.IOUtil; 006 import railo.commons.io.res.Resource; 007 import railo.commons.io.res.filter.AndResourceFilter; 008 import railo.commons.io.res.filter.DirectoryResourceFilter; 009 import railo.commons.io.res.filter.ExtensionResourceFilter; 010 import railo.commons.io.res.filter.ResourceFilter; 011 import railo.commons.io.res.util.ResourceUtil; 012 import railo.runtime.config.ConfigWebImpl; 013 import railo.runtime.op.Caster; 014 import railo.runtime.type.dt.DateTimeImpl; 015 import railo.runtime.type.scope.Scope; 016 import railo.runtime.type.scope.storage.StorageScopeEngine; 017 import railo.runtime.type.scope.storage.StorageScopeFile; 018 import railo.runtime.type.scope.storage.StorageScopeListener; 019 020 public class FileStorageScopeCleaner extends StorageScopeCleanerSupport { 021 022 private static final ResourceFilter DIR_FILTER = new DirectoryResourceFilter(); 023 private static ExtensionResourceFilter EXT_FILTER = new ExtensionResourceFilter(".scpt",true); 024 025 026 027 028 029 public FileStorageScopeCleaner(int type,StorageScopeListener listener) { 030 super(type,listener,INTERVALL_DAY); 031 } 032 033 @Override 034 public void init(StorageScopeEngine engine){ 035 super.init(engine); 036 } 037 038 @Override 039 protected void _clean() { 040 ConfigWebImpl cwi=(ConfigWebImpl) engine.getFactory().getConfig(); 041 Resource dir=type==Scope.SCOPE_CLIENT?cwi.getClientScopeDir():cwi.getSessionScopeDir(); 042 043 // for old files only the defintion from admin can be used 044 long timeout=type==Scope.SCOPE_CLIENT?cwi.getClientTimeout().getMillis():cwi.getSessionTimeout().getMillis(); 045 long time = new DateTimeImpl(cwi).getTime()-timeout; 046 047 try { 048 // delete files that has expired 049 AndResourceFilter andFilter = new AndResourceFilter(new ResourceFilter[]{EXT_FILTER,new ExpiresFilter(time,true)}); 050 String appName,cfid2,cfid; 051 Resource[] apps = dir.listResources(DIR_FILTER),cfidDir,files; 052 053 if(apps!=null)for(int a=0;a<apps.length;a++){ 054 appName=StorageScopeFile.decode(apps[a].getName()); 055 cfidDir=apps[a].listResources(DIR_FILTER); 056 if(cfidDir!=null)for(int b=0;b<cfidDir.length;b++){ 057 cfid2=cfidDir[b].getName(); 058 files=cfidDir[b].listResources(andFilter); 059 if(files!=null){ 060 for(int c=0;c<files.length;c++){ 061 cfid=files[c].getName(); 062 cfid=cfid2+cfid.substring(0,cfid.length()-5); 063 064 if(listener!=null)listener.doEnd(engine,this, appName, cfid); 065 066 //info("remove from memory "+appName+"/"+cfid); 067 engine.remove(type,appName,cfid); 068 069 info("remove file "+files[c]); 070 files[c].delete(); 071 } 072 } 073 } 074 } 075 076 ResourceUtil.deleteEmptyFolders(dir); 077 078 } catch (Throwable t) {error(t);} 079 080 081 //long maxSize = type==Scope.SCOPE_CLIENT?cwi.getClientScopeDirSize():cwi.getSessionScopeDirSize(); 082 //checkSize(config,dir,maxSize,extfilter); 083 } 084 085 086 static class ExpiresFilter implements ResourceFilter { 087 088 private long time; 089 private boolean allowDir; 090 091 public ExpiresFilter(long time, boolean allowDir) { 092 this.allowDir=allowDir; 093 this.time=time; 094 } 095 096 public boolean accept(Resource res) { 097 098 if(res.isDirectory()) return allowDir; 099 100 // load content 101 String str=null; 102 try { 103 str = IOUtil.toString(res,"UTF-8"); 104 } 105 catch (IOException e) { 106 return false; 107 } 108 109 int index=str.indexOf(':'); 110 if(index!=-1){ 111 long expires=Caster.toLongValue(str.substring(0,index),-1L); 112 // check is for backward compatibility, old files have no expires date inside. they do ot expire 113 if(expires!=-1) { 114 if(expires<System.currentTimeMillis()){ 115 return true; 116 } 117 str=str.substring(index+1); 118 return false; 119 } 120 } 121 // old files not having a timestamp inside 122 else if(res.lastModified()<=time) { 123 return true; 124 125 } 126 return false; 127 } 128 129 } 130 131 132 }