- added more parameters to DerivateHierarchyDTO
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / OccurrenceServiceImpl.java
index 14816235730b553721bd02dc64c0d422a6b9a667..ab2512baaeb6cdfe761893bbcf4b75f659b3e830 100644 (file)
@@ -27,6 +27,7 @@ import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.search.BooleanClause.Occur;\r
 import org.apache.lucene.search.BooleanQuery;\r
 import org.apache.lucene.search.SortField;\r
+import org.hibernate.TransientObjectException;\r
 import org.hibernate.search.spatial.impl.Rectangle;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.stereotype.Service;\r
@@ -35,6 +36,8 @@ import org.springframework.transaction.annotation.Transactional;
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;\r
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeConfigurator;\r
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;\r
+import eu.etaxonomy.cdm.api.service.dto.DerivateHierarchyDTO;\r
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;\r
 import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
 import eu.etaxonomy.cdm.api.service.search.ILuceneIndexToolProvider;\r
@@ -56,12 +59,16 @@ import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;\r
 import eu.etaxonomy.cdm.model.location.Country;\r
 import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
+import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;\r
 import eu.etaxonomy.cdm.model.molecular.DnaSample;\r
 import eu.etaxonomy.cdm.model.molecular.Sequence;\r
 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;\r
 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.GatheringEvent;\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
@@ -92,6 +99,9 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObs
     @Autowired\r
     private ITaxonService taxonService;\r
 \r
+    @Autowired\r
+    private ISequenceService sequenceService;\r
+\r
     @Autowired\r
     private AbstractBeanInitializer beanInitializer;\r
 \r
@@ -162,6 +172,14 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObs
         return new DefaultPagerImpl<DerivationEvent>(pageNumber, numberOfResults, pageSize, results);\r
     }\r
 \r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#countDeterminations(eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase, eu.etaxonomy.cdm.model.taxon.TaxonBase)\r
+     */\r
+    @Override\r
+    public int countDeterminations(SpecimenOrObservationBase occurence, TaxonBase taxonbase) {\r
+        return dao.countDeterminations(occurence, taxonbase);\r
+    }\r
+\r
     @Override\r
     public Pager<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurrence, TaxonBase taxonBase, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {\r
         Integer numberOfResults = dao.countDeterminations(occurrence, taxonBase);\r
@@ -268,6 +286,109 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObs
         return pageByAssociatedTaxon(type, includeRelationships, associatedTaxon, maxDepth, pageSize, pageNumber, orderHints, propertyPaths).getRecords();\r
     }\r
 \r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#listByAnyAssociation(java.lang.Class, java.util.Set, eu.etaxonomy.cdm.model.taxon.Taxon, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)\r
