Mercurial > hg > Members > shoshi > TreeCMSv2
annotate src/treecms/tree/util/NodeChildrenImpl.java @ 20:084de6909451
commit
author | shoshi |
---|---|
date | Wed, 01 Jun 2011 15:35:50 +0900 |
parents | 168deb591f21 |
children | f3150b37f9be |
rev | line source |
---|---|
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
1 package treecms.tree.util; |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
2 |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
3 import java.util.Collections; |
20 | 4 import java.util.HashMap; |
5 import java.util.List; | |
6 import java.util.Map; | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
7 import java.util.Set; |
20 | 8 import java.util.concurrent.ConcurrentHashMap; |
9 import java.util.concurrent.CopyOnWriteArrayList; | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
10 import treecms.api.NodeChildren; |
20 | 11 import treecms.api.NodeContext; |
12 import treecms.api.NodeID; | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
13 |
20 | 14 public class NodeChildrenImpl<T extends NodeContext & NodeChildren<T>> implements NodeChildren<T> |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
15 { |
20 | 16 private final Map<String,T> m_map; |
17 private final List<T> m_list; | |
18 private final List<T> m_readOnlyList; | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
19 |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
20 public NodeChildrenImpl() |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
21 { |
20 | 22 m_map = new ConcurrentHashMap<String,T>(); |
23 m_list = new CopyOnWriteArrayList<T>(); | |
24 m_readOnlyList = Collections.unmodifiableList(m_list); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
25 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
26 |
17 | 27 public NodeChildrenImpl(T... _args) |
28 { | |
29 this(); | |
30 for(T i : _args){ | |
20 | 31 String fid = i.getID().getFamilyID(); |
32 if(!m_map.containsKey(fid)){ | |
33 m_map.put(fid,i); | |
34 m_list.add(i); | |
17 | 35 } |
36 } | |
37 } | |
38 | |
15 | 39 public NodeChildrenImpl(NodeChildren<T> _list) |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
40 { |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
41 this(); |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
42 |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
43 if(_list != null){ |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
44 addAll(_list); |
20 | 45 }else{ |
46 throw new NullPointerException("_list is null"); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
47 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
48 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
49 |
20 | 50 @Override |
51 public synchronized List<T> getList() | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
52 { |
20 | 53 return m_readOnlyList; |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
54 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
55 |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
56 @Override |
20 | 57 public synchronized T replace(T _node) |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
58 { |
20 | 59 String fid = _node.getID().getFamilyID(); |
60 | |
61 T old = m_map.get(fid); | |
62 | |
63 if(old != null){ | |
64 m_map.put(fid,_node); | |
65 | |
66 //find index of _node , better put index with node in the map? | |
67 int size = m_list.size(); | |
68 for(int i = 0;i < size;i ++){ | |
69 T n = m_list.get(i); | |
70 NodeID nid = n.getID(); | |
71 if(nid.isFamily(nid)){ | |
72 m_list.set(i,_node); | |
73 return old; | |
74 } | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
75 } |
20 | 76 |
77 throw new IllegalStateException("FamilyID is found on the map but not found on the list"); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
78 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
79 return null; |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
80 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
81 |
20 | 82 @Override |
83 public synchronized boolean add(T _n) | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
84 { |
20 | 85 if(!m_map.containsKey(_n.getID().getFamilyID())){ |
86 m_map.put(_n.getID().getFamilyID(),_n); | |
87 return m_list.add(_n); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
88 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
89 return false; |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
90 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
91 |
20 | 92 @Override |
93 public synchronized boolean addAll(NodeChildren<T> _list) | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
94 { |
20 | 95 if(Collections.disjoint(getFamilyIDSet(),_list.getFamilyIDSet())){ |
96 | |
97 HashMap<String,T> map = new HashMap<String,T>(); | |
98 for(T item : _list.getList()){ | |
99 NodeID id = item.getID(); | |
100 map.put(id.getFamilyID(),item); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
101 } |
20 | 102 |
103 return m_list.addAll(_list.getList()); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
104 } |
20 | 105 return false; |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
106 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
107 |
20 | 108 @Override |
109 public synchronized T get(int _index) | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
110 { |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
111 return m_list.get(_index); |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
112 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
113 |
20 | 114 @Override |
115 public synchronized T get(String _familyID) | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
116 { |
20 | 117 return m_map.get(_familyID); |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
118 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
119 |
20 | 120 @Override |
121 public synchronized T remove(int _index) | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
122 { |
20 | 123 T n = m_list.remove(_index); |
124 NodeID id = n.getID(); | |
125 if(m_map.remove(id.getFamilyID()) != null){ | |
126 return n; | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
127 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
128 |
20 | 129 throw new IllegalStateException(""); |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
130 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
131 |
20 | 132 @Override |
133 public synchronized boolean contains(NodeID _id) | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
134 { |
20 | 135 T n = m_map.get(_id); |
136 NodeID id = n.getID(); | |
137 return id.equals(_id); | |
138 } | |
139 | |
140 @Override | |
141 public synchronized void clearChildren() | |
142 { | |
143 m_map.clear(); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
144 m_list.clear(); |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
145 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
146 |
16 | 147 @SuppressWarnings("unchecked") |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
148 @Override |
20 | 149 public synchronized boolean equals(Object _o) |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
150 { |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
151 NodeChildrenImpl<T> list = (NodeChildrenImpl<T>)_o; |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
152 return m_list.equals(list.m_list); |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
153 } |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
154 |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
155 @Override |
20 | 156 public synchronized int hashCode() |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
157 { |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
158 int result = 17; |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
159 result = 37*result + m_list.hashCode(); |
20 | 160 result = 37*result + m_map.hashCode(); |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
161 return result; |
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
162 } |
20 | 163 |
164 @Override | |
165 public synchronized Set<String> getFamilyIDSet() | |
166 { | |
167 return m_map.keySet(); | |
168 } | |
169 | |
170 @Override | |
171 public synchronized T remove(String _fid) | |
172 { | |
173 return m_map.remove(_fid); | |
174 } | |
175 | |
176 @Override | |
177 public synchronized boolean swap(String _fid1, String _fid2) | |
178 { | |
179 if(m_map.containsKey(_fid1) && m_map.containsKey(_fid2)){ | |
180 int index1,index2; | |
181 index1 = index2 = -1; | |
182 int size = m_list.size(); | |
183 for(int i = 0;i < size;i ++){ | |
184 T n = m_list.get(i); | |
185 String fid = n.getID().getFamilyID(); | |
186 | |
187 if(fid.equals(_fid1)){ | |
188 index1 = i; | |
189 }else if(fid.equals(_fid2)){ | |
190 index2 = i; | |
191 } | |
192 | |
193 if(index1 != -1 && index2 != -1){ | |
194 Collections.swap(m_list, index1, index2); | |
195 return true; | |
196 } | |
197 } | |
198 } | |
199 return false; | |
200 } | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff
changeset
|
201 } |