1d02a064168ae5c916b977182b764580e601cb084Wink Saville/* 2d02a064168ae5c916b977182b764580e601cb084Wink Saville * Copyright (C) 2008 Esmertec AG. 3d02a064168ae5c916b977182b764580e601cb084Wink Saville * Copyright (C) 2008 The Android Open Source Project 4d02a064168ae5c916b977182b764580e601cb084Wink Saville * 5d02a064168ae5c916b977182b764580e601cb084Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 6d02a064168ae5c916b977182b764580e601cb084Wink Saville * you may not use this file except in compliance with the License. 7d02a064168ae5c916b977182b764580e601cb084Wink Saville * You may obtain a copy of the License at 8d02a064168ae5c916b977182b764580e601cb084Wink Saville * 9d02a064168ae5c916b977182b764580e601cb084Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 10d02a064168ae5c916b977182b764580e601cb084Wink Saville * 11d02a064168ae5c916b977182b764580e601cb084Wink Saville * Unless required by applicable law or agreed to in writing, software 12d02a064168ae5c916b977182b764580e601cb084Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 13d02a064168ae5c916b977182b764580e601cb084Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d02a064168ae5c916b977182b764580e601cb084Wink Saville * See the License for the specific language governing permissions and 15d02a064168ae5c916b977182b764580e601cb084Wink Saville * limitations under the License. 16d02a064168ae5c916b977182b764580e601cb084Wink Saville */ 17d02a064168ae5c916b977182b764580e601cb084Wink Saville 18d02a064168ae5c916b977182b764580e601cb084Wink Savillepackage com.google.android.mms.util; 19d02a064168ae5c916b977182b764580e601cb084Wink Saville 20d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport android.util.Log; 21d02a064168ae5c916b977182b764580e601cb084Wink Saville 22d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport java.util.HashMap; 23d02a064168ae5c916b977182b764580e601cb084Wink Saville 24d02a064168ae5c916b977182b764580e601cb084Wink Savillepublic abstract class AbstractCache<K, V> { 25d02a064168ae5c916b977182b764580e601cb084Wink Saville private static final String TAG = "AbstractCache"; 26d02a064168ae5c916b977182b764580e601cb084Wink Saville private static final boolean DEBUG = false; 27d02a064168ae5c916b977182b764580e601cb084Wink Saville private static final boolean LOCAL_LOGV = false; 28d02a064168ae5c916b977182b764580e601cb084Wink Saville 29d02a064168ae5c916b977182b764580e601cb084Wink Saville private static final int MAX_CACHED_ITEMS = 500; 30d02a064168ae5c916b977182b764580e601cb084Wink Saville 31d02a064168ae5c916b977182b764580e601cb084Wink Saville private final HashMap<K, CacheEntry<V>> mCacheMap; 32d02a064168ae5c916b977182b764580e601cb084Wink Saville 33d02a064168ae5c916b977182b764580e601cb084Wink Saville protected AbstractCache() { 34d02a064168ae5c916b977182b764580e601cb084Wink Saville mCacheMap = new HashMap<K, CacheEntry<V>>(); 35d02a064168ae5c916b977182b764580e601cb084Wink Saville } 36d02a064168ae5c916b977182b764580e601cb084Wink Saville 37d02a064168ae5c916b977182b764580e601cb084Wink Saville public boolean put(K key, V value) { 38d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 39d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, "Trying to put " + key + " into cache."); 40d02a064168ae5c916b977182b764580e601cb084Wink Saville } 41d02a064168ae5c916b977182b764580e601cb084Wink Saville 42d02a064168ae5c916b977182b764580e601cb084Wink Saville if (mCacheMap.size() >= MAX_CACHED_ITEMS) { 43d02a064168ae5c916b977182b764580e601cb084Wink Saville // TODO Should remove the oldest or least hit cached entry 44d02a064168ae5c916b977182b764580e601cb084Wink Saville // and then cache the new one. 45d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 46d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, "Failed! size limitation reached."); 47d02a064168ae5c916b977182b764580e601cb084Wink Saville } 48d02a064168ae5c916b977182b764580e601cb084Wink Saville return false; 49d02a064168ae5c916b977182b764580e601cb084Wink Saville } 50d02a064168ae5c916b977182b764580e601cb084Wink Saville 51d02a064168ae5c916b977182b764580e601cb084Wink Saville if (key != null) { 52d02a064168ae5c916b977182b764580e601cb084Wink Saville CacheEntry<V> cacheEntry = new CacheEntry<V>(); 53d02a064168ae5c916b977182b764580e601cb084Wink Saville cacheEntry.value = value; 54d02a064168ae5c916b977182b764580e601cb084Wink Saville mCacheMap.put(key, cacheEntry); 55d02a064168ae5c916b977182b764580e601cb084Wink Saville 56d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 57d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, key + " cached, " + mCacheMap.size() + " items total."); 58d02a064168ae5c916b977182b764580e601cb084Wink Saville } 59d02a064168ae5c916b977182b764580e601cb084Wink Saville return true; 60d02a064168ae5c916b977182b764580e601cb084Wink Saville } 61d02a064168ae5c916b977182b764580e601cb084Wink Saville return false; 62d02a064168ae5c916b977182b764580e601cb084Wink Saville } 63d02a064168ae5c916b977182b764580e601cb084Wink Saville 64d02a064168ae5c916b977182b764580e601cb084Wink Saville public V get(K key) { 65d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 66d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, "Trying to get " + key + " from cache."); 67d02a064168ae5c916b977182b764580e601cb084Wink Saville } 68d02a064168ae5c916b977182b764580e601cb084Wink Saville 69d02a064168ae5c916b977182b764580e601cb084Wink Saville if (key != null) { 70d02a064168ae5c916b977182b764580e601cb084Wink Saville CacheEntry<V> cacheEntry = mCacheMap.get(key); 71d02a064168ae5c916b977182b764580e601cb084Wink Saville if (cacheEntry != null) { 72d02a064168ae5c916b977182b764580e601cb084Wink Saville cacheEntry.hit++; 73d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 74d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, key + " hit " + cacheEntry.hit + " times."); 75d02a064168ae5c916b977182b764580e601cb084Wink Saville } 76d02a064168ae5c916b977182b764580e601cb084Wink Saville return cacheEntry.value; 77d02a064168ae5c916b977182b764580e601cb084Wink Saville } 78d02a064168ae5c916b977182b764580e601cb084Wink Saville } 79d02a064168ae5c916b977182b764580e601cb084Wink Saville return null; 80d02a064168ae5c916b977182b764580e601cb084Wink Saville } 81d02a064168ae5c916b977182b764580e601cb084Wink Saville 82d02a064168ae5c916b977182b764580e601cb084Wink Saville public V purge(K key) { 83d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 84d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, "Trying to purge " + key); 85d02a064168ae5c916b977182b764580e601cb084Wink Saville } 86d02a064168ae5c916b977182b764580e601cb084Wink Saville 87d02a064168ae5c916b977182b764580e601cb084Wink Saville CacheEntry<V> v = mCacheMap.remove(key); 88d02a064168ae5c916b977182b764580e601cb084Wink Saville 89d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 90d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, mCacheMap.size() + " items cached."); 91d02a064168ae5c916b977182b764580e601cb084Wink Saville } 92d02a064168ae5c916b977182b764580e601cb084Wink Saville 93d02a064168ae5c916b977182b764580e601cb084Wink Saville return v != null ? v.value : null; 94d02a064168ae5c916b977182b764580e601cb084Wink Saville } 95d02a064168ae5c916b977182b764580e601cb084Wink Saville 96d02a064168ae5c916b977182b764580e601cb084Wink Saville public void purgeAll() { 97d02a064168ae5c916b977182b764580e601cb084Wink Saville if (LOCAL_LOGV) { 98d02a064168ae5c916b977182b764580e601cb084Wink Saville Log.v(TAG, "Purging cache, " + mCacheMap.size() 99d02a064168ae5c916b977182b764580e601cb084Wink Saville + " items dropped."); 100d02a064168ae5c916b977182b764580e601cb084Wink Saville } 101d02a064168ae5c916b977182b764580e601cb084Wink Saville mCacheMap.clear(); 102d02a064168ae5c916b977182b764580e601cb084Wink Saville } 103d02a064168ae5c916b977182b764580e601cb084Wink Saville 104d02a064168ae5c916b977182b764580e601cb084Wink Saville public int size() { 105d02a064168ae5c916b977182b764580e601cb084Wink Saville return mCacheMap.size(); 106d02a064168ae5c916b977182b764580e601cb084Wink Saville } 107d02a064168ae5c916b977182b764580e601cb084Wink Saville 108d02a064168ae5c916b977182b764580e601cb084Wink Saville private static class CacheEntry<V> { 109d02a064168ae5c916b977182b764580e601cb084Wink Saville int hit; 110d02a064168ae5c916b977182b764580e601cb084Wink Saville V value; 111d02a064168ae5c916b977182b764580e601cb084Wink Saville } 112d02a064168ae5c916b977182b764580e601cb084Wink Saville} 113