package lucee.commons.io.cache.complex; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import lucee.commons.io.cache.Cache; import lucee.commons.io.cache.CacheEntry; import lucee.commons.io.cache.CacheEntryFilter; import lucee.commons.io.cache.CacheKeyFilter; import lucee.runtime.cache.CacheConnection; import lucee.runtime.cache.CacheUtil; import lucee.runtime.config.Config; import lucee.runtime.type.Struct; public class CacheComplex implements Cache { private Cache cache; private CacheConnection cc; public CacheComplex(CacheConnection cc, Cache cache) { this.cc=cc; this.cache=cache; } @Override public List<CacheEntry> entries() throws IOException { return entries(cache.entries()); } @Override public List<CacheEntry> entries(CacheKeyFilter filter) throws IOException { return entries(cache.entries(filter)); } @Override public List<CacheEntry> entries(CacheEntryFilter filter) throws IOException { return entries(cache.entries(filter)); } private List<CacheEntry> entries(List<CacheEntry> entries) { if(entries==null || entries.size()==0) return entries; Iterator<CacheEntry> it = entries.iterator(); ArrayList<CacheEntry> list=new ArrayList<CacheEntry>(entries.size()); CacheEntry entry; while(it.hasNext()) { entry=it.next(); if(entry!=null) list.add(new CacheComplexEntry(this,entry)); } return list; } @Override public CacheEntry getCacheEntry(String key) throws IOException { CacheEntry entry = cache.getCacheEntry(key); if(entry==null) return entry; return new CacheComplexEntry(this,entry); } @Override public CacheEntry getCacheEntry(String key, CacheEntry defaultValue) { CacheEntry entry = cache.getCacheEntry(key,defaultValue); if(entry==null || entry==defaultValue) return entry; return new CacheComplexEntry(this,entry); } @Override public Struct getCustomInfo() throws IOException { return CacheUtil.getInfo(cache.getCustomInfo(),cache); } @Override public Object getValue(String key) throws IOException { Object value = cache.getValue(key); if(value instanceof CacheComplexData) return ((CacheComplexData)value).value; return value; } @Override public Object getValue(String key, Object defaultValue) { Object value = cache.getValue(key,defaultValue); if(value instanceof CacheComplexData) return ((CacheComplexData)value).value; return value; } @Override public long hitCount() throws IOException { return cache.hitCount(); } @Override public long missCount() throws IOException { return cache.missCount(); } @Override public void put(String key, Object value, Long idle, Long until) throws IOException { cache.put(key, value==null?null:new CacheComplexData(value,idle,until), idle, until); } @Override public int remove(CacheEntryFilter filter) throws IOException { return cache.remove(filter); } @Override public List<String> keys(CacheEntryFilter filter) throws IOException { return cache.keys(filter); } @Override public List<Object> values() throws IOException { return values(cache.values()); } @Override public List<Object> values(CacheKeyFilter filter) throws IOException { return values(cache.values(filter)); } @Override public List<Object> values(CacheEntryFilter filter) throws IOException { return values(cache.values(filter)); } public List<Object> values(List<Object> values) throws IOException { if(values==null || values.size()==0) return values; ArrayList<Object> list=new ArrayList<Object>(); Iterator<Object> it = values.iterator(); Object v; while(it.hasNext()) { v=it.next(); if(v instanceof CacheComplexData) list.add(((CacheComplexData)v).value); else list.add(v); } return list; } ///////////////////////////////////////////////////////////////////////////////////// @Override public boolean contains(String key) throws IOException { return cache.contains(key); } @Override public void init(Config config, String arg1, Struct arg2) throws IOException { cache.init(config, arg1, arg2); } @Override public List<String> keys() throws IOException { return cache.keys(); } @Override public List<String> keys(CacheKeyFilter filter) throws IOException { return cache.keys(filter); } @Override public boolean remove(String key) throws IOException { return cache.remove(key); } @Override public int remove(CacheKeyFilter filter) throws IOException { return cache.remove(filter); } }