+     */\r
+    @Override\r
+    public Collection<FieldUnit> listFieldUnitsByAssociatedTaxon(Set<TaxonRelationshipEdge> includeRelationships,\r
+            Taxon associatedTaxon, Integer maxDepth, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Set<FieldUnit> fieldUnits = new HashSet<FieldUnit>();\r
+\r
+        List<SpecimenOrObservationBase> records = pageByAssociatedTaxon(null, includeRelationships, associatedTaxon, maxDepth, pageSize, pageNumber, orderHints, propertyPaths).getRecords();\r
+        for(SpecimenOrObservationBase<?> specimen:records){\r
+            fieldUnits.addAll(getFieldUnits(specimen.getUuid()));\r
+        }\r
+        return fieldUnits;\r
+    }\r
+\r
+    @Override\r
+    public Collection<DerivateHierarchyDTO> listDerivateHierarchyDTOsByAssociatedTaxon(Set<TaxonRelationshipEdge> includeRelationships,\r
+            Taxon associatedTaxon, Integer maxDepth, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Collection<FieldUnit> fieldUnits = listFieldUnitsByAssociatedTaxon(includeRelationships, associatedTaxon, maxDepth, pageSize, pageNumber, orderHints, propertyPaths);\r
+\r
+        Collection<DerivateHierarchyDTO> derivateHierarchyDTOs = new ArrayList<DerivateHierarchyDTO>();\r
+        for(FieldUnit fieldUnit:fieldUnits){\r
+            derivateHierarchyDTOs.add(assembleDerivateHierarchyDTO(fieldUnit, associatedTaxon));\r
+        }\r
+        return derivateHierarchyDTOs;\r
+    }\r
+\r
+    private DerivateHierarchyDTO assembleDerivateHierarchyDTO(FieldUnit fieldUnit, Taxon associatedTaxon){\r
+        DerivateHierarchyDTO dto = new DerivateHierarchyDTO();\r
+        //        TaxonNameBase name = associatedTaxon.getName();\r
+        //        name = HibernateProxyHelper.deproxy(name, TaxonNameBase.class);\r
+        //        dto.setType(!name.getTypeDesignations().isEmpty());\r
+        dto.setFieldUnit(fieldUnit);\r
+\r
+        if(fieldUnit.getGatheringEvent()!=null){\r
+            GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();\r
+            dto.setCountry(gatheringEvent.getCountry()!=null?gatheringEvent.getCountry().getDescription():"");\r
+            dto.setDate(gatheringEvent.getGatheringDate()!=null?gatheringEvent.getGatheringDate().toString("yyyy-MM-dd"):"");\r
+            dto.setCollection((gatheringEvent.getActor()!=null?gatheringEvent.getActor():"") + fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():"");\r
+        }\r
+\r
+        dto.setTaxonName(associatedTaxon.getName().getFullTitleCache());\r
+        //get derivatives\r
+        Collection<DerivedUnit> derivedUnits = new ArrayList<DerivedUnit>();\r
+        getDerivedUnitsFor(fieldUnit, derivedUnits);\r
+\r
+        for (DerivedUnit derivedUnit : derivedUnits) {\r
+            if(derivedUnit instanceof DnaSample){//.getRecordBasis()==SpecimenOrObservationType.DnaSample){\r
+                dto.setHasDna(true);\r
+\r
+                DnaSample dna = (DnaSample)derivedUnit;\r
+                if(dna.getBankNumber()!=null){\r
+                    dto.getMolecularData().add(dna.getBankNumber());\r
+                }\r
+            }\r
+            if(derivedUnit instanceof MediaSpecimen){\r
+                dto.setHasDna(true);\r
+\r
+                MediaSpecimen media = (MediaSpecimen)derivedUnit;\r
+                String mediaUriString = getMediaUriString(media);\r
+                if(media.getKindOfUnit()!=null){\r
+                    if(media.getKindOfUnit().getUuid().equals(UUID.fromString("acda15be-c0e2-4ea8-8783-b9b0c4ad7f03"))){\r
+                        dto.setHasSpecimenScan(true);\r
+                        if(mediaUriString!=null){\r
+                            dto.getSpecimenScans().add(mediaUriString);\r
+                        }\r
+                    }\r
+                    if(media.getKindOfUnit().getUuid().equals(UUID.fromString("detailImageUUid"))){\r
+                        dto.setHasDetailImage(true);\r
+                        if(mediaUriString!=null){\r
+                            dto.getDetailImages().add(mediaUriString);\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        return dto;\r
+    }\r
+\r
+private String getMediaUriString(MediaSpecimen mediaSpecimen){\r
+       String mediaUri = null;\r
+       Collection<MediaRepresentation> mediaRepresentations = mediaSpecimen.getMediaSpecimen().getRepresentations();\r
+       if(mediaRepresentations!=null && !mediaRepresentations.isEmpty()){\r
+               Collection<MediaRepresentationPart> mediaRepresentationParts = mediaRepresentations.iterator().next().getParts();\r
+               if(mediaRepresentationParts!=null && !mediaRepresentationParts.isEmpty()){\r
+                       MediaRepresentationPart part = mediaRepresentationParts.iterator().next();\r
+                       if(part.getUri()!=null){\r
+                               mediaUri = part.getUri().toASCIIString();\r
+                       }\r
+               }\r
+       }\r
+       return mediaUri;\r
+}\r
+\r
+    private void getDerivedUnitsFor(SpecimenOrObservationBase<?> specimen, Collection<DerivedUnit> derivedUnits){\r
+        for(DerivationEvent derivationEvent:specimen.getDerivationEvents()){\r
+            for(DerivedUnit derivative:derivationEvent.getDerivatives()){\r
+                derivedUnits.add(derivative);\r
+                getDerivedUnitsFor(derivative, derivedUnits);\r
+            }\r
+        }\r
+    }\r
+\r
 \r
     /* (non-Javadoc)\r
      * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#pageByAssociatedTaxon(java.lang.Class, java.util.Set, eu.etaxonomy.cdm.model.taxon.Taxon, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)\r
@@ -399,10 +520,15 @@ type=null;
         //from which this DerivedUnit was derived until all FieldUnits are found.\r
 \r
         //FIXME: use HQL queries to increase performance\r
+        SpecimenOrObservationBase<?> specimen = load(derivedUnitUuid);\r
+//        specimen = HibernateProxyHelper.deproxy(specimen, SpecimenOrObservationBase.class);\r
         Collection<FieldUnit> fieldUnits = new ArrayList<FieldUnit>();\r
-        SpecimenOrObservationBase derivedUnit = load(derivedUnitUuid);\r
-        if(derivedUnit instanceof DerivedUnit){\r
-            getFieldUnits((DerivedUnit) derivedUnit, fieldUnits);\r
+\r
+        if(specimen instanceof FieldUnit){\r
+            fieldUnits.add((FieldUnit) specimen);\r
+        }\r
+        else if(specimen instanceof DerivedUnit){\r
+            getFieldUnits((DerivedUnit) specimen, fieldUnits);\r
         }\r
         return fieldUnits;\r
     }\r
@@ -431,6 +557,15 @@ type=null;
      */\r
     @Override\r
     public boolean moveSequence(DnaSample from, DnaSample to, Sequence sequence) {\r
+        //reload specimens to avoid session conflicts\r
+        from = (DnaSample) load(from.getUuid());\r
+        to = (DnaSample) load(to.getUuid());\r
+        sequence = sequenceService.load(sequence.getUuid());\r
+\r
+        if(from==null || to==null || sequence==null){\r
+            throw new TransientObjectException("One of the CDM entities has not been saved to the data base yet. Moving only works for persisted/saved CDM entities.\n" +\r
+                    "Operation was move "+sequence+ " from "+from+" to "+to);\r
+        }\r
         from.removeSequence(sequence);\r
         saveOrUpdate(from);\r
         to.addSequence(sequence);\r
@@ -443,10 +578,21 @@ type=null;
      */\r
     @Override\r
     public boolean moveDerivate(SpecimenOrObservationBase<?> from, SpecimenOrObservationBase<?> to, DerivedUnit derivate) {\r
+        //reload specimens to avoid session conflicts\r
+        from = load(from.getUuid());\r
+        to = load(to.getUuid());\r
+        derivate = (DerivedUnit) load(derivate.getUuid());\r
+\r
+        if(from==null || to==null || derivate==null){\r
+            throw new TransientObjectException("One of the CDM entities has not been saved to the data base yet. Moving only works for persisted/saved CDM entities.\n" +\r
+                       "Operation was move "+derivate+ " from "+from+" to "+to);\r
+        }\r
+\r
         SpecimenOrObservationType derivateType = derivate.getRecordBasis();\r
         SpecimenOrObservationType toType = to.getRecordBasis();\r
         //check if type is a sub derivate type\r
         if(toType==SpecimenOrObservationType.FieldUnit //moving to FieldUnit always works\r
+                || derivateType==SpecimenOrObservationType.Media //moving media always works\r
                 || (derivateType.isKindOf(toType) && toType!=derivateType)){ //moving only to parent derivate type\r
             //remove derivation event from parent specimen of dragged object\r
             DerivationEvent eventToRemove = null;\r