package railo.runtime.type.scope.storage.clean; import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import railo.commons.io.cache.Cache; import railo.commons.io.cache.CacheEntry; import railo.commons.io.cache.CacheKeyFilter; import railo.runtime.cache.CacheConnection; import railo.runtime.config.ConfigWebImpl; import railo.runtime.type.scope.storage.StorageScopeCache; import railo.runtime.type.scope.storage.StorageScopeEngine; import railo.runtime.type.scope.storage.StorageScopeListener; public class CacheStorageScopeCleaner extends StorageScopeCleanerSupport { private Filter filter; public CacheStorageScopeCleaner(int type,StorageScopeListener listener) { super(type,listener,INTERVALL_MINUTE); //this.strType=VariableInterpreter.scopeInt2String(type); filter=new Filter(strType); } public void init(StorageScopeEngine engine) { super.init(engine); } protected void _clean() { ConfigWebImpl config = (ConfigWebImpl) engine.getFactory().getConfig(); Map<String, CacheConnection> connections = config.getCacheConnections(); CacheConnection cc; if(connections!=null) { Map.Entry<String, CacheConnection> entry; Iterator<Entry<String, CacheConnection>> it = connections.entrySet().iterator(); while(it.hasNext()){ entry=it.next(); cc=entry.getValue(); if(cc.isStorage()){ try { clean(cc,config); } catch (IOException e) { error(e); } } } } } private void clean(CacheConnection cc, ConfigWebImpl config) throws IOException { Cache cache = cc.getInstance(config); int len=filter.length(),index; List<CacheEntry> entries = cache.entries(filter); CacheEntry ce; long expires; String key,appname,cfid; if(entries.size()>0){ Iterator<CacheEntry> it = entries.iterator(); while(it.hasNext()){ ce=it.next(); expires=ce.lastModified().getTime()+ce.idleTimeSpan()-StorageScopeCache.SAVE_EXPIRES_OFFSET; if(expires<=System.currentTimeMillis()) { key=ce.getKey().substring(len); index=key.indexOf(':'); cfid=key.substring(0,index); appname=key.substring(index+1); if(listener!=null)listener.doEnd(engine, this,appname, cfid); info("remove "+strType+"/"+appname+"/"+cfid+" from cache "+cc.getName()); engine.remove(type,appname,cfid); cache.remove(ce.getKey()); } } } //engine.remove(type,appName,cfid); //return (Struct) cache.getValue(key,null); } public static class Filter implements CacheKeyFilter { private String startsWith; public Filter(String type){ startsWith="railo-storage:"+type+":"; } public String toPattern() { // TODO Auto-generated method stub return startsWith+"*"; } public boolean accept(String key) { return key.startsWith(startsWith); } public int length() { return startsWith.length(); } } }