Project

General

Profile

Download (3.42 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.api.service;
2

    
3
import java.util.ArrayList;
4
import java.util.Collections;
5
import java.util.List;
6
import java.util.Set;
7

    
8
import eu.etaxonomy.cdm.common.Tree;
9
import eu.etaxonomy.cdm.common.TreeNode;
10
import eu.etaxonomy.cdm.model.location.NamedArea;
11
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
12

    
13
/**
14
 * @author f.revilla
15
 * @version 1.0
16
 * @created 10.06.2010
17
 */
18
public class NamedAreaTree extends Tree<NamedArea>{
19
	
20
	public NamedAreaTree() {
21
		NamedArea data = new NamedArea();
22
		TreeNode<NamedArea> rootElement = new TreeNode<NamedArea>();
23
		List<TreeNode<NamedArea>> children = new ArrayList<TreeNode<NamedArea>>();
24
		
25
		rootElement.setData(data);
26
		rootElement.setChildren(children);
27
		setRootElement(rootElement);
28
    }
29
/*	
30
    public NamedAreaTree getHiearchieTree(List<NamedArea> areaList) {
31
    	NamedAreaTree result = new NamedAreaTree();
32
    	for (NamedArea area : areaList) {
33
			List<NamedArea> levelList = area.getAreaLevelPathList(area);
34
			result.merge(levelList);
35
		}	    	
36
    	return result;
37
    }
38
*/	
39
	public void merge(List<NamedArea> areaList, Set<NamedAreaLevel> omitLevels){
40
		for (NamedArea area : areaList) {
41
			List<NamedArea> levelList = this.getAreaLevelPathList(area, omitLevels);
42
			mergeAux(levelList, this.getRootElement());
43
		}
44
	}
45
	
46
	public void sortChildren(){
47
		sortChildrenAux(this.getRootElement());
48
	}	
49
	
50
	private void sortChildrenAux(TreeNode<NamedArea> treeNode){
51
		NamedAreaNodeComparator comp = new NamedAreaNodeComparator();
52
		if (treeNode.children == null){
53
			//nothing => stop condition
54
			return;
55
		}else{
56
			Collections.sort(treeNode.children, comp);
57
			for (TreeNode<NamedArea> child : treeNode.children) {
58
				sortChildrenAux(child);
59
			}
60
		}
61
	}
62
	
63
	private void mergeAux(List<NamedArea> areaHierarchieList, TreeNode<NamedArea> root) {
64
		TreeNode<NamedArea> child; // the new child to add or the child to follow through the tree
65
		//if the list to merge is empty finish the execution
66
		if (areaHierarchieList.isEmpty()){
67
			return;
68
		}
69
		//getting the highest area and inserting it into the tree
70
		NamedArea highestArea = areaHierarchieList.get(0);
71
		TreeNode<NamedArea> highestAreaNode = new TreeNode<NamedArea>(highestArea);
72
		//NamedAreaLevel level = highestArea.getLevel();
73
		//List<TreeNode<NamedArea>> children = root.getChildren();
74
		
75
		//if(children == null || !children.contains(highestAreaNode)){
76
		if (root.getChildren().isEmpty() || !root.containsChild(highestAreaNode)){
77
			//if the highest level is not on the depth-1 of the tree we add it. 
78
			child = new TreeNode<NamedArea>(highestArea);
79
			root.addChild(child);
80
			//children.add(child);
81
		}else{
82
			//if the deepth-1 of the tree contains the highest area level
83
			//get the subtree or create it in order to continuing merging
84
			child = root.getChild(highestAreaNode);				
85
		}
86
		//continue merging with the next highest area of the list.
87
		List<NamedArea> newList = areaHierarchieList.subList(1, areaHierarchieList.size());
88
		mergeAux(newList, child);
89
	}
90
	
91
	private List<NamedArea> getAreaLevelPathList(NamedArea area, Set<NamedAreaLevel> omitLevels){
92
		List<NamedArea> result = new ArrayList<NamedArea>();
93
		if (!omitLevels.contains(area.getLevel())){
94
			result.add(area);		
95
		}
96
		while (area.getPartOf() != null) {
97
			area = area.getPartOf();
98
			if (!omitLevels.contains(area.getLevel())){
99
				result.add(0, area);
100
			}
101
		}
102
		return result;
103
	}
104
}
(62-62/76)