1526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen/* 2526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Copyright (C) 2008 Esmertec AG. 3526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Copyright (C) 2008 The Android Open Source Project 4526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 5526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Licensed under the Apache License, Version 2.0 (the "License"); 6526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * you may not use this file except in compliance with the License. 7526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * You may obtain a copy of the License at 8526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 9526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * http://www.apache.org/licenses/LICENSE-2.0 10526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 11526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Unless required by applicable law or agreed to in writing, software 12526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * distributed under the License is distributed on an "AS IS" BASIS, 13526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * See the License for the specific language governing permissions and 15526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * limitations under the License. 16526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 17526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 18526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenpackage com.google.android.mms.util; 19526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 20526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport android.util.Log; 21526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 22526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport java.util.HashMap; 23526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 24526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenpublic abstract class AbstractCache<K, V> { 25526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static final String TAG = "AbstractCache"; 26526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static final boolean DEBUG = false; 27526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static final boolean LOCAL_LOGV = false; 28526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 29526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static final int MAX_CACHED_ITEMS = 500; 30526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 31526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private final HashMap<K, CacheEntry<V>> mCacheMap; 32526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 33526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen protected AbstractCache() { 34526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mCacheMap = new HashMap<K, CacheEntry<V>>(); 35526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 36526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 37526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public boolean put(K key, V value) { 38526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 39526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, "Trying to put " + key + " into cache."); 40526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 41526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 42526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (mCacheMap.size() >= MAX_CACHED_ITEMS) { 43526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen // TODO Should remove the oldest or least hit cached entry 44526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen // and then cache the new one. 45526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 46526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, "Failed! size limitation reached."); 47526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 48526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return false; 49526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 50526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 51526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (key != null) { 52526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen CacheEntry<V> cacheEntry = new CacheEntry<V>(); 53526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen cacheEntry.value = value; 54526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mCacheMap.put(key, cacheEntry); 55526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 56526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 57526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, key + " cached, " + mCacheMap.size() + " items total."); 58526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 59526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return true; 60526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 61526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return false; 62526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 63526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 64526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public V get(K key) { 65526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 66526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, "Trying to get " + key + " from cache."); 67526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 68526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 69526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (key != null) { 70526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen CacheEntry<V> cacheEntry = mCacheMap.get(key); 71526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (cacheEntry != null) { 72526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen cacheEntry.hit++; 73526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 74526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, key + " hit " + cacheEntry.hit + " times."); 75526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 76526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return cacheEntry.value; 77526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 78526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 79526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return null; 80526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 81526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 82526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public V purge(K key) { 83526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 84526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, "Trying to purge " + key); 85526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 86526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 87526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen CacheEntry<V> v = mCacheMap.remove(key); 88526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 89526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 90526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, mCacheMap.size() + " items cached."); 91526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 92526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 93526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return v != null ? v.value : null; 94526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 95526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 96526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public void purgeAll() { 97526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 98526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, "Purging cache, " + mCacheMap.size() 99526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen + " items dropped."); 100526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 101526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mCacheMap.clear(); 102526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 103526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 104526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public int size() { 105526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return mCacheMap.size(); 106526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 107526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 108526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static class CacheEntry<V> { 109526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen int hit; 110526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen V value; 111526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 112526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen} 113