Revision 0979f889
Added by Andreas Kohlbecker over 3 years ago
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java | ||
---|---|---|
49 | 49 |
import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator; |
50 | 50 |
import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator; |
51 | 51 |
import eu.etaxonomy.cdm.api.service.dto.DNASampleDTO; |
52 |
import eu.etaxonomy.cdm.api.service.dto.DerivateDTO;
|
|
52 |
import eu.etaxonomy.cdm.api.service.dto.SpecimenOrObservationBaseDTO;
|
|
53 | 53 |
import eu.etaxonomy.cdm.api.service.dto.DerivateDataDTO; |
54 | 54 |
import eu.etaxonomy.cdm.api.service.dto.DerivateDataDTO.ContigFile; |
55 | 55 |
import eu.etaxonomy.cdm.api.service.dto.DerivateDataDTO.Link; |
56 | 56 |
import eu.etaxonomy.cdm.api.service.dto.DerivateDataDTO.MolecularData; |
57 | 57 |
import eu.etaxonomy.cdm.api.service.dto.FieldUnitDTO; |
58 |
import eu.etaxonomy.cdm.api.service.dto.PreservedSpecimenDTO;
|
|
58 |
import eu.etaxonomy.cdm.api.service.dto.DerivedUnitDTO;
|
|
59 | 59 |
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException; |
60 | 60 |
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService; |
61 | 61 |
import eu.etaxonomy.cdm.api.service.pager.Pager; |
... | ... | |
464 | 464 |
collectionToCountMap.put(collection, herbariumCount + 1); |
465 | 465 |
} |
466 | 466 |
if (derivedUnit.getRecordBasis().equals(SpecimenOrObservationType.PreservedSpecimen)) { |
467 |
PreservedSpecimenDTO preservedSpecimenDTO = assemblePreservedSpecimenDTO(derivedUnit, fieldUnitDTO);
|
|
467 |
DerivedUnitDTO preservedSpecimenDTO = assemblePreservedSpecimenDTO(derivedUnit, fieldUnitDTO);
|
|
468 | 468 |
fieldUnitDTO.addDerivate(preservedSpecimenDTO); |
469 | 469 |
fieldUnitDTO.setHasCharacterData(fieldUnitDTO.isHasCharacterData() || preservedSpecimenDTO.isHasCharacterData()); |
470 | 470 |
fieldUnitDTO.setHasDetailImage(fieldUnitDTO.isHasDetailImage() || preservedSpecimenDTO.isHasDetailImage()); |
... | ... | |
514 | 514 |
} |
515 | 515 |
|
516 | 516 |
@Override |
517 |
public PreservedSpecimenDTO assemblePreservedSpecimenDTO(DerivedUnit derivedUnit) {
|
|
517 |
public DerivedUnitDTO assemblePreservedSpecimenDTO(DerivedUnit derivedUnit) {
|
|
518 | 518 |
return assemblePreservedSpecimenDTO(derivedUnit, null); |
519 | 519 |
} |
520 | 520 |
|
... | ... | |
532 | 532 |
return null; |
533 | 533 |
} |
534 | 534 |
|
535 |
public PreservedSpecimenDTO assemblePreservedSpecimenDTO(DerivedUnit derivedUnit, FieldUnitDTO fieldUnitDTO) {
|
|
535 |
public DerivedUnitDTO assemblePreservedSpecimenDTO(DerivedUnit derivedUnit, FieldUnitDTO fieldUnitDTO) {
|
|
536 | 536 |
if (!getSession().contains(derivedUnit)) { |
537 | 537 |
derivedUnit = (DerivedUnit) load(derivedUnit.getUuid()); |
538 | 538 |
} |
539 |
PreservedSpecimenDTO preservedSpecimenDTO = new PreservedSpecimenDTO(derivedUnit);
|
|
539 |
DerivedUnitDTO preservedSpecimenDTO = new DerivedUnitDTO(derivedUnit);
|
|
540 | 540 |
|
541 | 541 |
//specimen identifier |
542 | 542 |
FormatKey collectionKey = FormatKey.COLLECTION_CODE; |
... | ... | |
626 | 626 |
return preservedSpecimenDTO; |
627 | 627 |
} |
628 | 628 |
|
629 |
private DerivateDataDTO assembleDerivateDataDTO(DerivateDTO derivateDTO, SpecimenOrObservationBase<?> specimenOrObservation) {
|
|
629 |
private DerivateDataDTO assembleDerivateDataDTO(SpecimenOrObservationBaseDTO derivateDTO, SpecimenOrObservationBase<?> specimenOrObservation) {
|
|
630 | 630 |
DerivateDataDTO derivateDataDTO = new DerivateDataDTO(); |
631 | 631 |
Collection<DerivedUnit> childDerivates = getDerivedUnitsFor(specimenOrObservation); |
632 | 632 |
for (DerivedUnit childDerivate : childDerivates) { |
... | ... | |
691 | 691 |
derivateDataDTO.addSpecimenScanUuid(media.getMediaSpecimen().getUuid()); |
692 | 692 |
derivateDTO.setHasSpecimenScan(true); |
693 | 693 |
String imageLinkText = "scan"; |
694 |
if (derivateDTO instanceof PreservedSpecimenDTO && ((PreservedSpecimenDTO) derivateDTO).getAccessionNumber() != null) {
|
|
695 |
imageLinkText = ((PreservedSpecimenDTO) derivateDTO).getAccessionNumber();
|
|
694 |
if (derivateDTO instanceof DerivedUnitDTO && ((DerivedUnitDTO) derivateDTO).getAccessionNumber() != null) {
|
|
695 |
imageLinkText = ((DerivedUnitDTO) derivateDTO).getAccessionNumber();
|
|
696 | 696 |
} |
697 | 697 |
derivateDataDTO.addSpecimenScan(mediaUri, imageLinkText); |
698 | 698 |
} |
... | ... | |
747 | 747 |
return derivedUnits; |
748 | 748 |
} |
749 | 749 |
|
750 |
private Set<DerivateDTO> getDerivedUnitDTOsFor(DerivateDTO specimenDto, DerivedUnit specimen, HashMap<UUID, DerivateDTO> alreadyCollectedSpecimen) {
|
|
751 |
Set<DerivateDTO> derivedUnits = new HashSet<>();
|
|
750 |
private Set<SpecimenOrObservationBaseDTO> getDerivedUnitDTOsFor(SpecimenOrObservationBaseDTO specimenDto, DerivedUnit specimen, HashMap<UUID, SpecimenOrObservationBaseDTO> alreadyCollectedSpecimen) {
|
|
751 |
Set<SpecimenOrObservationBaseDTO> derivedUnits = new HashSet<>();
|
|
752 | 752 |
// load |
753 | 753 |
for (DerivationEvent derivationEvent : specimen.getDerivationEvents()) { |
754 | 754 |
for (DerivedUnit derivative : derivationEvent.getDerivatives()) { |
755 | 755 |
if (!alreadyCollectedSpecimen.containsKey(specimenDto.getUuid())){ |
756 |
PreservedSpecimenDTO dto;
|
|
756 |
DerivedUnitDTO dto;
|
|
757 | 757 |
if (derivative instanceof DnaSample) { |
758 | 758 |
dto = new DNASampleDTO(derivative); |
759 | 759 |
} else { |
760 |
dto = new PreservedSpecimenDTO(derivative);
|
|
760 |
dto = new DerivedUnitDTO(derivative);
|
|
761 | 761 |
} |
762 | 762 |
alreadyCollectedSpecimen.put(dto.getUuid(), dto); |
763 | 763 |
dto.addAllDerivates(getDerivedUnitDTOsFor(dto, derivative, alreadyCollectedSpecimen)); |
... | ... | |
844 | 844 |
Set<Taxon> taxa = new HashSet<>(); |
845 | 845 |
Set<Integer> occurrenceIds = new HashSet<>(); |
846 | 846 |
List<FieldUnitDTO> fieldUnitDTOs = new ArrayList<>(); |
847 |
HashMap<UUID, DerivateDTO> alreadyCollectedSpecimen = new HashMap<>();
|
|
847 |
HashMap<UUID, SpecimenOrObservationBaseDTO> alreadyCollectedSpecimen = new HashMap<>();
|
|
848 | 848 |
List<SpecimenOrObservationBase> occurrences = new ArrayList<>(); |
849 | 849 |
boolean includeUnpublished = INCLUDE_UNPUBLISHED; |
850 | 850 |
|
... | ... | |
865 | 865 |
for (SpecimenOrObservationBase<?> o : perTaxonOccurrences) { |
866 | 866 |
if (o.isInstanceOf(DerivedUnit.class)){ |
867 | 867 |
DerivedUnit derivedUnit; |
868 |
DerivateDTO derivedUnitDTO;
|
|
868 |
SpecimenOrObservationBaseDTO derivedUnitDTO;
|
|
869 | 869 |
if (o.isInstanceOf(DnaSample.class)) { |
870 | 870 |
derivedUnit = HibernateProxyHelper.deproxy(o, DnaSample.class); |
871 | 871 |
derivedUnitDTO = new DNASampleDTO(derivedUnit); |
872 | 872 |
} else { |
873 | 873 |
derivedUnit = HibernateProxyHelper.deproxy(o, DerivedUnit.class); |
874 |
derivedUnitDTO = new PreservedSpecimenDTO(derivedUnit);
|
|
874 |
derivedUnitDTO = new DerivedUnitDTO(derivedUnit);
|
|
875 | 875 |
} |
876 | 876 |
if (alreadyCollectedSpecimen.get(derivedUnitDTO.getUuid()) == null){ |
877 | 877 |
alreadyCollectedSpecimen.put(derivedUnitDTO.getUuid(), derivedUnitDTO); |
... | ... | |
896 | 896 |
List<String> propertyPaths) { |
897 | 897 |
|
898 | 898 |
DnaSample dnaSample = dao.findByGeneticAccessionNumber(accessionNumberString, propertyPaths); |
899 |
DerivateDTO derivedUnitDTO;
|
|
900 |
HashMap<UUID, DerivateDTO> alreadyCollectedSpecimen = new HashMap<>();
|
|
899 |
SpecimenOrObservationBaseDTO derivedUnitDTO;
|
|
900 |
HashMap<UUID, SpecimenOrObservationBaseDTO> alreadyCollectedSpecimen = new HashMap<>();
|
|
901 | 901 |
List<FieldUnitDTO> fieldUnitDTOs = new ArrayList<>(); |
902 | 902 |
if (dnaSample != null){ |
903 | 903 |
derivedUnitDTO = new DNASampleDTO(dnaSample); |
... | ... | |
1021 | 1021 |
|
1022 | 1022 |
@Override |
1023 | 1023 |
@Transactional(readOnly=true) |
1024 |
public FieldUnitDTO findFieldUnitDTO(DerivateDTO derivedUnitDTO, Collection<FieldUnitDTO> fieldUnits,
|
|
1025 |
HashMap<UUID, DerivateDTO> alreadyCollectedSpecimen) {
|
|
1024 |
public FieldUnitDTO findFieldUnitDTO(SpecimenOrObservationBaseDTO derivedUnitDTO, Collection<FieldUnitDTO> fieldUnits,
|
|
1025 |
HashMap<UUID, SpecimenOrObservationBaseDTO> alreadyCollectedSpecimen) {
|
|
1026 | 1026 |
//It will search recursively over all {@link DerivationEvent}s and get the "originals" ({@link SpecimenOrObservationBase}) |
1027 | 1027 |
//from which this DerivedUnit was derived until all FieldUnits are found. |
1028 | 1028 |
List<SpecimenOrObservationBase> specimens = new ArrayList<>(); |
... | ... | |
1057 | 1057 |
fieldUnits.add(fieldUnitDto); |
1058 | 1058 |
|
1059 | 1059 |
}else{ |
1060 |
DerivateDTO originalDTO;
|
|
1060 |
SpecimenOrObservationBaseDTO originalDTO;
|
|
1061 | 1061 |
if (specimen instanceof DnaSample){ |
1062 | 1062 |
originalDTO = new DNASampleDTO((DnaSample)specimen); |
1063 | 1063 |
} else { |
1064 |
originalDTO = new PreservedSpecimenDTO((DerivedUnit)specimen);
|
|
1064 |
originalDTO = new DerivedUnitDTO((DerivedUnit)specimen);
|
|
1065 | 1065 |
} |
1066 | 1066 |
originalDTO.addDerivate(derivedUnitDTO); |
1067 | 1067 |
fieldUnitDto = findFieldUnitDTO(originalDTO, fieldUnits, |
... | ... | |
1083 | 1083 |
public FieldUnitDTO loadFieldUnitDTO(UUID derivedUnitUuid) { |
1084 | 1084 |
|
1085 | 1085 |
FieldUnitDTO fieldUnitDTO = null; |
1086 |
DerivateDTO derivedUnitDTO = null;
|
|
1086 |
SpecimenOrObservationBaseDTO derivedUnitDTO = null;
|
|
1087 | 1087 |
|
1088 |
Map<UUID, DerivateDTO> cycleDetectionMap = new HashMap<>();
|
|
1088 |
Map<UUID, SpecimenOrObservationBaseDTO> cycleDetectionMap = new HashMap<>();
|
|
1089 | 1089 |
SpecimenOrObservationBase derivative = dao.load(derivedUnitUuid); |
1090 | 1090 |
if(derivative != null){ |
1091 | 1091 |
if (derivative instanceof FieldUnit){ |
... | ... | |
1093 | 1093 |
return fieldUnitDTO; |
1094 | 1094 |
} else { |
1095 | 1095 |
// must be a DerivedUnit otherwise |
1096 |
derivedUnitDTO = PreservedSpecimenDTO.fromEntity((DerivedUnit)derivative);
|
|
1096 |
derivedUnitDTO = DerivedUnitDTO.fromEntity((DerivedUnit)derivative);
|
|
1097 | 1097 |
while(true){ |
1098 | 1098 |
|
1099 |
Set<DerivateDTO> originals = originalDTOs(derivedUnitDTO.getUuid());
|
|
1099 |
Set<SpecimenOrObservationBaseDTO> originals = originalDTOs(derivedUnitDTO.getUuid());
|
|
1100 | 1100 |
|
1101 | 1101 |
if(originals.isEmpty()){ |
1102 | 1102 |
break; |
... | ... | |
1105 | 1105 |
logger.debug("The derived unit with uuid " + derivedUnitUuid + "has more than one orginal, ignoring all but the first one."); |
1106 | 1106 |
} |
1107 | 1107 |
|
1108 |
DerivateDTO originalDTO = originals.iterator().next();
|
|
1108 |
SpecimenOrObservationBaseDTO originalDTO = originals.iterator().next();
|
|
1109 | 1109 |
|
1110 | 1110 |
// cycle detection and handling |
1111 | 1111 |
if(cycleDetectionMap.containsKey(originalDTO.getUuid())){ |
... | ... | |
1118 | 1118 |
// to solve the situation for the output we remove the derivate from the more distant graph node |
1119 | 1119 |
// by removing it from the derivatives of its original |
1120 | 1120 |
// but let the derivate to be added to the original which is closer to the FieldUnit (below at originalDTO.addDerivate(derivedUnitDTO);) |
1121 |
for(DerivateDTO seenOriginal: cycleDetectionMap.values()){
|
|
1122 |
for(DerivateDTO derivateDTO : seenOriginal.getDerivates()){
|
|
1121 |
for(SpecimenOrObservationBaseDTO seenOriginal: cycleDetectionMap.values()){
|
|
1122 |
for(SpecimenOrObservationBaseDTO derivateDTO : seenOriginal.getDerivates()){
|
|
1123 | 1123 |
if(derivateDTO.equals(originalDTO)){ |
1124 | 1124 |
seenOriginal.getDerivates().remove(originalDTO); |
1125 | 1125 |
} |
... | ... | |
1156 | 1156 |
* @param originalDTO |
1157 | 1157 |
* @return |
1158 | 1158 |
*/ |
1159 |
private Set<DerivateDTO> originalDTOs(UUID derivativeUuid) {
|
|
1159 |
private Set<SpecimenOrObservationBaseDTO> originalDTOs(UUID derivativeUuid) {
|
|
1160 | 1160 |
|
1161 |
Set<DerivateDTO> dtos = new HashSet<>();
|
|
1161 |
Set<SpecimenOrObservationBaseDTO> dtos = new HashSet<>();
|
|
1162 | 1162 |
List<SpecimenOrObservationBase> specimens = dao.findOriginalsForDerivedUnit(derivativeUuid, null); |
1163 | 1163 |
for(SpecimenOrObservationBase sob : specimens){ |
1164 | 1164 |
if(sob instanceof FieldUnit) { |
1165 | 1165 |
dtos.add(FieldUnitDTO.fromEntity((FieldUnit)sob)); |
1166 | 1166 |
} else { |
1167 |
dtos.add(PreservedSpecimenDTO.fromEntity((DerivedUnit)sob));
|
|
1167 |
dtos.add(DerivedUnitDTO.fromEntity((DerivedUnit)sob));
|
|
1168 | 1168 |
} |
1169 | 1169 |
} |
1170 | 1170 |
return dtos; |
... | ... | |
1717 | 1717 |
} |
1718 | 1718 |
|
1719 | 1719 |
@Override |
1720 |
public List<PreservedSpecimenDTO> findByTitlePreservedSpecimenDTO(FindOccurrencesConfigurator config) {
|
|
1720 |
public List<DerivedUnitDTO> findByTitlePreservedSpecimenDTO(FindOccurrencesConfigurator config) {
|
|
1721 | 1721 |
Taxon taxon = null; |
1722 | 1722 |
if(config.getAssociatedTaxonUuid()!=null){ |
1723 | 1723 |
TaxonBase<?> taxonBase = taxonService.load(config.getAssociatedTaxonUuid()); |
... | ... | |
1735 | 1735 |
config.getSpecimenType(), taxon, taxonName, config.getMatchMode(), null, null, |
1736 | 1736 |
config.getOrderHints(), null)); |
1737 | 1737 |
|
1738 |
List<PreservedSpecimenDTO> dtos = new ArrayList<>();
|
|
1738 |
List<DerivedUnitDTO> dtos = new ArrayList<>();
|
|
1739 | 1739 |
occurrences.forEach(derivedUnit->dtos.add(assemblePreservedSpecimenDTO(derivedUnit))); |
1740 | 1740 |
return dtos; |
1741 | 1741 |
} |
Also available in: Unified diff
ref #9252 harmonizing SpecimenOrOberservationBase related DTOs - renaming classes