KickJava   Java API By Example, From Geeks To Geeks.

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


1 package com.tirsen.nanning.samples;
2
3 import com.tirsen.nanning.AspectInstance;
4 import com.tirsen.nanning.Invocation;
5 import com.tirsen.nanning.MethodInterceptor;
6 import com.tirsen.nanning.MixinInstance;
7 import com.tirsen.nanning.config.Aspect;
8 import com.tirsen.nanning.config.AttributePointcut;
9 import com.tirsen.nanning.config.Pointcut;
10
11 import java.lang.reflect.Method JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.List JavaDoc;
14
15 public class CacheAspect implements Aspect {
16     int totalCount;
17     int missCount;
18     private MethodInterceptor cacheInterceptor;
19     private Pointcut pointcut = new AttributePointcut("cache");
20
21     public CacheAspect(MethodInterceptor cacheInterceptor) {
22         this.cacheInterceptor = cacheInterceptor;
23     }
24
25     public CacheAspect() {
26         this(new CacheInterceptor());
27     }
28
29     public void introduce(AspectInstance aspectInstance) {
30     }
31
32     public void advise(AspectInstance instance) {
33         List JavaDoc mixins = instance.getMixins();
34         for (Iterator JavaDoc iterator = mixins.iterator(); iterator.hasNext();) {
35             MixinInstance mixin = (MixinInstance) iterator.next();
36             Method JavaDoc[] methods = pointcut.methodsToAdvise(instance, mixin);
37             for (int i = 0; i < methods.length; i++) {
38                 Method JavaDoc method = methods[i];
39                 mixin.addInterceptor(method, new MethodInterceptor() {
40                     public Object JavaDoc invoke(Invocation invocation) throws Throwable JavaDoc {
41                         totalCount++;
42                         return invocation.invokeNext();
43                     }
44                 });
45                 mixin.addInterceptor(method, cacheInterceptor);
46                 mixin.addInterceptor(method, new MethodInterceptor() {
47                     public Object JavaDoc invoke(Invocation invocation) throws Throwable JavaDoc {
48                         missCount++;
49                         return invocation.invokeNext();
50                     }
51                 });
52             }
53         }
54     }
55
56     public double getCacheHitRatio() {
57         return totalCount == 0 ? 1 : (totalCount - missCount) / (double) totalCount;
58     }
59 }
60
Popular Tags