1 package eu
.etaxonomy
.cdm
.api
.cache
;
5 import net
.sf
.ehcache
.config
.CacheConfiguration
;
6 import net
.sf
.ehcache
.config
.SizeOfPolicyConfiguration
;
8 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
9 import org
.springframework
.stereotype
.Component
;
11 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
12 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
13 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
14 import eu
.etaxonomy
.taxeditor
.remoting
.cache
.CacheLoader
;
15 import eu
.etaxonomy
.taxeditor
.remoting
.cache
.CdmEntityCacheKey
;
16 import eu
.etaxonomy
.taxeditor
.remoting
.cache
.CdmTransientEntityCacher
;
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
;
24 * Class which uses CDM services to cache cdm entities
26 * FIXME: Currently only handles terms entities. It would be
27 * interesting to have a generic method which finds the
28 * correct service to load / cache the entity.
35 public class CdmServiceCacher
extends CdmCacher
implements ICdmEntitySessionManagerObserver
{
38 ITermService termService
;
41 private ICdmEntitySessionManager cdmEntitySessionManager
;
43 private CdmTransientEntityCacher cdmTransientEntityCacher
;
45 private CacheLoader cacheLoader
;
48 protected void setup() {
49 DefinedTermBase
.setCacher(this);
50 CdmTransientEntityCacher
.setDefaultCacher(this);
51 TermServiceRequestExecutor
.setDefaultCacher(this);
52 cacheLoader
= new CacheLoader(this);
57 protected CacheConfiguration
getDefaultCacheConfiguration() {
58 // For a better understanding on how to size caches, refer to
59 // http://ehcache.org/documentation/configuration/cache-size
61 SizeOfPolicyConfiguration sizeOfConfig
= new SizeOfPolicyConfiguration();
62 sizeOfConfig
.setMaxDepth(100);
63 sizeOfConfig
.setMaxDepthExceededBehavior("abort");
65 return new CacheConfiguration(DEFAULT_CACHE_NAME
, 0)
68 .sizeOfPolicy(sizeOfConfig
)
69 .overflowToOffHeap(false);
74 protected CdmBase
findByUuid(UUID uuid
) {
75 CdmBase term
= termService
.findWithoutFlush(uuid
);
80 * @see eu.etaxonomy.cdm.model.ICdmCacher#isCachable(eu.etaxonomy.cdm.model.common.CdmBase)
83 public boolean isCachable(CdmBase cdmEntity
) {
84 if(cdmEntity
!= null && cdmEntity
instanceof DefinedTermBase
) {
91 public void setCdmEntitySessionManager(ICdmEntitySessionManager cdmEntitySessionManager
) {
92 this.cdmEntitySessionManager
= cdmEntitySessionManager
;
93 if(cdmEntitySessionManager
!= null) {
94 cdmEntitySessionManager
.addSessionObserver(this);
99 public CdmTransientEntityCacher
getCurrentCacher() {
100 ICdmEntitySession cdmEntitySession
= cdmEntitySessionManager
.getActiveSession();
101 if(cdmEntitySession
!= null && cdmEntitySession
instanceof CdmEntitySession
) {
102 return ((CdmEntitySession
) cdmEntitySession
).getCacher();
108 public CdmBase
getFromCache(CdmBase cdmBase
) {
109 CdmBase cachedCdmEntity
= null;
110 // first we check in the active session cache if the
111 if(!isCachable(cdmBase
) && cdmTransientEntityCacher
!= null) {
112 CdmEntityCacheKey key
= CdmTransientEntityCacher
.generateKey(cdmBase
);
113 cachedCdmEntity
= cdmTransientEntityCacher
.getFromCache(key
);
116 if(cachedCdmEntity
== null) {
117 cachedCdmEntity
= super.getFromCache(cdmBase
);
119 return cachedCdmEntity
;
124 * @see eu.etaxonomy.cdm.api.cache.CdmCacher#load(eu.etaxonomy.cdm.model.common.CdmBase)
127 public CdmBase
load(CdmBase cdmEntity
) {
128 CdmBase cachedCdmEntity
= getFromCache(cdmEntity
.getUuid());
130 if(isCachable(cdmEntity
)) {
131 cachedCdmEntity
= cacheLoader
.load(cdmEntity
, true, false);
133 return cachedCdmEntity
;
137 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver#changed()
140 public void changed() {
141 ICdmEntitySession cdmEntitySession
= cdmEntitySessionManager
.getActiveSession();
142 if(cdmEntitySession
!= null && cdmEntitySession
instanceof CdmEntitySession
) {
143 this.cdmTransientEntityCacher
= ((CdmEntitySession
) cdmEntitySession
).getCacher();
145 this.cdmTransientEntityCacher
= null;