KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tirsen > nanning > samples > CacheInterceptor


1 package com.tirsen.nanning.samples;
2
3 import java.lang.reflect.Method JavaDoc;
4 import java.util.Arrays JavaDoc;
5 import java.util.HashMap JavaDoc;
6 import java.util.List JavaDoc;
7 import java.util.Map JavaDoc;
8
9 import com.tirsen.nanning.*;
10 import com.tirsen.nanning.attribute.Attributes;
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13
14 public class CacheInterceptor implements MethodInterceptor, FilterMethodsInterceptor {
15     private static final Log logger = LogFactory.getLog(CacheInterceptor.class);
16
17     /**
18      * TODO Should be an LRU-cache
19      */

20     private Map JavaDoc cache = new HashMap JavaDoc();
21
22     public boolean interceptsMethod(Method JavaDoc method) {
23         return Attributes.hasAttribute(method, "cache");
24     }
25
26     public Object JavaDoc invoke(Invocation invocation) throws Throwable JavaDoc {
27         Method JavaDoc method = invocation.getMethod();
28         Map JavaDoc methodCache = getMethodCache(method);
29         List JavaDoc args = Arrays.asList(invocation.getArgs()); // needs args as collection for hashCode and equals
30
Object JavaDoc cachedResult = methodCache.get(args);
31         if (cachedResult == null) {
32             if (logger.isDebugEnabled()) {
33                 logger.debug("caching call for method " + method + " with args " + args);
34             }
35             cachedResult = invocation.invokeNext();
36             methodCache.put(args, cachedResult);
37         }
38         return cachedResult;
39     }
40
41     private Map JavaDoc getMethodCache(Method JavaDoc method) {
42         Map JavaDoc methodCache = (Map JavaDoc) cache.get(method);
43         if (methodCache == null) {
44             methodCache = new HashMap JavaDoc();
45             cache.put(method, methodCache);
46         }
47         return methodCache;
48     }
49
50     public void clearCache() {
51         cache.clear();
52     }
53 }
54
Popular Tags