1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.commons.jcs.jcache.cdi;
20
21 import java.io.Serializable;
22 import java.lang.reflect.Method;
23 import javax.annotation.Priority;
24 import javax.cache.Cache;
25 import javax.cache.annotation.CacheKeyInvocationContext;
26 import javax.cache.annotation.CacheResolver;
27 import javax.cache.annotation.CacheResolverFactory;
28 import javax.cache.annotation.CacheResult;
29 import javax.cache.annotation.GeneratedCacheKey;
30 import javax.inject.Inject;
31 import javax.interceptor.AroundInvoke;
32 import javax.interceptor.Interceptor;
33 import javax.interceptor.InvocationContext;
34
35 @CacheResult
36 @Interceptor
37 @Priority(1000)
38 public class CacheResultInterceptor implements Serializable
39 {
40 @Inject
41 private CDIJCacheHelper helper;
42
43 @AroundInvoke
44 public Object cache(final InvocationContext ic) throws Throwable
45 {
46 final CDIJCacheHelper.MethodMeta methodMeta = helper.findMeta(ic);
47
48 final String cacheName = methodMeta.getCacheResultCacheName();
49
50 final CacheResult cacheResult = methodMeta.getCacheResult();
51 final CacheKeyInvocationContext<CacheResult> context = new CacheKeyInvocationContextImpl<CacheResult>(
52 ic, cacheResult, cacheName, methodMeta);
53
54 final CacheResolverFactory cacheResolverFactory = methodMeta.getCacheResultResolverFactory();
55 final CacheResolver cacheResolver = cacheResolverFactory.getCacheResolver(context);
56 final Cache<Object, Object> cache = cacheResolver.resolveCache(context);
57
58 final GeneratedCacheKey cacheKey = methodMeta.getCacheResultKeyGenerator().generateCacheKey(context);
59
60 Cache<Object, Object> exceptionCache = null;
61
62 Object result;
63 if (!cacheResult.skipGet())
64 {
65 result = cache.get(cacheKey);
66 if (result != null)
67 {
68 return result;
69 }
70
71
72 if (!cacheResult.exceptionCacheName().isEmpty())
73 {
74 exceptionCache = cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context);
75 final Object exception = exceptionCache.get(cacheKey);
76 if (exception != null)
77 {
78 throw Throwable.class.cast(exception);
79 }
80 }
81 }
82
83 try
84 {
85 result = ic.proceed();
86 if (result != null)
87 {
88 cache.put(cacheKey, result);
89 }
90
91 return result;
92 }
93 catch (final Throwable t)
94 {
95 if (helper.isIncluded(t.getClass(), cacheResult.cachedExceptions(), cacheResult.nonCachedExceptions()))
96 {
97 if (exceptionCache == null)
98 {
99 exceptionCache = cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context);
100 }
101 exceptionCache.put(cacheKey, t);
102 }
103 throw t;
104 }
105 }
106 }