fix #8162 adapt terms to new package structure in TaxEditor
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / cdm / api / cache / CdmServiceCacher.java
1 package eu.etaxonomy.cdm.api.cache;
2
3 import java.io.File;
4 import java.util.UUID;
5
6 import org.springframework.stereotype.Component;
7
8 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
9 import eu.etaxonomy.cdm.api.config.EhCacheConfiguration;
10 import eu.etaxonomy.cdm.cache.CacheLoader;
11 import eu.etaxonomy.cdm.cache.CdmEntityCacheKey;
12 import eu.etaxonomy.cdm.cache.CdmTransientEntityCacher;
13 import eu.etaxonomy.cdm.common.CdmUtils;
14 import eu.etaxonomy.cdm.model.common.CdmBase;
15 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
16 import eu.etaxonomy.cdm.model.term.TermBase;
17 import eu.etaxonomy.taxeditor.service.TermServiceRequestExecutor;
18 import eu.etaxonomy.taxeditor.session.CdmEntitySession;
19 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
20 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
21 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver;
22 import net.sf.ehcache.config.CacheConfiguration;
23 import net.sf.ehcache.config.DiskStoreConfiguration;
24 import net.sf.ehcache.config.SizeOfPolicyConfiguration;
25
26 /**
27 * Class which uses CDM services to cache cdm entities
28 *
29 * FIXME: Currently only handles term entities. It would be
30 * interesting to have a generic method which finds the
31 * correct service to load / cache the entity.
32 *
33 * @author cmathew
34 */
35 @Component //FIXME This indicates that the CdmServiceCacher is initialized as Spring Component but it seems only to be instantiated directly
36 public class CdmServiceCacher extends CdmCacher implements ICdmEntitySessionManagerObserver {
37
38
39 private ICdmEntitySessionManager cdmEntitySessionManager;
40
41 private CdmTransientEntityCacher cdmTransientEntityCacher;
42
43 private CacheLoader cacheLoader;
44
45 @Override
46 protected void setup() {
47
48 setUpCacheManager();
49
50 DefinedTermBase.setCacher(this);
51 CdmTransientEntityCacher.setPermanentCacher(this);
52 TermServiceRequestExecutor.setDefaultCacher(this);
53
54 cacheLoader = new CacheLoader(this);
55 }
56
57 private void setUpCacheManager() {
58
59 EhCacheConfiguration cacheConfig = new EhCacheConfiguration();
60
61 DiskStoreConfiguration diskStoreConfiguration = new DiskStoreConfiguration();
62 File ehcacheFolder = CdmUtils.getCdmHomeSubDir("taxeditor-ehcache");
63 // FIXME use subfolder per taxeditor version to allow running multiple installations in parallel
64 // String taxEditorVersion = ..;
65 // File ehcacheFolder = new File(ehcacheFolder, taxEditorVersion);
66 diskStoreConfiguration.setPath(ehcacheFolder.getAbsolutePath());
67
68 cacheConfig.setDiskStoreConfiguration(diskStoreConfiguration);
69 addCacheManager(cacheConfig.cacheManager());
70
71 }
72
73
74 @Override
75 protected CacheConfiguration getDefaultCacheConfiguration() {
76 // For a better understanding on how to size caches, refer to
77 // http://ehcache.org/documentation/configuration/cache-size
78
79 SizeOfPolicyConfiguration sizeOfConfig = new SizeOfPolicyConfiguration();
80 sizeOfConfig.setMaxDepth(100);
81 sizeOfConfig.setMaxDepthExceededBehavior("abort");
82
83 return new CacheConfiguration(DEFAULT_CACHE_NAME, 0)
84 .eternal(true)
85 .statistics(true)
86 .sizeOfPolicy(sizeOfConfig)
87 .overflowToOffHeap(false);
88
89 }
90
91 @Override
92 protected CdmBase findByUuid(UUID uuid) {
93 CdmBase term = CdmApplicationState.getCurrentAppConfig().getTermService().findWithoutFlush(uuid);
94 return load(term);
95 }
96
97 @Override
98 public boolean isCachable(CdmBase cdmEntity) {
99 // if(cdmEntity != null && cdmEntity instanceof DefinedTermBase) {
100 if(cdmEntity != null && cdmEntity instanceof TermBase) {
101 return true;
102 }
103 return false;
104 }
105
106
107 public void setCdmEntitySessionManager(ICdmEntitySessionManager cdmEntitySessionManager) {
108 this.cdmEntitySessionManager = cdmEntitySessionManager;
109 if(cdmEntitySessionManager != null) {
110 cdmEntitySessionManager.addSessionObserver(this);
111 }
112 }
113
114
115 public CdmTransientEntityCacher getCurrentCacher() {
116 ICdmEntitySession cdmEntitySession = cdmEntitySessionManager.getActiveSession();
117 if(cdmEntitySession != null && cdmEntitySession instanceof CdmEntitySession) {
118 return ((CdmEntitySession) cdmEntitySession).getCacher();
119 }
120 return null;
121 }
122
123 @Override
124 public <T extends CdmBase> T getFromCache(T cdmBase) {
125 T cachedCdmEntity = null;
126 // first we check in the active session cache if the
127 // entity has been loaded there
128 // FIXME:Remoting do we really need the cdmTransientEntityCacher
129 // here. Is it not guarenteed that all every entity which 'isCachable'
130 // by this cacher is cached only in this cacher ?
131 if(!isCachable(cdmBase) && cdmTransientEntityCacher != null) {
132 CdmEntityCacheKey<T> key = CdmTransientEntityCacher.generateKey(cdmBase);
133 cachedCdmEntity = cdmTransientEntityCacher.getFromCache(key);
134
135 }
136 if(cachedCdmEntity == null) {
137 cachedCdmEntity = super.getFromCache(cdmBase);
138 }
139 return cachedCdmEntity;
140 }
141
142 @Override
143 public <T extends CdmBase> T load(T cdmEntity) {
144 T cachedCdmEntity = (T)getFromCache(cdmEntity.getUuid());
145
146 if(isCachable(cdmEntity) && cachedCdmEntity == null) {
147 cachedCdmEntity = cacheLoader.load(cdmEntity, false, true);
148 }
149 return cachedCdmEntity;
150 }
151
152 @Override
153 public void changed() {
154 ICdmEntitySession cdmEntitySession = cdmEntitySessionManager.getActiveSession();
155 if(cdmEntitySession != null && cdmEntitySession instanceof CdmEntitySession) {
156 this.cdmTransientEntityCacher = ((CdmEntitySession) cdmEntitySession).getCacher();
157 } else {
158 this.cdmTransientEntityCacher = null;
159 }
160 }
161 }