3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.cdm
.api
.service
;
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
;
19 import java
.util
.TreeMap
;
20 import java
.util
.UUID
;
22 import javax
.swing
.tree
.TreeNode
;
24 import org
.apache
.log4j
.Logger
;
25 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
26 import org
.springframework
.stereotype
.Service
;
27 import org
.springframework
.transaction
.annotation
.Propagation
;
28 import org
.springframework
.transaction
.annotation
.Transactional
;
30 import eu
.etaxonomy
.cdm
.common
.IProgressMonitor
;
31 import eu
.etaxonomy
.cdm
.model
.agent
.AgentBase
;
32 import eu
.etaxonomy
.cdm
.model
.common
.UuidAndTitleCache
;
33 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
34 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
35 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
36 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
37 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
38 import eu
.etaxonomy
.cdm
.model
.media
.MediaUtils
;
39 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
40 import eu
.etaxonomy
.cdm
.model
.taxon
.ITreeNode
;
41 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
42 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
43 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
44 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
45 import eu
.etaxonomy
.cdm
.persistence
.dao
.BeanInitializer
;
46 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonDao
;
47 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonNodeDao
;
48 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.IClassificationDao
;
49 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
50 import eu
.etaxonomy
.cdm
.strategy
.cache
.common
.IIdentifiableEntityCacheStrategy
;
54 * @created Sep 21, 2009
58 @Transactional(propagation
= Propagation
.SUPPORTS
, readOnly
= true)
59 public class ClassificationServiceImpl
extends IdentifiableServiceBase
<Classification
, IClassificationDao
> implements IClassificationService
{
60 private static final Logger logger
= Logger
.getLogger(ClassificationServiceImpl
.class);
63 private ITaxonNodeDao taxonNodeDao
;
65 private ITaxonDao taxonDao
;
67 private BeanInitializer defaultBeanInitializer
;
68 private Comparator
<?
super TaxonNode
> taxonNodeComparator
;
70 public void setTaxonNodeComparator(ITaxonNodeComparator
<?
super TaxonNode
> taxonNodeComparator
){
71 this.taxonNodeComparator
= (Comparator
<?
super TaxonNode
>) taxonNodeComparator
;
77 * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadTaxonNodeByTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, java.util.UUID, java.util.List)
79 public TaxonNode
loadTaxonNodeByTaxon(Taxon taxon
, UUID classificationUuid
, List
<String
> propertyPaths
){
80 Classification tree
= dao
.load(classificationUuid
);
81 TaxonNode node
= tree
.getNode(taxon
);
83 return loadTaxonNode(node
.getUuid(), propertyPaths
);
86 @Deprecated // use loadTaxonNode(UUID, List<String>) instead
87 public TaxonNode
loadTaxonNode(TaxonNode taxonNode
, List
<String
> propertyPaths
){
88 return taxonNodeDao
.load(taxonNode
.getUuid(), propertyPaths
);
91 public TaxonNode
loadTaxonNode(UUID taxonNodeUuid
, List
<String
> propertyPaths
){
92 return taxonNodeDao
.load(taxonNodeUuid
, propertyPaths
);
97 * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadRankSpecificRootNodes(eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
99 public List
<TaxonNode
> loadRankSpecificRootNodes(Classification classification
, Rank rank
, List
<String
> propertyPaths
){
101 List
<TaxonNode
> rootNodes
= dao
.loadRankSpecificRootNodes(classification
, rank
, propertyPaths
);
103 //sort nodes by TaxonName
104 Collections
.sort(rootNodes
, taxonNodeComparator
);
106 // initialize all nodes
107 defaultBeanInitializer
.initializeAll(rootNodes
, propertyPaths
);
114 * @see eu.etaxonomy.cdm.api.service.ITaxonService#loadTreeBranchTo(eu.etaxonomy.cdm.model.taxon.TaxonNode, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
115 * FIXME Candidate for harmonization
116 * move to classification service
118 public List
<TaxonNode
> loadTreeBranch(TaxonNode taxonNode
, Rank baseRank
, List
<String
> propertyPaths
){
120 TaxonNode thisNode
= taxonNodeDao
.load(taxonNode
.getUuid(), propertyPaths
);
121 List
<TaxonNode
> pathToRoot
= new ArrayList
<TaxonNode
>();
122 pathToRoot
.add(thisNode
);
124 TaxonNode parentNode
= thisNode
.getParent();
125 while(parentNode
!= null){
126 TaxonNode parent
= parentNode
;
127 Rank parentNodeRank
= parent
.getTaxon().getName().getRank();
128 // stop if the next parent is higher than the baseRank
129 if(baseRank
!= null && baseRank
.isLower(parentNodeRank
)){
132 pathToRoot
.add(parentNode
);
133 parentNode
= parentNode
.getParent();
136 // initialize and invert order of nodes in list
137 defaultBeanInitializer
.initializeAll(pathToRoot
, propertyPaths
);
138 Collections
.reverse(pathToRoot
);
145 * @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)
147 public List
<TaxonNode
> loadTreeBranchToTaxon(Taxon taxon
, Classification classification
, Rank baseRank
, List
<String
> propertyPaths
){
148 Classification tree
= dao
.load(classification
.getUuid());
149 taxon
= (Taxon
) taxonDao
.load(taxon
.getUuid());
150 TaxonNode node
= tree
.getNode(taxon
);
152 logger
.warn("The specified taxon is not found in the given tree.");
155 return loadTreeBranch(node
, baseRank
, propertyPaths
);
160 * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadChildNodesOfTaxon(eu.etaxonomy.cdm.model.taxon.TaxonNode, java.util.List)
162 public List
<TaxonNode
> loadChildNodesOfTaxonNode(TaxonNode taxonNode
,
163 List
<String
> propertyPaths
) {
164 taxonNode
= taxonNodeDao
.load(taxonNode
.getUuid());
165 List
<TaxonNode
> childNodes
= new ArrayList
<TaxonNode
>(taxonNode
.getChildNodes());
166 defaultBeanInitializer
.initializeAll(childNodes
, propertyPaths
);
167 Collections
.sort(childNodes
, taxonNodeComparator
);
173 * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadChildNodesOfTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.Classification, java.util.List)
175 public List
<TaxonNode
> loadChildNodesOfTaxon(Taxon taxon
, Classification classification
, List
<String
> propertyPaths
){
176 Classification tree
= dao
.load(classification
.getUuid());
177 taxon
= (Taxon
) taxonDao
.load(taxon
.getUuid());
179 TaxonNode node
= tree
.getNode(taxon
);
181 return loadChildNodesOfTaxonNode(node
, propertyPaths
);
191 * @see eu.etaxonomy.cdm.api.service.IClassificationService#getTaxonNodeByUuid(java.util.UUID)
193 public TaxonNode
getTaxonNodeByUuid(UUID uuid
) {
194 return taxonNodeDao
.findByUuid(uuid
);
199 * @see eu.etaxonomy.cdm.api.service.IClassificationService#getTreeNodeByUuid(java.util.UUID)
201 public ITreeNode
getTreeNodeByUuid(UUID uuid
){
202 ITreeNode treeNode
= taxonNodeDao
.findByUuid(uuid
);
203 if(treeNode
== null){
204 treeNode
= dao
.findByUuid(uuid
);
211 * @see eu.etaxonomy.cdm.api.service.IClassificationService#listClassifications(java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
213 public List
<Classification
> listClassifications(Integer limit
, Integer start
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
214 return dao
.list(limit
, start
, orderHints
, propertyPaths
);
218 * @see eu.etaxonomy.cdm.api.service.IClassificationService#getClassificationByUuid(java.util.UUID)
220 public Classification
getClassificationByUuid(UUID uuid
){
221 return dao
.findByUuid(uuid
);
225 * @see eu.etaxonomy.cdm.api.service.IClassificationService#removeTaxonNode(eu.etaxonomy.cdm.model.taxon.Classification)
227 public UUID
removeTaxonNode(TaxonNode taxonNode
) {
228 return taxonNodeDao
.delete(taxonNode
);
231 * @see eu.etaxonomy.cdm.api.service.IClassificationService#removeTreeNode(eu.etaxonomy.cdm.model.taxon.ITreeNode)
233 public UUID
removeTreeNode(ITreeNode treeNode
) {
234 if(treeNode
instanceof Classification
){
235 return dao
.delete((Classification
) treeNode
);
236 }else if(treeNode
instanceof TaxonNode
){
237 return taxonNodeDao
.delete((TaxonNode
)treeNode
);
242 * @see eu.etaxonomy.cdm.api.service.IClassificationService#saveTaxonNode(eu.etaxonomy.cdm.model.taxon.Classification)
244 public UUID
saveTaxonNode(TaxonNode taxonNode
) {
245 return taxonNodeDao
.save(taxonNode
);
250 * @see eu.etaxonomy.cdm.api.service.IClassificationService#saveTaxonNodeAll(java.util.Collection)
252 public Map
<UUID
, TaxonNode
> saveTaxonNodeAll(
253 Collection
<TaxonNode
> taxonNodeCollection
) {
254 return taxonNodeDao
.saveAll(taxonNodeCollection
);
258 * @see eu.etaxonomy.cdm.api.service.IClassificationService#saveTreeNode(eu.etaxonomy.cdm.model.taxon.ITreeNode)
260 public UUID
saveTreeNode(ITreeNode treeNode
) {
261 if(treeNode
instanceof Classification
){
262 return dao
.save((Classification
) treeNode
);
263 }else if(treeNode
instanceof TaxonNode
){
264 return taxonNodeDao
.save((TaxonNode
)treeNode
);
269 public List
<TaxonNode
> getAllNodes(){
270 return taxonNodeDao
.list(null,null);
275 * @see eu.etaxonomy.cdm.api.service.ITaxonService#getUuidAndTitleCacheOfAcceptedTaxa(eu.etaxonomy.cdm.model.taxon.Classification)
277 public List
<UuidAndTitleCache
<TaxonNode
>> getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(Classification classification
) {
278 return taxonDao
.getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(classification
);
282 * @see eu.etaxonomy.cdm.api.service.IdentifiableServiceBase#getUuidAndTitleCache()
285 public List
<UuidAndTitleCache
<Classification
>> getUuidAndTitleCache() {
286 return dao
.getUuidAndTitleCache();
290 * @see eu.etaxonomy.cdm.api.service.IClassificationService#getAllMediaForChildNodes(eu.etaxonomy.cdm.model.taxon.TaxonNode, java.util.List, int, int, int, java.lang.String[])
292 public Map
<UUID
, List
<MediaRepresentation
>> getAllMediaForChildNodes(
293 TaxonNode taxonNode
, List
<String
> propertyPaths
, int size
,
294 int height
, int widthOrDuration
, String
[] mimeTypes
) {
296 TreeMap
<UUID
, List
<MediaRepresentation
>> result
= new TreeMap
<UUID
, List
<MediaRepresentation
>>();
297 List
<Media
> taxonMedia
= new ArrayList
<Media
>();
298 List
<MediaRepresentation
> mediaRepresentations
= new ArrayList
<MediaRepresentation
>();
300 //add all media of the children to the result map
301 if (taxonNode
!= null){
303 List
<TaxonNode
> nodes
= new ArrayList
<TaxonNode
>();
305 nodes
.add(loadTaxonNode(taxonNode
, propertyPaths
));
306 nodes
.addAll(loadChildNodesOfTaxonNode(taxonNode
, propertyPaths
));
309 for(TaxonNode node
: nodes
){
310 Taxon taxon
= node
.getTaxon();
311 for (TaxonDescription taxonDescription
: taxon
.getDescriptions()){
312 for (DescriptionElementBase descriptionElement
: taxonDescription
.getElements()){
313 for(Media media
: descriptionElement
.getMedia()){
314 taxonMedia
.add(media
);
316 //find the best matching representation
317 mediaRepresentations
.add(MediaUtils
.findBestMatchingRepresentation(media
,size
, height
, widthOrDuration
, mimeTypes
));
322 result
.put(taxon
.getUuid(), mediaRepresentations
);
334 public Map
<UUID
, List
<MediaRepresentation
>> getAllMediaForChildNodes(Taxon taxon
, Classification taxTree
, List
<String
> propertyPaths
, int size
, int height
, int widthOrDuration
, String
[] mimeTypes
){
335 TaxonNode node
= taxTree
.getNode(taxon
);
337 return getAllMediaForChildNodes(node
, propertyPaths
, size
, height
, widthOrDuration
, mimeTypes
);
345 * @see eu.etaxonomy.cdm.api.service.ServiceBase#setDao(eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao)
348 protected void setDao(IClassificationDao dao
) {
354 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
357 public void updateTitleCache(Class
<?
extends Classification
> clazz
, Integer stepSize
, IIdentifiableEntityCacheStrategy
<Classification
> cacheStrategy
, IProgressMonitor monitor
) {
359 clazz
= Classification
.class;
361 super.updateTitleCacheImpl(clazz
, stepSize
, cacheStrategy
, monitor
);