X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/blobdiff_plain/fe61f73d8387bbfcd82c7c073746e62cc96af787..70b69a8ce67982786e01a6e1b1281a8be38871b3:/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java index f122d18eb..dcfff9f24 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java @@ -2,16 +2,28 @@ package eu.etaxonomy.cdm.api.cache; import java.util.UUID; -import org.springframework.beans.factory.annotation.Autowired; +import net.sf.ehcache.config.CacheConfiguration; +import net.sf.ehcache.config.SizeOfPolicyConfiguration; + import org.springframework.stereotype.Component; -import eu.etaxonomy.cdm.api.service.ITermService; +import eu.etaxonomy.cdm.api.application.CdmApplicationState; import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.common.DefinedTermBase; +import eu.etaxonomy.cdm.model.common.TermBase; +import eu.etaxonomy.taxeditor.remoting.cache.CacheLoader; +import eu.etaxonomy.taxeditor.remoting.cache.CdmEntityCacheKey; +import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher; +import eu.etaxonomy.taxeditor.service.TermServiceRequestExecutor; +import eu.etaxonomy.taxeditor.session.CdmEntitySession; +import eu.etaxonomy.taxeditor.session.ICdmEntitySession; +import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; +import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver; /** * Class which uses CDM services to cache cdm entities * - * FIXME: Currently only handles terms entities. It would be + * FIXME: Currently only handles term entities. It would be * interesting to have a generic method which finds the * correct service to load / cache the entity. * @@ -20,23 +32,118 @@ import eu.etaxonomy.cdm.model.common.CdmBase; * @param */ @Component -public class CdmServiceCacher extends CdmCacher { +public class CdmServiceCacher extends CdmCacher implements ICdmEntitySessionManagerObserver { + + + + private ICdmEntitySessionManager cdmEntitySessionManager; + + private CdmTransientEntityCacher cdmTransientEntityCacher; + + private CacheLoader cacheLoader; + + @Override + protected void setup() { + DefinedTermBase.setCacher(this); + CdmTransientEntityCacher.setDefaultCacher(this); + TermServiceRequestExecutor.setDefaultCacher(this); + + cacheLoader = new CacheLoader(this); + } + + + @Override + protected CacheConfiguration getDefaultCacheConfiguration() { + // For a better understanding on how to size caches, refer to + // http://ehcache.org/documentation/configuration/cache-size + + SizeOfPolicyConfiguration sizeOfConfig = new SizeOfPolicyConfiguration(); + sizeOfConfig.setMaxDepth(100); + sizeOfConfig.setMaxDepthExceededBehavior("abort"); + + return new CacheConfiguration(DEFAULT_CACHE_NAME, 0) + .eternal(true) + .statistics(true) + .sizeOfPolicy(sizeOfConfig) + .overflowToOffHeap(false); + + } + + @Override + protected CdmBase findByUuid(UUID uuid) { + CdmBase term = CdmApplicationState.getCurrentAppConfig().getTermService().findWithoutFlush(uuid); + return load(term); + } + + @Override + public boolean isCachable(CdmBase cdmEntity) { + // if(cdmEntity != null && cdmEntity instanceof DefinedTermBase) { + if(cdmEntity != null && cdmEntity instanceof TermBase) { + return true; + } + return false; + } - @Autowired - ITermService termService; - @Override - protected T findByUuid(UUID uuid) { - return (T)termService.findWithoutFlush(uuid); - } + public void setCdmEntitySessionManager(ICdmEntitySessionManager cdmEntitySessionManager) { + this.cdmEntitySessionManager = cdmEntitySessionManager; + if(cdmEntitySessionManager != null) { + cdmEntitySessionManager.addSessionObserver(this); + } + } + + + public CdmTransientEntityCacher getCurrentCacher() { + ICdmEntitySession cdmEntitySession = cdmEntitySessionManager.getActiveSession(); + if(cdmEntitySession != null && cdmEntitySession instanceof CdmEntitySession) { + return ((CdmEntitySession) cdmEntitySession).getCacher(); + } + return null; + } + + @Override + public CdmBase getFromCache(CdmBase cdmBase) { + CdmBase cachedCdmEntity = null; + // first we check in the active session cache if the + // entity has been loaded there + // FIXME:Remoting do we really need the cdmTransientEntityCacher + // here. Is it not guarenteed that all every entity which 'isCachable' + // by this cacher is cached only in this cacher ? + if(!isCachable(cdmBase) && cdmTransientEntityCacher != null) { + CdmEntityCacheKey key = CdmTransientEntityCacher.generateKey(cdmBase); + cachedCdmEntity = cdmTransientEntityCacher.getFromCache(key); + + } + if(cachedCdmEntity == null) { + cachedCdmEntity = super.getFromCache(cdmBase); + } + return cachedCdmEntity; + } + /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.cache.CdmCacher#setup() + * @see eu.etaxonomy.cdm.api.cache.CdmCacher#load(eu.etaxonomy.cdm.model.common.CdmBase) */ @Override - protected void setup() { - // TODO Auto-generated method stub + public CdmBase load(CdmBase cdmEntity) { + CdmBase cachedCdmEntity = getFromCache(cdmEntity.getUuid()); + if(isCachable(cdmEntity) && cachedCdmEntity == null) { + cachedCdmEntity = cacheLoader.load(cdmEntity, false, true); + } + return cachedCdmEntity; } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver#changed() + */ + @Override + public void changed() { + ICdmEntitySession cdmEntitySession = cdmEntitySessionManager.getActiveSession(); + if(cdmEntitySession != null && cdmEntitySession instanceof CdmEntitySession) { + this.cdmTransientEntityCacher = ((CdmEntitySession) cdmEntitySession).getCacher(); + } else { + this.cdmTransientEntityCacher = null; + } + } }