001package lucee.commons.io.cache.complex;
002
003import java.io.IOException;
004import java.util.ArrayList;
005import java.util.Iterator;
006import java.util.List;
007
008import lucee.commons.io.cache.Cache;
009import lucee.commons.io.cache.CacheEntry;
010import lucee.commons.io.cache.CacheEntryFilter;
011import lucee.commons.io.cache.CacheKeyFilter;
012import lucee.runtime.cache.CacheConnection;
013import lucee.runtime.cache.CacheUtil;
014import lucee.runtime.config.Config;
015import lucee.runtime.type.Struct;
016
017public class CacheComplex implements Cache {
018
019        private Cache cache;
020        private CacheConnection cc;
021
022        public CacheComplex(CacheConnection cc, Cache cache) {
023                this.cc=cc;
024                this.cache=cache;
025                
026        }
027
028        @Override
029        public List<CacheEntry> entries() throws IOException {
030                return entries(cache.entries());
031        }
032        
033        @Override
034        public List<CacheEntry> entries(CacheKeyFilter filter) throws IOException {
035                return entries(cache.entries(filter));
036        }
037
038        @Override
039        public List<CacheEntry> entries(CacheEntryFilter filter) throws IOException {
040                return entries(cache.entries(filter));
041        }
042        
043        private List<CacheEntry> entries(List<CacheEntry> entries) {
044                if(entries==null || entries.size()==0) return entries;
045
046                Iterator<CacheEntry> it = entries.iterator();
047                ArrayList<CacheEntry> list=new ArrayList<CacheEntry>(entries.size());
048                CacheEntry entry;
049                while(it.hasNext()) {
050                        entry=it.next();
051                        if(entry!=null) list.add(new CacheComplexEntry(this,entry));
052                }
053                return list;
054        }
055        
056        @Override
057        public CacheEntry getCacheEntry(String key) throws IOException {
058                CacheEntry entry = cache.getCacheEntry(key);
059                if(entry==null) return entry;
060                return new CacheComplexEntry(this,entry);
061        }
062
063        @Override
064        public CacheEntry getCacheEntry(String key, CacheEntry defaultValue) {
065                CacheEntry entry = cache.getCacheEntry(key,defaultValue);
066                if(entry==null || entry==defaultValue) return entry;
067                return new CacheComplexEntry(this,entry);
068        }
069
070        @Override
071        public Struct getCustomInfo() {
072                return CacheUtil.getInfo(cache.getCustomInfo(),cache);
073        }
074
075        @Override
076        public Object getValue(String key) throws IOException {
077                Object value = cache.getValue(key);
078                if(value instanceof CacheComplexData) return ((CacheComplexData)value).value;
079                return value;
080        }
081
082        @Override
083        public Object getValue(String key, Object defaultValue) {
084                Object value = cache.getValue(key,defaultValue);
085                if(value instanceof CacheComplexData) return ((CacheComplexData)value).value;
086                return value;
087        }
088
089        @Override
090        public long hitCount() {
091                return cache.hitCount();
092        }
093        @Override
094        public long missCount() {
095                return cache.missCount();
096        }
097        
098        @Override
099        public void put(String key, Object value, Long idle, Long until) {
100                cache.put(key, value==null?null:new CacheComplexData(value,idle,until), idle, until);
101        }
102
103        @Override
104        public int remove(CacheEntryFilter filter) throws IOException {
105                return cache.remove(filter);
106        }
107        
108        @Override
109        public List<String> keys(CacheEntryFilter filter) throws IOException {
110                return cache.keys(filter);
111        }
112
113        @Override
114        public List<Object> values() throws IOException {
115                return values(cache.values());
116        }
117
118        @Override
119        public List<Object> values(CacheKeyFilter filter) throws IOException {
120                return values(cache.values(filter));
121        }
122
123        @Override
124        public List<Object> values(CacheEntryFilter filter) throws IOException {
125                return values(cache.values(filter));
126        }
127        
128        public List<Object> values(List<Object> values) {
129                if(values==null || values.size()==0) return values;
130
131                ArrayList<Object> list=new ArrayList<Object>();
132                Iterator<Object> it = values.iterator();
133                Object v;
134                while(it.hasNext()) {
135                        v=it.next();
136                        if(v instanceof CacheComplexData) list.add(((CacheComplexData)v).value);
137                        else list.add(v);
138                }
139                return list;
140        }
141
142        
143        
144        /////////////////////////////////////////////////////////////////////////////////////
145        
146        @Override
147        public boolean contains(String key) {
148                return cache.contains(key);
149        }
150
151        @Override
152        public void init(Config config, String arg1, Struct arg2) throws IOException {
153                cache.init(config, arg1, arg2);
154        }
155
156        @Override
157        public List<String> keys() throws IOException {
158                return cache.keys();
159        }
160
161        @Override
162        public List<String> keys(CacheKeyFilter filter) throws IOException {
163                return cache.keys(filter);
164        }
165
166        @Override
167        public boolean remove(String key) throws IOException {
168                return cache.remove(key);
169        }
170
171        @Override
172        public int remove(CacheKeyFilter filter) throws IOException {
173                return cache.remove(filter);
174        }
175
176}