Project

General

Profile

Download (12.1 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.TaxonNode;
40
import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
41
import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;
42
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
43
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao;
44
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonomicTreeDao;
45
import eu.etaxonomy.cdm.persistence.query.OrderHint;
46

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

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

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

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

    
346
	/* (non-Javadoc)
347
	 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#generateTitleCache()
348
	 */
349
	public void generateTitleCache() {
350
		logger.warn("generateTitleCache not yet fully implemented!");
351
	}
352
}
(60-60/65)