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