Project

General

Profile

Download (8 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
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
39

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

    
46
    private static Logger logger = Logger.getLogger(WorkingSetService.class);
47

    
48
    @Autowired
49
    private IOccurrenceService occurrenceService;
50

    
51
    @Autowired
52
    private ITaxonNodeService taxonNodeService;
53

    
54
    @Autowired
55
    private IProgressMonitorService progressMonitorService;
56

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

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

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

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

    
80

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

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

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

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

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

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

    
133
	private RowWrapperDTO createRowWrapper(SpecimenOrObservationBase specimen, DescriptionBase description, TaxonNode taxonNode, WorkingSet workingSet){
134
	    if(description!=null){
135
	        specimen = description.getDescribedSpecimenOrObservation();
136
	    }
137
        FieldUnit fieldUnit = null;
138
        String identifier = null;
139
        NamedArea country = null;
140
        //supplemental information
141
        if(specimen!=null){
142
            if(taxonNode==null){
143
                Collection<TaxonBase<?>> associatedTaxa = occurrenceService.listAssociatedTaxa(specimen, null, null, null,
144
                        Arrays.asList(new String[]{
145
                                "taxonNodes",
146
                                "taxonNodes.classification",
147
                        }));
148
                if(associatedTaxa!=null){
149
                    //FIXME: what about multiple associated taxa
150
                    Set<TaxonNode> taxonSubtreeFilter = workingSet.getTaxonSubtreeFilter();
151
                    if(taxonSubtreeFilter!=null && !taxonSubtreeFilter.isEmpty()){
152
                        Taxon taxon = HibernateProxyHelper.deproxy(associatedTaxa.iterator().next(), Taxon.class);
153
                        taxonNode = taxon.getTaxonNode(taxonSubtreeFilter.iterator().next().getClassification());
154
                    }
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

    
178
    @Override
179
    @Transactional(readOnly = false)
180
    public void updateTitleCache(Class<? extends WorkingSet> clazz, Integer stepSize,
181
            IIdentifiableEntityCacheStrategy<WorkingSet> cacheStrategy, IProgressMonitor monitor) {
182
        if (clazz == null) {
183
            clazz = WorkingSet.class;
184
        }
185
        super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);
186
    }
187

    
188
}
(105-105/105)