annotate src/treecms/tree/util/NodeChildrenImpl.java @ 22:fa784faafc78

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