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.extras.cdi;
20
21 import javax.cache.CacheManager;
22 import javax.cache.Caching;
23 import javax.cache.spi.CachingProvider;
24 import javax.enterprise.event.Observes;
25 import javax.enterprise.inject.spi.AfterBeanDiscovery;
26 import javax.enterprise.inject.spi.Bean;
27 import javax.enterprise.inject.spi.BeforeShutdown;
28 import javax.enterprise.inject.spi.Extension;
29 import javax.enterprise.inject.spi.ProcessBean;
30 import java.util.Properties;
31
32
33 public class ExtraJCacheExtension implements Extension
34 {
35 private static final boolean ACTIVATED = "true".equals(System.getProperty("org.apache.jcs.extra.cdi", "true"));
36
37 private boolean cacheManagerFound = false;
38 private boolean cacheProviderFound = false;
39 private CacheManager cacheManager;
40 private CachingProvider cachingProvider;
41
42 public <A> void processBean(final @Observes ProcessBean<A> processBeanEvent)
43 {
44 if (!ACTIVATED)
45 {
46 return;
47 }
48
49 if (cacheManagerFound && cacheProviderFound)
50 {
51 return;
52 }
53
54 final Bean<A> bean = processBeanEvent.getBean();
55 if (CacheManagerBean.class.isInstance(bean) || CacheProviderBean.class.isInstance(bean))
56 {
57 return;
58 }
59
60 if (!cacheManagerFound)
61 {
62 cacheManagerFound = bean.getTypes().contains(CacheManager.class);
63 }
64 if (!cacheProviderFound)
65 {
66 cacheProviderFound = bean.getTypes().contains(CachingProvider.class);
67 }
68 }
69
70 public void addJCacheBeans(final @Observes AfterBeanDiscovery afterBeanDiscovery)
71 {
72 if (!ACTIVATED)
73 {
74 return;
75 }
76
77 if (cacheManagerFound && cacheProviderFound) {
78 return;
79 }
80
81 cachingProvider = Caching.getCachingProvider();
82 if (!cacheManagerFound)
83 {
84 cacheManager = cachingProvider.getCacheManager(
85 cachingProvider.getDefaultURI(),
86 cachingProvider.getDefaultClassLoader(),
87 new Properties());
88 afterBeanDiscovery.addBean(new CacheManagerBean(cacheManager));
89 }
90 if (!cacheProviderFound)
91 {
92 afterBeanDiscovery.addBean(new CacheProviderBean(cachingProvider));
93 }
94 }
95
96 public void destroyIfCreated(final @Observes BeforeShutdown beforeShutdown)
97 {
98 if (cacheManager != null)
99 {
100 cacheManager.close();
101 }
102 if (cachingProvider != null)
103 {
104 cachingProvider.close();
105 }
106 }
107 }