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 AbstractMatchingPreferences[TeamOrPersonMatchingPreference 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]