fix autoinitializer bug in AdvancedBeanInitializer
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / initializer / BeanInitNode.java
1 /**
2 *
3 */
4 package eu.etaxonomy.cdm.persistence.dao.initializer;
5
6 import java.util.ArrayList;
7 import java.util.Collections;
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11
12 import eu.etaxonomy.cdm.common.CdmUtils;
13
14 /**
15 * @author a.mueller
16 * @date 2013-10-25
17 */
18 public class BeanInitNode implements Comparable<BeanInitNode>{
19
20 private BeanInitNode parent;
21
22 private Map<String, BeanInitNode> children = new HashMap<String, BeanInitNode>();
23
24 private String path;
25
26 private boolean isToManyInitialized = false;
27
28 private boolean isToOneInitialized = false;
29
30
31 public BeanInitNode(BeanInitNode parent, String part) {
32 this.path = CdmUtils.Nz(part);
33 this.parent = parent;
34 if (parent != null){
35 addChild(part, this);
36 }
37 }
38
39 private void addChild(String part, BeanInitNode child) {
40 children.put(part, child);
41 if (child.isWildcard()){
42 if (part.equals(AbstractBeanInitializer.LOAD_2ONE_2MANY_WILDCARD)){
43 this.isToManyInitialized = true;
44 }
45 this.isToOneInitialized = true;
46 }
47 }
48
49 public static BeanInitNode createInitTree(List<String> propertyPaths) {
50
51 //sort paths //TODO needed?
52 Collections.sort(propertyPaths);
53
54 BeanInitNode root = new BeanInitNode(null, "");
55
56 for (String fullPath : propertyPaths){
57 String[] parts = fullPath.split("\\.");
58 BeanInitNode lastNode = root;
59 for (String part : parts){
60 BeanInitNode child = lastNode.children.get(part);
61 if (child == null){
62 child = new BeanInitNode(lastNode, part);
63 }
64 lastNode = child;
65 }
66 }
67
68 return root;
69 }
70
71
72 public List<BeanInitNode> getChildrenList() {
73 List<BeanInitNode> result = new ArrayList<BeanInitNode>(children.values());
74 Collections.sort(result);
75 return result;
76 }
77
78
79 public String getPath() {
80 return path;
81 }
82
83 public boolean hasChildren() {
84 return children.size() > 0;
85 }
86
87
88 public boolean isWildcard() {
89 return path.equals(AbstractBeanInitializer.LOAD_2ONE_WILDCARD) ||
90 path.equals(AbstractBeanInitializer.LOAD_2ONE_2MANY_WILDCARD);
91 }
92
93 public boolean isToManyWildcard() {
94 return path.equals(AbstractBeanInitializer.LOAD_2ONE_2MANY_WILDCARD);
95 }
96
97 @Override
98 public int compareTo(BeanInitNode o) {
99 String toMany = AbstractBeanInitializer.LOAD_2ONE_2MANY_WILDCARD;
100 String toOne = AbstractBeanInitializer.LOAD_2ONE_WILDCARD;
101 if (this.path.equals(toMany)){
102 return -1;
103 }else if (o.path.equals(toMany)){
104 return 1;
105 }else if (this.path.equals(toOne)){
106 return -1;
107 }else if (o.path.equals(toOne)){
108 return 1;
109 }else{
110 return path.compareTo(o.path);
111 }
112 }
113
114
115 @Override
116 public String toString() {
117
118 if(parent == null){
119 return "/";
120 }else{
121 return parent.toString() + ((parent.parent == null) ? "" : ".") + path;
122 }
123 }
124
125 public String toStringTree() {
126
127 String result = (path.equals("")? "/": path) + "\n";
128 for (BeanInitNode child : getChildrenList()){
129 result += toString() + "." + child.toStringTree();
130 }
131
132 return result;
133 }
134
135 public boolean isInitializedIfSingle(){
136 return parent.isToOneInitialized;
137 }
138
139 public boolean isInitializedAny(){
140 return parent.isToManyInitialized;
141 }
142
143 }