+ /* (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
+\r
+ if(!getSession().contains(associatedTaxon)){\r
+ associatedTaxon = (Taxon) taxonDao.load(associatedTaxon.getUuid());\r
+ }\r
+\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
+\r
+ if(!getSession().contains(associatedTaxon)){\r
+ associatedTaxon = (Taxon) taxonDao.load(associatedTaxon.getUuid());\r
+ }\r
+\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
+\r
+ DerivateHierarchyDTO dto = new DerivateHierarchyDTO();\r
+ // TaxonNameBase name = associatedTaxon.getName();\r
+ // name = HibernateProxyHelper.deproxy(name, TaxonNameBase.class);\r
+ // dto.setType(!name.getTypeDesignations().isEmpty());\r
+\r
+ if(fieldUnit.getGatheringEvent()!=null){\r
+ GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();\r
+ //Country\r
+ dto.setCountry(gatheringEvent.getCountry()!=null?gatheringEvent.getCountry().getDescription():"");\r
+ //Collection\r
+ dto.setCollection((gatheringEvent.getCollector()!=null?gatheringEvent.getCollector():"") + fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():"");\r
+ //Date\r
+ dto.setDate(gatheringEvent.getGatheringDate()!=null?gatheringEvent.getGatheringDate().toString():"");\r
+ }\r
+\r
+ //Taxon Name\r
+ dto.setTaxonName(associatedTaxon.getName().getFullTitleCache());\r
+\r
+\r
+ Collection<DerivedUnit> derivedUnits = new ArrayList<DerivedUnit>();\r
+ getDerivedUnitsFor(fieldUnit, derivedUnits);\r
+ //Herbaria map\r
+ Map<eu.etaxonomy.cdm.model.occurrence.Collection, Integer> collectionToCountMap = new HashMap<eu.etaxonomy.cdm.model.occurrence.Collection, Integer>();\r
+\r
+ //iterate over sub derivates\r
+ for (DerivedUnit derivedUnit : derivedUnits) {\r
+ //assemble molecular data\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.addMolecularData(dna.getBankNumber());\r
+ }\r
+ }\r
+ //assemble media data\r
+ else if(derivedUnit instanceof MediaSpecimen){\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.addSpecimenScan(mediaUriString);\r
+ }\r
+ }\r
+ else if(media.getKindOfUnit().getUuid().equals(UUID.fromString("31eb8d02-bf5d-437c-bcc6-87a626445f34"))){\r
+ dto.setHasDetailImage(true);\r
+ if(mediaUriString!=null){\r
+ dto.addDetailImage(mediaUriString);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ //assemble preserved specimen data\r
+ else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){\r
+ eu.etaxonomy.cdm.model.occurrence.Collection collection = derivedUnit.getCollection();\r
+ if(collection!=null){\r
+ Integer count = collectionToCountMap.get(collection);\r
+ if(count==null){\r
+ count = 1;\r
+ }\r
+ else{\r
+ count++;\r
+ }\r
+ collectionToCountMap.put(collection, count);\r
+ }\r
+ }\r
+ }\r
+ //assemble herbaria string\r
+ String herbariaString = "";\r
+ final String herbariaSeparator = ", ";\r
+ for(Entry<eu.etaxonomy.cdm.model.occurrence.Collection, Integer> e:collectionToCountMap.entrySet()){\r
+ eu.etaxonomy.cdm.model.occurrence.Collection collection = e.getKey();\r
+ if(collection.getCode()!=null){\r
+ herbariaString += collection.getCode();\r
+ }\r
+ if(e.getValue()>1){\r
+ herbariaString += "("+e.getValue()+")";\r
+ }\r
+ herbariaString += herbariaSeparator;\r
+ }\r
+ if(herbariaString.endsWith(herbariaSeparator)){\r
+ herbariaString = herbariaString.substring(0, herbariaString.length()-herbariaSeparator.length());\r
+ }\r
+ dto.setHerbarium(herbariaString);\r
+ return dto;\r
+ }\r
+\r
+ private String getMediaUriString(MediaSpecimen mediaSpecimen){\r
+ if(!getSession().contains(mediaSpecimen)){\r
+ mediaSpecimen = (MediaSpecimen) load(mediaSpecimen.getUuid());\r
+ }\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