ref #9811 adding classification uuids to TaxonRelationshipsDTO
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / dto / RegistrationDTO.java
index bf3d77ffa55bdaf8c319b229f7d3007912a66e3a..c247b616d39786eb067c34cce0c5eef960fdba2f 100644 (file)
@@ -22,22 +22,29 @@ import org.apache.log4j.Logger;
 import org.joda.time.DateTime;
 
 import eu.etaxonomy.cdm.api.service.exception.RegistrationValidationException;
+import eu.etaxonomy.cdm.api.service.name.TypeDesignationDTO;
+import eu.etaxonomy.cdm.api.service.name.TypeDesignationSetFormatter;
 import eu.etaxonomy.cdm.api.service.name.TypeDesignationSetManager;
-import eu.etaxonomy.cdm.api.service.name.TypeDesignationSetManager.TypeDesignationWorkingSet;
+import eu.etaxonomy.cdm.api.service.name.TypeDesignationWorkingSet;
+import eu.etaxonomy.cdm.format.reference.NomenclaturalSourceFormatter;
 import eu.etaxonomy.cdm.model.common.VerbatimTimePeriod;
+import eu.etaxonomy.cdm.model.common.VersionableEntity;
 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
 import eu.etaxonomy.cdm.model.name.Registration;
 import eu.etaxonomy.cdm.model.name.RegistrationStatus;
 import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
+import eu.etaxonomy.cdm.model.reference.NamedSourceBase;
 import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.reference.ReferenceType;
 import eu.etaxonomy.cdm.ref.EntityReference;
 import eu.etaxonomy.cdm.ref.TypedEntityReference;
 import eu.etaxonomy.cdm.strategy.cache.TagEnum;
+import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper;
 import eu.etaxonomy.cdm.strategy.cache.TaggedText;
 
