From 0ddb839286c17db4d577e344d38a5e20ce08bcf7 Mon Sep 17 00:00:00 2001 From: Cherian Mathew Date: Tue, 17 Feb 2015 15:45:47 +0000 Subject: [PATCH] CdmTransientEntityCacher, EntityCacherDebugResult : moved debug methods to debug result class ProxyUtils : new class for util methods to do with hibernate proxy objects ICdmEntitySessionEnabled, CdmEntitySessionInput, PolytomousKeyEditorInput, TaxonNameEditor, PolytomousKeyViewPart, TaxonNavigator, AbstractCdmViewPart, MultiPageTaxonEditor : Added getRootEntities method CdmEntitySession, ICdmEntitySession : added new debug methods InspectSessionsDialog : new dialog to inspect session entities --- .gitattributes | 2 + .../cache/CdmTransientEntityCacher.java | 258 +------------ .../cache/EntityCacherDebugResult.java | 355 ++++++++++++++++-- .../taxeditor/remoting/cache/ProxyUtils.java | 60 +++ .../taxeditor/session/CdmEntitySession.java | 40 +- .../taxeditor/session/ICdmEntitySession.java | 6 + .../session/ICdmEntitySessionEnabled.java | 5 + .../session/mock/MockCdmEntitySession.java | 26 ++ .../editor/CdmEntitySessionInput.java | 3 - .../editor/MultiPageTaxonEditor.java | 9 + .../polytomous/PolytomousKeyEditorInput.java | 12 + .../editor/name/TaxonNameEditor.java | 9 + .../key/polytomous/PolytomousKeyViewPart.java | 9 + .../navigation/navigator/TaxonNavigator.java | 8 + .../taxeditor/view/AbstractCdmViewPart.java | 8 + .../view/sessions/InspectSessionsDialog.java | 204 ++++++++++ .../cdm/model/PolytomousKeyTest.java | 5 +- 17 files changed, 722 insertions(+), 297 deletions(-) create mode 100644 eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/ProxyUtils.java create mode 100644 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/InspectSessionsDialog.java diff --git a/.gitattributes b/.gitattributes index cd4faa47c..37b3d1131 100644 --- a/.gitattributes +++ b/.gitattributes @@ -342,6 +342,7 @@ eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cach eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmTransientEntityCacher.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/EntityCacherDebugResult.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/ICachedCommonService.java -text +eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/ProxyUtils.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/server/CDMServerException.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/source/CdmPersistentRemoteSource.java -text eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/source/CdmRemoteSource.java -text @@ -1813,6 +1814,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/InspectSessionsDialog.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 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 64e467aff..a5146bf31 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,14 +12,11 @@ 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; @@ -30,11 +27,6 @@ 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; @@ -42,9 +34,6 @@ 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; /** @@ -414,7 +403,7 @@ public class CdmTransientEntityCacher { if(o != null && o instanceof PersistentCollection) { PersistentCollection pc = ((PersistentCollection)o); if(pc.wasInitialized()) { - o = getObject(pc); + o = ProxyUtils.getObject(pc); field.set(cdmEntity, o); } } @@ -575,250 +564,5 @@ public class CdmTransientEntityCacher { } - /******* Debugging section follows *******/ - - private CdmBase debug(CdmBase cdmEntity) { - logger.info("debugging object of type " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId()); - - // start by looking up the cdm entity in the cache - CdmBase cachedCdmEntity = getFromCache(cdmEntity); - - if(cachedCdmEntity != null) { - // if cdm entity was found in cache then return ... - logger.info(" - object of type " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId() + " already exists"); - return cachedCdmEntity; - } else { - return cdmEntity; - } - } - - public EntityCacherDebugResult debug(CdmBase cdmEntity, boolean recursive) { - if(cdmEntity == null) { - return null; - } - EntityCacherDebugResult entityCacherDebugResult = new EntityCacherDebugResult(); - - if(isRecursiveEnabled && recursive) { - logger.info("---- starting recursive debug for cdm entity " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId()); - Set alreadyVisitedEntities = new HashSet(); - CdmBase cb = debugRecursive(cdmEntity, alreadyVisitedEntities, entityCacherDebugResult); - alreadyVisitedEntities.clear(); - logger.info("---- ending recursive debug for cdm entity " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId() + "\n"); - } - - return entityCacherDebugResult; - - } - - private T debugRecursive(T obj, Set alreadyVisitedEntities, EntityCacherDebugResult entityCacherDebugResult) { - if(obj == null) { - return null; - } - if(obj instanceof CdmBase) { - return (T) debugRecursive((CdmBase)obj, alreadyVisitedEntities, entityCacherDebugResult); - } else if (obj instanceof Map) { - return (T) debug((Map)obj, alreadyVisitedEntities, entityCacherDebugResult); - } else if (obj instanceof Collection) { - return (T) debug((Collection)obj, alreadyVisitedEntities, entityCacherDebugResult); - } - - logger.info("No caching yet for type " + obj.getClass().getName()); - - return obj; - } - - private Map debug(Map map, Set alreadyVisitedEntities, EntityCacherDebugResult entityCacherDebugResult){ - if(map == null || map.isEmpty()) { - return map; - } - - int originalMapSize = map.size(); - Object[] result = new Object[ map.size() * 2 ]; - Iterator> iter = map.entrySet().iterator(); - int i=0; - while ( iter.hasNext() ) { - Map.Entry e = iter.next(); - result[i++] = e.getKey(); - result[i++] = e.getValue(); - } - - for(i=0; i Collection debug(Collection collection, Set alreadyVisitedEntities, EntityCacherDebugResult entityCacherDebugResult){ - int length = collection.size(); - Object[] result = new Object[length]; - Iterator collectionItr = collection.iterator(); - int count = 0; - while(collectionItr.hasNext()) { - Object obj = collectionItr.next(); - if(alreadyVisitedEntities == null) { - result[count] = load(obj, false); - } else { - result[count] = debugRecursive(obj, alreadyVisitedEntities, entityCacherDebugResult); - } - - count++; - } - - collection.clear(); - - for ( int i = 0; i < length; i++ ) { - collection.add((T)result[i]); - } - - return collection; - } - - private CdmBase debugRecursive(CdmBase cdmEntity, Set alreadyVisitedEntities, EntityCacherDebugResult entityCacherDebugResult) { - - - - // we want to recursive through the cdmEntity (and not the cachedCdmEntity) - // since there could be new or deleted objects in the cdmEntity sub-graph - - // start by getting the fields from the cdm entity - String className = cdmEntity.getClass().getName(); - CdmModelFieldPropertyFromClass cmgmfc = getFromCdmlibModelCache(className); - if(cmgmfc != null) { - alreadyVisitedEntities.add(cdmEntity); - List fields = cmgmfc.getFields(); - for(String field : fields) { - // retrieve the actual object corresponding to the field. - // this object will be either a CdmBase or a Collection / Map - // with CdmBase as the generic type - - 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()); - debugRecursive(cdmEntityInSubGraph, alreadyVisitedEntities, entityCacherDebugResult); - } else { - logger.info("object of type " + cdmEntityInSubGraph.getClass().getName() + " with id " + cdmEntityInSubGraph.getId() + " already visited"); - } - } - } - } else { - 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 cdmEntity; - } - - - private CdmBase getDebugCdmBaseTypeFieldValue(CdmBase cdmEntity, - String fieldName, - Set alreadyVisitedEntities, - EntityCacherDebugResult entityCacherDebugResult) { - - - Class clazz = cdmEntity.getClass(); - try { - // this call will search in the provided class as well as - // the super classes until it finds the field - Field field = ReflectionUtils.findField(clazz, fieldName); - - if(field == null) { - throw new CdmClientCacheException("Field '" + fieldName - + "' not found when searching in class '" + clazz.getName() + "' and its supercalsses"); - } - field.setAccessible(true); - Object o = field.get(cdmEntity); - if(o != null && o instanceof HibernateProxy) { - LazyInitializer hli = ((HibernateProxy)o).getHibernateLazyInitializer(); - if(!hli.isUninitialized()) { - o = hli.getImplementation(); - } - } - - if(o != null && o instanceof PersistentCollection) { - PersistentCollection pc = ((PersistentCollection)o); - if(pc.wasInitialized()) { - o = getObject(pc); - } - } - CdmBase cdmEntityInSubGraph = null; - if(o != null - && !ProxyFactory.isProxyClass(o.getClass()) - && !(o instanceof PersistentCollection) ) { - - 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) { - // 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()); - CdmEntityInfo cei = entityCacherDebugResult.new CdmEntityInfo(cdmEntityInSubGraph, cdmEntity, field); - entityCacherDebugResult.addEntityNotInCache(cei); - } - } else if(o instanceof Map) { - debugRecursive((Map)o, alreadyVisitedEntities, entityCacherDebugResult); - } else if(o instanceof Collection) { - debugRecursive((Collection)o, alreadyVisitedEntities, entityCacherDebugResult); - } - } - // we return the original cdm entity in the sub graph because we - // want to continue to recurse on the input cdm entity graph - // and not the one in the cache - return cdmEntityInSubGraph; - } catch (SecurityException e) { - throw new CdmClientCacheException(e); - } catch (IllegalArgumentException e) { - throw new CdmClientCacheException(e); - } catch (IllegalAccessException e) { - throw new CdmClientCacheException(e); - } - } - - 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 12de6a6d8..8e4254a4d 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 @@ -11,10 +11,21 @@ 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.IdentityHashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import javassist.util.proxy.ProxyFactory; + +import org.apache.log4j.Logger; +import org.hibernate.collection.spi.PersistentCollection; +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.proxy.LazyInitializer; +import org.springframework.util.ReflectionUtils; + import eu.etaxonomy.cdm.model.common.CdmBase; /** @@ -24,13 +35,42 @@ import eu.etaxonomy.cdm.model.common.CdmBase; */ public class EntityCacherDebugResult { - private final Map duplicateCdmEntityMap; + private static final Logger logger = Logger.getLogger(EntityCacherDebugResult.class); + + private Map duplicateCdmEntityMap; - private final List notInCacheList; + private List notInCacheList; + + private CdmTransientEntityCacher cacher; + + private List rootElements; public EntityCacherDebugResult() { + } + + + public EntityCacherDebugResult(CdmTransientEntityCacher cacher, List rootEntities) { + this.cacher = cacher; + init(); + if(rootEntities != null && !rootEntities.isEmpty()) { + for(CdmBase rootEntity : rootEntities) { + debug(rootEntity, true); + print(); + clear(); + } + + } + } + + private void init() { duplicateCdmEntityMap = new HashMap(); notInCacheList = new ArrayList(); + rootElements = new ArrayList(); + } + + private void clear() { + duplicateCdmEntityMap.clear(); + notInCacheList.clear(); } public void addDuplicateEntity(CdmEntityInfo cei, CdmEntityInfo cachedCei) { @@ -41,7 +81,11 @@ public class EntityCacherDebugResult { notInCacheList.add(cei); } - public void print() { + public List getRootElements() { + return rootElements; + } + + private void print() { System.out.println(toString()); } @@ -58,13 +102,20 @@ public class EntityCacherDebugResult { { sb.append(System.getProperty("line.separator")); CdmEntityInfo cei = entry.getKey(); - CdmEntityInfo cachedCei = entry.getValue(); - sb.append(" - entity : " + cei.getCb().getUserFriendlyTypeName() + "/" + cei.getCb().getId() + + CdmBase cb = (CdmBase) cei.getObject(); + CdmBase cbParent = (CdmBase) cei.getParent().getObject(); + + CdmEntityInfo dupCei = entry.getValue(); + CdmBase dupCb = (CdmBase) dupCei.getObject(); + CdmBase dupCbParent = (CdmBase) dupCei.getParent().getObject(); + + sb.append(" - entity : " + cb.getUserFriendlyTypeName() + "/" + cb.getId() + " as field " + cei.getField().getName() + - " of entity " + cei.getCbOwner().getUserFriendlyTypeName() + "/" + cei.getCbOwner().getId()); + " of entity " + cbParent.getUserFriendlyTypeName() + "/" + cbParent.getId()); sb.append(System.getProperty("line.separator")); - sb.append(" - duplicate entity : " + cachedCei.getCb().getUserFriendlyTypeName() + "/" + cachedCei.getCb().getId() + - " as field " + cachedCei.getField().getName()); + sb.append(" - duplicate entity : " + dupCb.getUserFriendlyTypeName() + "/" + dupCb.getId() + + " as field " + dupCei.getField().getName() + + " of entity " + dupCbParent.getUserFriendlyTypeName() + "/" + dupCbParent.getId()); sb.append(System.getProperty("line.separator")); sb.append("-----------"); } @@ -79,10 +130,14 @@ public class EntityCacherDebugResult { sb.append("Not In Cache Entities,"); for(CdmEntityInfo cei : notInCacheList) { + CdmBase cb = (CdmBase) cei.getObject(); + CdmBase cbParent = (CdmBase) cei.getParent().getObject(); + sb.append(System.getProperty("line.separator")); - sb.append(" - entity : " + cei.getCb().getUserFriendlyTypeName() + "/" + cei.getCb().getId() + + + sb.append(" - entity : " + cb.getUserFriendlyTypeName() + "/" + cb.getId() + " as field " + cei.getField().getName() + - " of entity" + cei.getCbOwner().getUserFriendlyTypeName() + "/" + cei.getCbOwner().getId()); + " of entity" + cbParent.getUserFriendlyTypeName() + "/" + cbParent.getId()); } } @@ -90,44 +145,286 @@ public class EntityCacherDebugResult { } + private void debug(CdmBase cdmEntity, boolean recursive) { + if(cdmEntity == null) { + return; + } + logger.info("---- starting recursive debug for cdm entity " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId()); + IdentityHashMap alreadyVisitedEntities = new IdentityHashMap(); + CdmEntityInfo cei = new CdmEntityInfo(cdmEntity); + debugRecursive(cdmEntity, alreadyVisitedEntities, cei); + rootElements.add(cei); + alreadyVisitedEntities.clear(); + logger.info("---- ending recursive debug for cdm entity " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId() + "\n"); + } + + private void debugRecursive(T obj, + IdentityHashMap alreadyVisitedEntities, + CdmEntityInfo cei) { + if(obj == null) { + return; + } + if(obj instanceof CdmBase) { + debugRecursive((CdmBase)obj, alreadyVisitedEntities, cei); + } else if (obj instanceof Map) { + debug((Map)obj, alreadyVisitedEntities, cei); + } else if (obj instanceof Collection) { + debug((Collection)obj, alreadyVisitedEntities, cei); + } + + logger.info("No caching yet for type " + obj.getClass().getName()); + + + } + + private void debug(Map map, + IdentityHashMap alreadyVisitedEntities, + CdmEntityInfo cei) { + if(map == null || map.isEmpty()) { + return; + } + + int originalMapSize = map.size(); + + Iterator> iter = map.entrySet().iterator(); + int i=0; + while ( iter.hasNext() ) { + Map.Entry e = iter.next(); + CdmEntityInfo childCei = new CdmEntityInfo(e); + cei.addChild(childCei); + debugRecursive(e.getKey(), alreadyVisitedEntities, childCei); + debugRecursive(e.getValue(), alreadyVisitedEntities, childCei); + } + } + + private void debug(Collection collection, + IdentityHashMap alreadyVisitedEntities, + CdmEntityInfo cei) { + int length = collection.size(); + Object[] result = new Object[length]; + Iterator collectionItr = collection.iterator(); + + while(collectionItr.hasNext()) { + Object obj = collectionItr.next(); + CdmEntityInfo childCei = new CdmEntityInfo(obj); + cei.addChild(childCei); + debugRecursive(obj, alreadyVisitedEntities, childCei); + + } + + } + + private void debugRecursive(CdmBase cdmEntity, + IdentityHashMap alreadyVisitedEntities, + CdmEntityInfo cei) { + + // we want to recursive through the cdmEntity (and not the cachedCdmEntity) + // since there could be new or deleted objects in the cdmEntity sub-graph + + // start by getting the fields from the cdm entity + String className = cdmEntity.getClass().getName(); + CdmModelFieldPropertyFromClass cmgmfc = cacher.getFromCdmlibModelCache(className); + if(cmgmfc != null) { + alreadyVisitedEntities.put(cdmEntity, cei); + List fields = cmgmfc.getFields(); + for(String field : fields) { + // retrieve the actual object corresponding to the field. + // this object will be either a CdmBase or a Collection / Map + // with CdmBase as the generic type + + CdmEntityInfo childCei = getDebugCdmBaseTypeFieldValue(cdmEntity, field, alreadyVisitedEntities, cei); + CdmBase cdmEntityInSubGraph = (CdmBase)childCei.getObject(); + if(cdmEntityInSubGraph != null) { + if(!alreadyVisitedEntities.keySet().contains(cdmEntityInSubGraph)) { + logger.info("recursive debugging object of type " + cdmEntityInSubGraph.getClass().getName() + " with id " + cdmEntityInSubGraph.getId()); + debugRecursive(cdmEntityInSubGraph, alreadyVisitedEntities, childCei); + } else { + logger.info("object of type " + cdmEntityInSubGraph.getClass().getName() + " with id " + cdmEntityInSubGraph.getId() + " already visited"); + } + } + } + } else { + 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" ); + } + + } + + + private CdmEntityInfo getDebugCdmBaseTypeFieldValue(CdmBase cdmEntity, + String fieldName, + IdentityHashMap alreadyVisitedEntities, + CdmEntityInfo cei) { + + CdmEntityInfo childCei = null; + Class clazz = cdmEntity.getClass(); + try { + // this call will search in the provided class as well as + // the super classes until it finds the field + Field field = ReflectionUtils.findField(clazz, fieldName); + + if(field == null) { + throw new CdmClientCacheException("Field '" + fieldName + + "' not found when searching in class '" + clazz.getName() + "' and its supercalsses"); + } + field.setAccessible(true); + Object o = field.get(cdmEntity); + if(o != null) { + if(o instanceof HibernateProxy) { + LazyInitializer hli = ((HibernateProxy)o).getHibernateLazyInitializer(); + if(!hli.isUninitialized()) { + o = hli.getImplementation(); + } + } + + if(o instanceof PersistentCollection) { + PersistentCollection pc = ((PersistentCollection)o); + if(pc.wasInitialized()) { + o = ProxyUtils.getObject(pc); + } + } + } + childCei = new CdmEntityInfo(o); + cei.addChild(childCei); + childCei.setField(field); + CdmBase cdmEntityInSubGraph = null; + if(o != null + && !ProxyFactory.isProxyClass(o.getClass()) + && !(o instanceof PersistentCollection) ) { + + 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; + + if(alreadyVisitedEntities.keySet().contains(cdmEntityInSubGraph)) { + //logger.info(" - found duplicate entity at " + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId()); + CdmEntityInfo dupCei = alreadyVisitedEntities.get(cdmEntityInSubGraph); + addDuplicateEntity(childCei, dupCei); + } + + + CdmBase cachedCdmEntityInSubGraph = cacher.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) { + // 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()); + addEntityNotInCache(childCei); + } + } else if(o instanceof Map) { + debugRecursive((Map)o, alreadyVisitedEntities, childCei); + } else if(o instanceof Collection) { + debugRecursive((Collection)o, alreadyVisitedEntities, childCei); + } + } + // we return the original cdm entity in the sub graph because we + // want to continue to recurse on the input cdm entity graph + // and not the one in the cache + return childCei; + } catch (SecurityException e) { + throw new CdmClientCacheException(e); + } catch (IllegalArgumentException e) { + throw new CdmClientCacheException(e); + } catch (IllegalAccessException e) { + throw new CdmClientCacheException(e); + } + } + + + public class CdmEntityInfo { - private final CdmBase cb; - private final CdmBase cbOwner; - private final Field field; + private final Object object; + private CdmEntityInfo parent; + private List children; + private Field field; + private String label; - public CdmEntityInfo(CdmBase cb, CdmBase cbOwner, Field field) { - this.cb = cb; - this.cbOwner = cbOwner; - this.field = field; + public CdmEntityInfo(Object object) { + this.object = object; + children = new ArrayList(); + } + + public CdmEntityInfo getParent() { + return parent; + } + + public void setParent(CdmEntityInfo parent) { + this.parent = parent; + } + + public List getChildren() { + return children; } - public CdmBase getCb() { - return cb; + public void setChildren(List children) { + this.children = children; } - public CdmBase getCbOwner() { - return cbOwner; + public void addChild(CdmEntityInfo cei) { + this.children.add(cei); + cei.setParent(this); } public Field getField() { return field; } - @Override - public boolean equals(Object obj) { - if(obj instanceof CdmEntityInfo & obj == this) { - return true; + public void setField(Field field) { + this.field = field; + } + + + public String getLabel() { + String label; + String fieldName = ""; + if(field != null) { + fieldName = field.getName(); + } + if(object != null) { + if(object instanceof HibernateProxy) { + LazyInitializer hli = ((HibernateProxy)object).getHibernateLazyInitializer(); + if(hli.isUninitialized()) { + label = "[HibernateProxy] " + fieldName; + } else { + label = fieldName + "Object is a HibernateProxy, but initialised"; + } + } else if(object instanceof PersistentCollection) { + PersistentCollection pc = ((PersistentCollection)object); + if(!pc.wasInitialized()) { + label = "[PersistentCollection] " + fieldName; + } else { + label = fieldName + "Object is a PersistentCollection, but initialised"; + } + } else if(object instanceof Collection) { + String className = object.getClass().getName(); + label = "[" + className + "] " + fieldName + String.valueOf(((Collection)object).size()); + } else if(object instanceof Map) { + String className = object.getClass().getName(); + label = "[" + className + "] " + fieldName + String.valueOf(((Map)object).size()); + } else { + String className = object.getClass().getName(); + label = "[" + className + "] " + fieldName; + } } else { - return false; + label = "[NULL] " + fieldName; } + return label; } - @Override - public int hashCode() { - return this.cb.hashCode(); + public void setLabel(String label) { + this.label = label; } + + public Object getObject() { + return object; + } + + + } } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/ProxyUtils.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/ProxyUtils.java new file mode 100644 index 000000000..e61f3d4c5 --- /dev/null +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/ProxyUtils.java @@ -0,0 +1,60 @@ +// $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.remoting.cache; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +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 eu.etaxonomy.cdm.model.common.PersistentMultiLanguageText; +import eu.etaxonomy.taxeditor.remoting.CdmRemotingException; + +/** + * @author cmathew + * @date 17 Feb 2015 + * + */ +public class ProxyUtils { + + 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/session/CdmEntitySession.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java index 09443e3e8..c7935d609 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 @@ -10,6 +10,7 @@ package eu.etaxonomy.taxeditor.session; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set; @@ -18,7 +19,6 @@ 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; import eu.etaxonomy.cdm.model.common.CdmBase; @@ -52,12 +52,11 @@ public class CdmEntitySession implements ICdmEntitySession { private final List changeObservers; - private final List rootEntities; + public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) { this.sessionOwner = sessionOwner; this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager); - this.rootEntities = new ArrayList(); this.cdmEntitySessionManager = cdmEntitySessionManager; this.changeObservers = new ArrayList(); cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this); @@ -110,11 +109,30 @@ public class CdmEntitySession implements ICdmEntitySession { */ @Override public EntityCacherDebugResult debug(T cdmBase) { - EntityCacherDebugResult entityCacherDebugResult = cdmTransientEntityCacher.debug(cdmBase, true); - entityCacherDebugResult.print(); + return debug(Arrays.asList(cdmBase)); + } + + + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List) + */ + @Override + public EntityCacherDebugResult debug(List cdmBases) { + EntityCacherDebugResult entityCacherDebugResult = + new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases); return entityCacherDebugResult; } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug() + */ + @Override + public EntityCacherDebugResult debug() { + return debug(getRootEntities()); + } + /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection) */ @@ -165,7 +183,7 @@ public class CdmEntitySession implements ICdmEntitySession { */ @Override public void dispose() { - rootEntities.clear(); + cdmTransientEntityCacher.dispose(); for(ICdmEntitySessionEnabled observer : changeObservers) { CdmPostDataChangeObservableListener.getDefault().unregister(observer); @@ -280,6 +298,16 @@ public class CdmEntitySession implements ICdmEntitySession { } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities() + */ + @Override + public List getRootEntities() { + return sessionOwner.getRootEntities(); + } + + + 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 dda3a5454..5a9a7a89d 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 @@ -24,10 +24,16 @@ public interface ICdmEntitySession { public EntityCacherDebugResult debug(T cdmBase); + public EntityCacherDebugResult debug(List cdmBase); + + public EntityCacherDebugResult debug(); + public Collection load(Collection cdmBaseList); public void setEntitiesAsLatest(); + public List getRootEntities(); + public void dispose(); public void bind(); diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionEnabled.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionEnabled.java index ece5fec22..ba70991e0 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionEnabled.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionEnabled.java @@ -1,9 +1,14 @@ package eu.etaxonomy.taxeditor.session; +import java.util.List; + +import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver; public interface ICdmEntitySessionEnabled extends ICdmPostDataChangeObserver { public ICdmEntitySession getCdmEntitySession(); + public List getRootEntities(); + } 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 01cc869b0..559dc5561 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 @@ -219,4 +219,30 @@ public class MockCdmEntitySession implements ICdmEntitySession { return false; } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities() + */ + @Override + public List getRootEntities() { + return null; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List) + */ + @Override + public EntityCacherDebugResult debug(List cdmBase) { + + return null; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug() + */ + @Override + public EntityCacherDebugResult debug() { + + return null; + } + } 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 41ccf1e9a..f55e1b3ca 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 @@ -9,8 +9,6 @@ */ package eu.etaxonomy.taxeditor.editor; -import java.util.List; - import eu.etaxonomy.cdm.api.service.IService; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; @@ -58,7 +56,6 @@ public abstract class CdmEntitySessionInput implements ICdmEntitySessionEnabled cdmEntitySession.remoteUpdate(getService(), cdmBase); } - public abstract List getRootEntities(); public abstract void update(); } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java index d1054f959..3c1c7efde 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java @@ -29,6 +29,7 @@ import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonBase; +import eu.etaxonomy.cdm.model.taxon.TaxonNode; import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin; import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor; @@ -568,4 +569,12 @@ IDirtyMarkable, IPartContentHasDetails, ISecuredEditor, IPartContentHasMedia { public ICdmEntitySession getCdmEntitySession() { return cdmEntitySession; } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities() + */ + @Override + public List getRootEntities() { + return input.getRootEntities(); + } } 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 de54ee9cf..68428b6f5 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 @@ -3,6 +3,8 @@ */ package eu.etaxonomy.taxeditor.editor.key.polytomous; +import java.util.Arrays; +import java.util.List; import java.util.UUID; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; @@ -88,4 +90,14 @@ public class PolytomousKeyEditorInput extends AbstractIdentificationEditorInput< public ICdmEntitySession getCdmEntitySession() { return cdmEntitySession; } + + + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities() + */ + @Override + public List getRootEntities() { + return Arrays.asList(key); + } } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java index dc16cfc14..b9e334c45 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java @@ -957,4 +957,13 @@ public class TaxonNameEditor extends EditorPart implements return editor.getCdmEntitySession(); } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities() + */ + @Override + public List getRootEntities() { + // TODO Auto-generated method stub + return null; + } + } diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java index f275d8704..0a913f84c 100644 --- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java +++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java @@ -287,4 +287,13 @@ public class PolytomousKeyViewPart extends ViewPart implements return null; } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities() + */ + @Override + public List getRootEntities() { + // TODO Auto-generated method stub + return null; + } + } diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigator.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigator.java index 1ecc3f48c..516922276 100644 --- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigator.java +++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigator.java @@ -489,4 +489,12 @@ public class TaxonNavigator extends CommonNavigator implements public ICdmEntitySession getCdmEntitySession() { return cdmEntitySession; } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities() + */ + @Override + public List getRootEntities() { + return null; + } } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java index 770423be9..03acaeb24 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java @@ -10,6 +10,9 @@ package eu.etaxonomy.taxeditor.view; +import java.util.Arrays; +import java.util.List; + import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; @@ -181,6 +184,11 @@ public abstract class AbstractCdmViewPart extends ViewPart implements ISelection return null; } + @Override + public List getRootEntities() { + return Arrays.asList((CdmBase)getViewer().getInput()); + } + /** {@inheritDoc} */ @Override public void update(CdmDataChangeMap changeEvents) { diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/InspectSessionsDialog.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/InspectSessionsDialog.java new file mode 100644 index 000000000..3206427e6 --- /dev/null +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/sessions/InspectSessionsDialog.java @@ -0,0 +1,204 @@ +// $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.util.List; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.Element; + +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.StyledCellLabelProvider; +import org.eclipse.jface.viewers.StyledString; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerCell; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Dialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.wb.swt.SWTResourceManager; + +import eu.etaxonomy.taxeditor.remoting.cache.CdmModelFieldPropertyFromClass; +import eu.etaxonomy.taxeditor.remoting.cache.CdmRemoteCacheManager; +import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult; +import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult.CdmEntityInfo; +import eu.etaxonomy.taxeditor.session.ICdmEntitySession; +import eu.etaxonomy.taxeditor.store.CdmStore; + +/** + * @author cmathew + * @date 17 Feb 2015 + * + */ +public class InspectSessionsDialog extends Dialog { + + protected Object result; + protected Shell shlInspectSessions; + private Text text; + private Label lblDebugInformation; + + private final Cache cdmlibModelCache; + + private final ICdmEntitySession activeSession; + + private TreeViewer treeViewer; + /** + * Create the dialog. + * @param parent + * @param style + */ + public InspectSessionsDialog(Shell parent, int style) { + super(parent, style); + setText("SWT Dialog"); + cdmlibModelCache = CdmRemoteCacheManager.getInstance().getCdmModelGetMethodsCache(); + activeSession = CdmStore.getCurrentSessionManager().getActiveSession(); + } + + /** + * Open the dialog. + * @return the result + */ + public Object open() { + createContents(); + treeViewer.setContentProvider(new SessionsTreeContentProvider()); + treeViewer.setLabelProvider(new SessionsTreeLabelProvider()); + treeViewer.setInput(getRootElements()); + shlInspectSessions.open(); + shlInspectSessions.layout(); + Display display = getParent().getDisplay(); + while (!shlInspectSessions.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + return result; + } + + /** + * Create contents of the dialog. + */ + private void createContents() { + shlInspectSessions = new Shell(getParent(), getStyle()); + shlInspectSessions.setSize(641, 529); + shlInspectSessions.setText("Inspect Sessions"); + shlInspectSessions.setLayout(new GridLayout(1, false)); + + TreeViewer treeViewer = new TreeViewer(shlInspectSessions, SWT.BORDER); + Tree tree = treeViewer.getTree(); + tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + + lblDebugInformation = new Label(shlInspectSessions, SWT.NONE); + lblDebugInformation.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL)); + lblDebugInformation.setText("Debug Information :"); + + text = new Text(shlInspectSessions, SWT.BORDER); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + + } + + private CdmEntityInfo[] getRootElements() { + EntityCacherDebugResult ecdr = activeSession.debug(); + return (CdmEntityInfo[]) ecdr.getRootElements().toArray(); + } + + class SessionsTreeContentProvider implements ITreeContentProvider { + + + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.IContentProvider#dispose() + */ + @Override + public void dispose() { + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + */ + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object) + */ + @Override + public Object[] getElements(Object inputElement) { + return (CdmEntityInfo[])inputElement; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) + */ + @Override + public Object[] getChildren(Object parentElement) { + List children = ((CdmEntityInfo)parentElement).getChildren(); + return children.toArray(); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) + */ + @Override + public Object getParent(Object element) { + CdmEntityInfo cei = (CdmEntityInfo)element; + return cei.getParent(); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) + */ + @Override + public boolean hasChildren(Object element) { + List children = ((CdmEntityInfo)element).getChildren(); + if(children != null && !children.isEmpty()) { + return true; + } else { + return false; + } + } + + public CdmModelFieldPropertyFromClass getFromCdmlibModelCache(String className) { + Element e = cdmlibModelCache.get(className); + if (e == null) { + return null; + } else { + return (CdmModelFieldPropertyFromClass) e.getObjectValue(); + } + } + + } + + class SessionsTreeLabelProvider extends StyledCellLabelProvider { + + @Override + public void update(ViewerCell cell) { + CdmEntityInfo cei = (CdmEntityInfo)cell.getElement(); + StyledString text = new StyledString(); + if(cei != null) { + text.append(cei.getLabel()); + } + cell.setText(text.toString()); + cell.setStyleRanges(text.getStyleRanges()); + super.update(cell); + } + } +} + + diff --git a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/cdm/model/PolytomousKeyTest.java b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/cdm/model/PolytomousKeyTest.java index 1a7e70f04..899e02266 100644 --- a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/cdm/model/PolytomousKeyTest.java +++ b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/cdm/model/PolytomousKeyTest.java @@ -9,6 +9,7 @@ */ package eu.etaxonomy.cdm.model; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -211,8 +212,8 @@ public class PolytomousKeyTest extends BaseRemotingTest { Taxon taxon = CdmBase.deproxy(taxonService.find(taxon1Uuid),Taxon.class); pkeynode.getChildAt(1).setTaxon(taxon); - EntityCacherDebugResult debugResult = cacher.debug(pkey, true); - debugResult.print(); + EntityCacherDebugResult debugResult = new EntityCacherDebugResult(cacher, Arrays.asList(pkey)); + polytomousKeyService.merge(pkey); pkey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class); -- 2.34.1