Project

General

Profile

Download (12.2 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 javax.swing.tree.TreeNode;
23

    
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;
29

    
30
import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;
31
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
32
import eu.etaxonomy.cdm.model.description.TaxonDescription;
33
import eu.etaxonomy.cdm.model.media.Media;
34
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
35
import eu.etaxonomy.cdm.model.media.MediaUtils;
36
import eu.etaxonomy.cdm.model.name.Rank;
37
import eu.etaxonomy.cdm.model.taxon.ITreeNode;
38
import eu.etaxonomy.cdm.model.taxon.Taxon;
39
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
40
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
41
import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
42
import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;
43
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
44
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao;
45
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonomicTreeDao;
46
import eu.etaxonomy.cdm.persistence.query.OrderHint;
47

    
48
/**
49
 * @author n.hoffmann
50
 * @created Sep 21, 2009
51
 * @version 1.0
52
 */
53
@Service
54
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
55
public class TaxonTreeServiceImpl extends IdentifiableServiceBase<TaxonomicTree, ITaxonomicTreeDao> implements ITaxonTreeService {
56
	private static final Logger logger = Logger.getLogger(TaxonTreeServiceImpl.class);
57

    
58
	@Autowired
59
	private ITaxonNodeDao taxonNodeDao;
60
	@Autowired
61
	private ITaxonDao taxonDao;
62
	@Autowired
63
	private BeanInitializer defaultBeanInitializer;
64
	private Comparator<? super TaxonNode> taxonNodeComparator;
65
	@Autowired
66
	public void setTaxonNodeComparator(ITaxonNodeComparator<? super TaxonNode> taxonNodeComparator){
67
		this.taxonNodeComparator = (Comparator<? super TaxonNode>) taxonNodeComparator;
68
	}
69

    
70
	
71
	/*
72
	 * (non-Javadoc)
73
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#loadTaxonNodeByTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, java.util.UUID, java.util.List)
74
	 */
75
	public TaxonNode loadTaxonNodeByTaxon(Taxon taxon, UUID taxonomicTreeUuid, List<String> propertyPaths){
76
		TaxonomicTree tree = dao.load(taxonomicTreeUuid);
77
		TaxonNode node = tree.getNode(taxon);
78
	
79
		return loadTaxonNode(node.getUuid(), propertyPaths);
80
	}
81
	
82
	@Deprecated // use loadTaxonNode(UUID, List<String>) instead 
83
	public TaxonNode loadTaxonNode(TaxonNode taxonNode, List<String> propertyPaths){
84
		return taxonNodeDao.load(taxonNode.getUuid(), propertyPaths);
85
	}
86
	
87
	public TaxonNode loadTaxonNode(UUID taxonNodeUuid, List<String> propertyPaths){
88
		return taxonNodeDao.load(taxonNodeUuid, propertyPaths);
89
	}
90
	
91
	/*
92
	 * (non-Javadoc)
93
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#loadRankSpecificRootNodes(eu.etaxonomy.cdm.model.taxon.TaxonomicTree, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
94
	 */
95
	public List<TaxonNode> loadRankSpecificRootNodes(TaxonomicTree taxonomicTree, Rank rank, List<String> propertyPaths){
96
		
97
		List<TaxonNode> rootNodes = dao.loadRankSpecificRootNodes(taxonomicTree, rank, propertyPaths);
98
		
99
		//sort nodes by TaxonName
100
		Collections.sort(rootNodes, taxonNodeComparator);
101
		
102
		// initialize all nodes
103
		defaultBeanInitializer.initializeAll(rootNodes, propertyPaths);
104
		
105
		return rootNodes;
106
	}
107
	
108
	/**
109
     * (non-Javadoc)
110
	 * @see eu.etaxonomy.cdm.api.service.ITaxonService#loadTreeBranchTo(eu.etaxonomy.cdm.model.taxon.TaxonNode, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
111
	 * FIXME Candidate for harmonization
112
	 * move to taxonTreeService
113
	 */
114
	public List<TaxonNode> loadTreeBranch(TaxonNode taxonNode, Rank baseRank, List<String> propertyPaths){
115
		
116
		TaxonNode thisNode = taxonNodeDao.load(taxonNode.getUuid(), propertyPaths);
117
		List<TaxonNode> pathToRoot = new ArrayList<TaxonNode>();
118
		pathToRoot.add(thisNode);
119
		
120
		TaxonNode parentNode = thisNode.getParent();
121
		while(parentNode != null){
122
			TaxonNode parent = parentNode;
123
			Rank parentNodeRank = parent.getTaxon().getName().getRank();
124
			// stop if the next parent is higher than the baseRank
125
			if(baseRank != null && baseRank.isLower(parentNodeRank)){
126
				break;
127
			}
128
			pathToRoot.add(parentNode);
129
			parentNode = parentNode.getParent();
130
		}
131
		
132
		// initialize and invert order of nodes in list
133
		defaultBeanInitializer.initializeAll(pathToRoot, propertyPaths);
134
		Collections.reverse(pathToRoot);
135
		
136
		return pathToRoot;
137
	}
138
	
139
	/*
140
	 * (non-Javadoc)
141
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#loadTreeBranchToTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.TaxonomicTree, eu.etaxonomy.cdm.model.name.Rank, java.util.List)
142
	 */
143
	public List<TaxonNode> loadTreeBranchToTaxon(Taxon taxon, TaxonomicTree taxonomicTree, Rank baseRank, List<String> propertyPaths){
144
		TaxonomicTree tree = dao.load(taxonomicTree.getUuid());
145
		taxon = (Taxon) taxonDao.load(taxon.getUuid());
146
		TaxonNode node = tree.getNode(taxon);
147
		if(node == null){
148
			logger.warn("The specified tacon is not found in the given tree.");
149
			return null;
150
		}
151
		return loadTreeBranch(node, baseRank, propertyPaths);
152
	}
153
	
154

    
155
	/* (non-Javadoc)
156
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#loadChildNodesOfTaxon(eu.etaxonomy.cdm.model.taxon.TaxonNode, java.util.List)
157
	 */
158
	public List<TaxonNode> loadChildNodesOfTaxonNode(TaxonNode taxonNode,
159
			List<String> propertyPaths) {
160
		taxonNode = taxonNodeDao.load(taxonNode.getUuid());
161
		List<TaxonNode> childNodes = new ArrayList<TaxonNode>(taxonNode.getChildNodes());
162
		defaultBeanInitializer.initializeAll(childNodes, propertyPaths);
163
		Collections.sort(childNodes, taxonNodeComparator);
164
		return childNodes;
165
	}
166
	
167
	/*
168
	 * (non-Javadoc)
169
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#loadChildNodesOfTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.TaxonomicTree, java.util.List)
170
	 */
171
	public List<TaxonNode> loadChildNodesOfTaxon(Taxon taxon, TaxonomicTree taxonomicTree, List<String> propertyPaths){
172
		TaxonomicTree tree = dao.load(taxonomicTree.getUuid());
173
		taxon = (Taxon) taxonDao.load(taxon.getUuid());
174
		
175
		return loadChildNodesOfTaxonNode(tree.getNode(taxon), propertyPaths);
176
	}
177
	
178
	
179
	
180
	/*
181
	 * (non-Javadoc)
182
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#getTaxonNodeByUuid(java.util.UUID)
183
	 */
184
	public TaxonNode getTaxonNodeByUuid(UUID uuid) {
185
		return taxonNodeDao.findByUuid(uuid);
186
	}
187
	
188
	/*
189
	 * (non-Javadoc)
190
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#getTreeNodeByUuid(java.util.UUID)
191
	 */
192
	public ITreeNode getTreeNodeByUuid(UUID uuid){
193
		ITreeNode treeNode = taxonNodeDao.findByUuid(uuid);
194
		if(treeNode == null){
195
			treeNode = dao.findByUuid(uuid);
196
		}
197
		
198
		return treeNode;
199
	}
200
	
201
	/*
202
	 * (non-Javadoc)
203
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#listTaxonomicTrees(java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
204
	 */
205
	public List<TaxonomicTree> listTaxonomicTrees(Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {
206
		return dao.list(limit, start, orderHints, propertyPaths);
207
	}	
208
	
209
	/*
210
	 * (non-Javadoc)
211
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#getTaxonomicTreeByUuid(java.util.UUID)
212
	 */
213
	public TaxonomicTree getTaxonomicTreeByUuid(UUID uuid){
214
		return dao.findByUuid(uuid);
215
	}
216
	
217
	/* (non-Javadoc)
218
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#removeTaxonNode(eu.etaxonomy.cdm.model.taxon.TaxonomicTree)
219
	 */
220
	public UUID removeTaxonNode(TaxonNode taxonNode) {
221
		return taxonNodeDao.delete(taxonNode);
222
	}
223
	/* (non-Javadoc)
224
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#removeTreeNode(eu.etaxonomy.cdm.model.taxon.ITreeNode)
225
	 */
226
	public UUID removeTreeNode(ITreeNode treeNode) {
227
		if(treeNode instanceof TaxonomicTree){
228
			return dao.delete((TaxonomicTree) treeNode);
229
		}else if(treeNode instanceof TaxonNode){
230
			return taxonNodeDao.delete((TaxonNode)treeNode);
231
		}
232
		return null;
233
	}
234
	/* (non-Javadoc)
235
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#saveTaxonNode(eu.etaxonomy.cdm.model.taxon.TaxonomicTree)
236
	 */
237
	public UUID saveTaxonNode(TaxonNode taxonNode) {
238
		return taxonNodeDao.save(taxonNode);
239
	}
240
	
241
	/*
242
	 * (non-Javadoc)
243
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#saveTaxonNodeAll(java.util.Collection)
244
	 */
245
	public Map<UUID, TaxonNode> saveTaxonNodeAll(
246
			Collection<TaxonNode> taxonNodeCollection) {
247
		return taxonNodeDao.saveAll(taxonNodeCollection);
248
	}
249
	
250
	/* (non-Javadoc)
251
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#saveTreeNode(eu.etaxonomy.cdm.model.taxon.ITreeNode)
252
	 */
253
	public UUID saveTreeNode(ITreeNode treeNode) {
254
		if(treeNode instanceof TaxonomicTree){
255
			return dao.save((TaxonomicTree) treeNode);
256
		}else if(treeNode instanceof TaxonNode){
257
			return taxonNodeDao.save((TaxonNode)treeNode);
258
		}
259
		return null;
260
	}
261
	
262
	public List<TaxonNode> getAllNodes(){
263
		return taxonNodeDao.list(null,null);
264
	}
265
	
266
	/*
267
	 * (non-Javadoc)
268
	 * @see eu.etaxonomy.cdm.api.service.ITaxonService#getUuidAndTitleCacheOfAcceptedTaxa(eu.etaxonomy.cdm.model.taxon.TaxonomicTree)
269
	 */
270
	public List<UuidAndTitleCache<TaxonNode>> getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByTaxonomicTree(TaxonomicTree taxonomicTree) {
271
		return taxonDao.getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByTaxonomicTree(taxonomicTree);
272
	}
273
	
274
	/* (non-Javadoc)
275
	 * @see eu.etaxonomy.cdm.api.service.IdentifiableServiceBase#getUuidAndTitleCache()
276
	 */
277
	@Override
278
	public List<UuidAndTitleCache<TaxonomicTree>> getUuidAndTitleCache() {
279
		return dao.getUuidAndTitleCache();
280
	}
281
	
282
	/* (non-Javadoc)
283
	 * @see eu.etaxonomy.cdm.api.service.ITaxonTreeService#getAllMediaForChildNodes(eu.etaxonomy.cdm.model.taxon.TaxonNode, java.util.List, int, int, int, java.lang.String[])
284
	 */
285
	public Map<UUID, List<MediaRepresentation>> getAllMediaForChildNodes(
286
			TaxonNode taxonNode, List<String> propertyPaths, int size,
287
			int height, int widthOrDuration, String[] mimeTypes) {
288
		
289
		TreeMap<UUID, List<MediaRepresentation>> result = new TreeMap<UUID, List<MediaRepresentation>>();
290
		List<Media> taxonMedia = new ArrayList<Media>();
291
		List<MediaRepresentation> mediaRepresentations = new ArrayList<MediaRepresentation>();
292
		
293
		//add all media of the children to the result map
294
		if (taxonNode != null){
295
					
296
			List<TaxonNode> nodes = new ArrayList<TaxonNode>();
297
			
298
			nodes.add(loadTaxonNode(taxonNode, propertyPaths));
299
			nodes.addAll(loadChildNodesOfTaxonNode(taxonNode, propertyPaths));
300
			
301
			if (nodes != null){
302
				for(TaxonNode node : nodes){
303
					Taxon taxon = node.getTaxon();
304
					for (TaxonDescription taxonDescription: taxon.getDescriptions()){
305
						for (DescriptionElementBase descriptionElement: taxonDescription.getElements()){
306
							for(Media media : descriptionElement.getMedia()){
307
								taxonMedia.add(media);
308
								
309
								//find the best matching representation
310
								mediaRepresentations.add(MediaUtils.findBestMatchingRepresentation(media,size, height, widthOrDuration, mimeTypes));
311
								
312
							}
313
						}
314
					}
315
					result.put(taxon.getUuid(), mediaRepresentations);
316
										
317
				}	
318
			}
319
			
320
		}
321
		
322
		
323
		return result;
324
		
325
	}
326
	
327
	public Map<UUID, List<MediaRepresentation>> getAllMediaForChildNodes(Taxon taxon, TaxonomicTree taxTree, List<String> propertyPaths, int size, int height, int widthOrDuration, String[] mimeTypes){
328
		TaxonNode node = taxTree.getNode(taxon);
329
		
330
		return getAllMediaForChildNodes(node, propertyPaths, size, height, widthOrDuration, mimeTypes);
331
	}
332
	
333
	
334
	
335
	
336
	
337
	/* (non-Javadoc)
338
	 * @see eu.etaxonomy.cdm.api.service.ServiceBase#setDao(eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao)
339
	 */
340
	@Autowired
341
	protected void setDao(ITaxonomicTreeDao dao) {
342
		this.dao = dao;
343
	}
344

    
345
	/* (non-Javadoc)
346
	 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache()
347
	 */
348
	@Override
349
	public void updateTitleCache() {
350
		Class<TaxonomicTree> clazz = TaxonomicTree.class;
351
		super.updateTitleCache(clazz, null, null);
352
	}
353
}
(62-62/67)