ref #10137: only derived unit associated to the taxon should be collected in rootUnit...
authorKatja Luther <k.luther@bgbm.org>
Tue, 27 Sep 2022 10:39:49 +0000 (12:39 +0200)
committerKatja Luther <k.luther@bgbm.org>
Tue, 27 Sep 2022 10:39:49 +0000 (12:39 +0200)
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/OccurrenceController.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/dto/DNASampleDTO.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/dto/DerivationTreeSummaryDTO.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/dto/DerivedUnitDTO.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/dto/FieldUnitDTO.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/dto/SpecimenOrObservationBaseDTO.java

index 435e7ece867899de9f9cb48c50c11ae6cc89d522..3fe3715390f54b8e218b00a3b02bd3e11f488197 100644 (file)
@@ -55,13 +55,14 @@ public class OccurrenceController extends AbstractIdentifiableController<Specime
     });
 
     public static final List<String> DERIVED_UNIT_INIT_STRATEGY =  Arrays.asList(new String []{
-            "derivedFrom.derivatives",
-            "derivedFrom.originals",
+            "derivedFrom.derivatives.*",
+            "derivedFrom.originals.*",
             "specimenTypeDesignations.*",
             "specimenTypeDesignations.designationSource.citation.*",
             "specimenTypeDesignations.homotypicalGroup.*",
             "specimenTypeDesignations.typifiedNames",
-            "collection.$"
+            "collection.$",
+            "derivationEvents.derivatives.*"
     });
 
     private static final List<String> EXTENSIONS_INIT_STRATEGY =  Arrays.asList(new String []{
index 0cb4d25d2657efbf0f578bf8ef184488d4e2d93a..5f94ad9239ce1afcd7f3422d5330e33d1201c412 100644 (file)
@@ -549,12 +549,19 @@ public class OccurrenceServiceImpl
                     DerivedUnitDTO derivativeDTO;
                     if (!alreadyCollectedUnits.containsKey(unit.getUuid())){
                         DerivedUnit derivedUnit = (DerivedUnit)unit;
-                        derivativeDTO = (DerivedUnitDTO) SpecimenOrObservationDTOFactory.fromEntity(derivedUnit, null);
-                        if (unit instanceof DnaSample) {
-                            derivativeDTO = DNASampleDTO.fromEntity((DnaSample)unit);
-                        } else {
-                            derivativeDTO = DerivedUnitDTO.fromEntity(derivedUnit, null, null);
+                        boolean isAssociated = true;
+                        for (DeterminationEvent determination:derivedUnit.getDeterminations()) {
+                               if (determination.getTaxonName().equals(taxon.getName()) || determination.getTaxon().equals(taxon)){
+                                       isAssociated = true;
+                                       break;
+                               }else {
+                                       isAssociated = false;
+                               }
                         }
+                        if (!isAssociated) {
+                               continue;
+                        }
+                        derivativeDTO = (DerivedUnitDTO) SpecimenOrObservationDTOFactory.fromEntity(derivedUnit, null);
                         alreadyCollectedUnits.put(derivativeDTO.getUuid(), derivativeDTO);
                         derivativeDTO.addAllDerivatives(getDerivedUnitDTOsFor(derivativeDTO, derivedUnit, alreadyCollectedUnits));
                     }
index 3e56a346d513707f550e0cdf3cb513250e127030..ce35dcc01a7ee62b6f13451884845e18018837ac 100755 (executable)
@@ -51,6 +51,7 @@ public class DNASampleDTO extends DerivedUnitDTO{
         this.setSequences(seqDtos);
         this.amplificationResults = dnaSample.getAmplificationResults();
         this.dnaQuality = HibernateProxyHelper.deproxy(dnaSample.getDnaQuality(), DnaQuality.class);
+        this.setHasDna(true);
     }
 
 
index 3abea6e6ee71837e171e751c3fc44be6a07d3f4e..34e7a56931760c49c1f622f199e1fca1c37cc37a 100644 (file)
@@ -151,6 +151,94 @@ public class DerivationTreeSummaryDTO implements Serializable {
         }
         return derivateDataDTO;
     }
+    
+//    private void updateDerivateTree(Set<DerivedUnitDTO> derivatives) {
+//      for (DerivedUnitDTO childDerivate : derivatives) {
+//              DerivationTreeSummaryDTO childTree = childDerivate.getDerivationTreeSummary();
+//              for (Link link:childTree.detailImages) {
+//                      this.addDetailImage(null, null);
+//              }
+//      }
+//              
+//             // assemble molecular data
+//             //pattern: DNAMarker [contig1, primer1_1, primer1_2, ...][contig2, primer2_1, ...]...
+//             if (childDerivate instanceof DNASampleDTO) {
+//              DNASampleDTO dna = (DNASampleDTO)childDerivate;
+//                 if (childDerivate.getRecordBase() == SpecimenOrObservationType.TissueSample) {
+//                     // TODO implement TissueSample assembly for web service
+//                 }
+//                 if (childDerivate.getRecordBase() == SpecimenOrObservationType.DnaSample) {
+//                     
+//                     for (SequenceDTO sequence : dna.getSequences()) {
+//                         URI boldUri = null;
+//                         try {
+//                             boldUri = sequence.getBoldUri();
+//                         } catch (URISyntaxException e1) {
+//                             // TODO consider better reporting of this incident
+//                             logger.error("Could not create BOLD URI", e1);
+//                         }
+//                         final String dnaMarker = sequence.getDnaMarker();
+//                         Link providerLink = null;
+//                         if(boldUri!=null && dnaMarker!=null){
+//                             providerLink = new DerivationTreeSummaryDTO.Link(boldUri, dnaMarker);
+//                         }
+//                         MolecularData molecularData = this.addProviderLink(providerLink);
+//
+//                         //contig file
+//                         ContigFile contigFile = null;
+//                         if (sequence.getContigFile() != null) {
+//                             MediaRepresentationPart contigMediaRepresentationPart = MediaUtils.getFirstMediaRepresentationPart(sequence.getContigFile());
+//                             if (contigMediaRepresentationPart != null) {
+//                                 contigFile = molecularData.addContigFile(new Link(contigMediaRepresentationPart.getUri(), "contig"));
+//                             }
+//                         }
+//                         else{
+//                             contigFile = molecularData.addContigFile(null);
+//                         }
+//                         // primer files
+//                         if (sequence.getSingleReadAlignments() != null) {
+//                             int readCount = 1;
+//                             for (SingleReadAlignment singleRead : sequence.getSingleReadAlignments()) {
+//                                 MediaRepresentationPart pherogramMediaRepresentationPart = MediaUtils.getFirstMediaRepresentationPart(singleRead.getSingleRead().getPherogram());
+//                                 if (pherogramMediaRepresentationPart != null && contigFile != null) {
+//                                     contigFile.addPrimerLink(pherogramMediaRepresentationPart.getUri(), "read"+readCount++);
+//                                 }
+//                             }
+//                         }
+//                     }
+//                 }
+//             }
+//             // assemble media data
+//             else if (childDerivate.hasDetailImage) {
+//                 
+//                
+//                     // specimen scan
+//                     if (childDerivate.getKindOfUnit().getUuid().equals(DefinedTerm.uuidSpecimenScan)) {
+//                         this.addSpecimenScanUuid(childDerivate.get);
+//                         String imageLinkText = "scan of " + specimenIdentifier;
+//                         if(CdmUtils.isNotBlank(mediaSpecimen.getMostSignificantIdentifier())) {
+//                             imageLinkText = mediaSpecimen.getMostSignificantIdentifier();
+//                         }
+//                         if(CdmUtils.isNotBlank(mediaSpecimen.getMediaSpecimen().getTitleCache())) {
+//                             imageLinkText += " (" + mediaSpecimen.getMediaSpecimen().getTitleCache() + ")";
+//                         }
+//                         this.addSpecimenScan(mediaUri, imageLinkText.trim());
+//                     }
+//                     // detail image
+//                     else if (mediaSpecimen.getKindOfUnit().getUuid().equals(DefinedTerm.uuidDetailImage)) {
+//                         derivateDataDTO.addDetailImageUuid(mediaSpecimen.getMediaSpecimen().getUuid());
+//                         String motif = "detail image";
+//                         if (mediaSpecimen.getMediaSpecimen()!=null){
+//                             if(CdmUtils.isNotBlank(mediaSpecimen.getMediaSpecimen().getTitleCache())) {
+//                                 motif = mediaSpecimen.getMediaSpecimen().getTitleCache();
+//                             }
+//                         }
+//                         derivateDataDTO.addDetailImage(mediaUri, motif);
+//                     }
+//                 }
+//             }
+//         }
+//    }
 
     @Deprecated
     private static URI getMediaUri(MediaSpecimen mediaSpecimen) {
index 1c7ed06244a6032658100f2b6435636ea1a5314c..59464165c944735c26bb6d869b37324f669c9c75 100644 (file)
@@ -224,6 +224,7 @@ public class DerivedUnitDTO extends SpecimenOrObservationBaseDTO{
                    this.status.add(dto);
                }
         }
+        this.setDerivationTreeSummary(DerivationTreeSummaryDTO.fromEntity(derivedUnit, this.getSpecimenShortTitle()));
         
         
         if(derivedUnit.getStoredUnder() != null) {
@@ -382,7 +383,14 @@ public class DerivedUnitDTO extends SpecimenOrObservationBaseDTO{
        }
 
        @Override
-    protected void updateTreeDependantData() {
+    protected void updateTreeDependantData(Set<DerivedUnitDTO> derivatives) {
+               for (DerivedUnitDTO derivative: derivatives) {
+                       this.setHasDna(this.isHasDna() || derivative.isHasDna());
+                       this.setHasDetailImage(this.isHasDetailImage() || derivative.isHasDetailImage());
+                       this.setHasSpecimenScan(isHasSpecimenScan()|| derivative.isHasSpecimenScan());
+                       this.setHasCharacterData(isHasCharacterData()||derivative.isHasCharacterData());
+               }
+               
         // TODO DerivationTreeSummaryDTO should be updated here once it is refactored so that it can operate on dtos
     }
 }
\ No newline at end of file
index 0842798d867ab0468ee54c5847a6b38298f00f6d..7a25223f838e3e744004b4a26281226789dd842b 100644 (file)
@@ -14,6 +14,7 @@ import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.joda.time.Partial;
@@ -155,10 +156,16 @@ public class FieldUnitDTO extends SpecimenOrObservationBaseDTO {
     }
 
     @Override
-    public void updateTreeDependantData() {
+    public void updateTreeDependantData(Set<DerivedUnitDTO> derivatives) {
         TreeLabels treeLabels = assembleLablesFromTree(true, true);
         setSummaryLabel(treeLabels.summaryLabel);
         setCollectionStatistics(treeLabels.collectionsStatistics);
+        for (DerivedUnitDTO derivative: derivatives) {
+                       this.setHasDna(this.isHasDna() || derivative.isHasDna());
+                       this.setHasDetailImage(this.isHasDetailImage() || derivative.isHasDetailImage());
+                       this.setHasSpecimenScan(isHasSpecimenScan()|| derivative.isHasSpecimenScan());
+                       this.setHasCharacterData(isHasCharacterData()||derivative.isHasCharacterData());
+               }
     }
 
     /**
index abb6d2c2a6848dc28f93538f895f021620669de2..77ccdd711f5afdddf9272ad236377fadcd4829ad 100644 (file)
@@ -269,7 +269,7 @@ public abstract class SpecimenOrObservationBaseDTO extends TypedEntityReference<
 
     public void setDerivatives(Set<DerivedUnitDTO> derivatives) {
         this.derivatives = derivatives;
-        updateTreeDependantData();
+        updateTreeDependantData(derivatives);
     }
 
     public void addDerivative(DerivedUnitDTO derivate){
@@ -277,14 +277,16 @@ public abstract class SpecimenOrObservationBaseDTO extends TypedEntityReference<
             this.derivatives = new HashSet<>();
         }
         this.derivatives.add(derivate);
-        updateTreeDependantData();
+        Set<DerivedUnitDTO> derivatives = new HashSet<>();
+        derivatives.add(derivate);
+        updateTreeDependantData(derivatives);
     }
     public void addAllDerivatives(Set<DerivedUnitDTO> derivatives){
         if (this.derivatives == null){
             this.derivatives = new HashSet<>();
         }
         this.derivatives.addAll(derivatives);
-        updateTreeDependantData();
+        updateTreeDependantData(derivatives);
     }
     
     
@@ -293,7 +295,7 @@ public abstract class SpecimenOrObservationBaseDTO extends TypedEntityReference<
      * To be overwritten by implementing classes to
      * update data which depends on the derivation tree
      */
-    protected abstract void updateTreeDependantData();
+    protected abstract void updateTreeDependantData(Set<DerivedUnitDTO> derivatives) ;
 
     /**
      * Recursively collects all derivatives from this.
@@ -387,8 +389,10 @@ public abstract class SpecimenOrObservationBaseDTO extends TypedEntityReference<
             }
 
             if (doDescend && (includeTypes == null || includeTypes.contains(derivedUnit.getRecordBasis()))) {
-                DerivedUnitDTO derivedUnitDTO = DerivedUnitDTO.fromEntity(derivedUnit, nextLevelMaxDepth, includeTypes);
-                derivateDTOs.add(derivedUnitDTO);
+                SpecimenOrObservationBaseDTO derivedUnitDTO = SpecimenOrObservationDTOFactory.fromEntity(derivedUnit, nextLevelMaxDepth);
+                if (derivedUnitDTO instanceof DerivedUnitDTO) {
+                       derivateDTOs.add((DerivedUnitDTO)derivedUnitDTO);
+                }
                 setHasCharacterData(isHasCharacterData() || derivedUnitDTO.isHasCharacterData());
                 // NOTE! the flags setHasDetailImage, setHasDna, setHasSpecimenScan are also set in
                 // setDerivateDataDTO(), see below