Mercurial > hg > Members > shoshi > TreeCMSv2
annotate src/treecms/memory/OnMemoryMonotonicTreeNode.java @ 25:c1e7ec6b3d44
commit
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 12 Jul 2011 14:39:35 +0900 |
parents | 68021f7091e1 |
children | 9cb971a68cc5 |
rev | line source |
---|---|
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
1 package treecms.memory; |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
2 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
3 import java.nio.ByteBuffer; |
22 | 4 import java.util.ArrayList; |
5 import java.util.Collections; | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
6 import java.util.Iterator; |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
7 import java.util.List; |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
8 import java.util.Map; |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
9 import java.util.Set; |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
10 import treecms.api.MonotonicTreeNode; |
21 | 11 import treecms.api.Node; |
15 | 12 import treecms.api.NodeAttributes; |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
13 import treecms.api.NodeID; |
25 | 14 import treecms.tree.util.LockableNodeTable; |
16 | 15 import treecms.tree.util.NodeData; |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
16 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
17 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
18 { |
25 | 19 private volatile OnMemoryMonotonicTreeNode m_parent; |
20 private OnMemoryNode m_node; | |
21 private final LockableNodeTable m_table; | |
23 | 22 |
25 | 23 public OnMemoryMonotonicTreeNode(OnMemoryNode _node,OnMemoryMonotonicTreeNode _parent,LockableNodeTable _table) |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
24 { |
25 | 25 m_node = _node; |
26 m_table = _table; | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
27 m_parent = _parent; |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
28 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
29 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
30 @Override |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
31 public NodeID getID() |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
32 { |
25 | 33 OnMemoryNode n = (OnMemoryNode)getNode(); |
22 | 34 return n.getID(); |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
35 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
36 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
37 @Override |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
38 public MonotonicTreeNode getParent() |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
39 { |
23 | 40 if(m_parent == null){ |
41 return null; | |
42 } | |
43 | |
25 | 44 OnMemoryNode node = (OnMemoryNode)getNode(); |
22 | 45 |
25 | 46 //check , does parent contain the node. |
47 if(!m_parent.contains(node.getID())){ | |
48 m_parent = null; | |
22 | 49 } |
25 | 50 |
51 return m_parent; | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
52 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
53 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
54 @Override |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
55 public ByteBuffer get(ByteBuffer _key) |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
56 { |
25 | 57 OnMemoryNode node = (OnMemoryNode)getNode(); |
23 | 58 return node.get(_key); |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
59 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
60 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
61 @Override |
15 | 62 public NodeAttributes getAll() |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
63 { |
25 | 64 OnMemoryNode node = (OnMemoryNode)getNode(); |
23 | 65 return node.getAll(); |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
66 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
67 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
68 @Override |
25 | 69 public void put(ByteBuffer _key, ByteBuffer _value) |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
70 { |
25 | 71 OnMemoryNode n = (OnMemoryNode)getNode(); |
22 | 72 NodeData<Node> d = new NodeData<Node>(n,n); |
17 | 73 d.put(_key,_value); |
74 | |
75 cloneAndTransmit(d); | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
76 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
77 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
78 @Override |
25 | 79 public void putAll(NodeAttributes _map) |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
80 { |
25 | 81 OnMemoryNode n = (OnMemoryNode)getNode(); |
22 | 82 NodeData<Node> d = new NodeData<Node>(n,n); |
17 | 83 d.putAll(_map); |
84 | |
85 cloneAndTransmit(d); | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
86 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
87 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
88 @Override |
25 | 89 public void remove(ByteBuffer _key) |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
90 { |
25 | 91 OnMemoryNode n = (OnMemoryNode)getNode(); |
22 | 92 NodeData<Node> d = new NodeData<Node>(n,n); |
17 | 93 d.remove(_key); |
94 | |
95 cloneAndTransmit(d); | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
96 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
97 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
98 @Override |
25 | 99 public void removeAll(Set<ByteBuffer> _keys) |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
100 { |
25 | 101 OnMemoryNode n = (OnMemoryNode)getNode(); |
22 | 102 NodeData<Node> d = new NodeData<Node>(n,n); |
16 | 103 d.removeAll(_keys); |
104 | |
105 cloneAndTransmit(d); | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
106 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
107 |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
108 @Override |
25 | 109 public void clearAttributes() |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
110 { |
25 | 111 OnMemoryNode n = (OnMemoryNode)getNode(); |
22 | 112 NodeData<Node> d = new NodeData<Node>(n,n); |
16 | 113 d.clearAttributes(); |
114 | |
115 cloneAndTransmit(d); | |
116 } | |
117 | |
25 | 118 public void cloneAndTransmit(NodeData<Node> _d) |
16 | 119 { |
25 | 120 String fid = m_node.getID().getFamilyID(); |
121 | |
122 m_table.lock(fid); | |
123 | |
124 OnMemoryNode node = (OnMemoryNode)m_table.tip(fid); | |
23 | 125 NodeID newID = node.getID().update(); |
25 | 126 OnMemoryNode clone = new OnMemoryNode(newID,_d); |
127 m_table.register(clone); | |
128 | |
129 m_table.unlock(fid); | |
23 | 130 |
131 OnMemoryMonotonicTreeNode parent = (OnMemoryMonotonicTreeNode)getParent(); | |
132 if(parent != null){ | |
133 parent.transmit(node,clone); | |
134 } | |
25 | 135 |
136 m_node = clone; | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
137 } |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
138 |
25 | 139 public boolean transmit(Node _orig,Node _edit) |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
140 { |
25 | 141 String fid = m_node.getID().getFamilyID(); |
142 m_table.lock(fid); | |
143 OnMemoryNode node = (OnMemoryNode)getNode(); | |
14
8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
misaka
parents:
13
diff
changeset
|
144 |
22 | 145 NodeData<Node> d = new NodeData<Node>(node,node); |
146 d.replace(_edit); | |
25 | 147 NodeID newID = node.getID().update(); |
148 OnMemoryNode clone = new OnMemoryNode(newID,d); | |
22 | 149 |
25 | 150 m_table.register(clone); |
151 m_table.unlock(fid); | |
22 | 152 |
25 | 153 m_node = clone; |
22 | 154 |
155 OnMemoryMonotonicTreeNode parent = (OnMemoryMonotonicTreeNode)getParent(); | |
156 if(parent != null){ | |
157 return m_parent.transmit(node,clone); | |
20 | 158 } |
22 | 159 return true; |
20 | 160 } |
161 | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
162 @Override |
25 | 163 public Node getNode() |
21 | 164 { |
25 | 165 return m_node; |
21 | 166 } |
167 | |
168 @Override | |
25 | 169 public List<MonotonicTreeNode> getList() |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
170 { |
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
171 //NodeのリストよりMonotonicTreeNodeのリストを作成する. |
25 | 172 OnMemoryNode node = (OnMemoryNode)getNode(); |
22 | 173 int size = node.getList().size(); |
174 ArrayList<MonotonicTreeNode> list = new ArrayList<MonotonicTreeNode>(size); | |
175 for(Iterator<Node> it = node.getList().iterator();it.hasNext();){ | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
176 OnMemoryNode n = (OnMemoryNode)it.next(); |
25 | 177 OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(n,this,m_table); |
178 list.add(tn); | |
17 | 179 } |
180 | |
23 | 181 return Collections.unmodifiableList(list); |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
182 } |
22 | 183 |
25 | 184 @Override |
185 public MonotonicTreeNode remove(int _index) | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
186 { |
25 | 187 OnMemoryNode n = (OnMemoryNode)getNode(); |
188 NodeData<Node> d = new NodeData<Node>(n,n); | |
189 OnMemoryNode deleted = (OnMemoryNode)d.remove(_index); | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
190 |
25 | 191 if(deleted != null){ |
17 | 192 cloneAndTransmit(d); |
22 | 193 |
25 | 194 OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(deleted,null,m_table); |
22 | 195 return tn; |
17 | 196 } |
197 | |
198 return null; | |
15 | 199 } |
22 | 200 |
15 | 201 @Override |
25 | 202 public void clearChildren() |
15 | 203 { |
25 | 204 OnMemoryNode node = (OnMemoryNode)getNode(); |
205 if(node.getList().size() == 0){ | |
206 return; | |
207 } | |
208 | |
22 | 209 NodeData<Node> d = new NodeData<Node>(node,node); |
20 | 210 d.clearChildren(); |
17 | 211 |
212 cloneAndTransmit(d); | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
213 } |
16 | 214 |
215 @Override | |
216 public Map<ByteBuffer, ByteBuffer> asMap() | |
217 { | |
25 | 218 OnMemoryNode node = (OnMemoryNode)getNode(); |
22 | 219 return node.asMap(); |
16 | 220 } |
221 | |
222 @Override | |
223 public Set<ByteBuffer> getKeySet() | |
224 { | |
25 | 225 OnMemoryNode node = (OnMemoryNode)getNode(); |
22 | 226 return node.getKeySet(); |
16 | 227 } |
228 | |
229 @Override | |
25 | 230 public MonotonicTreeNode get(int _index) |
16 | 231 { |
25 | 232 OnMemoryNode node = (OnMemoryNode)getNode(); |
233 OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(node,this,m_table); | |
234 return tn; | |
16 | 235 } |
236 | |
237 @Override | |
20 | 238 public boolean contains(NodeID _id) |
16 | 239 { |
25 | 240 OnMemoryNode node = (OnMemoryNode)getNode(); |
22 | 241 return node.contains(_id); |
16 | 242 } |
243 | |
244 @Override | |
20 | 245 public boolean swap(String _fid1,String _fid2) |
246 { | |
25 | 247 OnMemoryNode node = (OnMemoryNode)getNode(); |
248 NodeData<Node> d = new NodeData<Node>(node,node); | |
249 | |
250 if(d.swap(_fid1,_fid2)){ | |
251 cloneAndTransmit(d); | |
252 | |
253 return true; | |
254 } | |
255 | |
256 return false; | |
20 | 257 } |
258 | |
259 @Override | |
260 public Set<String> getFamilyIDSet() | |
261 { | |
25 | 262 Set<String> fids = m_node.getFamilyIDSet(); |
263 return fids; | |
20 | 264 } |
265 | |
266 @Override | |
25 | 267 public MonotonicTreeNode get(String _fid) |
16 | 268 { |
25 | 269 OnMemoryNode node = (OnMemoryNode)m_node.get(_fid); |
270 OnMemoryMonotonicTreeNode mono = new OnMemoryMonotonicTreeNode(node,this,m_table); | |
20 | 271 return mono; |
272 } | |
273 | |
274 @Override | |
25 | 275 public MonotonicTreeNode remove(String _fid) |
20 | 276 { |
25 | 277 OnMemoryNode node = (OnMemoryNode)getNode(); |
22 | 278 |
279 NodeData<Node> d = new NodeData<Node>(node,node); | |
25 | 280 OnMemoryNode deleted = (OnMemoryNode)d.remove(_fid); |
20 | 281 |
282 cloneAndTransmit(d); | |
25 | 283 return new OnMemoryMonotonicTreeNode(deleted,null,m_table); |
22 | 284 } |
285 | |
286 @Override | |
25 | 287 public MonotonicTreeNode create(NodeAttributes _attr) |
22 | 288 { |
289 NodeID newID = getNode().getID().create(); | |
25 | 290 OnMemoryNode newNode = new OnMemoryNode(newID,new NodeData<Node>(null,_attr)); |
291 m_table.register(newNode); | |
20 | 292 |
22 | 293 OnMemoryNode thisNode = (OnMemoryNode)getNode(); |
294 NodeData<Node> d = new NodeData<Node>(thisNode,thisNode); | |
295 d.add(newNode); | |
23 | 296 cloneAndTransmit(d); |
297 | |
25 | 298 OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(newNode,this,m_table); |
23 | 299 return tn; |
16 | 300 } |
25 | 301 |
302 @Override | |
303 public String toString() | |
304 { | |
305 return m_node.toString(); | |
306 } | |
12
fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
shoshi
parents:
diff
changeset
|
307 } |