Project

General

Profile

Download (7.51 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.dto.RowWrapperDTO;
18
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
19
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
20
import eu.etaxonomy.cdm.common.monitor.RemotingProgressMonitorThread;
21
import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
22
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
23
import eu.etaxonomy.cdm.model.description.DescriptionBase;
24
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
25
import eu.etaxonomy.cdm.model.description.DescriptiveSystemRole;
26
import eu.etaxonomy.cdm.model.description.Feature;
27
import eu.etaxonomy.cdm.model.description.WorkingSet;
28
import eu.etaxonomy.cdm.model.location.NamedArea;
29
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
30
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
31
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
32
import eu.etaxonomy.cdm.model.taxon.Taxon;
33
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
34
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
35
import eu.etaxonomy.cdm.persistence.dao.description.IWorkingSetDao;
36
import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper;
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, null, workingSet));
104
            monitor.worked(1);
105
        }
106
	    return wrappers;
107
	}
108

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

    
117
        List<UUID> filteredNodes = taxonNodeService.uuidList(filter);
118
        return occurrenceService.listUuidAndTitleCacheByAssociatedTaxon(filteredNodes, null, null);
119
    }
120

    
121
    @Override
122
    public RowWrapperDTO createRowWrapper(DescriptionBase description, WorkingSet workingSet){
123
        return createRowWrapper(null, description, null, workingSet);
124
    }
125

    
126
    @Override
127
    public RowWrapperDTO createRowWrapper(SpecimenOrObservationBase specimen, WorkingSet workingSet){
128
        return createRowWrapper(specimen, null, null, workingSet);
129
    }
130

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