comparison src/treecms/memory/OnMemoryMonotonicTreeNode.java @ 17:168deb591f21

commit
author shoshi
date Tue, 24 May 2011 00:33:12 +0900
parents bb9760760744
children 084de6909451
comparison
equal deleted inserted replaced
16:bb9760760744 17:168deb591f21
21 */ 21 */
22 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode 22 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode
23 { 23 {
24 private OnMemoryNode m_node; 24 private OnMemoryNode m_node;
25 private OnMemoryMonotonicTreeNode m_parent; 25 private OnMemoryMonotonicTreeNode m_parent;
26 private OnMemoryMonotonicTree m_tree;
27 26
28 /** 27 /**
29 * コンストラクタです. 28 * コンストラクタです.
30 * @param _target 対象となるSingleLinked Node 29 * @param _target 対象となるSingleLinked Node
31 * @param _parent このDoubleLinked Nodeの親,RootNodeならnull 30 * @param _parent このDoubleLinked Nodeの親,RootNodeならnull
35 { 34 {
36 m_node = _target; 35 m_node = _target;
37 m_parent = _parent; 36 m_parent = _parent;
38 } 37 }
39 38
40 public OnMemoryMonotonicTreeNode(OnMemoryNode _root,OnMemoryMonotonicTree _tree)
41 {
42 m_node = _root;
43 m_tree = _tree;
44 m_parent = null;
45 }
46
47 @Override 39 @Override
48 public NodeID getID() 40 public NodeID getID()
49 { 41 {
50 return m_node.getID(); 42 return m_node.getID();
51 } 43 }
85 } 77 }
86 78
87 @Override 79 @Override
88 public void put(ByteBuffer _key, ByteBuffer _value) 80 public void put(ByteBuffer _key, ByteBuffer _value)
89 { 81 {
90 m_node.put(_key,_value); 82 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
83 d.put(_key,_value);
84
85 cloneAndTransmit(d);
91 } 86 }
92 87
93 @Override 88 @Override
94 public void putAll(NodeAttributes _map) 89 public void putAll(NodeAttributes _map)
95 { 90 {
96 m_node.putAll(_map); 91 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
92 d.putAll(_map);
93
94 cloneAndTransmit(d);
97 } 95 }
98 96
99 @Override 97 @Override
100 public void remove(ByteBuffer _key) 98 public void remove(ByteBuffer _key)
101 { 99 {
102 m_node.remove(_key); 100 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
101 d.remove(_key);
102
103 cloneAndTransmit(d);
103 } 104 }
104 105
105 @Override 106 @Override
106 public void removeAll(Set<ByteBuffer> _keys) 107 public void removeAll(Set<ByteBuffer> _keys)
107 { 108 {
123 public void cloneAndTransmit(NodeData<SingleNode> _d) 124 public void cloneAndTransmit(NodeData<SingleNode> _d)
124 { 125 {
125 OnMemoryForest f = (OnMemoryForest)m_node.getForest(); 126 OnMemoryForest f = (OnMemoryForest)m_node.getForest();
126 OnMemoryNode clone = f.createNode(m_node.getID().update(),_d); 127 OnMemoryNode clone = f.createNode(m_node.getID().update(),_d);
127 transmit(m_node,clone); 128 transmit(m_node,clone);
129
130 m_node = clone;
128 } 131 }
129 132
130 /** 133 /**
131 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます. 134 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます.
132 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します. 135 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します.
166 } 169 }
167 170
168 @Override 171 @Override
169 public boolean add(MonotonicTreeNode _n) 172 public boolean add(MonotonicTreeNode _n)
170 { 173 {
171 return m_node.add(_n.getNode()); 174 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
175 boolean ret = d.add(_n.getNode());
176 if(ret){
177 cloneAndTransmit(d);
178 }
179
180 return ret;
172 } 181 }
173 182
174 @Override 183 @Override
175 public boolean addAll(NodeChildren<MonotonicTreeNode> _list) 184 public boolean addAll(NodeChildren<MonotonicTreeNode> _list)
176 { 185 {
177 //MotonicTreeNodeのリストからNodeのリストを作成する. 186 //MotonicTreeNodeのリストからNodeのリストを作成する.
178 NodeChildren<SingleNode> res = new NodeChildrenImpl<SingleNode>(); 187 NodeChildren<SingleNode> c = new NodeChildrenImpl<SingleNode>();
179 for(Iterator<MonotonicTreeNode> it = _list.getList().iterator();it.hasNext();){ 188 for(Iterator<MonotonicTreeNode> it = _list.getList().iterator();it.hasNext();){
180 MonotonicTreeNode mono = (MonotonicTreeNode)it.next(); 189 MonotonicTreeNode mono = (MonotonicTreeNode)it.next();
181 res.add(mono.getNode()); 190 c.add(mono.getNode());
182 } 191 }
183 192
184 return m_node.addAll(res); 193 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
194 boolean ret = d.addAll(c);
195 if(ret){
196 cloneAndTransmit(d);
197 }
198
199 return ret;
185 } 200 }
186 201
187 @Override 202 @Override
188 public MonotonicTreeNode remove(String _uuid) 203 public MonotonicTreeNode remove(String _uuid)
189 { 204 {
190 SingleNode n = m_node.remove(_uuid); 205 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
191 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,this); 206 SingleNode n = d.remove(_uuid);
207 if(n != null){
208 cloneAndTransmit(d);
209 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,null);
210 }
211
212 return null;
192 } 213 }
193 214
194 @Override 215 @Override
195 public MonotonicTreeNode remove(int _index) 216 public MonotonicTreeNode remove(int _index)
196 { 217 {
197 SingleNode n = m_node.remove(_index); 218 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
198 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); 219 SingleNode n = d.remove(_index);
220 if(n != null){
221 cloneAndTransmit(d);
222 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,null);
223 }
224
225 return null;
199 } 226 }
200 227
201 @Override 228 @Override
202 public void clearChildren() 229 public void clearChildren()
203 { 230 {
204 m_node.clearChildren(); 231 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
232 d.clearChildren();
233 cloneAndTransmit(d);
205 } 234 }
206 235
207 @Override 236 @Override
208 public Map<ByteBuffer, ByteBuffer> asMap() 237 public Map<ByteBuffer, ByteBuffer> asMap()
209 { 238 {
237 } 266 }
238 267
239 @Override 268 @Override
240 public MonotonicTreeNode replace(MonotonicTreeNode _newChild) 269 public MonotonicTreeNode replace(MonotonicTreeNode _newChild)
241 { 270 {
242 SingleNode n = m_node.replace(_newChild.getNode()); 271 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node);
243 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); 272 SingleNode n = d.replace(_newChild.getNode());
273 if(n != null){
274 cloneAndTransmit(d);
275 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null);
276 }
277
278 return null;
244 } 279 }
245 280
246 @Override 281 @Override
247 public boolean contains(String _id) 282 public boolean contains(String _id)
248 { 283 {