Project

General

Profile

Download (7.75 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.api.service;
2

    
3
import java.io.Serializable;
4
import java.util.ArrayList;
5
import java.util.Arrays;
6
import java.util.Collection;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.Set;
10
import java.util.UUID;
11

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

    
17
import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
18
import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
19
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
20
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
21
import eu.etaxonomy.cdm.common.monitor.RemotingProgressMonitorThread;
22
import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
23
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
24
import eu.etaxonomy.cdm.model.description.DescriptionBase;
25
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
26
import eu.etaxonomy.cdm.model.description.DescriptiveSystemRole;
27
import eu.etaxonomy.cdm.model.description.Feature;
28
import eu.etaxonomy.cdm.model.description.WorkingSet;
29
import eu.etaxonomy.cdm.model.location.NamedArea;
30
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
31
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
32
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
33
import eu.etaxonomy.cdm.model.taxon.Taxon;
34
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
35
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
36
import eu.etaxonomy.cdm.persistence.dao.description.IWorkingSetDao;
37
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
38

    
39
@Service
40
@Transactional(readOnly = false)
41
public class WorkingSetService extends
42
		AnnotatableServiceBase<WorkingSet, IWorkingSetDao> implements IWorkingSetService {
43

    
44
    private static Logger logger = Logger.getLogger(WorkingSetService.class);
45

    
46
    @Autowired
47
    private IOccurrenceService occurrenceService;
48

    
49
    @Autowired
50
    private ITaxonNodeService taxonNodeService;
51

    
52
    @Autowired
53
    private IProgressMonitorService progressMonitorService;
54

    
55
	@Override
56
	@Autowired
57
	protected void setDao(IWorkingSetDao dao) {
58
		this.dao = dao;
59
	}
60

    
61
	@Override
62
    public Map<DescriptionBase, Set<DescriptionElementBase>> getDescriptionElements(WorkingSet workingSet, Set<Feature> features, Integer pageSize,	Integer pageNumber,
63
			List<String> propertyPaths) {
64
		return dao.getDescriptionElements(workingSet, features, pageSize, pageNumber, propertyPaths);
65
	}
66

    
67
	@Override
68
	public <T extends DescriptionElementBase> Map<UuidAndTitleCache, Map<UUID, Set<T>>> getTaxonFeatureDescriptionElementMap(
69
			Class<T> clazz, UUID workingSetUuid, DescriptiveSystemRole role) {
70
		return dao.getTaxonFeatureDescriptionElementMap(clazz, workingSetUuid, role);
71
	}
72

    
73
	@Override
74
    public List<UuidAndTitleCache<WorkingSet>> getWorkingSetUuidAndTitleCache(Integer limitOfInitialElements, String pattern) {
75
        return dao.getWorkingSetUuidAndTitleCache( limitOfInitialElements, pattern);
76
    }
77

    
78

    
79
    @Override
80
    @Transactional
81
    public UUID monitGetRowWrapper(WorkingSet workingSet) {
82
        RemotingProgressMonitorThread monitorThread = new RemotingProgressMonitorThread() {
83
            @Override
84
            public Serializable doRun(IRemotingProgressMonitor monitor) {
85
                return getRowWrapper(workingSet, monitor);
86
            }
87
        };
88
        UUID uuid = progressMonitorService.registerNewRemotingMonitor(monitorThread);
89
        monitorThread.setPriority(3);
90
        monitorThread.start();
91
        return uuid;
92
    }
93

    
94
	@Override
95
	public ArrayList<RowWrapperDTO> getRowWrapper(WorkingSet workingSet, IProgressMonitor monitor) {
96
	    monitor.beginTask("Load row wrapper", workingSet.getDescriptions().size());
97
	    ArrayList<RowWrapperDTO> wrappers = new ArrayList<>();
98
	    Set<DescriptionBase> descriptions = workingSet.getDescriptions();
99
	    for (DescriptionBase description : descriptions) {
100
            if(monitor.isCanceled()){
101
                return new ArrayList<>();
102
            }
103
            wrappers.add(createRowWrapper(null, description, workingSet));
104
            monitor.worked(1);
105
        }
106
	    return wrappers;
107
	}
108

    
109
    @Override
110
    public Collection<RowWrapperDTO> loadSpecimens(WorkingSet workingSet){
111
        List<RowWrapperDTO> specimenCache = new ArrayList<>();
112
        //set filter parameters
113
        TaxonNodeFilter filter = TaxonNodeFilter.NewRankInstance(workingSet.getMinRank(), workingSet.getMaxRank());
114
        workingSet.getGeoFilter().forEach(area -> filter.orArea(area.getUuid()));
115
        workingSet.getTaxonSubtreeFilter().forEach(node -> filter.orSubtree(node));
116
        filter.setIncludeUnpublished(true);
117

    
118
        List<UUID> filteredNodes = taxonNodeService.uuidList(filter);
119
        for (UUID uuid : filteredNodes) {
120
            //TODO implement occurrence service for taxon nodes
121
            // let it return UuidAndTitleCache
122
            TaxonNode taxonNode = taxonNodeService.load(uuid);
123
            Taxon taxon = taxonNode.getTaxon();
124
            if(taxon!=null){
125
                FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
126
                config.setAssociatedTaxonUuid(taxon.getUuid());
127
                List<SpecimenOrObservationBase> specimensForTaxon = occurrenceService.findByTitle(config).getRecords();
128
                specimensForTaxon.forEach(specimen -> specimenCache.add(createRowWrapper(specimen, null, workingSet)));
129
            }
130
        }
131
        return specimenCache;
132
    }
133

    
134
	private RowWrapperDTO createRowWrapper(SpecimenOrObservationBase specimen, DescriptionBase description, WorkingSet workingSet){
135
	    if(description!=null){
136
	        specimen = description.getDescribedSpecimenOrObservation();
137
	    }
138
        TaxonNode taxonNode = null;
139
        FieldUnit fieldUnit = null;
140
        String identifier = null;
141
        NamedArea country = null;
142
        //supplemental information
143
        if(specimen!=null){
144
            Collection<TaxonBase<?>> associatedTaxa = occurrenceService.listAssociatedTaxa(specimen, null, null, null,
145
                    Arrays.asList(new String[]{
146
                            "taxonNodes",
147
                            "taxonNodes.classification",
148
                            }));
149
            if(associatedTaxa!=null){
150
                //FIXME: what about multiple associated taxa
151
                Set<TaxonNode> taxonSubtreeFilter = workingSet.getTaxonSubtreeFilter();
152
                if(taxonSubtreeFilter!=null && !taxonSubtreeFilter.isEmpty()){
153
                    Taxon taxon = HibernateProxyHelper.deproxy(associatedTaxa.iterator().next(), Taxon.class);
154
                    taxonNode = taxon.getTaxonNode(taxonSubtreeFilter.iterator().next().getClassification());
155
                }
156
            }
157
            Collection<FieldUnit> fieldUnits = occurrenceService.getFieldUnits(specimen.getUuid(),
158
                    Arrays.asList(new String[]{
159
                            "gatheringEvent",
160
                            "gatheringEvent.country"
161
                            }));
162
            if(fieldUnits.size()!=1){
163
                logger.error("More than one or no field unit found for specimen"); //$NON-NLS-1$
164
            }
165
            else{
166
                fieldUnit = fieldUnits.iterator().next();
167
            }
168
            if(specimen instanceof DerivedUnit){
169
                identifier = occurrenceService.getMostSignificantIdentifier(HibernateProxyHelper.deproxy(specimen, DerivedUnit.class));
170
            }
171
            if(fieldUnit!=null && fieldUnit.getGatheringEvent()!=null){
172
                country = fieldUnit.getGatheringEvent().getCountry();
173
            }
174
        }
175
        return new RowWrapperDTO(description, specimen, taxonNode, fieldUnit, identifier, country);
176
	}
177
}
(105-105/105)