/** * * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * **/ package lucee.runtime.cache.ram; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.util.Date; import lucee.commons.io.IOUtil; import lucee.commons.io.cache.CacheEntry; import lucee.commons.lang.ExceptionUtil; import lucee.runtime.cache.CacheUtil; import lucee.runtime.type.Struct; public class RamCacheEntry implements CacheEntry { private String key; private Object value; private long idleTime; private long until; private long created; private long modifed; private long accessed; private int hitCount; public RamCacheEntry(String key, Object value, long idleTime, long until) { this.key=key; this.value=value; this.idleTime=idleTime; this.until=until; created=modifed=accessed=System.currentTimeMillis(); hitCount=1; } @Override public Date created() { return new Date(created); } @Override public Struct getCustomInfo() { return CacheUtil.getInfo(this); } @Override public String getKey() { return key; } @Override public Object getValue() { return value; } @Override public int hitCount() { return hitCount; } @Override public long idleTimeSpan() { return idleTime; } @Override public Date lastHit() { return new Date(accessed); } @Override public Date lastModified() { return new Date(modifed); } @Override public long liveTimeSpan() { return until; } @Override public long size() { return sizeOf(value); } public void update(Object value) { this.value=value; modifed=accessed=System.currentTimeMillis(); hitCount++; } public RamCacheEntry read() { accessed=System.currentTimeMillis(); hitCount++; return this; } private static int sizeOf(Object o) { //System.err.println(o.getClass().getName()); ByteArrayOutputStream os = new ByteArrayOutputStream(); ObjectOutputStream oos=null; try { oos = new ObjectOutputStream(os); oos.writeObject(o); } catch(Throwable t) {ExceptionUtil.rethrowIfNecessary(t);} finally { IOUtil.closeEL(oos); } return os.toByteArray().length; } }