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
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;
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
11 import treecms.api.NodeContext;
shoshi
parents: 17
diff changeset
12 import treecms.api.NodeID;
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
13
20
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
16 private final Map<String,T> m_map;
shoshi
parents: 17
diff changeset
17 private final List<T> m_list;
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
22 m_map = new ConcurrentHashMap<String,T>();
shoshi
parents: 17
diff changeset
23 m_list = new CopyOnWriteArrayList<T>();
shoshi
parents: 17
diff changeset
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
shoshi
parents: 16
diff changeset
27 public NodeChildrenImpl(T... _args)
shoshi
parents: 16
diff changeset
28 {
shoshi
parents: 16
diff changeset
29 this();
shoshi
parents: 16
diff changeset
30 for(T i : _args){
20
shoshi
parents: 17
diff changeset
31 String fid = i.getID().getFamilyID();
shoshi
parents: 17
diff changeset
32 if(!m_map.containsKey(fid)){
shoshi
parents: 17
diff changeset
33 m_map.put(fid,i);
shoshi
parents: 17
diff changeset
34 m_list.add(i);
17
shoshi
parents: 16
diff changeset
35 }
shoshi
parents: 16
diff changeset
36 }
shoshi
parents: 16
diff changeset
37 }
shoshi
parents: 16
diff changeset
38
15
misaka
parents: 14
diff changeset
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
shoshi
parents: 17
diff changeset
45 }else{
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
50 @Override
shoshi
parents: 17
diff changeset
51 public synchronized List<T> getList()
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
52 {
20
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
57 public synchronized T replace(T _node)
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
58 {
20
shoshi
parents: 17
diff changeset
59 String fid = _node.getID().getFamilyID();
shoshi
parents: 17
diff changeset
60
shoshi
parents: 17
diff changeset
61 T old = m_map.get(fid);
shoshi
parents: 17
diff changeset
62
shoshi
parents: 17
diff changeset
63 if(old != null){
shoshi
parents: 17
diff changeset
64 m_map.put(fid,_node);
shoshi
parents: 17
diff changeset
65
shoshi
parents: 17
diff changeset
66 //find index of _node , better put index with node in the map?
shoshi
parents: 17
diff changeset
67 int size = m_list.size();
shoshi
parents: 17
diff changeset
68 for(int i = 0;i < size;i ++){
shoshi
parents: 17
diff changeset
69 T n = m_list.get(i);
shoshi
parents: 17
diff changeset
70 NodeID nid = n.getID();
shoshi
parents: 17
diff changeset
71 if(nid.isFamily(nid)){
shoshi
parents: 17
diff changeset
72 m_list.set(i,_node);
shoshi
parents: 17
diff changeset
73 return old;
shoshi
parents: 17
diff changeset
74 }
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
75 }
20
shoshi
parents: 17
diff changeset
76
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
82 @Override
shoshi
parents: 17
diff changeset
83 public synchronized boolean add(T _n)
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
84 {
20
shoshi
parents: 17
diff changeset
85 if(!m_map.containsKey(_n.getID().getFamilyID())){
shoshi
parents: 17
diff changeset
86 m_map.put(_n.getID().getFamilyID(),_n);
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
92 @Override
shoshi
parents: 17
diff changeset
93 public synchronized boolean addAll(NodeChildren<T> _list)
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
94 {
20
shoshi
parents: 17
diff changeset
95 if(Collections.disjoint(getFamilyIDSet(),_list.getFamilyIDSet())){
shoshi
parents: 17
diff changeset
96
shoshi
parents: 17
diff changeset
97 HashMap<String,T> map = new HashMap<String,T>();
shoshi
parents: 17
diff changeset
98 for(T item : _list.getList()){
shoshi
parents: 17
diff changeset
99 NodeID id = item.getID();
shoshi
parents: 17
diff changeset
100 map.put(id.getFamilyID(),item);
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
101 }
20
shoshi
parents: 17
diff changeset
102
shoshi
parents: 17
diff changeset
103 return m_list.addAll(_list.getList());
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
104 }
20
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
108 @Override
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
114 @Override
shoshi
parents: 17
diff changeset
115 public synchronized T get(String _familyID)
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
116 {
20
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
120 @Override
shoshi
parents: 17
diff changeset
121 public synchronized T remove(int _index)
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
122 {
20
shoshi
parents: 17
diff changeset
123 T n = m_list.remove(_index);
shoshi
parents: 17
diff changeset
124 NodeID id = n.getID();
shoshi
parents: 17
diff changeset
125 if(m_map.remove(id.getFamilyID()) != null){
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
132 @Override
shoshi
parents: 17
diff changeset
133 public synchronized boolean contains(NodeID _id)
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
134 {
20
shoshi
parents: 17
diff changeset
135 T n = m_map.get(_id);
shoshi
parents: 17
diff changeset
136 NodeID id = n.getID();
shoshi
parents: 17
diff changeset
137 return id.equals(_id);
shoshi
parents: 17
diff changeset
138 }
shoshi
parents: 17
diff changeset
139
shoshi
parents: 17
diff changeset
140 @Override
shoshi
parents: 17
diff changeset
141 public synchronized void clearChildren()
shoshi
parents: 17
diff changeset
142 {
shoshi
parents: 17
diff changeset
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
shoshi
parents: 15
diff changeset
147 @SuppressWarnings("unchecked")
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
148 @Override
20
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
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
shoshi
parents: 17
diff changeset
163
shoshi
parents: 17
diff changeset
164 @Override
shoshi
parents: 17
diff changeset
165 public synchronized Set<String> getFamilyIDSet()
shoshi
parents: 17
diff changeset
166 {
shoshi
parents: 17
diff changeset
167 return m_map.keySet();
shoshi
parents: 17
diff changeset
168 }
shoshi
parents: 17
diff changeset
169
shoshi
parents: 17
diff changeset
170 @Override
shoshi
parents: 17
diff changeset
171 public synchronized T remove(String _fid)
shoshi
parents: 17
diff changeset
172 {
shoshi
parents: 17
diff changeset
173 return m_map.remove(_fid);
shoshi
parents: 17
diff changeset
174 }
shoshi
parents: 17
diff changeset
175
shoshi
parents: 17
diff changeset
176 @Override
shoshi
parents: 17
diff changeset
177 public synchronized boolean swap(String _fid1, String _fid2)
shoshi
parents: 17
diff changeset
178 {
shoshi
parents: 17
diff changeset
179 if(m_map.containsKey(_fid1) && m_map.containsKey(_fid2)){
shoshi
parents: 17
diff changeset
180 int index1,index2;
shoshi
parents: 17
diff changeset
181 index1 = index2 = -1;
shoshi
parents: 17
diff changeset
182 int size = m_list.size();
shoshi
parents: 17
diff changeset
183 for(int i = 0;i < size;i ++){
shoshi
parents: 17
diff changeset
184 T n = m_list.get(i);
shoshi
parents: 17
diff changeset
185 String fid = n.getID().getFamilyID();
shoshi
parents: 17
diff changeset
186
shoshi
parents: 17
diff changeset
187 if(fid.equals(_fid1)){
shoshi
parents: 17
diff changeset
188 index1 = i;
shoshi
parents: 17
diff changeset
189 }else if(fid.equals(_fid2)){
shoshi
parents: 17
diff changeset
190 index2 = i;
shoshi
parents: 17
diff changeset
191 }
shoshi
parents: 17
diff changeset
192
shoshi
parents: 17
diff changeset
193 if(index1 != -1 && index2 != -1){
shoshi
parents: 17
diff changeset
194 Collections.swap(m_list, index1, index2);
shoshi
parents: 17
diff changeset
195 return true;
shoshi
parents: 17
diff changeset
196 }
shoshi
parents: 17
diff changeset
197 }
shoshi
parents: 17
diff changeset
198 }
shoshi
parents: 17
diff changeset
199 return false;
shoshi
parents: 17
diff changeset
200 }
14
8bf59f161b23 separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
diff changeset
201 }