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, 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
|
}
|