fix #9433 titleCache generation for misapplications only adapted (use sensu, not...
authorAndreas Müller <a.mueller@bgbm.org>
Fri, 14 May 2021 10:48:39 +0000 (12:48 +0200)
committerAndreas Müller <a.mueller@bgbm.org>
Fri, 14 May 2021 10:48:39 +0000 (12:48 +0200)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/Taxon.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/taxon/TaxonBaseDefaultCacheStrategy.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/taxon/TaxonBaseDefaultCacheStrategyTest.java

index a9d940393d0314177bbab183020df8d9ec383849..9878778c30aa54df7e4271c029b965266d4db012 100644 (file)
@@ -997,6 +997,18 @@ public class Taxon
         }
     }
 
+    public boolean isMisapplicationOnly() {
+        if (!getTaxonNodes().isEmpty()){
+            return false;
+        }
+        int nMan = computeMisapliedNameRelations();
+        if (nMan > 0 && nMan == this.relationsFromThisTaxon.size() + this.relationsToThisTaxon.size()){
+            return true;
+        }else{
+            return false;
+        }
+    }
+
     /**
      * Returns the boolean value indicating whether <i>this</i> taxon is a misapplication
      * (misapplied name) for at least one other taxon.
index 460aab70a51e22fc14e6c2fbd97da79ecb545d20..c62ba599ce0a2519df8261ff98acddde4514c338 100644 (file)
@@ -19,6 +19,7 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.name.TaxonName;
 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.strategy.StrategyBase;
 import eu.etaxonomy.cdm.strategy.cache.HTMLTagRules;
@@ -73,7 +74,7 @@ public class TaxonBaseDefaultCacheStrategy<T extends TaxonBase>
         }
 
         boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
-        String secSeparator =  (isSynonym? " syn." : "") + " sec. ";
+        String secSeparator =  isMisapplication(taxonBase)? " sensu " : (isSynonym? " syn." : "") + " sec. ";
         //not used: we currently use a post-separator in the name tags
 //                if (nameTags.get(nameTags.size() - 1).getType().equals(TagEnum.nomStatus)){
 //                    secSeparator = "," + secSeparator;
@@ -91,6 +92,14 @@ public class TaxonBaseDefaultCacheStrategy<T extends TaxonBase>
         return tags;
     }
 
+    private boolean isMisapplication(T taxonBase) {
+        if (! taxonBase.isInstanceOf(Taxon.class)){
+            return false;
+        }else{
+            return CdmBase.deproxy(taxonBase, Taxon.class).isMisapplicationOnly();
+        }
+    }
+
     private List<TaggedText> getNameTags(T taxonBase) {
         List<TaggedText> tags = new ArrayList<>();
         TaxonName name = CdmBase.deproxy(taxonBase.getName());
index 75ec51759f03b70e621b67f9e426ef93c100cb5c..0dbfabedba756a39ff17abe02c90b7707fd4b884 100644 (file)
@@ -27,9 +27,13 @@ import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
 import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
 import eu.etaxonomy.cdm.model.reference.ReferenceType;
+import eu.etaxonomy.cdm.model.taxon.Classification;
 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.model.taxon.TaxonNode;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
 import eu.etaxonomy.cdm.strategy.parser.TimePeriodParser;
 import eu.etaxonomy.cdm.test.TermTestBase;
@@ -216,4 +220,37 @@ public class TaxonBaseDefaultCacheStrategyTest extends TermTestBase {
         Assert.assertEquals("Abies alba (L.) Mill. sec. MLW 1983", taxonBase.getTitleCache());
 
     }
+
+    @Test
+    public void testMisapplication(){
+        //assert default (taxon without relation)
+        Taxon man = Taxon.NewInstance(name, sec);
+        ITaxonCacheStrategy<Taxon> cacheStrategy = man.getCacheStrategy();
+        assertEquals("Taxon titlecache must use sec", expectedNameTitleCache + " sec. Sp.Pl.", cacheStrategy.getTitleCache(man));
+
+        //make it a MAN only
+        Taxon mainTaxon = Taxon.NewInstance(TaxonNameFactory.NewBacterialInstance(Rank.SPECIES()), ReferenceFactory.newBook() );
+        mainTaxon.addMisappliedName(man, null, null);
+        assertEquals("Taxon titlecache must use sensu", expectedNameTitleCache + " sensu Sp.Pl.", cacheStrategy.getTitleCache(man));
+
+        //add another from relation
+        Taxon relatedTaxon = Taxon.NewInstance(TaxonNameFactory.NewBacterialInstance(Rank.SPECIES()), ReferenceFactory.newBook() );
+        TaxonRelationship rel = man.addTaxonRelation(relatedTaxon, TaxonRelationshipType.CONGRUENT_TO(), null, null);
+        assertEquals("Taxon titlecache must use sec", expectedNameTitleCache + " sec. Sp.Pl.", cacheStrategy.getTitleCache(man));
+        man.removeTaxonRelation(rel);
+        assertEquals("Taxon titlecache must use sensu", expectedNameTitleCache + " sensu Sp.Pl.", cacheStrategy.getTitleCache(man));
+
+        //add another to relation
+        rel = relatedTaxon.addTaxonRelation(man, TaxonRelationshipType.CONGRUENT_TO(), null, null);
+        assertEquals("Taxon titlecache must use sec", expectedNameTitleCache + " sec. Sp.Pl.", cacheStrategy.getTitleCache(man));
+        man.removeTaxonRelation(rel);
+        assertEquals("Taxon titlecache must use sensu", expectedNameTitleCache + " sensu Sp.Pl.", cacheStrategy.getTitleCache(man));
+
+        //add taxon node
+        Classification c = Classification.NewInstance("Test");
+        TaxonNode tn = c.addChildTaxon(man, null);
+        assertEquals("Taxon titlecache must use sec", expectedNameTitleCache + " sec. Sp.Pl.", cacheStrategy.getTitleCache(man));
+        man.removeTaxonNode(tn);
+        assertEquals("Taxon titlecache must use sensu", expectedNameTitleCache + " sensu Sp.Pl.", cacheStrategy.getTitleCache(man));
+    }
 }
\ No newline at end of file