Project

General

Profile

« Previous | Next » 

Revision fad21775

Added by Patrick Plitzner almost 6 years ago

ref #7095 Move specimen and description loading to service layer

View differences:

cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/WorkingSetService.java
1 1
package eu.etaxonomy.cdm.api.service;
2 2

  
3
import java.util.ArrayList;
4
import java.util.Collection;
3 5
import java.util.List;
4 6
import java.util.Map;
5 7
import java.util.Set;
6 8
import java.util.UUID;
9
import java.util.stream.Collectors;
7 10

  
11
import org.apache.log4j.Logger;
8 12
import org.springframework.beans.factory.annotation.Autowired;
9 13
import org.springframework.stereotype.Service;
10 14
import org.springframework.transaction.annotation.Transactional;
11 15

  
16
import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
17
import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
18
import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
19
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
12 20
import eu.etaxonomy.cdm.model.description.DescriptionBase;
13 21
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
14 22
import eu.etaxonomy.cdm.model.description.DescriptiveSystemRole;
15 23
import eu.etaxonomy.cdm.model.description.Feature;
16 24
import eu.etaxonomy.cdm.model.description.WorkingSet;
25
import eu.etaxonomy.cdm.model.location.NamedArea;
26
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
27
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
28
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
29
import eu.etaxonomy.cdm.model.taxon.Taxon;
30
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
31
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
17 32
import eu.etaxonomy.cdm.persistence.dao.description.IWorkingSetDao;
18 33
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
19 34

  
......
22 37
public class WorkingSetService extends
23 38
		AnnotatableServiceBase<WorkingSet, IWorkingSetDao> implements IWorkingSetService {
24 39

  
40
    private static Logger logger = Logger.getLogger(WorkingSetService.class);
41

  
42
    @Autowired
43
    private IOccurrenceService occurrenceService;
44

  
45
    @Autowired
46
    private ITaxonNodeService taxonNodeService;
47

  
25 48
	@Override
26 49
	@Autowired
27 50
	protected void setDao(IWorkingSetDao dao) {
......
44 67
    public List<UuidAndTitleCache<WorkingSet>> getWorkingSetUuidAndTitleCache(Integer limitOfInitialElements, String pattern) {
45 68
        return dao.getWorkingSetUuidAndTitleCache( limitOfInitialElements, pattern);
46 69
    }
70

  
71
	@Override
72
	public Collection<RowWrapperDTO> getRowWrapper(WorkingSet workingSet) {
73
	    return workingSet.getDescriptions().stream()
74
	            .map(description->createRowWrapper(null, description, workingSet))
75
	            .collect(Collectors.toList());
76
	}
77

  
78
    @Override
79
    public Collection<RowWrapperDTO> loadSpecimens(WorkingSet workingSet){
80
        List<RowWrapperDTO> specimenCache = new ArrayList<>();
81
        //set filter parameters
82
        TaxonNodeFilter filter = TaxonNodeFilter.NewRankInstance(workingSet.getMinRank(), workingSet.getMaxRank());
83
        workingSet.getGeoFilter().forEach(area -> filter.orArea(area.getUuid()));
84
        workingSet.getTaxonSubtreeFilter().forEach(node -> filter.orSubtree(node));
85
        filter.setIncludeUnpublished(true);
86

  
87
        List<UUID> filteredNodes = taxonNodeService.uuidList(filter);
88
        for (UUID uuid : filteredNodes) {
89
            //TODO implement occurrence service for taxon nodes
90
            // let it return UuidAndTitleCache
91
            TaxonNode taxonNode = taxonNodeService.load(uuid);
92
            Taxon taxon = taxonNode.getTaxon();
93
            if(taxon!=null){
94
                FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
95
                config.setAssociatedTaxonUuid(taxon.getUuid());
96
                List<SpecimenOrObservationBase> specimensForTaxon = occurrenceService.findByTitle(config).getRecords();
97
                specimensForTaxon.forEach(specimen -> specimenCache.add(createRowWrapper(specimen, null, workingSet)));
98
            }
99
        }
100
        return specimenCache;
101
    }
102

  
103
	private RowWrapperDTO createRowWrapper(SpecimenOrObservationBase specimen, DescriptionBase description, WorkingSet workingSet){
104
	    if(description!=null){
105
	        specimen = description.getDescribedSpecimenOrObservation();
106
	    }
107
        TaxonNode taxonNode = null;
108
        FieldUnit fieldUnit = null;
109
        String identifier = null;
110
        NamedArea country = null;
111
        //supplemental information
112
        if(specimen!=null){
113
            Collection<TaxonBase<?>> associatedTaxa = occurrenceService.listAssociatedTaxa(specimen, null, null, null, null);
114
            if(associatedTaxa!=null){
115
                //FIXME: what about multiple associated taxa
116
                Set<TaxonNode> taxonSubtreeFilter = workingSet.getTaxonSubtreeFilter();
117
                if(taxonSubtreeFilter!=null && !taxonSubtreeFilter.isEmpty()){
118
                    taxonNode = ((Taxon) associatedTaxa.iterator().next()).getTaxonNode(taxonSubtreeFilter.iterator().next().getClassification());
119
                }
120
            }
121
            Collection<FieldUnit> fieldUnits = occurrenceService.getFieldUnits(specimen.getUuid());
122
            if(fieldUnits.size()!=1){
123
                logger.error("More than one or no field unit found for specimen"); //$NON-NLS-1$
124
            }
125
            else{
126
                fieldUnit = fieldUnits.iterator().next();
127
            }
128
            if(specimen instanceof DerivedUnit){
129
                identifier = occurrenceService.getMostSignificantIdentifier(HibernateProxyHelper.deproxy(specimen, DerivedUnit.class));
130
            }
131
            if(fieldUnit!=null && fieldUnit.getGatheringEvent()!=null){
132
                country = fieldUnit.getGatheringEvent().getCountry();
133
            }
134
        }
135
        return new RowWrapperDTO(description, taxonNode, fieldUnit, identifier, country);
136
	}
47 137
}

Also available in: Unified diff