ref #10336, #10222: allow defining the authors et al. position
authorAndreas Müller <a.mueller@bgbm.org>
Sun, 28 May 2023 13:24:07 +0000 (15:24 +0200)
committerAndreas Müller <a.mueller@bgbm.org>
Sun, 28 May 2023 13:24:07 +0000 (15:24 +0200)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/name/INameCacheStrategy.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/name/TaxonNameDefaultCacheStrategy.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/name/TaxonNameDefaultCacheStrategyTest.java
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/name/TestingBotanicalNameCacheStrategy.java
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/name/TestingZoologicalNameCacheStrategy.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonPortalController.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/portal/PortalDtoLoader.java

index 67ffe5ebdf770a929e12dc841d9c135994b6c806..dbd22e1d3e47553f6841bd2e002fc450e16e92ab 100644 (file)
@@ -115,5 +115,15 @@ public interface INameCacheStrategy extends IIdentifiableEntityCacheStrategy<Tax
     public String getAuthorshipCache(TaxonName nonViralName);
 
 
+    /**
+     * If a name has more authors then this position
+     * add "& al." instead at the given author position.
+     */
+    public Integer getEtAlPosition();
+    /**
+     * @see #getEtAlPosition()
+     * @param etAlPosition
+     */
+    public void setEtAlPosition(Integer etAlPosition);
 
 }
index 77ca70d37b1f5bf180284735a5f5d05229d9cb50..089674c17016297cab5e6e55988717295b382917 100644 (file)
@@ -19,7 +19,9 @@ import org.apache.logging.log4j.Logger;
 
 import eu.etaxonomy.cdm.common.CdmUtils;
 import eu.etaxonomy.cdm.common.UTF8;
-import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;
+import eu.etaxonomy.cdm.model.agent.Team;
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
+import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.name.HybridRelationship;
 import eu.etaxonomy.cdm.model.name.INonViralName;
 import eu.etaxonomy.cdm.model.name.Rank;
@@ -27,6 +29,7 @@ import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.strategy.cache.TagEnum;
 import eu.etaxonomy.cdm.strategy.cache.TaggedText;
 import eu.etaxonomy.cdm.strategy.cache.TaggedTextBuilder;
+import eu.etaxonomy.cdm.strategy.cache.agent.TeamDefaultCacheStrategy;
 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
 import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImplRegExBase;
 
@@ -56,6 +59,7 @@ public class TaxonNameDefaultCacheStrategy
     private CharSequence basionymAuthorCombinationAuthorSeperator = " ";
 
     private String zooAuthorYearSeperator = ", ";
+    private Integer etAlPosition;
 
     private String cultivarStart = "'";
     private String cultivarEnd = "'";
@@ -79,6 +83,16 @@ public class TaxonNameDefaultCacheStrategy
 
 /* **************** GETTER / SETTER **************************************/
 
