From: Cherian Mathew Date: Thu, 1 Oct 2015 13:14:24 +0000 (+0200) Subject: #5299 Handle session caching of new entities X-Git-Tag: 3.12.0^2~127^2~11 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/c27ecf00af142aeb5c2b56fc2176360bc8285b19 #5299 Handle session caching of new entities --- diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationState.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationState.java index 2c90c55b7..1251d3325 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationState.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationState.java @@ -20,7 +20,9 @@ import eu.etaxonomy.cdm.api.service.ICommonService; import eu.etaxonomy.cdm.api.service.IService; import eu.etaxonomy.cdm.api.service.ITestService; import eu.etaxonomy.cdm.io.service.IIOService; +import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.taxeditor.service.ICachedCommonService; +import eu.etaxonomy.taxeditor.session.DefaultNewEntityListener; /** * @author cmathew @@ -43,6 +45,7 @@ public class CdmApplicationState { public static CdmApplicationState getInstance() { if(cdmApplicationState == null) { cdmApplicationState = new CdmApplicationState(); + CdmBase.setNewEntityListener(new DefaultNewEntityListener()); } return cdmApplicationState; 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 d92bdad55..a811d28db 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 @@ -11,10 +11,12 @@ package eu.etaxonomy.taxeditor.remoting.cache; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; @@ -63,7 +65,7 @@ public class CdmTransientEntityCacher implements ICdmCacher { private final CacheLoader cacheLoader; - + private final Map newEntitiesMap = new HashMap(); public CdmTransientEntityCacher(String cacheId, ICdmEntitySessionManager cdmEntitySessionManager) { this.cacheId = cacheId; @@ -75,6 +77,7 @@ public class CdmTransientEntityCacher implements ICdmCacher { this.cdmEntitySessionManager = cdmEntitySessionManager; cacheLoader = new CacheLoader(this); + } public CdmTransientEntityCacher(Object sessionOwner, ICdmEntitySessionManager cdmEntitySessionManager) { @@ -186,7 +189,11 @@ public class CdmTransientEntityCacher implements ICdmCacher { } - + public void addNewEntity(CdmBase newEntity) { + if(newEntity != null && newEntity.getId() == 0 && newEntity.getUuid() != null) { + newEntitiesMap.put(newEntity.getUuid(), newEntity); + } + } @Override public void put(CdmBase cdmEntity) { @@ -200,9 +207,16 @@ public class CdmTransientEntityCacher implements ICdmCacher { cachedCdmEntity = getFromCache(id); if(cachedCdmEntity == null) { - getCache().put(new Element(id, cdmEntity)); - cdmEntity.initListener(); - logger.info(" - object of type " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId() + " put in cache"); + CdmBase cdmEntityToCache = cdmEntity; + CdmBase newEntity = newEntitiesMap.get(cdmEntity.getUuid()); + if(newEntity != null) { + newEntity.setId(cdmEntity.getId()); + cdmEntityToCache = newEntity; + } + getCache().put(new Element(id, cdmEntityToCache)); + cdmEntityToCache.initListener(); + newEntitiesMap.remove(cdmEntity.getUuid()); + logger.info(" - object of type " + cdmEntityToCache.getClass().getName() + " with id " + cdmEntityToCache.getId() + " put in cache"); return; } logger.info(" - object of type " + cdmEntity.getClass().getName() + " with id " + cdmEntity.getId() + " already exists"); @@ -274,6 +288,7 @@ public class CdmTransientEntityCacher implements ICdmCacher { public void dispose() { CacheManager.create().removeCache(cache.getName()); cache.dispose(); + newEntitiesMap.clear(); } 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 a8cc4ecd9..4bb1c3d58 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 @@ -64,6 +64,7 @@ public class CdmEntitySession implements ICdmEntitySession { + /* (non-Javadoc) * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.lang.Object, boolean) */ @@ -299,4 +300,12 @@ public class CdmEntitySession implements ICdmEntitySession { return propertyPathsMap.get(obj); } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase) + */ + @Override + public void addNewCdmEntity(CdmBase newEntity) { + cdmTransientEntityCacher.addNewEntity(newEntity); + } + } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/DefaultNewEntityListener.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/DefaultNewEntityListener.java new file mode 100644 index 000000000..c26557731 --- /dev/null +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/DefaultNewEntityListener.java @@ -0,0 +1,37 @@ +// $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; + +import org.apache.log4j.Logger; + +import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteController; +import eu.etaxonomy.cdm.api.application.CdmApplicationState; +import eu.etaxonomy.cdm.model.NewEntityListener; +import eu.etaxonomy.cdm.model.common.CdmBase; + +/** + * @author cmathew + * @date 30 Sep 2015 + * + */ +public class DefaultNewEntityListener implements NewEntityListener { + + private static final Logger logger = Logger.getLogger(DefaultNewEntityListener.class); + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.model.NewEntityListener#onCreate(eu.etaxonomy.cdm.model.common.CdmBase) + */ + @Override + public void onCreate(CdmBase cdmBase) { + logger.warn("New Entity created : " + cdmBase); + ((CdmApplicationRemoteController)CdmApplicationState.getCurrentAppConfig()).getCdmEntitySessionManager().getActiveSession().addNewCdmEntity(cdmBase); + } + +} 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 c43e88d43..22388ed7e 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 @@ -88,4 +88,6 @@ public interface ICdmEntitySession { */ public List getPropertyPaths(Object obj); + public void addNewCdmEntity(CdmBase newEntity); + } \ No newline at end of file diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/NullSession.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/NullSession.java index eed1b494d..fcb6c69b6 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/NullSession.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/NullSession.java @@ -209,4 +209,13 @@ public class NullSession implements ICdmEntitySession { return propertyPathsMap.get(obj); } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase) + */ + @Override + public void addNewCdmEntity(CdmBase newEntity) { + // TODO Auto-generated method stub + + } + } 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 5db78a9f7..ef72bfa02 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 @@ -198,5 +198,14 @@ public class MockCdmEntitySession implements ICdmEntitySession { return null; } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase) + */ + @Override + public void addNewCdmEntity(CdmBase newEntity) { + // TODO Auto-generated method stub + + } + } diff --git a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.java b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.java index 76e9242bf..57aa4c410 100644 --- a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.java +++ b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.java @@ -18,6 +18,7 @@ import java.util.UUID; import org.apache.log4j.Logger; import org.eclipse.core.commands.ExecutionException; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.unitils.dbunit.annotation.DataSet; @@ -25,6 +26,11 @@ import eu.etaxonomy.cdm.api.service.IClassificationService; import eu.etaxonomy.cdm.api.service.ITaxonNodeService; import eu.etaxonomy.cdm.api.service.ITaxonService; import eu.etaxonomy.cdm.model.common.Language; +import eu.etaxonomy.cdm.model.common.OriginalSourceType; +import eu.etaxonomy.cdm.model.description.DescriptionElementSource; +import eu.etaxonomy.cdm.model.description.Feature; +import eu.etaxonomy.cdm.model.description.TaxonDescription; +import eu.etaxonomy.cdm.model.description.TextData; import eu.etaxonomy.cdm.model.name.BotanicalName; import eu.etaxonomy.cdm.model.name.HomotypicalGroup; import eu.etaxonomy.cdm.model.name.NonViralName; @@ -33,6 +39,7 @@ import eu.etaxonomy.cdm.model.taxon.Synonym; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonNode; import eu.etaxonomy.taxeditor.editor.name.operation.CreateSynonymInExistingHomotypicalGroupOperation; +import eu.etaxonomy.taxeditor.store.CdmStore; /** * @author cmathew @@ -151,5 +158,48 @@ public class TaxonNameEditorTest extends BaseOperationTest { taxonService.merge(taxon); } + @Ignore + @Test + public void addDescription() { + UUID taxonNodeUuid = UUID.fromString("ce54c396-3694-47f2-abb0-1d7b7e057985"); + + TaxonNode taxonNode = taxonNodeService.load(taxonNodeUuid); + Taxon taxon = taxonNode.getTaxon(); + TaxonDescription description = TaxonDescription.NewInstance(taxon); + + + TextData textData = TextData.NewInstance(); + + textData.setFeature(Feature.ECOLOGY()); + description.addElement(textData); + + DescriptionElementSource descriptionElementSource = DescriptionElementSource.NewInstance(OriginalSourceType.PrimaryTaxonomicSource); + textData.addSource(descriptionElementSource); + + + CdmStore.getService(ITaxonNodeService.class).merge(taxonNode); + + description.getId(); + } + + + @Test + public void addTaxonNodeCascadeProblem() { + UUID taxonNodeUuid = UUID.fromString("ce54c396-3694-47f2-abb0-1d7b7e057985"); + + TaxonNode taxonNode = taxonNodeService.load(taxonNodeUuid); + Taxon childTaxon = Taxon.NewInstance(null, null); + TaxonNode childTaxonNode = taxonNode.addChildTaxon(childTaxon, null, null); + Taxon grandChildTaxon = Taxon.NewInstance(null, null); + TaxonNode grandChildTaxonNode = childTaxonNode.addChildTaxon(grandChildTaxon, null, null); + + CdmStore.getService(ITaxonNodeService.class).merge(taxonNode, true); + + Assert.assertEquals(taxonNode.getChildNodes().get(0).getId(), childTaxonNode.getId()); + Assert.assertEquals(taxonNode.getChildNodes().get(0).getTaxon().getId(), childTaxon.getId()); + Assert.assertEquals(taxonNode.getChildNodes().get(0).getChildNodes().get(0).getId(), grandChildTaxonNode.getId()); + Assert.assertEquals(taxonNode.getChildNodes().get(0).getChildNodes().get(0).getTaxon().getId(), grandChildTaxon.getId()); + } + } diff --git a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionAwareTest.java b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionAwareTest.java index c89201247..82b9e94d1 100644 --- a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionAwareTest.java +++ b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionAwareTest.java @@ -178,12 +178,12 @@ public class CdmEntitySessionAwareTest extends RemotingSessionAwareTest { pKey = polytomousKeyService.merge(pKey, true); grandChildNode = pKey.getRoot().getChildAt(0).getChildAt(0); Assert.assertTrue(0 != grandChildNode.getId()); - - grandChildNode.setStatement(KeyStatement.NewInstance("test")); + KeyStatement ks = KeyStatement.NewInstance("test"); + grandChildNode.setStatement(ks); pKey = polytomousKeyService.merge(pKey, true); - grandChildNode = pKey.getRoot().getChildAt(0).getChildAt(0); - KeyStatement ks = grandChildNode.getStatement(); + //grandChildNode = pKey.getRoot().getChildAt(0).getChildAt(0); + //KeyStatement ks = grandChildNode.getStatement(); Assert.assertTrue(0 != ks.getId()); } @@ -197,10 +197,8 @@ public class CdmEntitySessionAwareTest extends RemotingSessionAwareTest { rootChildNode.addChild(grandChildNode); - grandChildNode = polytomousKeyNodeService.merge(grandChildNode); + polytomousKeyNodeService.merge(grandChildNode); - PolytomousKeyNode greatGrandChildNode = PolytomousKeyNode.NewInstance(); - grandChildNode.addChild(greatGrandChildNode); Assert.assertFalse(pKey.getRoot().getChildAt(0).getChildAt(0).getId() == 0); } diff --git a/eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.xml b/eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.xml index fb244293a..5d91d4033 100644 --- a/eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.xml +++ b/eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.xml @@ -35,4 +35,6 @@ + +