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