Extend media gathering for taxon specimens
authorPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 2 Oct 2015 13:18:44 +0000 (15:18 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 2 Oct 2015 13:19:48 +0000 (15:19 +0200)
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IOccurrenceService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java

index 04779e42cb5f33288a7d0092698b762929476478..97281663bc68547848c8179349b50f1703c1ba08 100644 (file)
@@ -48,6 +48,7 @@ import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;\r
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;\r
+import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
@@ -111,6 +112,17 @@ public interface IOccurrenceService extends IIdentifiableEntityService<SpecimenO
      */\r
     public Pager<Media> getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths);\r
 \r
+    /**\r
+     * Returns all media attached to this occurence and its children. Also takes\r
+     * {@link MediaSpecimen} and molecular images into account.\r
+     *\r
+     * @param occurence the occurence and its children from which the media to get\r
+     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+     * @param propertyPaths properties to initialize - see {@link IBeanInitializer#initialize(Object, List)}\r
+     * @return a Pager of media instances\r
+     */\r
+    public Pager<Media> getMediainHierarchy(SpecimenOrObservationBase rootOccurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths);\r
+\r
     /**\r
      * Returns a count of determinations that have been made for a given occurence and for a given taxon concept\r
      *\r
index 4f97370b0852e09fd8613b01e944a9a008fb946c..314638037576e6077060bf17920cb7e2e2ccee0f 100644 (file)
@@ -226,6 +226,42 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObs
         return new DefaultPagerImpl<Media>(pageNumber, numberOfResults, pageSize, results);
     }
 
+    @Override
+    public Pager<Media> getMediainHierarchy(SpecimenOrObservationBase rootOccurence, Integer pageSize,
+            Integer pageNumber, List<String> propertyPaths) {
+        List<Media> media = new ArrayList<Media>();
+        //media specimens
+        if(rootOccurence.isInstanceOf(MediaSpecimen.class)){
+            MediaSpecimen mediaSpecimen = HibernateProxyHelper.deproxy(rootOccurence, MediaSpecimen.class);
+            media.add(mediaSpecimen.getMediaSpecimen());
+        }
+        // pherograms & gelPhotos
+        if (rootOccurence.isInstanceOf(DnaSample.class)) {
+            DnaSample dnaSample = CdmBase.deproxy(rootOccurence, DnaSample.class);
+            Set<Sequence> sequences = dnaSample.getSequences();
+            //we do show only those gelPhotos which lead to a consensus sequence
+            for (Sequence sequence : sequences) {
+                Set<Media> dnaRelatedMedia = new HashSet<Media>();
+                for (SingleRead singleRead : sequence.getSingleReads()){
+                    AmplificationResult amplification = singleRead.getAmplificationResult();
+                    dnaRelatedMedia.add(amplification.getGelPhoto());
+                    dnaRelatedMedia.add(singleRead.getPherogram());
+                    dnaRelatedMedia.remove(null);
+                }
+                media.addAll(dnaRelatedMedia);
+            }
+        }
+        if(rootOccurence.isInstanceOf(DerivedUnit.class)){
+            DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(rootOccurence, DerivedUnit.class);
+            for (DerivationEvent derivationEvent : derivedUnit.getDerivationEvents()) {
+                for (DerivedUnit childDerivative : derivationEvent.getDerivatives()) {
+                    media.addAll(getMediainHierarchy(childDerivative, pageSize, pageNumber, propertyPaths).getRecords());
+                }
+            }
+        }
+        return new DefaultPagerImpl<Media>(pageNumber, media.size(), pageSize, media);
+    }
+
     @Override
     public Pager<SpecimenOrObservationBase> list(Class<? extends SpecimenOrObservationBase> type, TaxonBase determinedAs, Integer pageSize, Integer pageNumber,        List<OrderHint> orderHints, List<String> propertyPaths) {
         Integer numberOfResults = dao.count(type, determinedAs);
index b339e5f7c6453c10506e74539a0c367222333d21..ac01216cbb2e066fbc3903398bcb27d0743fb0f7 100644 (file)
@@ -95,10 +95,6 @@ import eu.etaxonomy.cdm.model.location.NamedArea;
 import eu.etaxonomy.cdm.model.media.Media;\r
 import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
 import eu.etaxonomy.cdm.model.media.MediaUtils;\r
-import eu.etaxonomy.cdm.model.molecular.AmplificationResult;\r
-import eu.etaxonomy.cdm.model.molecular.DnaSample;\r
-import eu.etaxonomy.cdm.model.molecular.Sequence;\r
-import eu.etaxonomy.cdm.model.molecular.SingleRead;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
 import eu.etaxonomy.cdm.model.name.NameRelationship;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
@@ -159,6 +155,9 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
     @Autowired\r
     private INameService nameService;\r
 \r
+    @Autowired\r
+    private IOccurrenceService occurrenceService;\r
+\r
     @Autowired\r
     private ITaxonNodeService nodeService;\r
 \r
@@ -899,32 +898,16 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                     }\r
                 }\r
 \r
-                // Collection\r
-                //TODO why may collections have media attached? #\r
                 if (occurrence.isInstanceOf(DerivedUnit.class)) {\r
                     DerivedUnit derivedUnit = CdmBase.deproxy(occurrence, DerivedUnit.class);\r
+                    // Collection\r
+                    //TODO why may collections have media attached? #\r
                     if (derivedUnit.getCollection() != null){\r
                         taxonMedia.addAll(derivedUnit.getCollection().getMedia());\r
                     }\r
                 }\r
-\r
-                // pherograms & gelPhotos\r
-                if (occurrence.isInstanceOf(DnaSample.class)) {\r
-                    DnaSample dnaSample = CdmBase.deproxy(occurrence, DnaSample.class);\r
-                    Set<Sequence> sequences = dnaSample.getSequences();\r
-                    //we do show only those gelPhotos which lead to a consensus sequence\r
-                    for (Sequence sequence : sequences) {\r
-                        Set<Media> dnaRelatedMedia = new HashSet<Media>();\r
-                        for (SingleRead singleRead : sequence.getSingleReads()){\r
-                            AmplificationResult amplification = singleRead.getAmplificationResult();\r
-                            dnaRelatedMedia.add(amplification.getGelPhoto());\r
-                            dnaRelatedMedia.add(singleRead.getPherogram());\r
-                            dnaRelatedMedia.remove(null);\r
-                        }\r
-                        taxonMedia.addAll(dnaRelatedMedia);\r
-                    }\r
-                }\r
-\r
+                //media in hierarchy\r
+                taxonMedia.addAll(occurrenceService.getMediainHierarchy(occurrence, null, null, propertyPath).getRecords());\r
             }\r
         }\r
 \r