Project

General

Profile

Download (3.41 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
public class NamedAreaTree extends Tree<NamedArea>{
14
	
15
	public NamedAreaTree() {
16
		NamedArea data = new NamedArea();
17
		TreeNode<NamedArea> rootElement = new TreeNode<NamedArea>();
18
		List<TreeNode<NamedArea>> children = new ArrayList<TreeNode<NamedArea>>();
19
		
20
		rootElement.setData(data);
21
		rootElement.setChildren(children);
22
		setRootElement(rootElement);
23
    }
24
/*	
25
    public NamedAreaTree getHiearchieTree(List<NamedArea> areaList) {
26
    	NamedAreaTree result = new NamedAreaTree();
27
    	for (NamedArea area : areaList) {
28
			List<NamedArea> levelList = area.getAreaLevelPathList(area);
29
			result.merge(levelList);
30
		}	    	
31
    	return result;
32
    }
33
*/	
34
	public void merge(List<NamedArea> areaList, Set<NamedAreaLevel> omitLevels){
35
		for (NamedArea area : areaList) {
36
			List<NamedArea> levelList = this.getAreaLevelPathList(area, omitLevels);
37
			mergeAux(levelList, this.getRootElement());
38
		}
39

    
40
		//mergeAux(areaHierarchieList, this.getRootElement());
41
	}
42
	
43
	public void sortChildren(){
44
		sortChildrenAux(this.getRootElement());
45
	}	
46
	
47
	private void sortChildrenAux(TreeNode<NamedArea> TreeNode){
48
		NamedAreaNodeComparator comp = new NamedAreaNodeComparator();
49
		if (TreeNode.children == null){
50
			//nothing => stop condition
51
			return;
52
		}else{
53
			Collections.sort(TreeNode.children, comp);
54
			for (TreeNode<NamedArea> child : TreeNode.children) {
55
				sortChildrenAux(child);
56
			}
57
		}
58
	}
59
	
60
	private void mergeAux(List<NamedArea> areaHierarchieList, TreeNode<NamedArea> root) {
61
		TreeNode<NamedArea> child; // the new child to add or the child to follow through the tree
62
		//if the list to merge is empty finish the execution
63
		if (areaHierarchieList.isEmpty()){
64
			return;
65
		}
66
		//getting the highest area and inserting it into the tree
67
		NamedArea highestArea = areaHierarchieList.get(0);
68
		TreeNode<NamedArea> highestAreaNode = new TreeNode<NamedArea>(highestArea);
69
		//NamedAreaLevel level = highestArea.getLevel();
70
		//List<TreeNode<NamedArea>> children = root.getChildren();
71
		
72
		//if(children == null || !children.contains(highestAreaNode)){
73
		if (root.getChildren().isEmpty() || !root.containsChild(highestAreaNode)){
74
			//if the highest level is not on the depth-1 of the tree we add it. 
75
			child = new TreeNode<NamedArea>(highestArea);
76
			root.addChild(child);
77
			//children.add(child);
78
		}else{
79
			//if the deepth-1 of the tree contains the highest area level
80
			//get the subtree or create it in order to continuing merging
81
			child = root.getChild(highestAreaNode);				
82
		}
83
		//continue merging with the next highest area of the list.
84
		List<NamedArea> newList = areaHierarchieList.subList(1, areaHierarchieList.size());
85
		mergeAux(newList, child);
86
	}
87
	
88
	private List<NamedArea> getAreaLevelPathList(NamedArea area, Set<NamedAreaLevel> omitLevels){
89
		List<NamedArea> result = new ArrayList<NamedArea>();
90
		if (!omitLevels.contains(area.getLevel())){
91
			result.add(area);		
92
		}
93
		while (area.getPartOf() != null) {
94
			area = area.getPartOf();
95
			if (!omitLevels.contains(area.getLevel())){
96
				result.add(0, area);
97
			}
98
		}
99
		return result;
100
	}
101
}
(51-51/65)