Project

General

Profile

Download (15.8 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2007 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10

    
11
package eu.etaxonomy.cdm.api.service;
12

    
13
import java.util.ArrayList;
14
import java.util.Collection;
15
import java.util.Collections;
16
import java.util.Comparator;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.TreeMap;
20
import java.util.UUID;
21

    
22
import org.apache.log4j.Logger;
23
import org.springframework.beans.factory.annotation.Autowired;
24
import org.springframework.stereotype.Service;
25
import org.springframework.transaction.annotation.Transactional;
26

    
27
import eu.etaxonomy.cdm.api.service.pager.Pager;
28
import eu.etaxonomy.cdm.api.service.pager.PagerUtils;
29
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
30
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
31
import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;
32
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
33
import eu.etaxonomy.cdm.model.description.TaxonDescription;
34
import eu.etaxonomy.cdm.model.media.Media;
35
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
36
import eu.etaxonomy.cdm.model.media.MediaUtils;
37
import eu.etaxonomy.cdm.model.name.Rank;
38
import eu.etaxonomy.cdm.model.taxon.Classification;
39
import eu.etaxonomy.cdm.model.taxon.ITaxonNodeComparator;
40
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
41
import eu.etaxonomy.cdm.model.taxon.Taxon;
42
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
43
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer;
44
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;
45
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
46
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao;
47
import eu.etaxonomy.cdm.persistence.query.OrderHint;
48
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
49

    
50
/**
51
 * @author n.hoffmann
52
 * @created Sep 21, 2009
53
 */
54
@Service
55
@Transactional(readOnly = true)
56
public class ClassificationServiceImpl extends IdentifiableServiceBase<Classification, IClassificationDao> implements IClassificationService {
57
    private static final Logger logger = Logger.getLogger(ClassificationServiceImpl.class);
58

    
59
    @Autowired
60
    private ITaxonNodeDao taxonNodeDao;
61

    
62
    @Autowired
63
    private ITaxonDao taxonDao;
64

    
65
    @Autowired
66
    private IBeanInitializer defaultBeanInitializer;
67

    
68

    
69
    /* (non-Javadoc)
70
     * @see eu.etaxonomy.cdm.api.service.ServiceBase#setDao(eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao)
71
     */
72
    @Override
73
    @Autowired
74
    protected void setDao(IClassificationDao dao) {
75
        this.dao = dao;
76
    }
77

    
78
    private Comparator<? super TaxonNode> taxonNodeComparator;
79

    
80
    @Autowired
81
    public void setTaxonNodeComparator(ITaxonNodeComparator<? super TaxonNode> taxonNodeComparator){
82
        this.taxonNodeComparator = (Comparator<? super TaxonNode>) taxonNodeComparator;
83
    }
84

    
85

    
86
    /*
87
     * (non-Javadoc)
88
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadTaxonNodeByTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, java.util.UUID, java.util.List)
89
     */
90
    @Override
91
    public TaxonNode loadTaxonNodeByTaxon(Taxon taxon, UUID classificationUuid, List<String> propertyPaths){
92
        Classification tree = dao.load(classificationUuid);
93
        TaxonNode node = tree.getNode(taxon);
94

    
95
        return loadTaxonNode(node.getUuid(), propertyPaths);
96
    }
97

    
98
    @Override
99
    @Deprecated // use loadTaxonNode(UUID, List<String>) instead
100
    public TaxonNode loadTaxonNode(TaxonNode taxonNode, List<String> propertyPaths){
101
        return taxonNodeDao.load(taxonNode.getUuid(), propertyPaths);
102
    }
103

    
104
    public TaxonNode loadTaxonNode(UUID taxonNodeUuid, List<String> propertyPaths){
105
        return taxonNodeDao.load(taxonNodeUuid, propertyPaths);
106
    }
107

    
108
    /*
109
     * (non-Javadoc)
110
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadRankSpecificRootNodes(eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
111
     */
112
    @Override
113
    @Deprecated
114
    public List<TaxonNode> loadRankSpecificRootNodes(Classification classification, Rank rank, Integer limit, Integer start, List<String> propertyPaths){
115

    
116
        List<TaxonNode> rootNodes = dao.loadRankSpecificRootNodes(classification, rank, limit , start, propertyPaths);
117

    
118
        //sort nodes by TaxonName
119
        Collections.sort(rootNodes, taxonNodeComparator);
120

    
121
        // initialize all nodes
122
        defaultBeanInitializer.initializeAll(rootNodes, propertyPaths);
123

    
124
        return rootNodes;
125
    }
126

    
127
    /* (non-Javadoc)
128
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#listRankSpecificRootNodes(eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.model.name.Rank, java.lang.Integer, java.lang.Integer, java.util.List)
129
     */
130
    @Override
131
    public List<TaxonNode> listRankSpecificRootNodes(Classification classification, Rank rank, Integer pageSize,
132
            Integer pageIndex, List<String> propertyPaths) {
133
        return pageRankSpecificRootNodes(classification, rank, pageSize, pageIndex, propertyPaths).getRecords();
134
    }
135

    
136
    /* (non-Javadoc)
137
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#pageRankSpecificRootNodes(eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.model.name.Rank, java.lang.Integer, java.lang.Integer, java.util.List)
138
     */
139
    @Override
140
    public Pager<TaxonNode> pageRankSpecificRootNodes(Classification classification, Rank rank, Integer pageSize,
141
            Integer pageIndex, List<String> propertyPaths) {
142
        Long numberOfResults = dao.countRankSpecificRootNodes(classification, rank);
143

    
144
        List<TaxonNode> results = new ArrayList<TaxonNode>();
145
        if (numberOfResults > 0) { // no point checking again
146

    
147
            results = dao.loadRankSpecificRootNodes(classification, rank, PagerUtils.limitFor(pageSize),
148
                    PagerUtils.startFor(pageSize, pageIndex), propertyPaths);
149
        }
150

    
151
        Collections.sort(results, taxonNodeComparator); // FIXME this is only a HACK, order during the hibernate query in the dao
152
        return new DefaultPagerImpl<TaxonNode>(pageIndex, numberOfResults.intValue(), pageSize, results);
153

    
154
    }
155

    
156
    /**
157
     * (non-Javadoc)
158
     * @see eu.etaxonomy.cdm.api.service.ITaxonService#loadTreeBranchTo(eu.etaxonomy.cdm.model.taxon.TaxonNode, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
159
     * FIXME Candidate for harmonization
160
     * move to classification service
161
     */
162
    @Override
163
    public List<TaxonNode> loadTreeBranch(TaxonNode taxonNode, Rank baseRank, List<String> propertyPaths){
164

    
165
        TaxonNode thisNode = taxonNodeDao.load(taxonNode.getUuid(), propertyPaths);
166
        List<TaxonNode> pathToRoot = new ArrayList<TaxonNode>();
167
        pathToRoot.add(thisNode);
168

    
169
        TaxonNode parentNode = thisNode.getParent();
170
        while(parentNode != null){
171
            TaxonNode parent = parentNode;
172
            Rank parentNodeRank = parent.getTaxon().getName().getRank();
173
            // stop if the next parent is higher than the baseRank
174
            if(baseRank != null && baseRank.isLower(parentNodeRank)){
175
                break;
176
            }
177
            pathToRoot.add(parentNode);
178
            parentNode = parentNode.getParent();
179
        }
180

    
181
        // initialize and invert order of nodes in list
182
        defaultBeanInitializer.initializeAll(pathToRoot, propertyPaths);
183
        Collections.reverse(pathToRoot);
184

    
185
        return pathToRoot;
186
    }
187

    
188
    /*
189
     * (non-Javadoc)
190
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadTreeBranchToTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
191
     */
192
    @Override
193
    public List<TaxonNode> loadTreeBranchToTaxon(Taxon taxon, Classification classification, Rank baseRank, List<String> propertyPaths){
194
        Classification tree = dao.load(classification.getUuid());
195
        taxon = (Taxon) taxonDao.load(taxon.getUuid());
196
        TaxonNode node = tree.getNode(taxon);
197
        if(node == null){
198
            logger.warn("The specified taxon is not found in the given tree.");
199
            return null;
200
        }
201
        return loadTreeBranch(node, baseRank, propertyPaths);
202
    }
203

    
204

    
205
    /* (non-Javadoc)
206
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadChildNodesOfTaxon(eu.etaxonomy.cdm.model.taxon.TaxonNode, java.util.List)
207
     */
208
    @Override
209
    public List<TaxonNode> loadChildNodesOfTaxonNode(TaxonNode taxonNode,
210
            List<String> propertyPaths) {
211
        taxonNode = taxonNodeDao.load(taxonNode.getUuid());
212
        List<TaxonNode> childNodes = new ArrayList<TaxonNode>(taxonNode.getChildNodes());
213
        defaultBeanInitializer.initializeAll(childNodes, propertyPaths);
214
        Collections.sort(childNodes, taxonNodeComparator);
215
        return childNodes;
216
    }
217

    
218
    /*
219
     * (non-Javadoc)
220
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadChildNodesOfTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.Classification, java.util.List)
221
     */
222
    @Override
223
    public List<TaxonNode> loadChildNodesOfTaxon(Taxon taxon, Classification classification, List<String> propertyPaths){
224
        Classification tree = dao.load(classification.getUuid());
225
        taxon = (Taxon) taxonDao.load(taxon.getUuid());
226

    
227
        TaxonNode node = tree.getNode(taxon);
228
        if(node != null){
229
            return loadChildNodesOfTaxonNode(node, propertyPaths);
230
        } else {
231
            return null;
232
        }
233
    }
234

    
235

    
236

    
237
    /*
238
     * (non-Javadoc)
239
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#getTaxonNodeByUuid(java.util.UUID)
240
     */
241
    @Override
242
    public TaxonNode getTaxonNodeByUuid(UUID uuid) {
243
        return taxonNodeDao.findByUuid(uuid);
244
    }
245

    
246
    /*
247
     * (non-Javadoc)
248
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#getTreeNodeByUuid(java.util.UUID)
249
     */
250
    @Override
251
    public ITaxonTreeNode getTreeNodeByUuid(UUID uuid){
252
        ITaxonTreeNode treeNode = taxonNodeDao.findByUuid(uuid);
253
        if(treeNode == null){
254
            treeNode = dao.findByUuid(uuid);
255
        }
256

    
257
        return treeNode;
258
    }
259

    
260
    /* (non-Javadoc)
261
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#listClassifications(java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
262
     */
263
    @Override
264
    public List<Classification> listClassifications(Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {
265
        return dao.list(limit, start, orderHints, propertyPaths);
266
    }
267

    
268
    /* (non-Javadoc)
269
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#removeTaxonNode(eu.etaxonomy.cdm.model.taxon.Classification)
270
     */
271
    @Override
272
    public UUID removeTaxonNode(TaxonNode taxonNode) {
273
        return taxonNodeDao.delete(taxonNode);
274
    }
275
    /* (non-Javadoc)
276
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#removeTreeNode(eu.etaxonomy.cdm.model.taxon.ITreeNode)
277
     */
278
    @Override
279
    public UUID removeTreeNode(ITaxonTreeNode treeNode) {
280
        if(treeNode instanceof Classification){
281
            return dao.delete((Classification) treeNode);
282
        }else if(treeNode instanceof TaxonNode){
283
            return taxonNodeDao.delete((TaxonNode)treeNode);
284
        }
285
        return null;
286
    }
287
    /* (non-Javadoc)
288
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#saveTaxonNode(eu.etaxonomy.cdm.model.taxon.Classification)
289
     */
290
    @Override
291
    public UUID saveTaxonNode(TaxonNode taxonNode) {
292
        return taxonNodeDao.save(taxonNode);
293
    }
294

    
295
    /*
296
     * (non-Javadoc)
297
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#saveTaxonNodeAll(java.util.Collection)
298
     */
299
    @Override
300
    public Map<UUID, TaxonNode> saveTaxonNodeAll(
301
            Collection<TaxonNode> taxonNodeCollection) {
302
        return taxonNodeDao.saveAll(taxonNodeCollection);
303
    }
304

    
305
    /* (non-Javadoc)
306
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#saveTreeNode(eu.etaxonomy.cdm.model.taxon.ITreeNode)
307
     */
308
    @Override
309
    public UUID saveTreeNode(ITaxonTreeNode treeNode) {
310
        if(treeNode instanceof Classification){
311
            return dao.save((Classification) treeNode);
312
        }else if(treeNode instanceof TaxonNode){
313
            return taxonNodeDao.save((TaxonNode)treeNode);
314
        }
315
        return null;
316
    }
317

    
318
    @Override
319
    public List<TaxonNode> getAllNodes(){
320
        return taxonNodeDao.list(null,null);
321
    }
322

    
323
    /*
324
     * (non-Javadoc)
325
     * @see eu.etaxonomy.cdm.api.service.ITaxonService#getUuidAndTitleCacheOfAcceptedTaxa(eu.etaxonomy.cdm.model.taxon.Classification)
326
     */
327
    @Override
328
    public List<UuidAndTitleCache<TaxonNode>> getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(Classification classification) {
329
        return taxonDao.getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(classification);
330
    }
331

    
332
    /* (non-Javadoc)
333
     * @see eu.etaxonomy.cdm.api.service.IdentifiableServiceBase#getUuidAndTitleCache()
334
     */
335
    @Override
336
    public List<UuidAndTitleCache<Classification>> getUuidAndTitleCache() {
337
        return dao.getUuidAndTitleCache();
338
    }
339

    
340
    /* (non-Javadoc)
341
     * @see eu.etaxonomy.cdm.api.service.IClassificationService#getAllMediaForChildNodes(eu.etaxonomy.cdm.model.taxon.TaxonNode, java.util.List, int, int, int, java.lang.String[])
342
     */
343
    @Override
344
    public Map<UUID, List<MediaRepresentation>> getAllMediaForChildNodes(
345
            TaxonNode taxonNode, List<String> propertyPaths, int size,
346
            int height, int widthOrDuration, String[] mimeTypes) {
347

    
348
        TreeMap<UUID, List<MediaRepresentation>> result = new TreeMap<UUID, List<MediaRepresentation>>();
349
        List<Media> taxonMedia = new ArrayList<Media>();
350
        List<MediaRepresentation> mediaRepresentations = new ArrayList<MediaRepresentation>();
351

    
352
        //add all media of the children to the result map
353
        if (taxonNode != null){
354

    
355
            List<TaxonNode> nodes = new ArrayList<TaxonNode>();
356

    
357
            nodes.add(loadTaxonNode(taxonNode, propertyPaths));
358
            nodes.addAll(loadChildNodesOfTaxonNode(taxonNode, propertyPaths));
359

    
360
            if (nodes != null){
361
                for(TaxonNode node : nodes){
362
                    Taxon taxon = node.getTaxon();
363
                    for (TaxonDescription taxonDescription: taxon.getDescriptions()){
364
                        for (DescriptionElementBase descriptionElement: taxonDescription.getElements()){
365
                            for(Media media : descriptionElement.getMedia()){
366
                                taxonMedia.add(media);
367

    
368
                                //find the best matching representation
369
                                mediaRepresentations.add(MediaUtils.findBestMatchingRepresentation(media,null, size, height, widthOrDuration, mimeTypes));
370

    
371
                            }
372
                        }
373
                    }
374
                    result.put(taxon.getUuid(), mediaRepresentations);
375

    
376
                }
377
            }
378

    
379
        }
380

    
381
        return result;
382

    
383
    }
384

    
385
    @Override
386
    public Map<UUID, List<MediaRepresentation>> getAllMediaForChildNodes(Taxon taxon, Classification taxTree, List<String> propertyPaths, int size, int height, int widthOrDuration, String[] mimeTypes){
387
        TaxonNode node = taxTree.getNode(taxon);
388

    
389
        return getAllMediaForChildNodes(node, propertyPaths, size, height, widthOrDuration, mimeTypes);
390
    }
391

    
392
    /* (non-Javadoc)
393
     * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
394
     */
395
    @Override
396
    @Transactional(readOnly = false)
397
    public void updateTitleCache(Class<? extends Classification> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<Classification> cacheStrategy, IProgressMonitor monitor) {
398
        if (clazz == null){
399
            clazz = Classification.class;
400
        }
401
        super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);
402
    }
403

    
404

    
405
}
(7-7/84)