Refactoring of taxon business logic methods and started to write tests for these...
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / NamedAreaTree.java
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 }