X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/blobdiff_plain/4b6abd7e88d34f6363270c92cdecab8ade8a4d62..08183f9940eba2215352b890199303f20046713a:/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java index d606965f37..270fb3af85 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java @@ -1,4 +1,3 @@ -// $Id$ /** * Copyright (C) 2007 EDIT * European Distributed Institute of Taxonomy @@ -19,6 +18,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -26,7 +26,6 @@ import java.util.Set; import java.util.UUID; import org.apache.log4j.Logger; -import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery.Builder; @@ -47,9 +46,9 @@ import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException; import eu.etaxonomy.cdm.api.service.UpdateResult.Status; import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase; import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator; -import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator.AssignmentStatus; import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator; import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator; +import eu.etaxonomy.cdm.api.service.dto.DNASampleDTO; import eu.etaxonomy.cdm.api.service.dto.DerivateDTO; import eu.etaxonomy.cdm.api.service.dto.DerivateDataDTO; import eu.etaxonomy.cdm.api.service.dto.DerivateDataDTO.ContigFile; @@ -63,6 +62,7 @@ import eu.etaxonomy.cdm.api.service.pager.Pager; import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl; import eu.etaxonomy.cdm.api.service.search.ILuceneIndexToolProvider; import eu.etaxonomy.cdm.api.service.search.ISearchResultBuilder; +import eu.etaxonomy.cdm.api.service.search.LuceneParseException; import eu.etaxonomy.cdm.api.service.search.LuceneSearch; import eu.etaxonomy.cdm.api.service.search.QueryFactory; import eu.etaxonomy.cdm.api.service.search.SearchResult; @@ -70,13 +70,14 @@ import eu.etaxonomy.cdm.api.service.search.SearchResultBuilder; import eu.etaxonomy.cdm.api.service.util.TaxonRelationshipEdge; import eu.etaxonomy.cdm.common.CdmUtils; import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; +import eu.etaxonomy.cdm.format.CdmFormatterFactory; +import eu.etaxonomy.cdm.format.ICdmFormatter.FormatKey; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.CdmBaseType; import eu.etaxonomy.cdm.model.agent.AgentBase; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.DefinedTerm; import eu.etaxonomy.cdm.model.common.DefinedTermBase; -import eu.etaxonomy.cdm.model.common.ICdmBase; import eu.etaxonomy.cdm.model.common.Language; import eu.etaxonomy.cdm.model.description.CategoricalData; import eu.etaxonomy.cdm.model.description.DescriptionBase; @@ -87,6 +88,7 @@ import eu.etaxonomy.cdm.model.description.SpecimenDescription; import eu.etaxonomy.cdm.model.description.TaxonDescription; import eu.etaxonomy.cdm.model.location.Country; import eu.etaxonomy.cdm.model.location.NamedArea; +import eu.etaxonomy.cdm.model.location.Point; import eu.etaxonomy.cdm.model.media.Media; import eu.etaxonomy.cdm.model.media.MediaRepresentation; import eu.etaxonomy.cdm.model.media.MediaRepresentationPart; @@ -96,7 +98,7 @@ import eu.etaxonomy.cdm.model.molecular.DnaSample; import eu.etaxonomy.cdm.model.molecular.Sequence; import eu.etaxonomy.cdm.model.molecular.SingleRead; import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation; -import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.cdm.model.name.TaxonName; import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase; import eu.etaxonomy.cdm.model.occurrence.DerivationEvent; import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; @@ -110,15 +112,17 @@ import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao; import eu.etaxonomy.cdm.persistence.dao.initializer.AbstractBeanInitializer; -import eu.etaxonomy.cdm.persistence.dao.molecular.ISingleReadDao; import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao; +import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper; import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache; +import eu.etaxonomy.cdm.persistence.query.AssignmentStatus; import eu.etaxonomy.cdm.persistence.query.OrderHint; import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy; +import eu.etaxonomy.cdm.strategy.cache.common.IdentifiableEntityDefaultCacheStrategy; /** * @author a.babadshanjan - * @created 01.09.2008 + * @since 01.09.2008 */ @Service @Transactional(readOnly = true) @@ -136,13 +140,13 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase DERIVED_UNIT_INIT_STRATEGY = Arrays.asList(new String []{ + "derivedFrom.derivatives", + "derivedFrom.originals", + "specimenTypeDesignations.*", + "specimenTypeDesignations.citation.*", + "specimenTypeDesignations.homotypicalGroup.*", + "specimenTypeDesignations.typifiedNames", + "collection.$" + }); + public OccurrenceServiceImpl() { logger.debug("Load OccurrenceService Bean"); } @@ -182,8 +196,8 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getCountryByName(String name) { - List terms = this.definedTermDao.findByTitle(Country.class, name, null, null, null, null, null, null); - List countries = new ArrayList(); + List terms = this.definedTermDao.findByTitleWithRestrictions(Country.class, name, null, null, null, null, null, null); + List countries = new ArrayList<>(); for (int i = 0; i < terms.size(); i++) { countries.add((Country) terms.get(i)); } @@ -198,9 +212,9 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List propertyPaths) { - Integer numberOfResults = dao.countDerivationEvents(occurence); + long numberOfResults = dao.countDerivationEvents(occurence); - List results = new ArrayList(); + List results = new ArrayList<>(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) results = dao.getDerivationEvents(occurence, pageSize, pageNumber, propertyPaths); } @@ -209,27 +223,28 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getDeterminations(SpecimenOrObservationBase occurrence, TaxonBase taxonBase, Integer pageSize, Integer pageNumber, List propertyPaths) { - Integer numberOfResults = dao.countDeterminations(occurrence, taxonBase); + public Pager getDeterminations(SpecimenOrObservationBase occurrence, TaxonBase taxonBase, + Integer pageSize, Integer pageNumber, List propertyPaths) { + long numberOfResults = dao.countDeterminations(occurrence, taxonBase); - List results = new ArrayList(); + List results = new ArrayList<>(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) results = dao.getDeterminations(occurrence, taxonBase, pageSize, pageNumber, propertyPaths); } - return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); + return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results); } @Override public Pager getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List propertyPaths) { - Integer numberOfResults = dao.countMedia(occurence); + long numberOfResults = dao.countMedia(occurence); - List results = new ArrayList(); + List results = new ArrayList<>(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) results = dao.getMedia(occurence, pageSize, pageNumber, propertyPaths); } @@ -240,7 +255,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getMediainHierarchy(SpecimenOrObservationBase rootOccurence, Integer pageSize, Integer pageNumber, List propertyPaths) { - List media = new ArrayList(); + List media = new ArrayList<>(); //media specimens if(rootOccurence.isInstanceOf(MediaSpecimen.class)){ MediaSpecimen mediaSpecimen = HibernateProxyHelper.deproxy(rootOccurence, MediaSpecimen.class); @@ -252,7 +267,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase sequences = dnaSample.getSequences(); //we do show only those gelPhotos which lead to a consensus sequence for (Sequence sequence : sequences) { - Set dnaRelatedMedia = new HashSet(); + Set dnaRelatedMedia = new HashSet<>(); for (SingleRead singleRead : sequence.getSingleReads()){ AmplificationResult amplification = singleRead.getAmplificationResult(); dnaRelatedMedia.add(amplification.getGelPhoto()); @@ -270,36 +285,36 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase(pageNumber, media.size(), pageSize, media); + return new DefaultPagerImpl(pageNumber, Long.valueOf(media.size()), pageSize, media); } @Override - public Pager list(Class type, TaxonNameBase determinedAs, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - Integer numberOfResults = dao.count(type, determinedAs); - List results = new ArrayList(); - pageNumber = pageNumber == null ? 0 : pageNumber; + public Pager list(Class type, TaxonName determinedAs, + Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { + long numberOfResults = dao.count(type, determinedAs); + @SuppressWarnings("rawtypes") + List results = new ArrayList<>(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - Integer start = pageSize == null ? 0 : pageSize * pageNumber; - results = dao.list(type, determinedAs, pageSize, start, orderHints, propertyPaths); + results = dao.list(type, determinedAs, pageSize, pageNumber, orderHints, propertyPaths); } - return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); + return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results); } @Override - public Pager list(Class type, TaxonBase determinedAs, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - Integer numberOfResults = dao.count(type, determinedAs); - List results = new ArrayList(); - pageNumber = pageNumber == null ? 0 : pageNumber; + public Pager list(Class type, TaxonBase determinedAs, + Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { + long numberOfResults = dao.count(type, determinedAs); + @SuppressWarnings("rawtypes") + List results = new ArrayList<>(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - Integer start = pageSize == null ? 0 : pageSize * pageNumber; - results = dao.list(type, determinedAs, pageSize, start, orderHints, propertyPaths); + results = dao.list(type, determinedAs, pageSize, pageNumber, orderHints, propertyPaths); } - return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); + return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results); } @Override - public List> getDerivedUnitUuidAndTitleCache() { - return dao.getDerivedUnitUuidAndTitleCache(); + public List> getDerivedUnitUuidAndTitleCache(Integer limit, String pattern) { + return dao.getDerivedUnitUuidAndTitleCache(limit, pattern); } @Override @@ -321,7 +336,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase listDerivedUnitFacades( DescriptionBase description, List propertyPaths) { - List derivedUnitFacadeList = new ArrayList(); + List derivedUnitFacadeList = new ArrayList<>(); IndividualsAssociation tempIndividualsAssociation; SpecimenOrObservationBase tempSpecimenOrObservationBase; List elements = descriptionService.listDescriptionElements(description, null, IndividualsAssociation.class, null, 0, Arrays.asList(new String []{"associatedSpecimenOrObservation"})); @@ -352,6 +367,12 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase listUuidAndTitleCacheByAssociatedTaxon(List taxonNodeUuids, + Integer limit, Integer start) { + return dao.listUuidAndTitleCacheByAssociatedTaxon(taxonNodeUuids, limit, start); + } + @Override public Collection listFieldUnitsByAssociatedTaxon(Taxon associatedTaxon, List orderHints, List propertyPaths) { return pageFieldUnitsByAssociatedTaxon(null, associatedTaxon, null, null, null, null, propertyPaths).getRecords(); @@ -367,33 +388,32 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase fieldUnitUuids = new HashSet(); + Set fieldUnitUuids = new HashSet<>(); List records = listByAssociatedTaxon(null, includeRelationships, associatedTaxon, maxDepth, null, null, orderHints, propertyPaths); for (SpecimenOrObservationBase specimen : records) { - for (FieldUnit fieldUnit : getFieldUnits(specimen.getUuid())) { + for (FieldUnit fieldUnit : findFieldUnits(specimen.getUuid(), null)) { fieldUnitUuids.add(fieldUnit.getUuid()); } } //dao.list() does the paging of the field units. Passing the field units directly to the Pager would not work List fieldUnits = dao.list(fieldUnitUuids, pageSize, pageNumber, orderHints, propertyPaths); - return new DefaultPagerImpl(pageNumber, fieldUnitUuids.size(), pageSize, fieldUnits); + return new DefaultPagerImpl<>(pageNumber, fieldUnitUuids.size(), pageSize, fieldUnits); } @Override - public FieldUnitDTO assembleFieldUnitDTO(FieldUnit fieldUnit, UUID associatedTaxonUuid) { + public FieldUnitDTO assembleFieldUnitDTO(FieldUnit fieldUnit) { if (!getSession().contains(fieldUnit)) { fieldUnit = (FieldUnit) load(fieldUnit.getUuid()); } - TaxonBase associatedTaxon = taxonService.load(associatedTaxonUuid); - FieldUnitDTO fieldUnitDTO = new FieldUnitDTO(); + FieldUnitDTO fieldUnitDTO = new FieldUnitDTO(fieldUnit); if (fieldUnit.getGatheringEvent() != null) { GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent(); // Country NamedArea country = gatheringEvent.getCountry(); - fieldUnitDTO.setCountry(country != null ? country.getDescription() : null); + fieldUnitDTO.setCountry(country != null ? country.getLabel() : null); // Collection AgentBase collector = gatheringEvent.getCollector(); String fieldNumber = fieldUnit.getFieldNumber(); @@ -411,7 +431,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase collectionToCountMap = new HashMap(); + Map collectionToCountMap = new HashMap<>(); // List of accession numbers for citation - List preservedSpecimenAccessionNumbers = new ArrayList(); + List preservedSpecimenAccessionNumbers = new ArrayList<>(); // assemble preserved specimen DTOs Set derivationEvents = fieldUnit.getDerivationEvents(); @@ -436,21 +453,27 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBasebarCode>catalogNumber>collection - String identifier = derivedUnit.getMostSignificantIdentifier(); - if(CdmUtils.isBlank(identifier) && derivedUnit.getCollection()!=null){ - identifier = derivedUnit.getCollection().toString(); + //specimen identifier + FormatKey collectionKey = FormatKey.COLLECTION_CODE; + String specimenIdentifier = CdmFormatterFactory.format(derivedUnit, collectionKey); + if (CdmUtils.isBlank(specimenIdentifier)) { + collectionKey = FormatKey.COLLECTION_NAME; } - if(CdmUtils.isBlank(identifier)){ - identifier = derivedUnit.getTitleCache(); - if(CdmUtils.isBlank(identifier) && !derivedUnit.isProtectedTitleCache()){ - //regenerate title cache if it is empty - derivedUnit.setTitleCache(null); - identifier = derivedUnit.getTitleCache(); - } + specimenIdentifier = CdmFormatterFactory.format(derivedUnit, new FormatKey[] { + collectionKey, FormatKey.SPACE, + FormatKey.MOST_SIGNIFICANT_IDENTIFIER, FormatKey.SPACE }); + if(CdmUtils.isBlank(specimenIdentifier)){ + specimenIdentifier = derivedUnit.getTitleCache(); } - if(CdmUtils.isBlank(identifier)){ - //default fallback UUID - identifier = derivedUnit.getUuid().toString(); + if(CdmUtils.isBlank(specimenIdentifier)){ + specimenIdentifier = derivedUnit.getUuid().toString(); } - preservedSpecimenDTO.setAccessionNumber(identifier); - preservedSpecimenDTO.setUuid(derivedUnit.getUuid().toString()); + preservedSpecimenDTO.setAccessionNumber(specimenIdentifier); + //preferred stable URI preservedSpecimenDTO.setPreferredStableUri(derivedUnit.getPreferredStableUri()); // citation - Collection fieldUnits = getFieldUnits(derivedUnit); + Collection fieldUnits = getFieldUnits(derivedUnit, null); if (fieldUnits.size() == 1) { preservedSpecimenDTO.setCitation(fieldUnits.iterator().next().getTitleCache()); } @@ -564,7 +585,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase languages = new ArrayList(Collections.singleton(Language.DEFAULT())); + ArrayList languages = new ArrayList<>(Collections.singleton(Language.DEFAULT())); if (descriptionElementBase instanceof QuantitativeData) { QuantitativeData quantitativeData = (QuantitativeData) descriptionElementBase; DefaultQuantitativeDescriptionBuilder builder = new DefaultQuantitativeDescriptionBuilder(); @@ -585,15 +606,12 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase typeStatus = specimenTypeDesignation.getTypeStatus(); - if (typeStatus != null) { - List typedTaxaNames = new ArrayList(); - String label = typeStatus.getLabel(); - Set typifiedNames = specimenTypeDesignation.getTypifiedNames(); - for (TaxonNameBase taxonNameBase : typifiedNames) { - typedTaxaNames.add(taxonNameBase.getFullTitleCache()); - } - preservedSpecimenDTO.addTypes(label, typedTaxaNames); + Set typifiedNames = specimenTypeDesignation.getTypifiedNames(); + List typedTaxaNames = new ArrayList<>(); + for (TaxonName taxonName : typifiedNames) { + typedTaxaNames.add(taxonName.getTitleCache()); } + preservedSpecimenDTO.addTypes(typeStatus!=null?typeStatus.getLabel():"", typedTaxaNames); } // individuals associations @@ -725,7 +743,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getDerivedUnitsFor(SpecimenOrObservationBase specimen) { - Collection derivedUnits = new ArrayList(); + Collection derivedUnits = new ArrayList<>(); for (DerivationEvent derivationEvent : specimen.getDerivationEvents()) { for (DerivedUnit derivative : derivationEvent.getDerivatives()) { derivedUnits.add(derivative); @@ -735,15 +753,58 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getDerivedUnitDTOsFor(DerivateDTO specimenDto, DerivedUnit specimen, HashMap alreadyCollectedSpecimen) { + Set derivedUnits = new HashSet<>(); +// load + for (DerivationEvent derivationEvent : specimen.getDerivationEvents()) { + for (DerivedUnit derivative : derivationEvent.getDerivatives()) { + if (!alreadyCollectedSpecimen.containsKey(specimenDto.getUuid())){ + PreservedSpecimenDTO dto; + if (derivative instanceof DnaSample) { + dto = new DNASampleDTO(derivative); + } else { + dto = new PreservedSpecimenDTO(derivative); + } + alreadyCollectedSpecimen.put(dto.getUuid(), dto); + dto.addAllDerivates(getDerivedUnitDTOsFor(dto, derivative, alreadyCollectedSpecimen)); + derivedUnits.add(dto); + } + } + } + return derivedUnits; + } + +// private Set getDerivedUnitDTOsFor(DerivateDTO specimenDto, DerivedUnit specimen, HashMap alreadyCollectedSpecimen) { +// Set derivedUnits = new HashSet<>(); +//// load +// for (DerivationEvent derivationEvent : specimen.getDerivationEvents()) { +// for (DerivedUnit derivative : derivationEvent.getDerivatives()) { +// if (!alreadyCollectedSpecimen.containsKey(specimenDto.getUuid())){ +// PreservedSpecimenDTO dto; +// if (derivative instanceof DnaSample){ +// dto = DNASampleDTO.newInstance(derivative); +// }else{ +// dto = PreservedSpecimenDTO.newInstance(derivative); +// } +// alreadyCollectedSpecimen.put(dto.getUuid(), dto); +// dto.addAllDerivates(getDerivedUnitDTOsFor(dto, derivative, alreadyCollectedSpecimen)); +// derivedUnits.add(dto); +// } +// } +// } +// return derivedUnits; +// } + @SuppressWarnings("unchecked") @Override - public Pager pageByAssociatedTaxon(Class type, Set includeRelationships, + public Pager pageByAssociatedTaxon(Class type, Set includedRelationships, Taxon associatedTaxon, Integer maxDepth, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - Set taxa = new HashSet(); - Set occurrenceIds = new HashSet(); - List occurrences = new ArrayList(); + Set taxa = new HashSet<>(); + Set occurrenceIds = new HashSet<>(); + List occurrences = new ArrayList<>(); + boolean includeUnpublished = INCLUDE_UNPUBLISHED; // Integer limit = PagerUtils.limitFor(pageSize); // Integer start = PagerUtils.startFor(pageSize, pageNumber); @@ -752,21 +813,21 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase perTaxonOccurrences = dao.listByAssociatedTaxon(type, taxon, null, null, orderHints, propertyPaths); - for (SpecimenOrObservationBase o : perTaxonOccurrences) { + for (SpecimenOrObservationBase o : perTaxonOccurrences) { occurrenceIds.add(o.getId()); } } occurrences = (List) dao.loadList(occurrenceIds, propertyPaths); - return new DefaultPagerImpl(pageNumber, occurrenceIds.size(), pageSize, occurrences); + return new DefaultPagerImpl(pageNumber, Long.valueOf(occurrences.size()), pageSize, occurrences); } @@ -782,18 +843,90 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase findFieldUnitDTOByAssociatedTaxon(Set includedRelationships, + UUID associatedTaxonUuid) { + + Set taxa = new HashSet<>(); + Set occurrenceIds = new HashSet<>(); + List fieldUnitDTOs = new ArrayList<>(); + HashMap alreadyCollectedSpecimen = new HashMap<>(); + List occurrences = new ArrayList<>(); + boolean includeUnpublished = INCLUDE_UNPUBLISHED; + + // Integer limit = PagerUtils.limitFor(pageSize); + // Integer start = PagerUtils.startFor(pageSize, pageNumber); + + Taxon associatedTaxon = (Taxon) taxonService.load(associatedTaxonUuid); + + + if (includedRelationships != null) { + taxa = taxonService.listRelatedTaxa(associatedTaxon, includedRelationships, null, includeUnpublished, null, null, null); + } + + taxa.add(associatedTaxon); + + for (Taxon taxon : taxa) { + List perTaxonOccurrences = dao.listByAssociatedTaxon(null,taxon, null, null, null, DERIVED_UNIT_INIT_STRATEGY); + for (SpecimenOrObservationBase o : perTaxonOccurrences) { + if (o.isInstanceOf(DerivedUnit.class)){ + DerivedUnit derivedUnit; + DerivateDTO derivedUnitDTO; + if (o.isInstanceOf(DnaSample.class)) { + derivedUnit = HibernateProxyHelper.deproxy(o, DnaSample.class); + derivedUnitDTO = new DNASampleDTO(derivedUnit); + } else { + derivedUnit = HibernateProxyHelper.deproxy(o, DerivedUnit.class); + derivedUnitDTO = new PreservedSpecimenDTO(derivedUnit); + } + if (alreadyCollectedSpecimen.get(derivedUnitDTO.getUuid()) == null){ + alreadyCollectedSpecimen.put(derivedUnitDTO.getUuid(), derivedUnitDTO); + } + derivedUnitDTO.addAllDerivates(getDerivedUnitDTOsFor(derivedUnitDTO, derivedUnit, alreadyCollectedSpecimen)); + this.findFieldUnitDTO(derivedUnitDTO, fieldUnitDTOs, alreadyCollectedSpecimen); + } + } + + } + + return fieldUnitDTOs; + + } + + + + @Override + public List findByAccessionNumber( + String accessionNumberString, Integer pageSize, Integer pageNumber, List orderHints, + List propertyPaths) { + + List records = new ArrayList<>(); + records = dao.findByGeneticAccessionNumber(accessionNumberString, propertyPaths); + + return records; + + } + @Override public Pager> findByFullText( Class clazz, String queryString, Rectangle boundingBox, List languages, boolean highlightFragments, Integer pageSize, Integer pageNumber, List orderHints, - List propertyPaths) throws CorruptIndexException, IOException, ParseException { + List propertyPaths) throws IOException, LuceneParseException { LuceneSearch luceneSearch = prepareByFullTextSearch(clazz, queryString, boundingBox, languages, highlightFragments); // --- execute search - TopGroups topDocsResultSet = luceneSearch.executeSearch(pageSize, pageNumber); + TopGroups topDocsResultSet; + try { + topDocsResultSet = luceneSearch.executeSearch(pageSize, pageNumber); + } catch (ParseException e) { + LuceneParseException parseException = new LuceneParseException(e.getMessage()); + parseException.setStackTrace(e.getStackTrace()); + throw parseException; + } - Map idFieldMap = new HashMap(); + Map idFieldMap = new HashMap<>(); idFieldMap.put(CdmBaseType.SPECIMEN_OR_OBSERVATIONBASE, "id"); // --- initialize taxa, highlight matches .... @@ -804,8 +937,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase>(pageNumber, totalHits, pageSize, - searchResults); + return new DefaultPagerImpl<>(pageNumber, Long.valueOf(totalHits), pageSize, searchResults); } @@ -844,40 +976,96 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getFieldUnits(UUID derivedUnitUuid) { + public Collection findFieldUnits(UUID derivedUnitUuid, List propertyPaths) { //It will search recursively over all {@link DerivationEvent}s and get the "originals" ({@link SpecimenOrObservationBase}) //from which this DerivedUnit was derived until all FieldUnits are found. // FIXME: use HQL queries to increase performance - SpecimenOrObservationBase specimen = load(derivedUnitUuid); + SpecimenOrObservationBase specimen = load(derivedUnitUuid, propertyPaths); // specimen = HibernateProxyHelper.deproxy(specimen, SpecimenOrObservationBase.class); - Collection fieldUnits = new ArrayList(); + Collection fieldUnits = new ArrayList<>(); if (specimen.isInstanceOf(FieldUnit.class)) { fieldUnits.add(HibernateProxyHelper.deproxy(specimen, FieldUnit.class)); } else if(specimen.isInstanceOf(DerivedUnit.class)){ - fieldUnits.addAll(getFieldUnits(HibernateProxyHelper.deproxy(specimen, DerivedUnit.class))); + fieldUnits.addAll(getFieldUnits(HibernateProxyHelper.deproxy(specimen, DerivedUnit.class), propertyPaths)); } return fieldUnits; } - private Collection getFieldUnits(DerivedUnit derivedUnit) { - Collection fieldUnits = new HashSet(); + private Collection getFieldUnits(DerivedUnit derivedUnit, List propertyPaths) { + Collection fieldUnits = new HashSet<>(); Set originals = derivedUnit.getOriginals(); if (originals != null && !originals.isEmpty()) { for (SpecimenOrObservationBase original : originals) { if (original.isInstanceOf(FieldUnit.class)) { - fieldUnits.add(HibernateProxyHelper.deproxy(original, FieldUnit.class)); + fieldUnits.add((FieldUnit) load(original.getUuid(), propertyPaths)); } else if(original.isInstanceOf(DerivedUnit.class)){ - fieldUnits.addAll(getFieldUnits(HibernateProxyHelper.deproxy(original, DerivedUnit.class))); + fieldUnits.addAll(getFieldUnits(HibernateProxyHelper.deproxy(original, DerivedUnit.class), propertyPaths)); } } } return fieldUnits; } + + + @Override + public FieldUnitDTO findFieldUnitDTO(DerivateDTO derivedUnitDTO, Collection fieldUnits, HashMap alreadyCollectedSpecimen) { + //It will search recursively over all {@link DerivationEvent}s and get the "originals" ({@link SpecimenOrObservationBase}) + //from which this DerivedUnit was derived until all FieldUnits are found. + List specimens = new ArrayList<>(); + List propertyPaths = new ArrayList<>(); + + propertyPaths.add("descriptions.elements.media.title"); + propertyPaths.add("kindOfUnit"); + + specimens = dao.findOriginalsForDerivedUnit(derivedUnitDTO.getUuid(), propertyPaths); + + if (specimens.size() > 1){ + logger.debug("The derived unit with uuid " + derivedUnitDTO.getUuid() + "has more than one orginal"); + } + // for (SpecimenOrObservationBase specimen: specimens){ + SpecimenOrObservationBase specimen = null; + if (specimens.size() > 0){ + specimen = specimens.get(0); + }else{ + return null; + } + FieldUnitDTO fieldUnitDto = null; + if (alreadyCollectedSpecimen.get(specimen.getUuid()) != null){ + alreadyCollectedSpecimen.get(specimen.getUuid()).addDerivate(derivedUnitDTO); + if ( alreadyCollectedSpecimen.get(specimen.getUuid()) instanceof FieldUnitDTO){ + ((FieldUnitDTO)alreadyCollectedSpecimen.get(specimen.getUuid())).getTaxonRelatedDerivedUnits().add(derivedUnitDTO.getUuid()); + } + }else{ + if (specimen.isInstanceOf(FieldUnit.class)){ + fieldUnitDto = FieldUnitDTO.newInstance((FieldUnit)specimen); + fieldUnitDto.addDerivate(derivedUnitDTO); + fieldUnits.add(fieldUnitDto); + }else{ + DerivateDTO originalDTO; + if (specimen instanceof DnaSample){ + originalDTO = new DNASampleDTO((DnaSample)specimen); + } else { + originalDTO = new PreservedSpecimenDTO((DerivedUnit)specimen); + } + originalDTO.addDerivate(derivedUnitDTO); + fieldUnitDto = findFieldUnitDTO(originalDTO, fieldUnits, alreadyCollectedSpecimen); + } + + } + // } + alreadyCollectedSpecimen.put(derivedUnitDTO.getUuid(), derivedUnitDTO); + if (fieldUnitDto != null){ + fieldUnitDto.addTaxonRelatedDerivedUnits(derivedUnitDTO); + } + return fieldUnitDto; + + } + @Override @Transactional(readOnly = false) public UpdateResult moveSequence(DnaSample from, DnaSample to, Sequence sequence) { @@ -977,121 +1165,6 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getNonCascadedAssociatedElements(SpecimenOrObservationBase specimen) { - // potential fields that are not persisted cascadingly - /* - * SOOB - -DescriptionBase - -determinations - --modifier TERM - -kindOfUnit TERM - -lifeStage TERM - -sex TERM - - FieldUnit - -GatheringEvent - --Country TERM - --CollectingAreas TERM - - DerivedUnit - -collection - --institute - ---types TERM - -preservationMethod - --medium TERM - -storedUnder CDM TaxonNameBase - */ - - Collection nonCascadedCdmEntities = new HashSet(); - - //Choose the correct entry point to traverse the graph (FieldUnit or DerivedUnit) - - // FieldUnit - if (specimen.isInstanceOf(FieldUnit.class)) { - nonCascadedCdmEntities.addAll(getFieldUnitNonCascadedAssociatedElements(HibernateProxyHelper.deproxy(specimen, FieldUnit.class))); - } - // DerivedUnit - else if (specimen.isInstanceOf(DerivedUnit.class)) { - DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(specimen, DerivedUnit.class); - if (derivedUnit.getDerivedFrom() != null) { - Collection fieldUnits = getFieldUnits(derivedUnit); - for (FieldUnit fieldUnit : fieldUnits) { - nonCascadedCdmEntities.addAll(getFieldUnitNonCascadedAssociatedElements(fieldUnit)); - } - } - } - return nonCascadedCdmEntities; - } - - private Collection getFieldUnitNonCascadedAssociatedElements(FieldUnit fieldUnit) { - // get non cascaded element on SpecimenOrObservationBase level - Collection nonCascadedCdmEntities = getSpecimenOrObservationNonCascadedAssociatedElements(fieldUnit); - - // get FieldUnit specific elements - GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent(); - if (gatheringEvent != null) { - // country - if (gatheringEvent.getCountry() != null) { - nonCascadedCdmEntities.add(gatheringEvent.getCountry()); - } - // collecting areas - for (NamedArea namedArea : gatheringEvent.getCollectingAreas()) { - nonCascadedCdmEntities.add(namedArea); - } - } - for (DerivationEvent derivationEvent : fieldUnit.getDerivationEvents()) { - for (DerivedUnit derivedUnit : derivationEvent.getDerivatives()) { - nonCascadedCdmEntities.addAll(getDerivedUnitNonCascadedAssociatedElements(derivedUnit)); - } - } - return nonCascadedCdmEntities; - } - - private Collection getDerivedUnitNonCascadedAssociatedElements(DerivedUnit derivedUnit) { - // get non cascaded element on SpecimenOrObservationBase level - Collection nonCascadedCdmEntities = getSpecimenOrObservationNonCascadedAssociatedElements(derivedUnit); - - // get DerivedUnit specific elements - if (derivedUnit.getCollection() != null && derivedUnit.getCollection().getInstitute() != null) { - for (DefinedTerm type : derivedUnit.getCollection().getInstitute().getTypes()) { - nonCascadedCdmEntities.add(type); - } - } - if (derivedUnit.getPreservation() != null && derivedUnit.getPreservation().getMedium() != null) { - nonCascadedCdmEntities.add(derivedUnit.getPreservation().getMedium()); - } - if (derivedUnit.getStoredUnder() != null) { - nonCascadedCdmEntities.add(derivedUnit.getStoredUnder()); - } - return nonCascadedCdmEntities; - } - - private Collection getSpecimenOrObservationNonCascadedAssociatedElements( - SpecimenOrObservationBase specimen) { - Collection nonCascadedCdmEntities = new HashSet(); - // scan SpecimenOrObservationBase - for (DeterminationEvent determinationEvent : specimen.getDeterminations()) { - // modifier - if (determinationEvent.getModifier() != null) { - nonCascadedCdmEntities.add(determinationEvent.getModifier()); - } - } - // kindOfUnit - if (specimen.getKindOfUnit() != null) { - nonCascadedCdmEntities.add(specimen.getKindOfUnit()); - } - // lifeStage - if (specimen.getLifeStage() != null) { - nonCascadedCdmEntities.add(specimen.getLifeStage()); - } - // sex - if (specimen.getSex() != null) { - nonCascadedCdmEntities.add(specimen.getSex()); - } - return nonCascadedCdmEntities; - } - @Override public DeleteResult isDeletable(UUID specimenUuid, DeleteConfiguratorBase config) { DeleteResult deleteResult = new DeleteResult(); @@ -1104,14 +1177,14 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase specimen, SpecimenDeleteConfigurator config) { specimen = HibernateProxyHelper.deproxy(specimen, SpecimenOrObservationBase.class); + DeleteResult deleteResult = isDeletable(specimen.getUuid(), config); + if (!deleteResult.isOk()) { + return deleteResult; + } + if (config.isDeleteChildren()) { Set derivationEvents = specimen.getDerivationEvents(); //clone to avoid concurrent modification //can happen if the child is deleted and deleted its own derivedFrom event - Set derivationEventsClone = new HashSet(derivationEvents); + Set derivationEventsClone = new HashSet<>(derivationEvents); for (DerivationEvent derivationEvent : derivationEventsClone) { Set derivatives = derivationEvent.getDerivatives(); - for (DerivedUnit derivedUnit : derivatives) { - delete(derivedUnit, config); + Iterator it = derivatives.iterator(); + Set derivativesToDelete = new HashSet<>(); + while (it.hasNext()) { + DerivedUnit unit = it.next(); + derivativesToDelete.add(unit); + } + for (DerivedUnit unit:derivativesToDelete){ + deleteResult.includeResult(delete(unit, config)); } } } - DeleteResult deleteResult = isDeletable(specimen.getUuid(), config); - if (!deleteResult.isOk()) { - return deleteResult; - } + + // check related objects Set relatedObjects = deleteResult.getRelatedObjects(); @@ -1224,10 +1306,10 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase typifiedNames = new ArrayList(); + List typifiedNames = new ArrayList<>(); typifiedNames.addAll(designation.getTypifiedNames()); - for (TaxonNameBase taxonNameBase : typifiedNames) { - taxonNameBase.removeTypeDesignation(designation); + for (TaxonName taxonName : typifiedNames) { + taxonName.removeTypeDesignation(designation); } } // delete IndividualsAssociation @@ -1251,7 +1333,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase listIndividualsAssociations(SpecimenOrObservationBase specimen, Integer limit, Integer start, List orderHints, List propertyPaths) { - return dao.listIndividualsAssociations(specimen, null, null, null, null); + return dao.listIndividualsAssociations(specimen, limit, start, orderHints, propertyPaths); } + /** + * {@inheritDoc} + */ @Override - public Collection> listAssociatedTaxa(SpecimenOrObservationBase specimen, Integer limit, Integer start, - List orderHints, List propertyPaths) { - Collection> associatedTaxa = new HashSet>(); + public Collection> listAssociatedTaxa(SpecimenOrObservationBase specimen, Integer limit, + Integer start, List orderHints, List propertyPaths) { + return listAssociatedTaxa(specimen, INCLUDE_UNPUBLISHED, limit, start, orderHints, propertyPaths); + } + @Override + public Collection> listAssociatedTaxa(SpecimenOrObservationBase specimen, boolean includeUnpublished, + Integer limit, Integer start, List orderHints, List propertyPaths) { + Collection> associatedTaxa = new HashSet<>(); //individuals associations - associatedTaxa.addAll(listIndividualsAssociationTaxa(specimen, limit, start, orderHints, propertyPaths)); + associatedTaxa.addAll(listIndividualsAssociationTaxa(specimen, includeUnpublished, limit, start, orderHints, propertyPaths)); //type designation if(specimen.isInstanceOf(DerivedUnit.class)){ - associatedTaxa.addAll(listTypeDesignationTaxa(HibernateProxyHelper.deproxy(specimen, DerivedUnit.class), limit, start, orderHints, propertyPaths)); + associatedTaxa.addAll(listTypeDesignationTaxa(HibernateProxyHelper.deproxy(specimen, DerivedUnit.class), + includeUnpublished, limit, start, orderHints, propertyPaths)); } //determinations - associatedTaxa.addAll(listDeterminedTaxa(specimen, limit, start, orderHints, propertyPaths)); + associatedTaxa.addAll(listDeterminedTaxa(specimen, includeUnpublished, limit, start, orderHints, propertyPaths)); return associatedTaxa; } + + /** + * {@inheritDoc} + */ + @Override + public Collection> listDeterminedTaxa(SpecimenOrObservationBase specimen, Integer limit, + Integer start, List orderHints, List propertyPaths) { + return listDeterminedTaxa(specimen, INCLUDE_UNPUBLISHED, limit, start, orderHints, propertyPaths); + } @Override - public Collection> listDeterminedTaxa(SpecimenOrObservationBase specimen, Integer limit, Integer start, + public Collection> listDeterminedTaxa(SpecimenOrObservationBase specimen, boolean includeUnpublished, Integer limit, Integer start, List orderHints, List propertyPaths) { - Collection> associatedTaxa = new HashSet>(); + Collection> associatedTaxa = new HashSet<>(); for (DeterminationEvent determinationEvent : listDeterminationEvents(specimen, limit, start, orderHints, propertyPaths)) { if(determinationEvent.getIdentifiedUnit().equals(specimen)){ if(determinationEvent.getTaxon()!=null){ - associatedTaxa.add(determinationEvent.getTaxon()); + associatedTaxa.add(taxonService.load(determinationEvent.getTaxon().getUuid(), includeUnpublished, propertyPaths)); } if(determinationEvent.getTaxonName()!=null){ - associatedTaxa.addAll(determinationEvent.getTaxonName().getTaxonBases()); + Collection taxonBases = determinationEvent.getTaxonName().getTaxonBases(); + for (TaxonBase taxonBase : taxonBases) { + associatedTaxa.add(taxonService.load(taxonBase.getUuid(), includeUnpublished, propertyPaths)); + } } } } return associatedTaxa; } + /** + * {@inheritDoc} + */ @Override public Collection> listTypeDesignationTaxa(DerivedUnit specimen, Integer limit, Integer start, List orderHints, List propertyPaths) { - Collection> associatedTaxa = new HashSet>(); + return listTypeDesignationTaxa(specimen, INCLUDE_UNPUBLISHED, limit, start, orderHints, propertyPaths); + } + @Override + public Collection> listTypeDesignationTaxa(DerivedUnit specimen, boolean includeUnpublished, + Integer limit, Integer start, List orderHints, List propertyPaths) { + Collection> associatedTaxa = new HashSet<>(); for (SpecimenTypeDesignation typeDesignation : listTypeDesignations(specimen, limit, start, orderHints, propertyPaths)) { if(typeDesignation.getTypeSpecimen().equals(specimen)){ - Set typifiedNames = typeDesignation.getTypifiedNames(); - for (TaxonNameBase taxonNameBase : typifiedNames) { - associatedTaxa.addAll(taxonNameBase.getTaxa()); + Set typifiedNames = typeDesignation.getTypifiedNames(); + for (TaxonName taxonName : typifiedNames) { + Set taxa = taxonName.getTaxa(); + for (Taxon taxon : taxa) { + associatedTaxa.add(taxonService.load(taxon.getUuid(), includeUnpublished, propertyPaths)); + } } } } return associatedTaxa; } + /** + * {@inheritDoc} + */ @Override - public Collection> listIndividualsAssociationTaxa(SpecimenOrObservationBase specimen, Integer limit, Integer start, - List orderHints, List propertyPaths) { - Collection> associatedTaxa = new HashSet>(); - for (IndividualsAssociation individualsAssociation : listIndividualsAssociations(specimen, limit, start, orderHints, propertyPaths)) { + public Collection> listIndividualsAssociationTaxa(SpecimenOrObservationBase specimen, Integer limit, + Integer start, List orderHints, List propertyPaths) { + return listIndividualsAssociationTaxa(specimen, INCLUDE_UNPUBLISHED, limit, start, orderHints, propertyPaths); + } + + @Override + public Collection> listIndividualsAssociationTaxa(SpecimenOrObservationBase specimen, boolean includeUnpublished, + Integer limit, Integer start, List orderHints, List propertyPaths) { + Collection> associatedTaxa = new HashSet<>(); + for (IndividualsAssociation individualsAssociation : listIndividualsAssociations(specimen, null, null, null, null)) { if(individualsAssociation.getInDescription().isInstanceOf(TaxonDescription.class)){ TaxonDescription taxonDescription = HibernateProxyHelper.deproxy(individualsAssociation.getInDescription(), TaxonDescription.class); if(taxonDescription.getTaxon()!=null){ - associatedTaxa.add(taxonDescription.getTaxon()); + associatedTaxa.add(taxonService.load(taxonDescription.getTaxon().getUuid(), includeUnpublished, propertyPaths)); } } } @@ -1369,7 +1505,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase> listTypeDesignations( Collection specimens, Integer limit, Integer start, List orderHints, List propertyPaths) { - Map> typeDesignationMap = new HashMap>(); + Map> typeDesignationMap = new HashMap<>(); for (DerivedUnit specimen : specimens) { Collection typeDesignations = listTypeDesignations(specimen, limit, start, orderHints, propertyPaths); typeDesignationMap.put(specimen, typeDesignations); @@ -1396,7 +1532,7 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase(); + return new ArrayList<>(); } } @@ -1413,68 +1549,141 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase findByTitle( - IIdentifiableEntityServiceConfigurator config) { + public long countByTitle(IIdentifiableEntityServiceConfigurator config){ if (config instanceof FindOccurrencesConfigurator) { FindOccurrencesConfigurator occurrenceConfig = (FindOccurrencesConfigurator) config; - List occurrences = new ArrayList(); Taxon taxon = null; if(occurrenceConfig.getAssociatedTaxonUuid()!=null){ - TaxonBase taxonBase = taxonService.load(occurrenceConfig.getAssociatedTaxonUuid()); + TaxonBase taxonBase = taxonService.load(occurrenceConfig.getAssociatedTaxonUuid()); if(taxonBase.isInstanceOf(Taxon.class)){ taxon = HibernateProxyHelper.deproxy(taxonBase, Taxon.class); } } - TaxonNameBase taxonName = null; + TaxonName taxonName = null; if(occurrenceConfig.getAssociatedTaxonNameUuid()!=null){ taxonName = nameService.load(occurrenceConfig.getAssociatedTaxonNameUuid()); } - occurrences.addAll(dao.findOccurrences(occurrenceConfig.getClazz(), + /*TODO: #6484 Neither isRetrieveIndirectlyAssociatedSpecimens() nor the AssignmentStatus + * is currently reflected in the HQL query. So using these in the count method will + * significantly slow down this method as we have to retreive the entities instead of + * the just the amount. + */ + if(occurrenceConfig.isRetrieveIndirectlyAssociatedSpecimens() || !occurrenceConfig.getAssignmentStatus().equals(AssignmentStatus.ALL_SPECIMENS)){ + List occurrences = new ArrayList<>(); + occurrences.addAll(dao.findOccurrences(occurrenceConfig.getClazz(), + occurrenceConfig.getTitleSearchStringSqlized(), occurrenceConfig.getSignificantIdentifier(), + occurrenceConfig.getSpecimenType(), taxon, taxonName, occurrenceConfig.getMatchMode(), null, null, + occurrenceConfig.getOrderHints(), occurrenceConfig.getPropertyPaths())); + occurrences = filterOccurencesByAssignmentAndHierarchy(occurrenceConfig, occurrences, taxon, taxonName); + return occurrences.size(); + } + + return dao.countOccurrences(occurrenceConfig.getClazz(), + occurrenceConfig.getTitleSearchStringSqlized(), occurrenceConfig.getSignificantIdentifier(), + occurrenceConfig.getSpecimenType(), taxon, taxonName, occurrenceConfig.getMatchMode(), null, null, + occurrenceConfig.getOrderHints(), occurrenceConfig.getPropertyPaths()); + } + else{ + return super.countByTitle(config); + } + } + + @Override + public Pager> findByTitleUuidAndTitleCache( + FindOccurrencesConfigurator config){ + List> occurrences = new ArrayList<>(); + Taxon taxon = null; + if(config.getAssociatedTaxonUuid()!=null){ + TaxonBase taxonBase = taxonService.load(config.getAssociatedTaxonUuid()); + if(taxonBase.isInstanceOf(Taxon.class)){ + taxon = CdmBase.deproxy(taxonBase, Taxon.class); + } + } + TaxonName taxonName = null; + if(config.getAssociatedTaxonNameUuid()!=null){ + taxonName = nameService.load(config.getAssociatedTaxonNameUuid()); + } + occurrences.addAll(dao.findOccurrencesUuidAndTitleCache(config.getClazz(), + config.getTitleSearchString(), config.getSignificantIdentifier(), + config.getSpecimenType(), taxon, taxonName, config.getMatchMode(), null, null, + config.getOrderHints())); + + return new DefaultPagerImpl<>(config.getPageNumber(), occurrences.size(), config.getPageSize(), occurrences); + } + + @Override + public Pager findByTitle( + IIdentifiableEntityServiceConfigurator config) { + if (config instanceof FindOccurrencesConfigurator) { + FindOccurrencesConfigurator occurrenceConfig = (FindOccurrencesConfigurator) config; + List occurrences = new ArrayList<>(); + Taxon taxon = null; + if(occurrenceConfig.getAssociatedTaxonUuid()!=null){ + TaxonBase taxonBase = taxonService.load(occurrenceConfig.getAssociatedTaxonUuid()); + if(taxonBase.isInstanceOf(Taxon.class)){ + taxon = HibernateProxyHelper.deproxy(taxonBase, Taxon.class); + } + } + TaxonName taxonName = null; + if(occurrenceConfig.getAssociatedTaxonNameUuid()!=null){ + taxonName = nameService.load(occurrenceConfig.getAssociatedTaxonNameUuid()); + } + List foundOccurrences = dao.findOccurrences(occurrenceConfig.getClazz(), occurrenceConfig.getTitleSearchString(), occurrenceConfig.getSignificantIdentifier(), occurrenceConfig.getSpecimenType(), taxon, taxonName, occurrenceConfig.getMatchMode(), null, null, - occurrenceConfig.getOrderHints(), occurrenceConfig.getPropertyPaths())); - //filter out (un-)assigned specimens - if(taxon==null && taxonName==null){ - AssignmentStatus assignmentStatus = occurrenceConfig.getAssignmentStatus(); - List> specimenWithAssociations = new ArrayList>(); - if(!assignmentStatus.equals(AssignmentStatus.ALL_SPECIMENS)){ - for (SpecimenOrObservationBase specimenOrObservationBase : occurrences) { - Collection> associatedTaxa = listAssociatedTaxa(specimenOrObservationBase, null, null, null, null); - if(!associatedTaxa.isEmpty()){ - specimenWithAssociations.add(specimenOrObservationBase); - } + occurrenceConfig.getOrderHints(), occurrenceConfig.getPropertyPaths()); + occurrences.addAll(foundOccurrences); + occurrences = filterOccurencesByAssignmentAndHierarchy(occurrenceConfig, occurrences, taxon, taxonName); + + return new DefaultPagerImpl<>(config.getPageNumber(), occurrences.size(), config.getPageSize(), (List)occurrences); + } + return super.findByTitle(config); + } + + private List filterOccurencesByAssignmentAndHierarchy( + FindOccurrencesConfigurator occurrenceConfig, List occurrences, Taxon taxon, + TaxonName taxonName) { + //filter out (un-)assigned specimens + if(taxon==null && taxonName==null){ + AssignmentStatus assignmentStatus = occurrenceConfig.getAssignmentStatus(); + List specimenWithAssociations = new ArrayList<>(); + if(!assignmentStatus.equals(AssignmentStatus.ALL_SPECIMENS)){ + for (SpecimenOrObservationBase specimenOrObservationBase : occurrences) { + boolean includeUnpublished = true; //TODO not sure if this is correct, maybe we have to propagate publish flag to higher methods. + Collection> associatedTaxa = listAssociatedTaxa(specimenOrObservationBase, + includeUnpublished, null, null, null, null); + if(!associatedTaxa.isEmpty()){ + specimenWithAssociations.add(specimenOrObservationBase); } } - if(assignmentStatus.equals(AssignmentStatus.UNASSIGNED_SPECIMENS)){ - occurrences.removeAll(specimenWithAssociations); - } - if(assignmentStatus.equals(AssignmentStatus.ASSIGNED_SPECIMENS)){ - occurrences = new ArrayList(specimenWithAssociations); - } } - // indirectly associated specimens - List indirectlyAssociatedOccurrences = new ArrayList(occurrences); - if(occurrenceConfig.isRetrieveIndirectlyAssociatedSpecimens()){ - for (SpecimenOrObservationBase specimen : occurrences) { - List> allHierarchyDerivates = getAllHierarchyDerivatives(specimen); - for (SpecimenOrObservationBase specimenOrObservationBase : allHierarchyDerivates) { - if(!occurrences.contains(specimenOrObservationBase)){ - indirectlyAssociatedOccurrences.add(specimenOrObservationBase); - } + if(assignmentStatus.equals(AssignmentStatus.UNASSIGNED_SPECIMENS)){ + occurrences.removeAll(specimenWithAssociations); + } + if(assignmentStatus.equals(AssignmentStatus.ASSIGNED_SPECIMENS)){ + occurrences = new ArrayList<>(specimenWithAssociations); + } + } + // indirectly associated specimens + if(occurrenceConfig.isRetrieveIndirectlyAssociatedSpecimens()){ + List indirectlyAssociatedOccurrences = new ArrayList<>(occurrences); + for (SpecimenOrObservationBase specimen : occurrences) { + List> allHierarchyDerivates = getAllHierarchyDerivatives(specimen); + for (SpecimenOrObservationBase specimenOrObservationBase : allHierarchyDerivates) { + if(!occurrences.contains(specimenOrObservationBase)){ + indirectlyAssociatedOccurrences.add(specimenOrObservationBase); } } - occurrences = indirectlyAssociatedOccurrences; } - - return new DefaultPagerImpl(config.getPageNumber(), occurrences.size(), config.getPageSize(), occurrences); + occurrences = indirectlyAssociatedOccurrences; } - return super.findByTitle(config); + return occurrences; } @Override public List> getAllHierarchyDerivatives(SpecimenOrObservationBase specimen){ - List> allHierarchyDerivatives = new ArrayList>(); - Collection fieldUnits = getFieldUnits(specimen.getUuid()); + List> allHierarchyDerivatives = new ArrayList<>(); + Collection fieldUnits = findFieldUnits(specimen.getUuid(), null); if(fieldUnits.isEmpty()){ allHierarchyDerivatives.add(specimen); allHierarchyDerivatives.addAll(getAllChildDerivatives(specimen)); @@ -1495,7 +1704,10 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase getAllChildDerivatives(SpecimenOrObservationBase specimen){ - List childDerivate = new ArrayList(); + if (specimen == null){ + return null; + } + List childDerivate = new ArrayList<>(); Set derivationEvents = specimen.getDerivationEvents(); for (DerivationEvent derivationEvent : derivationEvents) { Set derivatives = derivationEvent.getDerivatives(); @@ -1508,8 +1720,25 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase config){ - return findByTitle(config).getRecords().size(); + public long countOccurrences(IIdentifiableEntityServiceConfigurator config){ + return countByTitle(config); } + /** + * {@inheritDoc} + */ + @Override + public List findFieldUnitsForGatheringEvent(UUID gatheringEventUuid) { + return dao.findFieldUnitsForGatheringEvent(gatheringEventUuid, null, null, null, null); + } + + + /** + * {@inheritDoc} + */ + @Override + public List findPointsForFieldUnitList(List fieldUnitUuids) { + + return dao.findPointsForFieldUnitList(fieldUnitUuids); + } }