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