001package lucee.commons.io.cache.complex;
002
003import java.util.Date;
004
005import lucee.commons.date.DateTimeUtil;
006import lucee.commons.io.cache.CacheEntry;
007import lucee.runtime.cache.CacheUtil;
008import lucee.runtime.cache.ram.RamCacheEntry;
009import lucee.runtime.op.Caster;
010import lucee.runtime.op.Decision;
011import lucee.runtime.type.Struct;
012import lucee.runtime.type.StructImpl;
013import lucee.runtime.type.dt.DateTime;
014import lucee.runtime.type.dt.DateTimeImpl;
015
016public class CacheComplexEntry implements CacheEntry {
017
018        private CacheEntry entry;
019        private CacheComplex cache;
020        private CacheComplexData data;
021        private Object value;
022
023        public CacheComplexEntry(CacheComplex cache,CacheEntry entry) {
024                this.cache=cache;
025                this.entry=entry;
026        }
027
028        @Override
029        public Date created() {
030                return lastModified();
031        }
032
033        @Override
034        public Struct getCustomInfo() {
035                return CacheUtil.getInfo(entry.getCustomInfo(),this);
036        }
037
038        @Override
039        public String getKey() {
040                return entry.getKey();
041        }
042
043        @Override
044        public Object getValue() {
045                getData();
046                return value;
047        }
048        
049        public CacheComplexData getData() {
050                if(data!=null) return data;
051                Object v = entry.getValue();
052                if(v instanceof CacheComplexData) {
053                        data=(CacheComplexData)v;
054                        value=data.value;
055                }
056                else if(v!=null) {
057                        value=v;
058                }
059                return null;
060        }
061
062        @Override
063        public int hitCount() {
064                CacheComplexData d = getData();
065                if(d!=null) return d.hitCount;
066                return 0;
067        }
068
069        @Override
070        public long idleTimeSpan() {
071                long i=entry.idleTimeSpan();
072                if(i>0) return i;
073                
074                CacheComplexData d = getData();
075                if(d!=null && d.idle!=null && d.idle.longValue()>0) return d.idle.longValue();
076                
077                return 0;
078        }
079
080        @Override
081        public long liveTimeSpan() {
082                long l=entry.liveTimeSpan();
083                if(l>0) return l;
084                
085                CacheComplexData d = getData();
086                if(d!=null && d.until!=null && d.until.longValue()>0) return d.until.longValue();
087                
088                return 0;
089        }
090
091        @Override
092        public Date lastHit() {
093                Date d=entry.lastHit();
094                if(d!=null) return d;
095                
096                return lastModified();
097                
098        }
099
100        @Override
101        public Date lastModified() {
102                Date d=entry.lastModified();
103                if(d!=null) return d;
104                
105                CacheComplexData ccd = getData();
106                if(ccd!=null && ccd.lastModified>0) return new DateTimeImpl(ccd.lastModified,false);
107                
108                return new DateTimeImpl(0, false);
109        }
110
111        @Override
112        public long size() {
113                long s = entry.size();
114                if(s>0) return s;
115                
116                Object v = getValue();
117                if(v!=null && Decision.isSimpleValue(v))
118                        return Caster.toString(v,"").length();
119                return 0;
120        }
121
122}