From: Cherian Mathew Date: Tue, 17 Feb 2015 11:43:25 +0000 (+0000) Subject: CdmRemoteCacheManager : added cache getter methods X-Git-Tag: remoting-3.9.0~203 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/703e8efcea740f40fea92ca5b74b28d14a03c161 CdmRemoteCacheManager : added cache getter methods CdmTransientEntityCacher, CdmEntitySession, CdmEntitySessionManager, ICdmEntitySession, ICdmEntitySessionManager, ICdmEntitySessionManagerObserver, MockCdmEntitySession, MockCdmEntitySessionManager , eu.etaxonomy.taxeditor.cdmlib/src/main/resources/cdmlib-ehcache.xml : added statistics config , getter method for live stats and observer to update when sessions are bound and disposed eu.etaxonomy.taxeditor.store/plugin.xml, SessionsViewPart : added new sessions debug view MatchStrategyConfigurator : moved to cdmlib ParseHandler, AbstractMatchingPreferences, NonViralNameMatchingPreference, ReferenceMatchingPreference, TeamOrPersonMatchingPreference : refactored after removal of MatchStrategyConfigurator replaced by enum MatchStrategy --- diff --git a/.gitattributes b/.gitattributes index 6b6bdfa0a..cd4faa47c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -359,6 +359,7 @@ eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEn eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySession.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionEnabled.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManager.java -text +eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManagerObserver.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySession.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySessionManager.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java -text @@ -1372,7 +1373,6 @@ eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/operation/Abst eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/operation/AbstractPostOperation.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/operation/AbstractPostTaxonOperation.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/operation/IPostOperationEnabled.java -text -eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/parser/MatchStrategyConfigurator.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/parser/ParseHandler.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/CdmPreferences.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/ChecklistEditorGeneralPreference.java -text @@ -1813,6 +1813,7 @@ eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/Cd eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewPart.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/reporting/ReportingViewPart.java -text +eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/SessionsViewPart.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/specimenSearch/SpecimenProviderSelectionComposite.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/specimenSearch/SpecimenProviderSelectionController.java -text eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/specimenSearch/SpecimenSearchComposite.java -text diff --git a/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF index cca23583b..d02be9ccf 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF +++ b/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF @@ -193,6 +193,7 @@ Export-Package: com.google.api, junit.framework;uses:="org.junit.runner.manipulation,org.junit.runner,org.junit.runner.notification", net.sf.ehcache, net.sf.ehcache.config, + net.sf.ehcache.statistics, net.sf.ehcache.store, net.sf.json;uses:="net.sf.json.processors,net.sf.json.util,org.apache.commons.lang.exception", org.apache.commons.collections;uses:="org.apache.commons.collections.keyvalue,new org.apache.commons.collections", diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmRemoteCacheManager.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmRemoteCacheManager.java index 88074638f..2d5b705f6 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmRemoteCacheManager.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmRemoteCacheManager.java @@ -1,7 +1,6 @@ package eu.etaxonomy.taxeditor.remoting.cache; import java.io.File; -import java.io.IOException; import java.io.InputStream; import net.sf.ehcache.Cache; @@ -10,43 +9,44 @@ import net.sf.ehcache.CacheManager; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.stereotype.Component; import eu.etaxonomy.cdm.common.CdmUtils; -public class CdmRemoteCacheManager { - +public class CdmRemoteCacheManager { + private CacheManager cdmlibModelCacheManager; - + private static CdmRemoteCacheManager cdmRemoteCacheManager = null; - + public static final Resource CDMLIB_CACHE_MANAGER_CONFIG_RESOURCE = new ClassPathResource("cdmlib-ehcache.xml"); - - + + public static final String CDM_MODEL_CACHE_NAME = "cdmModelGetMethodsCache"; + + public enum CdmCacheManagerType { CDMLIB_MODEL, DEFAULT } public static CdmRemoteCacheManager getInstance(){ - if(cdmRemoteCacheManager == null) { - cdmRemoteCacheManager = new CdmRemoteCacheManager(); + if(cdmRemoteCacheManager == null) { + cdmRemoteCacheManager = new CdmRemoteCacheManager(); } return cdmRemoteCacheManager; } private CdmRemoteCacheManager() { - - System.setProperty("ehcache.disk.store.dir", CdmUtils.getCdmHomeDir().getAbsolutePath() + File.separator + "cdmlib-model"); + + System.setProperty("ehcache.disk.store.dir", CdmUtils.getCdmHomeDir().getAbsolutePath() + File.separator + "cdmlib-model"); try { - // NOTE:Programmatically creating the cache manager may solve the problem of + // NOTE:Programmatically creating the cache manager may solve the problem of // recreating data written to disk on startup // see https://stackoverflow.com/questions/1729605/ehcache-persist-to-disk-issues //String cacheFilePath = CDMLIB_CACHE_MANAGER_CONFIG_RESOURCE.getFile().getAbsolutePath(); InputStream in = this.getClass().getClassLoader().getResourceAsStream("cdmlib-ehcache.xml"); cdmlibModelCacheManager = new CacheManager(in); - + } catch (CacheException e) { throw new CdmClientCacheException(e); } @@ -54,15 +54,23 @@ public class CdmRemoteCacheManager { // throw new CdmClientCacheException(e); // } } - + public Cache getCdmModelGetMethodsCache(){ - return cdmlibModelCacheManager.getCache("cdmModelGetMethodsCache"); + return cdmlibModelCacheManager.getCache(CDM_MODEL_CACHE_NAME); + } + + public CacheManager getCdmModelGetMethodsCacheManager() { + return cdmlibModelCacheManager; + } + + public CacheManager getDefaultCacheManager() { + return CacheManager.create(); } - + public void shutdown(CdmCacheManagerType ccmt) { CacheManager cm; - switch(ccmt) { - case CDMLIB_MODEL: + switch(ccmt) { + case CDMLIB_MODEL: cdmlibModelCacheManager.shutdown(); break; case DEFAULT: @@ -71,9 +79,9 @@ public class CdmRemoteCacheManager { break; default: //do nothing - } + } } - + public static void checkCacheProperties() { String pathToCache = System.getProperty("ehcache.disk.store.dir"); if(pathToCache == null || pathToCache.isEmpty()) { diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmTransientEntityCacher.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmTransientEntityCacher.java index 869d3deed..64e467aff 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmTransientEntityCacher.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmTransientEntityCacher.java @@ -12,19 +12,29 @@ package eu.etaxonomy.taxeditor.remoting.cache; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import javassist.util.proxy.ProxyFactory; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; import net.sf.ehcache.config.CacheConfiguration; +import net.sf.ehcache.config.SizeOfPolicyConfiguration; +import net.sf.ehcache.statistics.LiveCacheStatistics; import net.sf.ehcache.store.MemoryStoreEvictionPolicy; import org.apache.log4j.Logger; +import org.hibernate.collection.internal.PersistentList; +import org.hibernate.collection.internal.PersistentMap; +import org.hibernate.collection.internal.PersistentSet; +import org.hibernate.collection.internal.PersistentSortedMap; +import org.hibernate.collection.internal.PersistentSortedSet; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.LazyInitializer; @@ -32,6 +42,8 @@ import org.springframework.util.ReflectionUtils; import eu.etaxonomy.cdm.api.cache.CdmServiceCacher; import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.common.PersistentMultiLanguageText; +import eu.etaxonomy.taxeditor.remoting.CdmRemotingException; import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult.CdmEntityInfo; import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; @@ -90,6 +102,7 @@ public class CdmTransientEntityCacher { cdmlibModelCache = CdmRemoteCacheManager.getInstance().getCdmModelGetMethodsCache(); this.cdmEntitySessionManager = cdmEntitySessionManager; + } public CdmTransientEntityCacher(Object obj, ICdmEntitySessionManager cdmEntitySessionManager) { @@ -102,14 +115,21 @@ public class CdmTransientEntityCacher { * @return */ private CacheConfiguration getEntityCacheConfiguration(String cacheId) { + SizeOfPolicyConfiguration sizeOfConfig = new SizeOfPolicyConfiguration(); + sizeOfConfig.setMaxDepth(10000); + sizeOfConfig.setMaxDepthExceededBehavior("abort"); // For a better understanding on how to size caches, refer to // http://ehcache.org/documentation/configuration/cache-size return new CacheConfiguration(cacheId, 500) .memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LFU) - .eternal(false) + //.eternal(true); // default ttl and tti set to 2 hours .timeToLiveSeconds(60*60*2) - .timeToIdleSeconds(60*60*2); + .timeToIdleSeconds(60*60*2) + .statistics(true) + .sizeOfPolicy(sizeOfConfig); + + } @@ -117,6 +137,10 @@ public class CdmTransientEntityCacher { cdmServiceCacher = css; } + public LiveCacheStatistics getCacheStatistics() { + return cache.getLiveCacheStatistics(); + } + /** * Returns the cache corresponding to the cache id * @@ -387,6 +411,14 @@ public class CdmTransientEntityCacher { } } + if(o != null && o instanceof PersistentCollection) { + PersistentCollection pc = ((PersistentCollection)o); + if(pc.wasInitialized()) { + o = getObject(pc); + field.set(cdmEntity, o); + } + } + //field.set(cdmEntity, o); CdmBase cdmEntityInSubGraph = null; if(o != null @@ -401,6 +433,7 @@ public class CdmTransientEntityCacher { // up-to-date by setting to the value of the cdm entity being loaded // the only execption to this is found below field.set(cachedCdmEntity, o); + // the only exception to updating the field to the latest value // is the case where the field has been already initialised, cached and // is not the same as the one in the cache, in which case we set the value @@ -518,7 +551,7 @@ public class CdmTransientEntityCacher { public void dispose() { cache.removeAll(); cache.flush(); - + cdmServiceCacher.getDefaultCacheManager().removeCache(cacheId); } @@ -584,9 +617,9 @@ public class CdmTransientEntityCacher { if(obj instanceof CdmBase) { return (T) debugRecursive((CdmBase)obj, alreadyVisitedEntities, entityCacherDebugResult); } else if (obj instanceof Map) { - return (T) debugRecursive((Map)obj, alreadyVisitedEntities, entityCacherDebugResult); + return (T) debug((Map)obj, alreadyVisitedEntities, entityCacherDebugResult); } else if (obj instanceof Collection) { - return (T) debugRecursive((Collection)obj, alreadyVisitedEntities, entityCacherDebugResult); + return (T) debug((Collection)obj, alreadyVisitedEntities, entityCacherDebugResult); } logger.info("No caching yet for type " + obj.getClass().getName()); @@ -653,7 +686,7 @@ public class CdmTransientEntityCacher { private CdmBase debugRecursive(CdmBase cdmEntity, Set alreadyVisitedEntities, EntityCacherDebugResult entityCacherDebugResult) { - CdmBase cachedCdmEntity = debug(cdmEntity); + // we want to recursive through the cdmEntity (and not the cachedCdmEntity) // since there could be new or deleted objects in the cdmEntity sub-graph @@ -669,7 +702,7 @@ public class CdmTransientEntityCacher { // this object will be either a CdmBase or a Collection / Map // with CdmBase as the generic type - CdmBase cdmEntityInSubGraph = getDebugCdmBaseTypeFieldValue(cdmEntity, cachedCdmEntity, field, alreadyVisitedEntities, entityCacherDebugResult); + CdmBase cdmEntityInSubGraph = getDebugCdmBaseTypeFieldValue(cdmEntity, field, alreadyVisitedEntities, entityCacherDebugResult); if(cdmEntityInSubGraph != null) { if(!alreadyVisitedEntities.contains(cdmEntityInSubGraph)) { logger.info("recursive debugging object of type " + cdmEntityInSubGraph.getClass().getName() + " with id " + cdmEntityInSubGraph.getId()); @@ -683,22 +716,15 @@ public class CdmTransientEntityCacher { throw new CdmClientCacheException("CdmEntity with class " + cdmEntity.getClass().getName() + " is not found in the cdmlib model cache. " + "The cache may be corrupted or not in sync with the latest model version" ); } - return cachedCdmEntity; + return cdmEntity; } private CdmBase getDebugCdmBaseTypeFieldValue(CdmBase cdmEntity, - CdmBase cachedCdmEntity, String fieldName, Set alreadyVisitedEntities, EntityCacherDebugResult entityCacherDebugResult) { - // this method attempts to make sure that for any two objects found in - // the object graph, if they are equal then they should also be the same, - // which is crucial for the merge to work - if(cachedCdmEntity == null) { - throw new CdmClientCacheException("When trying to set field value, the cached cdm entity cannot be null"); - } Class clazz = cdmEntity.getClass(); try { @@ -715,7 +741,14 @@ public class CdmTransientEntityCacher { if(o != null && o instanceof HibernateProxy) { LazyInitializer hli = ((HibernateProxy)o).getHibernateLazyInitializer(); if(!hli.isUninitialized()) { - o = ((HibernateProxy) o).getHibernateLazyInitializer().getImplementation(); + o = hli.getImplementation(); + } + } + + if(o != null && o instanceof PersistentCollection) { + PersistentCollection pc = ((PersistentCollection)o); + if(pc.wasInitialized()) { + o = getObject(pc); } } CdmBase cdmEntityInSubGraph = null; @@ -726,21 +759,24 @@ public class CdmTransientEntityCacher { if(CdmBase.class.isAssignableFrom(o.getClass())) { logger.info("found initialised cdm entity '" + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId()); cdmEntityInSubGraph = (CdmBase)o; + for(CdmBase visitedEntity : alreadyVisitedEntities) { + if(cdmEntityInSubGraph.equals(visitedEntity) && cdmEntityInSubGraph != visitedEntity) { + //logger.info(" - found duplicate entity at " + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId()); + CdmEntityInfo cei = entityCacherDebugResult.new CdmEntityInfo(cdmEntityInSubGraph, cdmEntity, field); + CdmEntityInfo dupCei = entityCacherDebugResult.new CdmEntityInfo(visitedEntity, null, field); + entityCacherDebugResult.addDuplicateEntity(cei, dupCei); + } + } + CdmBase cachedCdmEntityInSubGraph = getFromCache(cdmEntityInSubGraph); // the only exception to updating the field to the latest value // is the case where the field has been already initialised, cached and // is not the same as the one in the cache, in which case we set the value // of the field to the one found in the cache - if(cachedCdmEntityInSubGraph != null) { - if(cachedCdmEntityInSubGraph != cdmEntityInSubGraph) { - logger.info(" - found duplicate entity at " + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId()); - CdmEntityInfo cei = entityCacherDebugResult.new CdmEntityInfo(cdmEntityInSubGraph, cdmEntity, field); - CdmEntityInfo cachedCei = entityCacherDebugResult.new CdmEntityInfo(cachedCdmEntityInSubGraph, null, field); - entityCacherDebugResult.addDuplicateEntity(cei, cachedCei); - } - } else { + + if(cachedCdmEntityInSubGraph == null) { // found a cdm entity which is not in cache - need to record this - logger.info(" - found entity not in cache " + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId()); + //logger.info(" - found entity not in cache " + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId()); CdmEntityInfo cei = entityCacherDebugResult.new CdmEntityInfo(cdmEntityInSubGraph, cdmEntity, field); entityCacherDebugResult.addEntityNotInCache(cei); } @@ -763,5 +799,26 @@ public class CdmTransientEntityCacher { } } + public static Object getObject(PersistentCollection pc) { + if(pc != null) { + if(pc instanceof PersistentSet) { + return new HashSet((Set)pc); + } + if(pc instanceof PersistentSortedSet) { + return new TreeSet((Set)pc); + } + if(pc instanceof PersistentList) { + return new ArrayList((List)pc); + } + if(pc instanceof PersistentMap || pc instanceof PersistentMultiLanguageText) { + return new HashMap((Map)pc); + } + if(pc instanceof PersistentSortedMap) { + return new TreeMap((Map)pc); + } + throw new CdmRemotingException("Cannot get Collection field for type " + pc.getClass().getName()); + } + return null; + } } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/EntityCacherDebugResult.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/EntityCacherDebugResult.java index 70ed1c335..12de6a6d8 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/EntityCacherDebugResult.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/EntityCacherDebugResult.java @@ -61,10 +61,11 @@ public class EntityCacherDebugResult { CdmEntityInfo cachedCei = entry.getValue(); sb.append(" - entity : " + cei.getCb().getUserFriendlyTypeName() + "/" + cei.getCb().getId() + " as field " + cei.getField().getName() + - " of entity" + cei.getCbOwner().getUserFriendlyTypeName() + "/" + cei.getCbOwner().getId()); + " of entity " + cei.getCbOwner().getUserFriendlyTypeName() + "/" + cei.getCbOwner().getId()); sb.append(System.getProperty("line.separator")); - sb.append(" - cached entity : " + cachedCei.getCb().getUserFriendlyTypeName() + "/" + cachedCei.getCb().getId() + + sb.append(" - duplicate entity : " + cachedCei.getCb().getUserFriendlyTypeName() + "/" + cachedCei.getCb().getId() + " as field " + cachedCei.getField().getName()); + sb.append(System.getProperty("line.separator")); sb.append("-----------"); } } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java index a8b968e84..09443e3e8 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java @@ -15,6 +15,9 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import net.sf.ehcache.statistics.LiveCacheStatistics; + +import org.apache.log4j.Logger; import org.apache.poi.ss.formula.functions.T; import eu.etaxonomy.cdm.api.service.IService; @@ -39,6 +42,7 @@ import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult; public class CdmEntitySession implements ICdmEntitySession { + private static final Logger logger = Logger.getLogger(CdmEntitySession.class); private final CdmEntitySessionManager cdmEntitySessionManager; @@ -151,8 +155,11 @@ public class CdmEntitySession implements ICdmEntitySession { @Override public void bind() { + logger.info("Binding session with owner " + sessionOwner.toString()); cdmEntitySessionManager.bind(sessionOwner); + cdmEntitySessionManager.notifyObservers(); } + /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose() */ @@ -164,6 +171,7 @@ public class CdmEntitySession implements ICdmEntitySession { CdmPostDataChangeObservableListener.getDefault().unregister(observer); } changeObservers.clear(); + cdmEntitySessionManager.dispose(sessionOwner); } @@ -233,14 +241,47 @@ public class CdmEntitySession implements ICdmEntitySession { * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase) */ @Override - public void remoteUpdate(IService service, T cdmBase) { - service.merge(cdmBase); + public T remoteUpdate(IService service, T cdmBase) { + debug(cdmBase); + T mergedCdmBase = service.merge(cdmBase); + //cdmTransientEntityCacher.clear(); // FIXME:Remoting not really sure if we need to reload the new // merged object or can we keep using the old one //return load(mergedCdmBase); + + return mergedCdmBase; + } + + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive() + */ + @Override + public boolean isActive() { + return cdmEntitySessionManager.getActiveSession() == this; } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner() + */ + @Override + public ICdmEntitySessionEnabled getOwner() { + return sessionOwner; + } + + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache() + */ + @Override + public LiveCacheStatistics getCacheStatistics() { + return cdmTransientEntityCacher.getCacheStatistics(); + } + + + + diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java index b4f0fe6ee..67ad8de81 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java @@ -9,8 +9,10 @@ */ package eu.etaxonomy.taxeditor.session; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.log4j.Logger; @@ -27,31 +29,45 @@ import eu.etaxonomy.cdm.model.common.CdmBase; public class CdmEntitySessionManager implements ICdmEntitySessionManager { private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class); - private final Map ownerSessionMap = - new HashMap(); + private final Map ownerSessionMap = + new HashMap(); + + private final List sessionObservers = new ArrayList(); private ICdmEntitySession activeSession; @Override public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) { - CdmEntitySession session = ownerSessionMap.get(sessionOwner); + ICdmEntitySession session = ownerSessionMap.get(sessionOwner); if(session == null) { session = new CdmEntitySession(sessionOwner, this); addToOwnerSessionMap(sessionOwner, session); + } if(setAsActive) { activeSession = session; + } + return session; } @Override public ICdmEntitySession getActiveSession() { - return activeSession; } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions() + */ + @Override + public Collection getSessions() { + return ownerSessionMap.values(); + } + + /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener) */ @@ -65,7 +81,9 @@ public class CdmEntitySessionManager implements ICdmEntitySessionManager { if(session == null) { session = newSession(sessionOwner,true); } + activeSession = session; + } @@ -109,19 +127,45 @@ public class CdmEntitySessionManager implements ICdmEntitySessionManager { /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener) */ - @Override - public void dispose(ICdmEntitySessionEnabled owner) { + void dispose(ICdmEntitySessionEnabled owner) { ICdmEntitySession session = ownerSessionMap.get(owner); if(session == null) { logger.info("No Session connected to owner, nothing to dispose"); return; } - session.dispose(); + ownerSessionMap.remove(owner); + notifyObservers(); } - void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, CdmEntitySession session) { + void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) { ownerSessionMap.put(owner, session); } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener() + */ + @Override + public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) { + sessionObservers.add(sessionObserver); + } + + public void notifyObservers() { + for(ICdmEntitySessionManagerObserver sessionObserver : sessionObservers) { + sessionObserver.changed(); + } + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting() + */ + @Override + public boolean isRemoting() { + // FIXME:Remoting stupid method to check whether we are in remoting + return true; + } + + + + } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySession.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySession.java index 62ce7df1b..dda3a5454 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySession.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySession.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import net.sf.ehcache.statistics.LiveCacheStatistics; import eu.etaxonomy.cdm.api.service.IService; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.ICdmBase; @@ -13,6 +14,10 @@ import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult; public interface ICdmEntitySession { + public ICdmEntitySessionEnabled getOwner(); + + public LiveCacheStatistics getCacheStatistics(); + public O load(O obj); public T load(T cdmBase); @@ -41,7 +46,7 @@ public interface ICdmEntitySession { public UUID remoteSave(IService service, T cdmBase); - public void remoteUpdate(IService service, T cdmBase); + public T remoteUpdate(IService service, T cdmBase); @@ -69,6 +74,8 @@ public interface ICdmEntitySession { */ public void fireNotifications(); + public boolean isActive(); + diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManager.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManager.java index 928c529f2..94e53ab62 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManager.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManager.java @@ -23,16 +23,19 @@ public interface ICdmEntitySessionManager { // public abstract Collection load( // ISessionEventListener sessionOwner, Collection cdmBaseList); - public abstract Collection load( - Collection cdmBaseList); + public abstract Collection load(Collection cdmBaseList); - public abstract void dispose(ICdmEntitySessionEnabled owner); + //public abstract void dispose(ICdmEntitySessionEnabled owner); /** * @return */ public ICdmEntitySession getActiveSession(); + public Collection getSessions(); + + public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver); + //FIXME:Remoting would be nice to have these methods working, // but they can only be useful if we can 'intelligently' // get from a model class to the correspoding service class @@ -51,5 +54,7 @@ public interface ICdmEntitySessionManager { // public abstract void commit(IService service, CdmBase cdmBase); + public boolean isRemoting(); + } \ No newline at end of file diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManagerObserver.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManagerObserver.java new file mode 100644 index 000000000..d2e32521f --- /dev/null +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManagerObserver.java @@ -0,0 +1,21 @@ +// $Id$ +/** +* Copyright (C) 2015 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ +package eu.etaxonomy.taxeditor.session; + +/** + * @author cmathew + * @date 16 Feb 2015 + * + */ +public interface ICdmEntitySessionManagerObserver { + + public void changed(); + +} diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySession.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySession.java index b5e72af4f..01cc869b0 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySession.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySession.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import net.sf.ehcache.statistics.LiveCacheStatistics; import eu.etaxonomy.cdm.api.service.IService; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.ICdmBase; @@ -162,8 +163,8 @@ public class MockCdmEntitySession implements ICdmEntitySession { * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase) */ @Override - public void remoteUpdate(IService service, T cdmBase) { - + public T remoteUpdate(IService service, T cdmBase) { + return cdmBase; } @@ -194,4 +195,28 @@ public class MockCdmEntitySession implements ICdmEntitySession { } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner() + */ + @Override + public ICdmEntitySessionEnabled getOwner() { + return null; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getCacheStatistics() + */ + @Override + public LiveCacheStatistics getCacheStatistics() { + return null; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive() + */ + @Override + public boolean isActive() { + return false; + } + } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySessionManager.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySessionManager.java index 5f6c242e1..7ff48a2d4 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySessionManager.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySessionManager.java @@ -6,6 +6,7 @@ import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.taxeditor.session.ICdmEntitySession; import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled; import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; +import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver; public class MockCdmEntitySessionManager implements ICdmEntitySessionManager { @@ -32,11 +33,6 @@ public class MockCdmEntitySessionManager implements ICdmEntitySessionManager { } - @Override - public void dispose(ICdmEntitySessionEnabled owner) { - - } - /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#newSession(eu.etaxonomy.taxeditor.session.ISessionEventListener, boolean) */ @@ -53,4 +49,28 @@ public class MockCdmEntitySessionManager implements ICdmEntitySessionManager { return new MockCdmEntitySession(); } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions() + */ + @Override + public Collection getSessions() { + return null; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionObserver(eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver) + */ + @Override + public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) { + + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting() + */ + @Override + public boolean isRemoting() { + return false; + } + } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/cdmlib-ehcache.xml b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/cdmlib-ehcache.xml index 6f2cc9388..36e1fe004 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/cdmlib-ehcache.xml +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/cdmlib-ehcache.xml @@ -1,6 +1,7 @@ + overflowToDisk="true" diskPersistent="true" memoryStoreEvictionPolicy="LRU" statistics="true"> + \ No newline at end of file diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java index 5494184c6..41ccf1e9a 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java @@ -60,12 +60,5 @@ public abstract class CdmEntitySessionInput implements ICdmEntitySessionEnabled public abstract List getRootEntities(); - public void update() { - List rootEntities = getRootEntities(); - if(rootEntities != null) { - for(T cdmBase : rootEntities) { - cdmEntitySession.remoteUpdate(getService(), cdmBase); - } - } - } + public abstract void update(); } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java index cba7d5eff..6c3661063 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java @@ -456,4 +456,13 @@ public class TaxonEditorInput extends CdmEntitySessionInput implements IEditorIn public List getRootEntities() { return Arrays.asList(taxonNode); } + + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput#update() + */ + @Override + public void update() { + taxonNode = getCdmEntitySession().remoteUpdate(service, taxonNode); + } } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyEditorInput.java index fd74ece68..de54ee9cf 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyEditorInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyEditorInput.java @@ -76,7 +76,7 @@ public class PolytomousKeyEditorInput extends AbstractIdentificationEditorInput< } public void dispose() { - CdmStore.getCurrentSessionManager().dispose(this); + cdmEntitySession.dispose(); } diff --git a/eu.etaxonomy.taxeditor.store/plugin.xml b/eu.etaxonomy.taxeditor.store/plugin.xml index 9a68e2ec1..1e3cb22a7 100644 --- a/eu.etaxonomy.taxeditor.store/plugin.xml +++ b/eu.etaxonomy.taxeditor.store/plugin.xml @@ -263,6 +263,13 @@ id="eu.etaxonomy.taxeditor.view.derivateSearch.DerivateSearchView" name="%view.name.6" restorable="true"> + + + + + + NonViralNameMatchStrategy

- * - * @throws eu.etaxonomy.cdm.strategy.match.MatchException if any. - * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object. - */ - public static IMatchStrategy NonViralNameMatchStrategy() throws MatchException{ - return getDefaultNonViralNameMatchStrategy();// PreferencesUtil.getMatchStrategy(NonViralName.class); - } - - /** - *

TeamOrPersonMatchStrategy

- * - * @throws eu.etaxonomy.cdm.strategy.match.MatchException if any. - * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object. - */ - public static IMatchStrategy TeamOrPersonMatchStrategy() throws MatchException{ - return null;// PreferencesUtil.getMatchStrategy(TeamOrPersonBase.class); - } - - /** - *

ReferenceMatchStrategy

- * - * @throws eu.etaxonomy.cdm.strategy.match.MatchException if any. - * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object. - */ - public static IMatchStrategy ReferenceMatchStrategy() throws MatchException{ - return getDefaultReferenceMatchStrategy();// PreferencesUtil.getMatchStrategy(ReferenceBase.class); - } - - /** - *

getDefaultNonViralNameMatchStrategy

- * - * @throws eu.etaxonomy.cdm.strategy.match.MatchException if any. - * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object. - */ - public static IMatchStrategy getDefaultNonViralNameMatchStrategy() throws MatchException{ - IMatchStrategy strategy = PreferencesUtil.getDefaultMatchStrategy(NonViralName.class); - - strategy.setMatchMode("nomenclaturalReference", MatchMode.IGNORE); - strategy.setMatchMode("combinationAuthorTeam", MatchMode.IGNORE); - strategy.setMatchMode("exCombinationAuthorTeam", MatchMode.IGNORE); - strategy.setMatchMode("basionymAuthorTeam", MatchMode.IGNORE); - strategy.setMatchMode("exBasionymAuthorTeam", MatchMode.IGNORE); - - return strategy; - } - - /** - *

getDefaultTeamOrPersonMatchStrategy

- * - * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object. - * @throws eu.etaxonomy.cdm.strategy.match.MatchException if any. - */ - public static IMatchStrategy getDefaultTeamOrPersonMatchStrategy() throws MatchException{ - IMatchStrategy strategy = PreferencesUtil.getDefaultMatchStrategy(TeamOrPersonBase.class); - - return strategy; - } - - - /** - *

getDefaultReferenceMatchStrategy

- * - * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object. - * @throws eu.etaxonomy.cdm.strategy.match.MatchException if any. - */ - public static IMatchStrategy getDefaultReferenceMatchStrategy() throws MatchException{ - IMatchStrategy strategy = PreferencesUtil.getDefaultMatchStrategy(Reference.class); - - strategy.setMatchMode("title", MatchMode.EQUAL); - strategy.setMatchMode("inReference", MatchMode.IGNORE); - - return strategy; - } - - /** - *

setMatchStrategy

- * - * @param matchStrategy a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object. - */ - public static void setMatchStrategy(IMatchStrategy matchStrategy) { - PreferencesUtil.setMatchStrategy(matchStrategy); - } - -} diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/parser/ParseHandler.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/parser/ParseHandler.java index 23e6825e3..0bae265df 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/parser/ParseHandler.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/parser/ParseHandler.java @@ -15,6 +15,7 @@ import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.reference.INomenclaturalReference; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.strategy.match.MatchException; +import eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator.MatchStrategy; import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl; import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.preference.PreferencesUtil; @@ -302,7 +303,7 @@ public class ParseHandler{ return new ArrayList(); } try{ - return CdmStore.getService(ICommonService.class).findMatching(nomenclaturalReference, MatchStrategyConfigurator.ReferenceMatchStrategy()); + return CdmStore.getService(ICommonService.class).findMatching(nomenclaturalReference, MatchStrategy.Reference); }catch (MatchException e) { MessagingUtils.error(this.getClass(), "Error finding matching references", e); } @@ -320,7 +321,7 @@ public class ParseHandler{ } try{ - return CdmStore.getService(ICommonService.class).findMatching(authorTeam, MatchStrategyConfigurator.TeamOrPersonMatchStrategy()); + return CdmStore.getService(ICommonService.class).findMatching(authorTeam, MatchStrategy.TeamOrPerson); }catch (MatchException e) { MessagingUtils.error(this.getClass(), "Error finding matching authors", e); } @@ -334,7 +335,7 @@ public class ParseHandler{ private List findMatchingLatinNames(TaxonNameBase taxonNameBase) { try { - return CdmStore.getService(ICommonService.class).findMatching(taxonNameBase, MatchStrategyConfigurator.NonViralNameMatchStrategy()); + return CdmStore.getService(ICommonService.class).findMatching(taxonNameBase, MatchStrategy.NonViralName); } catch (MatchException e) { MessagingUtils.error(this.getClass(), "Error finding matching names", e); diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/AbstractMatchingPreferences.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/AbstractMatchingPreferences.java index e09625cce..6d2ddb9bc 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/AbstractMatchingPreferences.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/AbstractMatchingPreferences.java @@ -33,7 +33,7 @@ import eu.etaxonomy.cdm.strategy.match.IMatchStrategy; import eu.etaxonomy.cdm.strategy.match.MatchException; import eu.etaxonomy.cdm.strategy.match.MatchMode; import eu.etaxonomy.taxeditor.model.MessagingUtils; -import eu.etaxonomy.taxeditor.parser.MatchStrategyConfigurator; +import eu.etaxonomy.taxeditor.preference.PreferencesUtil; import eu.etaxonomy.taxeditor.store.CdmStore; /** @@ -208,7 +208,7 @@ public abstract class AbstractMatchingPreferences /** {@inheritDoc} */ @Override protected void performApply() { - MatchStrategyConfigurator.setMatchStrategy(matchStrategy); + PreferencesUtil.setMatchStrategy(matchStrategy); super.performApply(); } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/NonViralNameMatchingPreference.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/NonViralNameMatchingPreference.java index 72acd5666..339232c7a 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/NonViralNameMatchingPreference.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/NonViralNameMatchingPreference.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2007 EDIT -* European Distributed Institute of Taxonomy +* European Distributed Institute of Taxonomy * http://www.e-taxonomy.eu -* +* * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ @@ -15,8 +15,8 @@ import org.eclipse.ui.IWorkbench; import eu.etaxonomy.cdm.model.name.NonViralName; import eu.etaxonomy.cdm.strategy.match.IMatchStrategy; import eu.etaxonomy.cdm.strategy.match.MatchException; +import eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator; import eu.etaxonomy.taxeditor.model.MessagingUtils; -import eu.etaxonomy.taxeditor.parser.MatchStrategyConfigurator; /** *

NonViralNameMatchingPreference class.

@@ -31,9 +31,10 @@ public class NonViralNameMatchingPreference extends AbstractMatchingPreferences< * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ /** {@inheritDoc} */ - public void init(IWorkbench workbench) { + @Override + public void init(IWorkbench workbench) { clazz = NonViralName.class; - + try { matchStrategy = MatchStrategyConfigurator.NonViralNameMatchStrategy(); } catch (MatchException e) { @@ -41,7 +42,7 @@ public class NonViralNameMatchingPreference extends AbstractMatchingPreferences< throw new RuntimeException(e); } } - + /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.preference.matching.AbstractMatchingPreferences#getDefaultMatchStrategy() */ diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/ReferenceMatchingPreference.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/ReferenceMatchingPreference.java index fd3fbdd32..9a578c0c4 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/ReferenceMatchingPreference.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/matching/ReferenceMatchingPreference.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2007 EDIT -* European Distributed Institute of Taxonomy +* European Distributed Institute of Taxonomy * http://www.e-taxonomy.eu -* +* * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ @@ -15,8 +15,8 @@ import org.eclipse.ui.IWorkbench; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.strategy.match.IMatchStrategy; import eu.etaxonomy.cdm.strategy.match.MatchException; +import eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator; import eu.etaxonomy.taxeditor.model.MessagingUtils; -import eu.etaxonomy.taxeditor.parser.MatchStrategyConfigurator; /** *

ReferenceMatchingPreference class.

@@ -31,9 +31,10 @@ public class ReferenceMatchingPreference extends AbstractMatchingPreferencesTeamOrPersonMatchingPreference class.

@@ -32,17 +32,18 @@ public class TeamOrPersonMatchingPreference extends * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ /** {@inheritDoc} */ - public void init(IWorkbench workbench) { + @Override + public void init(IWorkbench workbench) { clazz = TeamOrPersonBase.class; - + try { matchStrategy = MatchStrategyConfigurator.TeamOrPersonMatchStrategy(); } catch (MatchException e) { MessagingUtils.error(this.getClass(), e); throw new RuntimeException(e); } - } + } /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.preference.matching.AbstractMatchingPreferences#getDefaultMatchStrategy() diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/SessionsViewPart.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/SessionsViewPart.java new file mode 100644 index 000000000..baf62fab7 --- /dev/null +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/SessionsViewPart.java @@ -0,0 +1,329 @@ +// $Id$ +/** +* Copyright (C) 2015 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ +package eu.etaxonomy.taxeditor.view.sessions; + +import java.text.DecimalFormat; +import java.util.Collection; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.statistics.LiveCacheStatistics; + +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.part.ViewPart; +import org.eclipse.wb.swt.SWTResourceManager; + +import eu.etaxonomy.cdm.api.cache.CdmCacher; +import eu.etaxonomy.taxeditor.remoting.cache.CdmRemoteCacheManager; +import eu.etaxonomy.taxeditor.session.ICdmEntitySession; +import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; +import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver; +import eu.etaxonomy.taxeditor.store.CdmStore; + +/** + * @author cmathew + * @date 16 Feb 2015 + * + */ +public class SessionsViewPart extends ViewPart implements ICdmEntitySessionManagerObserver { + + public static final String ID = "eu.etaxonomy.taxeditor.view.sessions.SessionsViewPart"; //$NON-NLS-1$ + private Table tableSessions; + + private final String[] titles = { "Owner", "In Memory", "On Disk"}; + + private final ICdmEntitySessionManager cdmEntitySessionManager; + private Text txtNoOfSessions; + private Text txtNoOfCaches; + private Text txtDefaultInMemory; + private Text txtCdmModelInMemory; + private Text txtCdmModelOnDisk; + private Text txtDefaultOnDisk; + public SessionsViewPart() { + this.cdmEntitySessionManager = CdmStore.getCurrentSessionManager(); + if(cdmEntitySessionManager != null) { + cdmEntitySessionManager.addSessionObserver(this); + } + } + + /** + * Create contents of the view part. + * @param parent + */ + @Override + public void createPartControl(Composite parent) { + Composite container = new Composite(parent, SWT.NONE); + container.setLayout(new GridLayout(6, false)); + { + Label lblNoOfSessions = new Label(container, SWT.NONE); + lblNoOfSessions.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblNoOfSessions.setAlignment(SWT.RIGHT); + GridData gd_lblNoOfSessions = new GridData(SWT.RIGHT, SWT.FILL, false, false, 1, 1); + gd_lblNoOfSessions.widthHint = 115; + gd_lblNoOfSessions.minimumHeight = 30; + lblNoOfSessions.setLayoutData(gd_lblNoOfSessions); + lblNoOfSessions.setText("No. of Sessions : "); + } + { + txtNoOfSessions = new Text(container, SWT.BORDER); + txtNoOfSessions.setEditable(false); + txtNoOfSessions.setBackground(SWTResourceManager.getColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT)); + GridData gd_txtNoOfSessions = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_txtNoOfSessions.widthHint = 50; + txtNoOfSessions.setLayoutData(gd_txtNoOfSessions); + } + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + { + Label lblNoOfCaches = new Label(container, SWT.CENTER); + lblNoOfCaches.setAlignment(SWT.RIGHT); + lblNoOfCaches.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + GridData gd_lblNoOfCaches = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1); + gd_lblNoOfCaches.widthHint = 150; + lblNoOfCaches.setLayoutData(gd_lblNoOfCaches); + lblNoOfCaches.setText("No. of entity caches : "); + } + { + txtNoOfCaches = new Text(container, SWT.BORDER); + txtNoOfCaches.setEditable(false); + GridData gd_txtNoOfCaches = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_txtNoOfCaches.widthHint = 50; + txtNoOfCaches.setLayoutData(gd_txtNoOfCaches); + } + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + + { + Label lblDefaultCache = new Label(container, SWT.CENTER); + lblDefaultCache.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblDefaultCache.setText("Default Cache, "); + lblDefaultCache.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblDefaultCache.setAlignment(SWT.RIGHT); + } + { + Label lblDefaultInMemory = new Label(container, SWT.CENTER); + lblDefaultInMemory.setText("in Memory : "); + lblDefaultInMemory.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblDefaultInMemory.setAlignment(SWT.RIGHT); + lblDefaultInMemory.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + } + { + txtDefaultInMemory = new Text(container, SWT.BORDER); + txtDefaultInMemory.setEditable(false); + GridData gd_txtDefaultInMemory = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_txtDefaultInMemory.widthHint = 130; + txtDefaultInMemory.setLayoutData(gd_txtDefaultInMemory); + } + { + Label lblDefaultOnDisk = new Label(container, SWT.CENTER); + lblDefaultOnDisk.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblDefaultOnDisk.setText("on Disk : "); + lblDefaultOnDisk.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblDefaultOnDisk.setAlignment(SWT.RIGHT); + } + { + txtDefaultOnDisk = new Text(container, SWT.BORDER); + txtDefaultOnDisk.setEditable(false); + txtDefaultOnDisk.setText(""); + GridData gd_txtDefaultOnDisk = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_txtDefaultOnDisk.widthHint = 130; + txtDefaultOnDisk.setLayoutData(gd_txtDefaultOnDisk); + } + new Label(container, SWT.NONE); + { + Label lblCdmModelCache = new Label(container, SWT.CENTER); + lblCdmModelCache.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblCdmModelCache.setText("CDM Model Cache, "); + lblCdmModelCache.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblCdmModelCache.setAlignment(SWT.RIGHT); + } + { + Label lblCdmModelInMemory = new Label(container, SWT.CENTER); + lblCdmModelInMemory.setText("in Memory : "); + lblCdmModelInMemory.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblCdmModelInMemory.setAlignment(SWT.RIGHT); + GridData gd_lblCdmModelInMemory = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1); + gd_lblCdmModelInMemory.widthHint = 86; + lblCdmModelInMemory.setLayoutData(gd_lblCdmModelInMemory); + } + { + txtCdmModelInMemory = new Text(container, SWT.BORDER); + txtCdmModelInMemory.setEditable(false); + GridData gd_txtCdmModelInMemory = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_txtCdmModelInMemory.widthHint = 130; + txtCdmModelInMemory.setLayoutData(gd_txtCdmModelInMemory); + } + { + Label lblCdmModelOnDisk = new Label(container, SWT.CENTER); + lblCdmModelOnDisk.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblCdmModelOnDisk.setText("on Disk : "); + lblCdmModelOnDisk.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblCdmModelOnDisk.setAlignment(SWT.RIGHT); + } + { + txtCdmModelOnDisk = new Text(container, SWT.BORDER); + txtCdmModelOnDisk.setEditable(false); + txtCdmModelOnDisk.setText(""); + GridData gd_txtCdmModelOnDisk = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_txtCdmModelOnDisk.widthHint = 130; + txtCdmModelOnDisk.setLayoutData(gd_txtCdmModelOnDisk); + } + new Label(container, SWT.NONE); + { + Button btnRefresh = new Button(container, SWT.NONE); + btnRefresh.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + changed(); + } + }); + GridData gd_btnRefresh = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); + gd_btnRefresh.widthHint = 100; + btnRefresh.setLayoutData(gd_btnRefresh); + btnRefresh.setText("Refresh"); + } + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + new Label(container, SWT.NONE); + + { + tableSessions = new Table(container, SWT.BORDER | SWT.FULL_SELECTION); + tableSessions.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 5, 1)); + tableSessions.setHeaderVisible(true); + tableSessions.setLinesVisible(true); + } + new Label(container, SWT.NONE); + + createActions(); + initializeToolBar(); + initializeMenu(); + } + + /** + * Create the actions. + */ + private void createActions() { + + + for (String title : titles) { + TableColumn column = new TableColumn(tableSessions, SWT.NULL); + column.setWidth(200); + column.setText(title); + } + changed(); + + } + + + @Override + public void changed() { + tableSessions.removeAll(); + if(cdmEntitySessionManager != null) { + Collection sessions = cdmEntitySessionManager.getSessions(); + txtNoOfSessions.setText(String.valueOf(sessions.size())); + for(ICdmEntitySession session : sessions) { + if(session.getOwner() != null) { + TableItem item = new TableItem(tableSessions, SWT.NULL); + item.setText(session.getOwner().toString()); + String activePrefix = ""; + if(session.isActive()) { + activePrefix = "*"; + } + item.setText(0, activePrefix + session.getOwner().toString()); + LiveCacheStatistics cacheStatistics = session.getCacheStatistics(); + item.setText(1, getInMemoryStats(cacheStatistics)); + item.setText(2, getOnDiskStats(cacheStatistics)); + } + } + for (int i=0; i