package com.AsamiOffice.util; import java.lang.ref.SoftReference; import java.util.Iterator; import java.util.LinkedList; /** * CacheManager * * @since Sep. 22, 2005 * @version Sep. 30, 2005 * @author ASAMI, Tomoharu (asami@asamioffice.com) */ public class CacheManager { private LinkedList lru_ = new LinkedList(); private int maxSize_ = 10; public Object get(Object owner, String usage) { Iterator iter = lru_.iterator(); while (iter.hasNext()) { Info info = (Info)iter.next(); if (info.owner == owner && info.usage.equals(usage)) { iter.remove(); Object data = info.getData(); if (data != null) { lru_.addFirst(info); return data; } else { return null; } } } return null; } public void add(Object owner, String usage, Object data) { Iterator iter = lru_.iterator(); while (iter.hasNext()) { Info info = (Info)iter.next(); if (info.owner == owner && info.usage.equals(usage)) { iter.remove(); info.setData(data); lru_.addFirst(info); return; } } Info info = new Info(); info.owner = owner; info.usage = usage; info.setData(data); lru_.add(info); if (isFull_()) { lru_.removeLast(); } } private boolean isFull_() { return lru_.size() > getMaxSize_(); } private int getMaxSize_() { return maxSize_ ; } public void clear(Object owner) { Iterator iter = lru_.iterator(); while (iter.hasNext()) { Info info = (Info)iter.next(); if (info.owner == owner) { iter.remove(); } } } static class Info { private static final int SMALL_BINARY_SIZE = 8192; private static final int SMALL_TEXT_SIZE = 8192; Object owner; String usage; private Object data; private SoftReference ref; public void setData(Object data) { if (isSmallData_(data)) { this.data = data; this.ref = null; } else { this.ref = new SoftReference(data); this.data = null; } } private boolean isSmallData_(Object data) { if (data instanceof byte[]) { return ((byte[])data).length <= SMALL_BINARY_SIZE; } else if (data instanceof String) { return ((String)data).length() <= SMALL_TEXT_SIZE; } else { return false; } } public Object getData() { if (ref != null) { return ref.get(); } else { return data; } } } }