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