+    @Override
+    public Integer getEtAlPosition() {
+        return etAlPosition;
+    }
+
+    @Override
+    public void setEtAlPosition(Integer etAlPosition) {
+        this.etAlPosition = etAlPosition;
+    }
+
     /**
      * String that separates the NameCache part from the AuthorCache part
      * @return
@@ -168,10 +182,10 @@ public class TaxonNameDefaultCacheStrategy
             return this.getZoologicalNonCacheAuthorshipCache(nonViralName);
         }else{
             String result = "";
-            INomenclaturalAuthor combinationAuthor = nonViralName.getCombinationAuthorship();
-            INomenclaturalAuthor exCombinationAuthor = nonViralName.getExCombinationAuthorship();
-            INomenclaturalAuthor basionymAuthor = nonViralName.getBasionymAuthorship();
-            INomenclaturalAuthor exBasionymAuthor = nonViralName.getExBasionymAuthorship();
+            TeamOrPersonBase<?> combinationAuthor = nonViralName.getCombinationAuthorship();
+            TeamOrPersonBase<?> exCombinationAuthor = nonViralName.getExCombinationAuthorship();
+            TeamOrPersonBase<?> basionymAuthor = nonViralName.getBasionymAuthorship();
+            TeamOrPersonBase<?> exBasionymAuthor = nonViralName.getExBasionymAuthorship();
             if (isCultivar(nonViralName) ){
                 exCombinationAuthor = null;
                 basionymAuthor = null;
@@ -204,10 +218,10 @@ public class TaxonNameDefaultCacheStrategy
             return null;
         }
         String result = "";
-        INomenclaturalAuthor combinationAuthor = nonViralName.getCombinationAuthorship();
-        INomenclaturalAuthor exCombinationAuthor = nonViralName.getExCombinationAuthorship();
-        INomenclaturalAuthor basionymAuthor = nonViralName.getBasionymAuthorship();
-        INomenclaturalAuthor exBasionymAuthor = nonViralName.getExBasionymAuthorship();
+        TeamOrPersonBase<?> combinationAuthor = nonViralName.getCombinationAuthorship();
+        TeamOrPersonBase<?> exCombinationAuthor = nonViralName.getExCombinationAuthorship();
+        TeamOrPersonBase<?> basionymAuthor = nonViralName.getBasionymAuthorship();
+        TeamOrPersonBase<?> exBasionymAuthor = nonViralName.getExBasionymAuthorship();
         Integer publicationYear = nonViralName.getPublicationYear();
         Integer originalPublicationYear = nonViralName.getOriginalPublicationYear();
 
@@ -239,7 +253,7 @@ public class TaxonNameDefaultCacheStrategy
      * The correct order is exAuthor ex author though some botanist do not know about and do it the
      * other way round. (see 46.4-46.6 ICBN (Vienna Code, 2006))
      */
