1 package eu
.etaxonomy
.cdm
.api
.service
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Collections
;
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
;
18 public class NamedAreaTree
extends Tree
<NamedArea
>{
20 public NamedAreaTree() {
21 NamedArea data
= new NamedArea();
22 TreeNode
<NamedArea
> rootElement
= new TreeNode
<NamedArea
>();
23 List
<TreeNode
<NamedArea
>> children
= new ArrayList
<TreeNode
<NamedArea
>>();
25 rootElement
.setData(data
);
26 rootElement
.setChildren(children
);
27 setRootElement(rootElement
);
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);
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());
46 public void sortChildren(){
47 sortChildrenAux(this.getRootElement());
50 private void sortChildrenAux(TreeNode
<NamedArea
> treeNode
){
51 NamedAreaNodeComparator comp
= new NamedAreaNodeComparator();
52 if (treeNode
.children
== null){
53 //nothing => stop condition
56 Collections
.sort(treeNode
.children
, comp
);
57 for (TreeNode
<NamedArea
> child
: treeNode
.children
) {
58 sortChildrenAux(child
);
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()){
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();
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
);
80 //children.add(child);
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
);
86 //continue merging with the next highest area of the list.
87 List
<NamedArea
> newList
= areaHierarchieList
.subList(1, areaHierarchieList
.size());
88 mergeAux(newList
, child
);
91 private List
<NamedArea
> getAreaLevelPathList(NamedArea area
, Set
<NamedAreaLevel
> omitLevels
){
92 List
<NamedArea
> result
= new ArrayList
<NamedArea
>();
93 if (!omitLevels
.contains(area
.getLevel())){
96 while (area
.getPartOf() != null) {
97 area
= area
.getPartOf();
98 if (!omitLevels
.contains(area
.getLevel())){