From: Andreas Müller Date: Tue, 29 Sep 2009 14:16:58 +0000 (+0000) Subject: Agent cache strategies X-Git-Tag: 3.0.3~1716 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/commitdiff_plain/518d05906576a9bf1b254df09710527b5475a8dd Agent cache strategies --- diff --git a/.gitattributes b/.gitattributes index 0f6c6a4ca9..e1a84c9dab 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1679,6 +1679,8 @@ cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/taxon/TaxonComparatorTest.java cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/taxon/TaxonNodeTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/taxon/TaxonTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/taxon/TaxonomicTreeTest.java -text +cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/PersonDefaultCacheStrategyTest.java -text +cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategyTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/name/BotanicNameCacheStrategyTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/name/NonViralNameDefaultCacheStrategyTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/name/ZoologicalNameCacheStrategyTest.java -text diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Team.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Team.java index aad7eef1a0..92c2bcfc16 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Team.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Team.java @@ -33,6 +33,7 @@ import org.hibernate.envers.Audited; import org.hibernate.search.annotations.Indexed; import org.springframework.beans.factory.annotation.Configurable; +import eu.etaxonomy.cdm.common.CdmUtils; import eu.etaxonomy.cdm.strategy.cache.agent.TeamDefaultCacheStrategy; import eu.etaxonomy.cdm.strategy.match.IMatchable; import eu.etaxonomy.cdm.strategy.match.MatchMode; @@ -193,6 +194,9 @@ public class Team extends TeamOrPersonBase { } if (nomenclaturalTitle == null){ this.nomenclaturalTitle = cacheStrategy.getNomenclaturalTitle(this); + }else{ + //as long as team members to not inform the team about changes the cache must be created new each time + nomenclaturalTitle = cacheStrategy.getNomenclaturalTitle(this); } return nomenclaturalTitle; } @@ -221,4 +225,22 @@ public class Team extends TeamOrPersonBase { this.nomenclaturalTitle = nomenclaturalTitle; this.protectedNomenclaturalTitleCache = protectedNomenclaturalTitleCache; } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.model.agent.TeamOrPersonBase#getTitleCache() + */ + @Override + public String getTitleCache() { + isGeneratingTitleCache = true; + String result = ""; + if (isProtectedTitleCache()){ + result = this.titleCache; + }else{ + result = generateTitle(); + result = replaceEmptyTitleByNomTitle(result); + result = getTruncatedCache(result); + } + isGeneratingTitleCache = false; + return result; + } } \ No newline at end of file diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/TeamOrPersonBase.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/TeamOrPersonBase.java index f4a009094e..88fba1dce3 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/TeamOrPersonBase.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/TeamOrPersonBase.java @@ -22,6 +22,7 @@ import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.Indexed; +import eu.etaxonomy.cdm.common.CdmUtils; import eu.etaxonomy.cdm.strategy.cache.agent.INomenclaturalAuthorCacheStrategy; import eu.etaxonomy.cdm.strategy.match.IMatchable; @@ -49,6 +50,10 @@ public abstract class TeamOrPersonBase> extends Ag @Field(index=Index.TOKENIZED) protected String nomenclaturalTitle; + @Transient + @XmlTransient + protected boolean isGeneratingTitleCache = false; + /** * Returns the identification string (nomenclatural abbreviation) used in * nomenclature for this {@link Person person} or this {@link Team team}. @@ -56,7 +61,11 @@ public abstract class TeamOrPersonBase> extends Ag * @see INomenclaturalAuthor#getNomenclaturalTitle() */ public String getNomenclaturalTitle() { - return nomenclaturalTitle; + String result = nomenclaturalTitle; + if (CdmUtils.isEmpty(nomenclaturalTitle) && (isGeneratingTitleCache == false)){ + result = getTitleCache(); + } + return result; } /** @@ -65,4 +74,32 @@ public abstract class TeamOrPersonBase> extends Ag public void setNomenclaturalTitle(String nomenclaturalTitle) { this.nomenclaturalTitle = nomenclaturalTitle; } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.model.common.IdentifiableEntity#getTitleCache() + */ + @Override + public String getTitleCache() { + isGeneratingTitleCache = true; + String result = super.getTitleCache(); + result = replaceEmptyTitleByNomTitle(result); + isGeneratingTitleCache = false; + return result; + } + + /** + * @param result + * @return + */ + protected String replaceEmptyTitleByNomTitle(String result) { + if (CdmUtils.isEmpty(result)){ + result = nomenclaturalTitle; + } + if (CdmUtils.isEmpty(result)){ + result = super.getTitleCache(); + } + return result; + } + + } diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableEntity.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableEntity.java index 295585239d..748aa2fcda 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableEntity.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableEntity.java @@ -180,7 +180,8 @@ public abstract class IdentifiableEntity { + @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(PersonDefaultCacheStrategy.class); final static UUID uuid = UUID.fromString("9abda0e1-d5cc-480f-be38-40a510a3f253"); @@ -49,16 +51,33 @@ public class PersonDefaultCacheStrategy extends StrategyBase implements * @see eu.etaxonomy.cdm.strategy.INomenclaturalAuthorCacheStrategy#getTitleCache(eu.etaxonomy.cdm.model.name.TaxonNameBase) */ public String getTitleCache(Person person) { - if (! (person.getLastname() == null) && ! (person.getLastname().trim().equals("")) ){ - String result = ""; - if (person.getFirstname() != null){ - result += person.getFirstname() + " "; - } - result += person.getLastname(); + String result = ""; + if (CdmUtils.isNotEmpty(person.getLastname() ) ){ + result = person.getLastname(); + result = addFirstNamePrefixSuffix(result, person); return result; }else{ - return person.getNomenclaturalTitle(); + result = person.getNomenclaturalTitle(); + if (CdmUtils.isNotEmpty(result)){ + return result; + } + addFirstNamePrefixSuffix("", person); + if (CdmUtils.isNotEmpty(result)){ + return result; + } } + return person.toString(); + } + + /** + * + */ + private String addFirstNamePrefixSuffix(String oldString, Person person) { + String result = oldString; + result = CdmUtils.concat(" ", person.getFirstname(),result); + result = CdmUtils.concat(" ", person.getPrefix(),result); + result = CdmUtils.concat(" ", result, person.getSuffix()); + return result; } } diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategy.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategy.java index 70fe9300a9..16559c3d0e 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategy.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategy.java @@ -17,10 +17,14 @@ import eu.etaxonomy.cdm.strategy.StrategyBase; * */ public class TeamDefaultCacheStrategy extends StrategyBase implements INomenclaturalAuthorCacheStrategy { + private static final long serialVersionUID = 8375295443642690479L; + @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(TeamDefaultCacheStrategy.class); final static UUID uuid = UUID.fromString("1cbda0d1-d5cc-480f-bf38-40a510a3f223"); + public static final String EMPTY_TEAM = "-empty team-"; + static public TeamDefaultCacheStrategy NewInstance(){ return new TeamDefaultCacheStrategy(); } @@ -49,8 +53,10 @@ public class TeamDefaultCacheStrategy extends StrategyBase implements INomenclat for (Person teamMember : teamMembers){ result += teamMember.getNomenclaturalTitle() + " & "; } - if (teamMembers.size() > 1){ + if (teamMembers.size() > 0){ result = result.substring(0, result.length() - 3); + }else{ + result = getTitleCache(team); } return result; } @@ -65,8 +71,10 @@ public class TeamDefaultCacheStrategy extends StrategyBase implements INomenclat for (Person teamMember : teamMembers){ result += teamMember.getTitleCache() + " & "; } - if (teamMembers.size() > 1){ + if (teamMembers.size() > 0){ result = result.substring(0, result.length() - 3); + }else{ + result = EMPTY_TEAM; } return result; } diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/PersonDefaultCacheStrategyTest.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/PersonDefaultCacheStrategyTest.java new file mode 100644 index 0000000000..684ec06bba --- /dev/null +++ b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/PersonDefaultCacheStrategyTest.java @@ -0,0 +1,128 @@ +// $Id$ +/** +* Copyright (C) 2007 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.cdm.strategy.cache.agent; + + +import static org.junit.Assert.assertNotNull; +import junit.framework.Assert; + +import org.apache.log4j.Logger; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import eu.etaxonomy.cdm.common.CdmUtils; +import eu.etaxonomy.cdm.model.agent.Person; + +/** + * @author a.mueller + * @created 29.09.2009 + * @version 1.0 + */ +public class PersonDefaultCacheStrategyTest { + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(PersonDefaultCacheStrategyTest.class); + + private static Person person1; + private static Person person2; + private static Person person3; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + } + + /** + * @throws java.lang.Exception + */ + @AfterClass + public static void tearDownAfterClass() throws Exception { + + + } + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + person1 = Person.NewInstance(); + + person1.setFirstname("P1FN"); + person1.setLastname("P1LN"); + person1.setPrefix("Dr1."); + person1.setSuffix("Suff1"); + + person2 = Person.NewInstance(); + person2.setNomenclaturalTitle("P2NomT"); + person2.setLastname("P2LN"); + person2.setFirstname("P2FN"); + person2.setSuffix("P2Suff"); + + person3 = Person.NewInstance(); //empty person + + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + +//**************************************** TESTS ************************************** + + /** + * Test method for {@link eu.etaxonomy.cdm.strategy.cache.agent.PersonDefaultCacheStrategy#NewInstance()}. + */ + @Test + public final void testNewInstance() { + PersonDefaultCacheStrategy cacheStrategy = PersonDefaultCacheStrategy.NewInstance(); + assertNotNull(cacheStrategy); + } + + @Test + public final void testGetNomenclaturalTitleCache(){ + Assert.assertNotNull("person1 nomenclatural title must not to be null", person1.getNomenclaturalTitle()); + Assert.assertEquals("Person1 nomenclatural title should be created by elements", "Dr1. P1FN P1LN Suff1", person1.getNomenclaturalTitle()); + person1.setSuffix(null); + Assert.assertEquals("Person1 title should be Dr1. P1FN P1LN", "Dr1. P1FN P1LN", person1.getNomenclaturalTitle()); + //peson2 + Assert.assertEquals("Person2 title should be P2NomT", "P2NomT", person2.getNomenclaturalTitle()); + //person3 + Assert.assertNotNull("person3 nomenclatural title must not to be null", person3.getNomenclaturalTitle()); + Assert.assertTrue("Person3 nomenclatural title must not be empty", CdmUtils.isNotEmpty(person3.getNomenclaturalTitle())); + //don't take to serious, may be also something different, but not empty + Assert.assertEquals("Person3 title should start with Person#0", "Person#0", person3.getNomenclaturalTitle().substring(0, 8)); + } + + + @Test + public final void testGetTitleCache(){ + Assert.assertNotNull("person1 title cache must not to be null", person1.getTitleCache()); + Assert.assertEquals("Person1 title cache should be created by elements", "Dr1. P1FN P1LN Suff1", person1.getTitleCache()); + person1.setSuffix(null); + Assert.assertEquals("Person1 title cache should be Dr1. P1FN P1LN", "Dr1. P1FN P1LN", person1.getTitleCache()); + //peson2 + Assert.assertEquals("Person2 title cache should be P2NomT", "P2FN P2LN P2Suff", person2.getTitleCache()); + //person3 + Assert.assertNotNull("person3 title cache must not to be null", person3.getTitleCache()); + Assert.assertTrue("Person3 title cache must not be empty", CdmUtils.isNotEmpty(person3.getTitleCache())); + //don't take to serious, may be also something different, but not empty + Assert.assertEquals("Person3 title cache should start with Person#0", "Person#0", person3.getTitleCache().substring(0, 8)); + } + + +} diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategyTest.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategyTest.java new file mode 100644 index 0000000000..52d79714e6 --- /dev/null +++ b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/TeamDefaultCacheStrategyTest.java @@ -0,0 +1,150 @@ +// $Id$ +/** +* Copyright (C) 2007 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.cdm.strategy.cache.agent; + + +import static org.junit.Assert.assertNotNull; +import junit.framework.Assert; + +import org.apache.log4j.Logger; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import eu.etaxonomy.cdm.common.CdmUtils; +import eu.etaxonomy.cdm.model.agent.Person; +import eu.etaxonomy.cdm.model.agent.Team; + +/** + * @author a.mueller + * @created 29.09.2009 + * @version 1.0 + */ +public class TeamDefaultCacheStrategyTest { + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(TeamDefaultCacheStrategyTest.class); + + private static Team team1; + private static Team team2; + private static Team team3; + + private static Person person1; + private static Person person2; + private static Person person3; + private static Person person4; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + } + + /** + * @throws java.lang.Exception + */ + @AfterClass + public static void tearDownAfterClass() throws Exception { + + + } + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + team1 = Team.NewInstance(); + team2 = Team.NewInstance(); + team3 = Team.NewInstance(); //empty team + + person1 = Person.NewInstance(); + + person1.setFirstname("P1FN"); + person1.setLastname("P1LN"); + person1.setPrefix("Dr1."); + person1.setSuffix("Suff1"); + + person2 = Person.NewInstance(); + person2.setNomenclaturalTitle("P2NomT"); + person2.setLastname("P2LN"); + person2.setFirstname("P2FN"); + person2.setSuffix("P2Suff"); + + person3 = Person.NewInstance(); + person3.setNomenclaturalTitle("P3NomT"); + + + person4 = Person.NewInstance(); //empty person + + team1.addTeamMember(person1); + team2.addTeamMember(person2); + team2.addTeamMember(person1); + team2.addTeamMember(person3); + + + + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + +//**************************************** TESTS ************************************** + + /** + * Test method for {@link eu.etaxonomy.cdm.strategy.cache.agent.PersonDefaultCacheStrategy#NewInstance()}. + */ + @Test + public final void testNewInstance() { + TeamDefaultCacheStrategy cacheStrategy = TeamDefaultCacheStrategy.NewInstance(); + assertNotNull(cacheStrategy); + } + + @Test + public final void testGetNomenclaturalTitleCache(){ + Assert.assertNotNull("team1 nomenclatural title must not to be null", team1.getNomenclaturalTitle()); + Assert.assertEquals("team1 nomenclatural title should be created by elements", "Dr1. P1FN P1LN Suff1", team1.getNomenclaturalTitle()); + person1.setSuffix(null); + Assert.assertEquals("team1 nomenclatural title should be Dr1. P1FN P1LN", "Dr1. P1FN P1LN", team1.getNomenclaturalTitle()); + //peson2 + Assert.assertEquals("team2 nomenclatural title should be 'P2NomT & Dr1. P1FN P1LN & P3NomT'", "P2NomT & Dr1. P1FN P1LN & P3NomT", team2.getNomenclaturalTitle()); + //person3 + Assert.assertNotNull("team3 nomenclatural title must not to be null", team3.getNomenclaturalTitle()); + Assert.assertTrue("team3 nomenclatural title must not be empty", CdmUtils.isNotEmpty(team3.getNomenclaturalTitle())); + //don't take to serious, may be also something different, but not empty + Assert.assertEquals("team3 nomenclatural title should be empty team replacement string", TeamDefaultCacheStrategy.EMPTY_TEAM, team3.getNomenclaturalTitle()); + } + + + @Test + public final void testGetTitleCache(){ + Assert.assertNotNull("team1 title cache must not to be null", team1.getTitleCache()); + Assert.assertEquals("team1 title cache should be created by elements", "Dr1. P1FN P1LN Suff1", team1.getTitleCache()); + person1.setSuffix(null); + Assert.assertEquals("team1 title cache should be Dr1. P1FN P1LN", "Dr1. P1FN P1LN", team1.getTitleCache()); + //peson2 + Assert.assertEquals("team2 title cache should be 'P2FN P2LN P2Suff & Dr1. P1FN P1LN & P3NomT'", "P2FN P2LN P2Suff & Dr1. P1FN P1LN & P3NomT", team2.getTitleCache()); + //person3 + Assert.assertNotNull("team3 title cache must not to be null", team3.getTitleCache()); + Assert.assertTrue("team3 title cache must not be empty", CdmUtils.isNotEmpty(team3.getTitleCache())); + //don't take to serious, may be also something different, but not empty + Assert.assertEquals("team3 title cache should should be empty team replacement string", TeamDefaultCacheStrategy.EMPTY_TEAM, team3.getTitleCache()); + + } + + +}