ref #7666 adding NARROW NO-BREAK after doubtful marker
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / format / taxon / TaxonRelationshipFormatter.java
index 0f8dcd9c89e7b71fa4b5d2535d0ae144d9418308..e9d6f11e579e8e6f2b92187f2212fb53ef0138ef 100644 (file)
@@ -28,6 +28,8 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.cdm.ref.TypedEntityReference;
 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;
 
 /**
  * @author a.mueller
@@ -41,7 +43,7 @@ public class TaxonRelationshipFormatter {
     private static final String SYN_SEC = ", syn. sec. ";
     private static final String UNKNOWN_SEC = "???";
     private static final String NON_SEPARATOR = ", non ";
-    private static final String QUOTE_START = " \"";   //TODO
+    private static final String QUOTE_START = "\"";   //TODO
     private static final String QUOTE_END = "\"";   //TODO
     private static final String AUCT = "auct.";
     private static final String SENSU_SEPARATOR = " sensu ";
@@ -57,88 +59,89 @@ public class TaxonRelationshipFormatter {
         }
 
         TaxonRelationshipType type = taxonRelationship.getType();
-        boolean isMisapplied = type == null ? false : type.isAnyMisappliedName() && reverse;
+        boolean isMisapplied = type == null ? false : type.isMisappliedNameOrInvalidDesignation() && reverse;
         boolean isSynonym = type == null? false : type.isAnySynonym();
 
+
         Taxon relatedTaxon = reverse? taxonRelationship.getFromTaxon()
                 : taxonRelationship.getToTaxon();
 
         if (relatedTaxon == null){
             return null;
         }
+
+        String doubtfulTaxonStr = relatedTaxon.isDoubtful() ? "?\u202F" : "";
+        String doubtfulRelationStr = taxonRelationship.isDoubtful() ? "?" : "";
+
+
         TaxonName name = relatedTaxon.getName();
 
-        List<TaggedText> tags = new ArrayList<>();
+        TaggedTextBuilder builder = new TaggedTextBuilder();
 
         //rel symbol
-        String symbol = getSymbol(type, reverse, languages);
-        tags.add(TaggedText.NewInstance(TagEnum.symbol, symbol));
+        String symbol = doubtfulRelationStr + getSymbol(type, reverse, languages);
+        builder.add(TagEnum.symbol, symbol);
 
         //name
         if (isMisapplied){
             //starting quote
-            String startQuote = QUOTE_START;
-            tags.add(TaggedText.NewSeparatorInstance(startQuote));
+            String startQuote = " " + doubtfulTaxonStr + QUOTE_START;
+            builder.addSeparator(startQuote);
 
             //name cache
             List<TaggedText> nameCacheTags = getNameCacheTags(name);
-            tags.addAll(nameCacheTags);
+            builder.addAll(nameCacheTags);
 
             //end quote
             String endQuote = QUOTE_END;
-            tags.add(TaggedText.NewInstance(TagEnum.postSeparator, endQuote));
+            builder.add(TagEnum.postSeparator, endQuote);
         }else{
-            tags.add(TaggedText.NewWhitespaceInstance());
-            //name title cache
-            //TODO fullTitle?
+            builder.addSeparator(" " + doubtfulTaxonStr);
+            //name full title cache
             List<TaggedText> nameCacheTags = getNameTitleCacheTags(name);
-            tags.addAll(nameCacheTags);
+            builder.addAll(nameCacheTags);
         }
 
 
-        //sensu (+ Separatoren?)
+        //sec/sensu (+ Separatoren?)
         if (isNotBlank(relatedTaxon.getAppendedPhrase())){
-            tags.add(TaggedText.NewWhitespaceInstance());
-            tags.add(TaggedText.NewInstance(TagEnum.appendedPhrase, relatedTaxon.getAppendedPhrase()));
+            builder.addWhitespace();
+            builder.add(TagEnum.appendedPhrase, relatedTaxon.getAppendedPhrase());
         }
-        List<TaggedText> secTags = getSensuTags(relatedTaxon.getSec(), relatedTaxon.getSecMicroReference(), isMisapplied);
+        List<TaggedText> secTags = getSensuTags(relatedTaxon.getSec(), relatedTaxon.getSecMicroReference(),
+               /* isMisapplied,*/ false);
         if (!secTags.isEmpty()) {
-            tags.add(TaggedText.NewSeparatorInstance(isMisapplied? SENSU_SEPARATOR : SEC_SEPARATOR));
-            tags.addAll(secTags);
+            builder.addSeparator(isMisapplied? SENSU_SEPARATOR : SEC_SEPARATOR);
+            builder.addAll(secTags);
         }else if (isBlank(relatedTaxon.getAppendedPhrase())) {
             if (isMisapplied){
-                tags.add(TaggedText.NewWhitespaceInstance());
+                builder.addWhitespace();
                 //TODO type unclear sensuReference(?)
-                tags.add(TaggedText.NewInstance(TagEnum.authors, AUCT));
+                builder.add(TagEnum.appendedPhrase, AUCT);
             }else{
-                tags.add(TaggedText.NewSeparatorInstance(SEC_SEPARATOR + UNKNOWN_SEC));
+                builder.addSeparator(SEC_SEPARATOR + UNKNOWN_SEC);
             }
         }
 
 //        //, non author
         if (isMisapplied && name != null){
-            if (name.getCombinationAuthorship() != null){
-                tags.add(TaggedText.NewSeparatorInstance(NON_SEPARATOR));
-                //TODO add nom. ref. author tags
-            }else if (isNotBlank(name.getAuthorshipCache())){
-                tags.add(TaggedText.NewSeparatorInstance(NON_SEPARATOR));
-                tags.add(TaggedText.NewInstance(TagEnum.authors, name.getAuthorshipCache().trim()));
+            if (isNotBlank(name.getAuthorshipCache())){
+                builder.addSeparator(NON_SEPARATOR);
+                builder.add(TagEnum.authors, name.getAuthorshipCache().trim());
             }
         }
 
-        //TODO tagEnum for relSec?
-        List<TaggedText> relSecTags = getSensuTags /*getCitationTags*/(taxonRelationship.getCitation(),
-                taxonRelationship.getCitationMicroReference(), false);
+        List<TaggedText> relSecTags = getSensuTags(taxonRelationship.getCitation(),
+                taxonRelationship.getCitationMicroReference(),true);
         if (!relSecTags.isEmpty()){
-            TaggedText relSecSeparatorToag = TaggedText.NewSeparatorInstance(isSynonym ? SYN_SEC : isMisapplied ? ERR_SEC : REL_SEC);
-            tags.add(relSecSeparatorToag);
-            tags.addAll(relSecTags);
+            builder.addSeparator(isSynonym ? SYN_SEC : isMisapplied ? ERR_SEC : REL_SEC);
+            builder.addAll(relSecTags);
         }
 
-        return tags;
+        return builder.getTaggedText();
     }
 
