From 0f8d094a52a33e2b5c7ec2adbc1795f8e4cbfce5 Mon Sep 17 00:00:00 2001 From: Katja Luther Date: Mon, 10 Nov 2014 08:49:18 +0000 Subject: [PATCH] changes in service layer for fixes in bulg editor and search for misapplied names and common names in editor --- .../hibernate/common/CdmEntityDaoBase.java | 2 +- .../taxon/TaxonDaoHibernateImpl.java | 23 ++++++++++--- .../cdm/persistence/dao/taxon/ITaxonDao.java | 6 +++- .../taxon/TaxonDaoHibernateImplTest.java | 15 ++++---- .../cdm/api/service/AgentServiceImpl.java | 13 +++++++ .../cdm/api/service/TaxonServiceImpl.java | 18 +++++++--- .../test/function/ConcurrentSessionTest.java | 34 +++++++++++++++++++ 7 files changed, 95 insertions(+), 16 deletions(-) diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java index 0cd1b847f1..f83b30282b 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java @@ -330,7 +330,7 @@ public abstract class CdmEntityDaoBase extends DaoBase implem // I think this is preferable to catching lazy initialization errors // as that solution only swallows and hides the exception, but doesn't // actually solve it. - getSession().merge(persistentObject); + persistentObject = (T) getSession().merge(persistentObject); getSession().delete(persistentObject); return persistentObject.getUuid(); } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java index 14ba179aea..902610b608 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java @@ -248,7 +248,7 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem //new search for the editor, for performance issues the return values are only uuid and titleCache, to avoid the initialisation of all objects @Override @SuppressWarnings("unchecked") - public List> getTaxaByNameForEditor(boolean doTaxa, boolean doSynonyms, boolean doNamesWithoutTaxa, String queryString, Classification classification, + public List> getTaxaByNameForEditor(boolean doTaxa, boolean doSynonyms, boolean doNamesWithoutTaxa, boolean doMisappliedNames, String queryString, Classification classification, MatchMode matchMode, Set namedAreas) { long zstVorher; long zstNachher; @@ -267,7 +267,7 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem return resultObjects; } } - Query query = prepareTaxaByNameForEditor(doTaxa, doSynonyms, "nameCache", queryString, classification, matchMode, namedAreas, doCount); + Query query = prepareTaxaByNameForEditor(doTaxa, doSynonyms, doMisappliedNames, "nameCache", queryString, classification, matchMode, namedAreas, doCount); if (query != null){ @@ -331,9 +331,9 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem * * */ - private Query prepareTaxaByNameForEditor(boolean doTaxa, boolean doSynonyms, String searchField, String queryString, Classification classification, + private Query prepareTaxaByNameForEditor(boolean doTaxa, boolean doSynonyms, boolean doMisappliedNames, String searchField, String queryString, Classification classification, MatchMode matchMode, Set namedAreas, boolean doCount) { - return prepareQuery(doTaxa, doSynonyms, false, searchField, queryString, + return prepareQuery(doTaxa, doSynonyms, doMisappliedNames, searchField, queryString, classification, matchMode, namedAreas, doCount, true); } @@ -2143,5 +2143,20 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem return result; } + @Override + public List> getTaxaByCommonNameForEditor( + String titleSearchStringSqlized, Classification classification, + MatchMode matchMode, Set namedAreas) { + List> result = new ArrayList>(); + List taxa = getTaxaByCommonName(titleSearchStringSqlized, classification, matchMode, namedAreas, null, null); + if (!taxa.isEmpty()){ + for (TaxonBase taxon:taxa){ + result.add(new UuidAndTitleCache(taxon.getUuid(), taxon.getTitleCache())); + } + } + + return result; + } + } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java index 46134035dc..9af67d712b 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java @@ -478,7 +478,7 @@ public interface ITaxonDao extends IIdentifiableDao, ITitledDao> getUuidAndTitleCacheSynonym(); - public List> getTaxaByNameForEditor(boolean doTaxa, boolean doSynonyms, boolean doNamesWithoutTaxa, String queryString, Classification classification, + public List> getTaxaByNameForEditor(boolean doTaxa, boolean doSynonyms, boolean doNamesWithoutTaxa, boolean doMisappliedNames, String queryString, Classification classification, MatchMode matchMode, Set namedAreas); public List taxaByNameNotInDB(List taxonNames); @@ -488,5 +488,9 @@ public interface ITaxonDao extends IIdentifiableDao, ITitledDao> getTaxaByCommonNameForEditor( + String titleSearchStringSqlized, Classification classification, + MatchMode matchMode, Set namedAreas); + } diff --git a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java index 0d4256076c..abc4549c49 100644 --- a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java +++ b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java @@ -328,34 +328,37 @@ public class TaxonDaoHibernateImplTest extends CdmTransactionalIntegrationTest { Reference sec = referenceDao.findById(1); assert sec != null : "sec must exist"; - List> results = taxonDao.getTaxaByNameForEditor(true, true, false,"Mand*", null, MatchMode.BEGINNING, null); + List> results = taxonDao.getTaxaByNameForEditor(true, true, false,false,"Mand*", null, MatchMode.BEGINNING, null); assertNotNull("getTaxaByName should return a List", results); //assertFalse("The list should not be empty", results.isEmpty()); assertTrue(results.size() == 5); - results = taxonDao.getTaxaByNameForEditor(true, true, false, "A*",null, MatchMode.BEGINNING, null); + results = taxonDao.getTaxaByNameForEditor(true, true, false, false,"A*",null, MatchMode.BEGINNING, null); assertNotNull("getTaxaByName should return a List", results); assertEquals(results.size(), 12); - results = taxonDao.getTaxaByNameForEditor(true, false,false, "A", null,MatchMode.BEGINNING, null); + results = taxonDao.getTaxaByNameForEditor(true, false,false, false,"A", null,MatchMode.BEGINNING, null); assertNotNull("getTaxaByName should return a List", results); assertTrue(results.size() == 9); assertEquals(results.get(0).getType(), Taxon.class); - results = taxonDao.getTaxaByNameForEditor(false, true,false, "A", null,MatchMode.BEGINNING, null); + results = taxonDao.getTaxaByNameForEditor(false, true,false,false, "A", null,MatchMode.BEGINNING, null); assertNotNull("getTaxaByName should return a List", results); assertTrue(results.size() == 3); assertEquals(results.get(0).getType(), Synonym.class); - results = taxonDao.getTaxaByNameForEditor(true, true,false,"Aus", null,MatchMode.EXACT, null); + results = taxonDao.getTaxaByNameForEditor(true, true,false,false,"Aus", null,MatchMode.EXACT, null); assertNotNull("getTaxaByName should return a List", results); assertEquals("Results list should contain one entity",1,results.size()); - results = taxonDao.getTaxaByNameForEditor(true, true,true,"A*", null,MatchMode.BEGINNING, null); + results = taxonDao.getTaxaByNameForEditor(true, true,true,false,"A*", null,MatchMode.BEGINNING, null); assertNotNull("getTaxaByName should return a List", results); assertEquals("Results list should contain one entity",15,results.size()); + + //TODO: test the search for misapplied names + } diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java index 6bea34b285..17b49c359d 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java @@ -137,6 +137,19 @@ public class AgentServiceImpl extends IdentifiableServiceBase referencingObjects = this.isDeletable(base, null); DeleteResult result = new DeleteResult(); if (referencingObjects.isEmpty()){ + if (base instanceof Team){ + Team baseTeam = (Team) base; + List members = baseTeam.getTeamMembers(); + List temp = new ArrayList(); + for (Person member:members){ + temp.add(member); + } + for (Person member: temp){ + members.remove(member); + } + } + saveOrUpdate(base); + dao.delete(base); }else{ diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java index d87d999b09..fad00ffca4 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java @@ -700,12 +700,22 @@ public class TaxonServiceImpl extends IdentifiableServiceBase> findTaxaAndNamesForEditor(IFindTaxaAndNamesConfigurator configurator){ - List> result = new ArrayList>(); + List> results = new ArrayList>(); - - result = dao.getTaxaByNameForEditor(configurator.isDoTaxa(), configurator.isDoSynonyms(), configurator.isDoNamesWithoutTaxa(), configurator.getTitleSearchStringSqlized(), configurator.getClassification(), configurator.getMatchMode(), configurator.getNamedAreas()); - return result; + if (configurator.isDoSynonyms() || configurator.isDoTaxa() || configurator.isDoNamesWithoutTaxa()){ + results = dao.getTaxaByNameForEditor(configurator.isDoTaxa(), configurator.isDoSynonyms(), configurator.isDoNamesWithoutTaxa(), configurator.isDoMisappliedNames(),configurator.getTitleSearchStringSqlized(), configurator.getClassification(), configurator.getMatchMode(), configurator.getNamedAreas()); + } + if (configurator.isDoTaxaByCommonNames()) { + + if(configurator.getPageSize() == null ){ + List> commonNameResults = dao.getTaxaByCommonNameForEditor(configurator.getTitleSearchStringSqlized(), configurator.getClassification(), configurator.getMatchMode(), configurator.getNamedAreas()); + if(commonNameResults != null){ + results.addAll(commonNameResults); + } + } + } + return results; } /* (non-Javadoc) diff --git a/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/ConcurrentSessionTest.java b/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/ConcurrentSessionTest.java index 755690bfd6..625eaad2cb 100644 --- a/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/ConcurrentSessionTest.java +++ b/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/ConcurrentSessionTest.java @@ -16,6 +16,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import java.util.Set; import java.util.UUID; import javax.sql.DataSource; @@ -48,6 +49,7 @@ import eu.etaxonomy.cdm.model.location.NamedArea; import eu.etaxonomy.cdm.model.name.BotanicalName; import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.reference.Reference; +import eu.etaxonomy.cdm.model.taxon.Synonym; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao; @@ -175,6 +177,7 @@ public class ConcurrentSessionTest extends CdmIntegrationTest { assertEquals("Both contexts should yield the same results(at least if " + "there where no write operations in between)", context1Count, context2Count); + } /** @@ -217,6 +220,37 @@ public class ConcurrentSessionTest extends CdmIntegrationTest { assertEquals("The objects should be equal", taxonBase1, taxonBase2); assertNotSame("The objects should not be the same", taxonBase1, taxonBase2); } + + /** + * Getting the same taxon from two different sessions using the taxon service. + * However, the resulting objects should be equal but not be the same. + */ + @Test + @DataSet("ConcurrentSessionTest.xml") + public void testTwoSessionsRemoveTaxonBaseTaxonService(){ + conversationHolder1 = new ConversationHolder(targetDataSource, sessionFactory, transactionManager); + conversationHolder2 = new ConversationHolder(targetDataSource, sessionFactory, transactionManager); + + conversationHolder1.bind(); + TaxonBase taxonBase1 = taxonService.find(taxonUuid1); + TaxonNameBase name = taxonBase1.getName(); + Synonym syn = Synonym.NewInstance(name, null); + taxonService.save(syn); + conversationHolder1.commit(); + Set taxonBases = taxonBase1.getName().getTaxonBases(); + name.removeTaxonBase(syn); + taxonService.saveOrUpdate(taxonBase1); + conversationHolder1.commit(); + conversationHolder2.bind(); + conversationHolder2.startTransaction(); + + + TaxonBase taxonBase2 = taxonService.find(taxonUuid1); + taxonBases = taxonBase2.getName().getTaxonBases(); + + assertEquals("There should be only one taxon left", taxonBases.size(), 1); + assertNotSame("The objects should not be the same", taxonBase1, taxonBase2); + } /** * Interveaving conversations to test session within and outside conversations. -- 2.34.1