-public class RegistrationDTO{
+public class RegistrationDTO {
 
     private static final Logger logger = Logger.getLogger(RegistrationDTO.class);
 
@@ -63,10 +70,15 @@ public class RegistrationDTO{
 
     private List<TaggedText> summaryTaggedText;
 
+    private String nomenclaturalCitationString;
+
+    private String bibliographicCitationString;
+
+    private String bibliographicInRefCitationString;
 
     /**
      * @param reg
-     * @param typifiedName should be provided in for Registrations for TypeDesignations
+     * @param typifiedName should be provided for registrations for TypeDesignations
      * @throws RegistrationValidationException
      */
     public RegistrationDTO(Registration reg) {
@@ -79,21 +91,15 @@ public class RegistrationDTO{
              submitterUserName = reg.getSubmitter().getUsername();
          }
 
-        if(hasName(reg)){
-            citation = reg.getName().getNomenclaturalReference();
-            citationDetail = reg.getName().getNomenclaturalMicroReference();
-            name = new EntityReference(reg.getName().getUuid(), reg.getName().getTitleCache());
-        }
-        if(hasTypifications(reg)){
-            if(!reg.getTypeDesignations().isEmpty()){
-                for(TypeDesignationBase td : reg.getTypeDesignations()){
-                    if(citation == null) {
-                        citation = td.getCitation();
-                        citationDetail = td.getCitationMicroReference();
-                    }
-                }
-            }
+         if(hasName(reg)){
+             name = new EntityReference(reg.getName().getUuid(), reg.getName().getTitleCache());
+         }
+        NamedSourceBase publishedUnit = findPublishedUnit(reg);
+        if(publishedUnit != null) {
+            citation = publishedUnit.getCitation();
+            citationDetail = publishedUnit.getCitationMicroReference();
         }
+
         switch(registrationType) {
         case EMPTY:
             summary = "BLANK REGISTRATION";
@@ -108,17 +114,16 @@ public class RegistrationDTO{
         default:
             try {
                 typeDesignationManager = new TypeDesignationSetManager(reg.getTypeDesignations());
-                summary = typeDesignationManager.print();
-                summaryTaggedText = typeDesignationManager.toTaggedText();
+                summaryTaggedText = new TypeDesignationSetFormatter(false, true, true).toTaggedText(typeDesignationManager);
+                summary = TaggedCacheHelper.createString(summaryTaggedText);
             } catch (RegistrationValidationException e) {
                 validationProblems.add("Validation errors: " + e.getMessage());
             }
             break;
         }
 
-        // trigger initialization of the reference
-        getNomenclaturalCitationString();
-
+        makeBibliographicCitationStrings();
+        makeNomenclaturalCitationString();
     }
 
     /**
@@ -134,25 +139,34 @@ public class RegistrationDTO{
         citation = publication;
         // create a TypeDesignationSetManager with only a reference to the typifiedName for validation
         typeDesignationManager = new TypeDesignationSetManager(typifiedName);
+        makeBibliographicCitationStrings();
+        makeNomenclaturalCitationString();
     }
 
-    /**
-     * @param reg
-     * @return
-     */
-    private boolean hasTypifications(Registration reg) {
+    public static NamedSourceBase findPublishedUnit(Registration reg) {
+        NamedSourceBase publishedUnit = null;
+        if(hasName(reg)){
+            publishedUnit = reg.getName().getNomenclaturalSource();
+        } else if(hasTypifications(reg)){
+            if(!reg.getTypeDesignations().isEmpty()){
+                for(TypeDesignationBase<?> td : reg.getTypeDesignations()){
+                    if(td.getDesignationSource() != null) {
+                        publishedUnit = td.getDesignationSource();
+                    }
+                }
+            }
+        }
+        return publishedUnit;
+    }
+
+    private static boolean hasTypifications(Registration reg) {
         return reg.getTypeDesignations() != null && reg.getTypeDesignations().size() > 0;
     }
 
-    /**
-     * @param reg
-     * @return
-     */
-    private boolean hasName(Registration reg) {
+    private static boolean hasName(Registration reg) {
         return reg.getName() != null;
     }
 
-
     /**
      * Provides access to the Registration entity this DTO has been build from.
      * This method is purposely not a getter to hide the original Registration
@@ -164,17 +178,10 @@ public class RegistrationDTO{
         return reg;
     }
 
-
-    /**
-     * @return the summary
-     */
     public String getSummary() {
         return summary;
     }
 
-    /**
-     * @return the summary
-     */
     public List<TaggedText> getSummaryTaggedText() {
         return summaryTaggedText;
     }
@@ -183,56 +190,38 @@ public class RegistrationDTO{
         return submitterUserName;
     }
 
-    /**
-     * @return the registrationType
-     */
     public RegistrationType getRegistrationType() {
         return registrationType;
     }
 
-    /**
-     * @return the status
-     */
     public RegistrationStatus getStatus() {
         return reg.getStatus();
     }
 
-    /**
-     * @return the identifier
-     */
     public String getIdentifier() {
         return reg.getIdentifier();
     }
 
-
     public UUID getUuid() {
         return reg.getUuid();
     }
 
-    /**
-     * @return the specificIdentifier
-     */
     public String getSpecificIdentifier() {
         return reg.getSpecificIdentifier();
     }
 
-    /**
-     * @return the registrationDate
-     */
     public DateTime getRegistrationDate() {
         return reg.getRegistrationDate();
     }
 
-    /**
-     * @return the registrationDate
-     */
+    public String getInstitutionTitleCache(){
+        return reg.getInstitution() != null ? reg.getInstitution().getName() : null;
+    }
+
     public VerbatimTimePeriod getDatePublished() {
         return citation == null ? null : citation.getDatePublished();
     }
 
-    /**
-     * @return the created
-     */
     public DateTime getCreated() {
         return reg.getCreated();
     }
@@ -247,18 +236,19 @@ public class RegistrationDTO{
         } else {
             throw new Exception("Can not set the citation on a non emtpy RegistrationDTO");
         }
+        makeBibliographicCitationStrings();
+        makeNomenclaturalCitationString();
     }
 
-
     public UUID getCitationUuid() {
         return citation == null ? null : citation.getUuid();
     }
 
     public EntityReference getTypifiedNameRef() {
-        return typeDesignationManager != null ? typeDesignationManager.getTypifiedNameRef() : null;
+        return typeDesignationManager != null ? typeDesignationManager.getTypifiedNameAsEntityRef() : null;
     }
 
-    public TaxonName getTypifiedName() {
+    public TaxonName typifiedName() {
         return typeDesignationManager != null ? typeDesignationManager.getTypifiedName() : null;
     }
 
@@ -266,25 +256,18 @@ public class RegistrationDTO{
         return name;
     }
 
-    public LinkedHashMap<TypedEntityReference, TypeDesignationWorkingSet> getOrderdTypeDesignationWorkingSets() {
-        return typeDesignationManager != null ? typeDesignationManager.getOrderdTypeDesignationWorkingSets() : null;
+    public LinkedHashMap<TypedEntityReference<? extends VersionableEntity>, TypeDesignationWorkingSet> getOrderedTypeDesignationWorkingSets() {
+        return typeDesignationManager != null ? typeDesignationManager.getOrderedTypeDesignationWorkingSets() : null;
     }
 
-    /**
-     * @param baseEntityReference
-     */
     public TypeDesignationWorkingSet getTypeDesignationWorkingSet(TypedEntityReference baseEntityReference) {
-        return typeDesignationManager != null ? typeDesignationManager.getOrderdTypeDesignationWorkingSets().get(baseEntityReference) : null;
-
+        return typeDesignationManager != null ? typeDesignationManager.getOrderedTypeDesignationWorkingSets().get(baseEntityReference) : null;
     }
 
-    /**
-     * @param baseEntityReference
-     */
     public Set<TypeDesignationBase> getTypeDesignationsInWorkingSet(TypedEntityReference baseEntityReference) {
         Set<TypeDesignationBase> typeDesignations = new HashSet<>();
         TypeDesignationWorkingSet workingSet = getTypeDesignationWorkingSet(baseEntityReference);
-        for(EntityReference ref :  workingSet.getTypeDesignations()){
+        for(TypeDesignationDTO ref :  workingSet.getTypeDesignations()){
             typeDesignations.add(findTypeDesignation(ref));
         }
         return typeDesignations;
@@ -293,7 +276,7 @@ public class RegistrationDTO{
     public NameTypeDesignation getNameTypeDesignation(TypedEntityReference baseEntityReference) {
         Set<TypeDesignationBase> typeDesignations = getTypeDesignationsInWorkingSet(baseEntityReference);
         if(typeDesignations.size() == 1){
-            TypeDesignationBase item = typeDesignations.iterator().next();
+            TypeDesignationBase<?> item = typeDesignations.iterator().next();
             return (NameTypeDesignation)item ;
         }
         if(typeDesignations.size() == 0){
@@ -305,51 +288,91 @@ public class RegistrationDTO{
         return null;
     }
 
-    /**
-     * @param ref
-     * @return
-     */
-    private TypeDesignationBase findTypeDesignation(EntityReference ref) {
-        return typeDesignationManager != null ? typeDesignationManager.findTypeDesignation(ref) : null;
+    private TypeDesignationBase<?> findTypeDesignation(TypeDesignationDTO ref) {
+        return typeDesignationManager != null ? typeDesignationManager.findTypeDesignation(ref.getUuid()) : null;
     }
 
-    public Collection<TypeDesignationBase> typeDesignations() {
+    public Collection<TypeDesignationBase<?>> typeDesignations() {
         return typeDesignationManager != null ? typeDesignationManager.getTypeDesignations() : null;
     }
 
-    /**
-     * @return the citationString
-     */
-    public String getNomenclaturalCitationString() {
+    private void makeNomenclaturalCitationString() {
         if(citation == null){
-            return null;
-        }
-        if(INomenclaturalReference.class.isAssignableFrom(citation.getClass())){
-            return ((INomenclaturalReference)citation).getNomenclaturalCitation(citationDetail);
+            nomenclaturalCitationString = null;
         } else {
-            logger.error("The citation is not a NomenclaturalReference");
-            return citation.generateTitle();
+            if(INomenclaturalReference.class.isAssignableFrom(citation.getClass())){
+                nomenclaturalCitationString = NomenclaturalSourceFormatter.INSTANCE().format(citation, citationDetail);
+            } else {
+                logger.error("The citation is not a NomenclaturalReference");
+                nomenclaturalCitationString = citation.generateTitle();
+            }
         }
     }
 
-    /**
-     * @return the citationString
-     */
-    public String getBibliographicCitationString() {
+    private void makeBibliographicCitationStrings() {
         if(citation == null){
-            return null;
+            bibliographicCitationString = null;
         } else {
+            Reference bibliographicCitation;
+            String bibliographicCitationDetail = citationDetail;
+            if((citation.getType() == ReferenceType.Section || citation.getType() == ReferenceType.BookSection) && citation.getInReference() != null){
+                bibliographicCitation = citation.getInReference();
+                bibliographicCitationDetail = null; // can possibly be known once https://dev.e-taxonomy.eu/redmine/issues/6623 is solved
+            } else {
+                bibliographicCitation = citation;
+            }
+            if(StringUtils.isNotEmpty(bibliographicCitationDetail)){
+                // TODO see https://dev.e-taxonomy.eu/redmine/issues/6623
+                bibliographicInRefCitationString = bibliographicCitation.generateTitle().replaceAll("\\.$", "") + (StringUtils.isNotEmpty(bibliographicCitationDetail) ? ": " + bibliographicCitationDetail : "");
+            } else {
+                bibliographicInRefCitationString = bibliographicCitation.generateTitle();
+            }
             if(StringUtils.isNotEmpty(citationDetail)){
                 // TODO see https://dev.e-taxonomy.eu/redmine/issues/6623
-                return citation.generateTitle().replaceAll("\\.$", "") + (StringUtils.isNotEmpty(citationDetail) ? ": " + citationDetail : "");
+                bibliographicCitationString = citation.generateTitle().replaceAll("\\.$", "") + (StringUtils.isNotEmpty(citationDetail) ? ": " + citationDetail : "");
             } else {
-                return citation.generateTitle();
-
+                bibliographicCitationString = citation.generateTitle();
             }
-
         }
     }
 
+    /**
+     * The nomenclatural citation is always the nomenclaturalCitation of the reference which is directly
+     * associated with the registration.
+     * <p>
+     * <b>Note:</b>Compare with {@link #getBibliographicCitationString()}
+     *
+     * @return the nomenclaturalCitationString
+     */
+    public String getNomenclaturalCitationString() {
+        return nomenclaturalCitationString;
+    }
+
+    /**
+     * The bibliographic in-reference citation is either taken from the reference which is directly
+     * associated with the registration. In case this reference is a {@link eu.etaxonomy.cdm.model.reference.ReferenceType#Section} or
+     * {@link eu.etaxonomy.cdm.model.reference.ReferenceType#BookSection} the inReference will be taken instead.
+     * <p>
+     * <b>Note:</b>Compare with {@link #getBibliographicCitationString()}
+     *
+     * @return the bibliographicInRefCitationString
+     */
+    public String getBibliographicInRefCitationString() {
+       return bibliographicInRefCitationString;
+    }
+
+    /**
+     * The bibliographic citation is either reference which is directly
+     * associated with the registration.
+     * <p>
+     * <b>Note:</b>Compare with {@link #getBibliographicInRefCitationString()}
+     *
+     * @return the bibliographicCitationString
+     */
+    public String getBibliographicCitationString() {
+        return bibliographicCitationString;
+    }
+
     public boolean isBlocked() {
         return reg.getBlockedBy() != null && !reg.getBlockedBy().isEmpty();
     }
@@ -370,18 +393,11 @@ public class RegistrationDTO{
         return blockedBy;
     }
 
-    /**
-     * @return
-     */
     public List<String> getValidationProblems() {
         return validationProblems;
     }
 
-    /**
-     * @return
-     */
     public boolean isPersisted() {
         return reg.isPersited();
     }
-
 }
\ No newline at end of file