package railo.runtime.cache; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import railo.commons.io.cache.Cache; import railo.commons.io.cache.CacheEntry; import railo.commons.io.cache.CacheEntryFilter; import railo.commons.io.cache.CacheKeyFilter; import railo.commons.io.cache.exp.CacheException; import railo.runtime.type.Struct; public abstract class CacheSupport implements Cache { @Override public List<String> keys(CacheKeyFilter filter) throws IOException { List<String> keys = keys(); List<String> list=new ArrayList<String>(); Iterator<String> it = keys.iterator(); String key; while(it.hasNext()){ key= it.next(); if(filter.accept(key))list.add(key); } return list; } @Override public List<CacheEntry> keys(CacheEntryFilter filter) throws IOException { List<String> keys = keys(); List<CacheEntry> list=new ArrayList<CacheEntry>(); Iterator<String> it = keys.iterator(); String key; CacheEntry entry; while(it.hasNext()){ key=it.next(); entry=getQuiet(key,null); if(filter.accept(entry))list.add(entry); } return list; } @Override public List<CacheEntry> entries() throws IOException { List<String> keys = keys(); List<CacheEntry> list=new ArrayList<CacheEntry>(); Iterator<String> it = keys.iterator(); while(it.hasNext()){ list.add(getQuiet(it.next(),null)); } return list; } @Override public List<CacheEntry> entries(CacheKeyFilter filter) throws IOException { List<String> keys = keys(); List<CacheEntry> list=new ArrayList<CacheEntry>(); Iterator<String> it = keys.iterator(); String key; while(it.hasNext()){ key=it.next(); if(filter.accept(key))list.add(getQuiet(key,null)); } return list; } @Override public List<CacheEntry> entries(CacheEntryFilter filter) throws IOException { List<String> keys = keys(); List<CacheEntry> list=new ArrayList<CacheEntry>(); Iterator<String> it = keys.iterator(); CacheEntry entry; while(it.hasNext()){ entry=getQuiet(it.next(),null); if(filter.accept(entry))list.add(entry); } return list; } // there was the wrong generic type defined in the older interface, because of that we do not define a generic type at all here, just to be sure @Override public List values() throws IOException { List<String> keys = keys(); List<Object> list=new ArrayList<Object>(); Iterator<String> it = keys.iterator(); String key; while(it.hasNext()){ key=it.next(); list.add(getQuiet(key,null).getValue()); } return list; } // there was the wrong generic type defined in the older interface, because of that we do not define a generic type at all here, just to be sure @Override public List values(CacheEntryFilter filter) throws IOException { List<String> keys = keys(); List<Object> list=new ArrayList<Object>(); Iterator<String> it = keys.iterator(); String key; CacheEntry entry; while(it.hasNext()){ key=it.next(); entry=getQuiet(key,null); if(filter.accept(entry))list.add(entry.getValue()); } return list; } // there was the wrong generic type defined in the older interface, because of that we do not define a generic type at all here, just to be sure @Override public List values(CacheKeyFilter filter) throws IOException { List<String> keys = keys(); List<Object> list=new ArrayList<Object>(); Iterator<String> it = keys.iterator(); String key; while(it.hasNext()){ key=it.next(); if(filter.accept(key))list.add(getQuiet(key,null).getValue()); } return list; } @Override public int remove(CacheEntryFilter filter) throws IOException { List<String> keys = keys(); int count=0; Iterator<String> it = keys.iterator(); String key; CacheEntry entry; while(it.hasNext()){ key=it.next(); entry=getQuiet(key,null); if(filter==null || filter.accept(entry)){ remove(key); count++; } } return count; } @Override public int remove(CacheKeyFilter filter) throws IOException { List<String> keys = keys(); int count=0; Iterator<String> it = keys.iterator(); String key; while(it.hasNext()){ key=it.next(); if(filter==null || filter.accept(key)){ remove(key); count++; } } return count; } public Struct getCustomInfo() { return CacheUtil.getInfo(this); } @Override public Object getValue(String key) throws IOException { return getCacheEntry(key).getValue(); } @Override public Object getValue(String key, Object defaultValue) { CacheEntry entry = getCacheEntry(key,null); if(entry==null) return defaultValue; return entry.getValue(); } protected static boolean valid(CacheEntry entry) { long now = System.currentTimeMillis(); if(entry.liveTimeSpan()>0 && entry.liveTimeSpan()+entry.lastModified().getTime()<now){ return false; } if(entry.idleTimeSpan()>0 && entry.idleTimeSpan()+entry.lastHit().getTime()<now){ return false; } return true; } @Override public CacheEntry getCacheEntry(String key) throws IOException { CacheEntry entry = getCacheEntry(key, null); if(entry==null) throw new CacheException("there is no valid cache entry with key ["+key+"]"); return entry; } public CacheEntry getQuiet(String key) throws IOException { CacheEntry entry = getQuiet(key, null); if(entry==null) throw new CacheException("there is no valid cache entry with key ["+key+"]"); return entry; } public abstract CacheEntry getQuiet(String key, CacheEntry defaultValue); }