-    protected String getAuthorAndExAuthor(INomenclaturalAuthor author, INomenclaturalAuthor exAuthor){
+    protected String getAuthorAndExAuthor(TeamOrPersonBase<?> author, TeamOrPersonBase<?> exAuthor){
         String authorString = "";
         String exAuthorString = "";
         if (author != null){
@@ -253,8 +267,14 @@ public class TaxonNameDefaultCacheStrategy
         return result;
     }
 
-    private String getNomAuthorTitle(INomenclaturalAuthor author) {
-        return CdmUtils.Nz(author.getNomenclaturalTitleCache());
+    private String getNomAuthorTitle(TeamOrPersonBase<?>  author) {
+        if (!author.isInstanceOf(Team.class) || this.getEtAlPosition() == null || this.getEtAlPosition() < 2) {
+            return CdmUtils.Nz(author.getNomenclaturalTitleCache());
+        }else {
+            Team team = CdmBase.deproxy(author, Team.class);
+            TeamDefaultCacheStrategy formatter = TeamDefaultCacheStrategy.NewInstanceNomEtAl(this.getEtAlPosition());
+            return formatter.getNomenclaturalTitleCache(team);
+        }
     }
 
     /**
index bc44ee7ebe7f9a5ee04d5b84377460469288f403..e1ad635bf3b89e94d5c4f58245b7b9ba9da6a7ac 100644 (file)
@@ -829,4 +829,33 @@ public class TaxonNameDefaultCacheStrategyTest extends NameCacheStrategyTestBase
         String expected = String.format("Ophrys %skastelli E. Klein nothosubsp. kastelli", UTF8.HYBRID.toString());
         Assert.assertEquals("", expected, name.getTitleCache());
     }
+
+    @Test
+    public void testEtAlAuthors() {
+        TaxonName name = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
+        name.setGenusOrUninomial("Ophrys");
+        name.setSpecificEpithet("kastelli");
+        Team combTeam = Team.NewInstance();
+        combTeam.addTeamMember(Person.NewInstance("Mill.", "Miller", "A.", null));
+        combTeam.addTeamMember(Person.NewInstance("Ball.", "Baller", "B.", null));
+        combTeam.addTeamMember(Person.NewInstance("Cill.", "Ciller", "C.", null));
+        name.setCombinationAuthorship(combTeam);
+
+        INameCacheStrategy formatter = name.cacheStrategy();
+        Assert.assertEquals("", "Ophrys kastelli Mill., Ball. & Cill.", formatter.getTitleCache(name));
+        formatter.setEtAlPosition(3);
+        Assert.assertEquals("", "Ophrys kastelli Mill., Ball. & Cill.", formatter.getTitleCache(name));
+        formatter.setEtAlPosition(2);
+        Assert.assertEquals("", "Ophrys kastelli Mill. & al.", formatter.getTitleCache(name));
+        //null and <2 are handled as "no position defined"
+        formatter.setEtAlPosition(1);
+        Assert.assertEquals("", "Ophrys kastelli Mill., Ball. & Cill.", formatter.getTitleCache(name));
+        formatter.setEtAlPosition(null);
+        Assert.assertEquals("", "Ophrys kastelli Mill., Ball. & Cill.", formatter.getTitleCache(name));
+
+        name.setBasionymAuthorship(combTeam);
+        formatter.setEtAlPosition(2);
+        Assert.assertEquals("", "Ophrys kastelli (Mill. & al.) Mill. & al.", formatter.getTitleCache(name));
+
+    }
 }
\ No newline at end of file
index add27505be844e9f72e167e4b84cc405bbc285cb..4ea73620b1f74dffb42e5ebcac00094bced83135 100644 (file)
@@ -87,4 +87,15 @@ public class TestingBotanicalNameCacheStrategy implements INonViralNameCacheStra
         return null;
     }
 
+    @Override
+    public Integer getEtAlPosition() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void setEtAlPosition(Integer etAlPosition) {
+        // TODO Auto-generated method stub
+    }
+
 }
index 07ab28b1e81b4db613b1de49fbde0ac20106bd09..9e78effc818fe43105f7c4ecc99587ff3c2f1af6 100644 (file)
@@ -88,4 +88,15 @@ public class TestingZoologicalNameCacheStrategy implements INonViralNameCacheStr
         return null;
     }
 
+    @Override
+    public Integer getEtAlPosition() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void setEtAlPosition(Integer etAlPosition) {
+        // TODO Auto-generated method stub
+    }
+
 }
index 001b9610156fb6ee7c1d4fa9dc0a2d46f6d17b49..9f9f48b96429965c1e197f04baf5a26ebf4cf9bd 100644 (file)
@@ -320,7 +320,7 @@ public class TaxonPortalController extends TaxonController{
             @RequestParam(value = "featureTree", required = false) UUID featureTreeUuid,
             @RequestParam(value = "nameRelationsDirect", required = false) Set<UUID> directNameRelations,
             @RequestParam(value = "nameRelationsInverse", required = false) Set<UUID> inverseNameRelations,
-            @RequestParam(value = "etAlPos", required = false) Integer etAlPosition,
+            @RequestParam(value = "etAlPos", required = false, defaultValue = "2") Integer etAlPosition,
 
             //distributionInfoConfig
             @RequestParam(value = "part", required = false)  Set<InfoPart> partSet,
index 83d27c64101adf4e37aa49568496aeeafd5efcdd..91731b955e0ab7f9b9e4e5be187bd79aea25f409 100644 (file)
@@ -140,6 +140,7 @@ import eu.etaxonomy.cdm.model.term.TermNode;
 import eu.etaxonomy.cdm.model.term.TermTree;
 import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper;
 import eu.etaxonomy.cdm.strategy.cache.TaggedText;
+import eu.etaxonomy.cdm.strategy.cache.name.INameCacheStrategy;
 import eu.etaxonomy.cdm.strategy.cache.taxon.TaxonBaseDefaultCacheStrategy;
 
 /**
@@ -202,14 +203,17 @@ public class PortalDtoLoader {
         TaxonNameDto nameDto = taxonDto.new TaxonNameDto();
         loadBaseData(name, nameDto);
 
+        INameCacheStrategy formatter = name.cacheStrategy();
+        formatter.setEtAlPosition(config.getEtAlPosition());
+
         taxonDto.setName(nameDto);
-        taxonDto.setNameLabel(name.getTitleCache());
+        taxonDto.setNameLabel(formatter.getTitleCache(name));
         handleRelatedNames(name, taxonDto, config);
         loadProtologues(name, taxonDto);
         taxonDto.setNameUuid(name.getUuid());
         taxonDto.setNameType(name.getNameType().toString());
         loadNameFacts(name, taxonDto, config, pageDto);
-        nameDto.setTaggedName(name.getTaggedFullTitle());
+        nameDto.setTaggedName(formatter.getTaggedFullTitle(name));
     }
 
     private List<TaggedText> getTaggedTaxon(TaxonBase<?> taxon, TaxonPageDtoConfiguration config) {