-    private List<TaggedText> getSensuTags(Reference ref, String detail, boolean isSensu) {
+    private List<TaggedText> getSensuTags(Reference ref, String detail, /*boolean isSensu,*/ boolean isRelation) {
         List<TaggedText> result = new ArrayList<>();
         String secRef;
 
@@ -164,15 +167,14 @@ public class TaxonRelationshipFormatter {
             }else{
                 secRef = ref.getTitleCache();
             }
-            TagEnum secType = isSensu? TagEnum.sensuReference : TagEnum.secReference;
+            TagEnum secType = /*isSensu? TagEnum.sensuReference : */ isRelation? TagEnum.relSecReference : TagEnum.secReference;
             TaggedText refTag = TaggedText.NewInstance(secType, secRef);
-            refTag.setEntityReference(new TypedEntityReference<>(CdmBase.deproxy(ref.getClass()), ref.getUuid(), secRef));
+            refTag.setEntityReference(new TypedEntityReference<>(CdmBase.deproxy(ref).getClass(), ref.getUuid()));
             result.add(refTag);
         }
         if (isNotBlank(detail)){
             result.add(TaggedText.NewSeparatorInstance(DETAIL_SEPARATOR));
-            //TODO do we need a sensu micro reference??
-            TagEnum detailType = isSensu? TagEnum.sensuMicroReference : TagEnum.secMicroReference;
+            TagEnum detailType = /*isSensu? TagEnum.sensuMicroReference : */ isRelation? TagEnum.relSecMicroReference :TagEnum.secMicroReference;
             TaggedText microTag = TaggedText.NewInstance(detailType, detail);
             result.add(microTag);
         }
@@ -197,13 +199,13 @@ public class TaxonRelationshipFormatter {
             }
             for (Person member : team.getTeamMembers()){
                 String name = isNotBlank(member.getFamilyName())? member.getFamilyName(): member.getTitleCache();
-                String separator = index < n ? ", " : " & ";
+                String separator = index < n ? TeamDefaultCacheStrategy.STD_TEAM_CONCATINATION : TeamDefaultCacheStrategy.FINAL_TEAM_CONCATINATION;
                 result = CdmUtils.concat(separator, result, name);
                 index++;
             }
             if (team.isHasMoreMembers()){
                 //TODO or et al.???
-                result += " & al.";
+                result += TeamDefaultCacheStrategy.ET_AL_TEAM_CONCATINATION_FULL + "al.";
             }
             return result;
         }