Mercurial > hg > Members > shoshi > TreeCMSv2
comparison src/treecms/memory/OnMemoryMonotonicTreeNode.java @ 16:bb9760760744
commit
author | shoshi |
---|---|
date | Sat, 21 May 2011 04:46:00 +0900 |
parents | 22cd920986c5 |
children | 168deb591f21 |
comparison
equal
deleted
inserted
replaced
15:22cd920986c5 | 16:bb9760760744 |
---|---|
1 package treecms.memory; | 1 package treecms.memory; |
2 | 2 |
3 import java.nio.ByteBuffer; | 3 import java.nio.ByteBuffer; |
4 | |
4 import java.util.Iterator; | 5 import java.util.Iterator; |
5 import java.util.LinkedList; | |
6 import java.util.List; | 6 import java.util.List; |
7 import java.util.Map; | 7 import java.util.Map; |
8 import java.util.Set; | 8 import java.util.Set; |
9 import treecms.api.Forest; | 9 import treecms.api.Forest; |
10 import treecms.api.MonotonicTreeNode; | 10 import treecms.api.MonotonicTreeNode; |
11 import treecms.api.Node; | |
12 import treecms.api.NodeAttributes; | 11 import treecms.api.NodeAttributes; |
13 import treecms.api.NodeChildren; | 12 import treecms.api.NodeChildren; |
14 import treecms.api.NodeID; | 13 import treecms.api.NodeID; |
15 import treecms.api.SingleNode; | 14 import treecms.api.SingleNode; |
16 import treecms.api.TreeNode; | |
17 import treecms.tree.util.NodeChildrenImpl; | 15 import treecms.tree.util.NodeChildrenImpl; |
16 import treecms.tree.util.NodeData; | |
18 | 17 |
19 /** | 18 /** |
20 * SingleLinkedなNodeをラップしたDoubleLinkedなNodeの実装です. | 19 * SingleLinkedなNodeをラップしたDoubleLinkedなNodeの実装です. |
21 * @author shoshi | 20 * @author shoshi |
22 */ | 21 */ |
23 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode | 22 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode |
24 { | 23 { |
25 private OnMemoryNode m_node; | 24 private OnMemoryNode m_node; |
26 private OnMemoryMonotonicTreeNode m_parent; | 25 private OnMemoryMonotonicTreeNode m_parent; |
26 private OnMemoryMonotonicTree m_tree; | |
27 | 27 |
28 /** | 28 /** |
29 * コンストラクタです. | 29 * コンストラクタです. |
30 * @param _target 対象となるSingleLinked Node | 30 * @param _target 対象となるSingleLinked Node |
31 * @param _parent このDoubleLinked Nodeの親,RootNodeならnull | 31 * @param _parent このDoubleLinked Nodeの親,RootNodeならnull |
32 * @param _tree このNodeがRootNodeなら,nullではいけない. | 32 * @param _tree このNodeがRootNodeなら,nullではいけない. |
33 */ | 33 */ |
34 public OnMemoryMonotonicTreeNode(OnMemoryNode _target,OnMemoryMonotonicTreeNode _parent) | 34 public OnMemoryMonotonicTreeNode(OnMemoryNode _target,OnMemoryMonotonicTreeNode _parent) |
35 { | 35 { |
36 if(_target == null){ | |
37 throw new NullPointerException("_target must not be null."); | |
38 } | |
39 | |
40 m_node = _target; | 36 m_node = _target; |
41 m_parent = _parent; | 37 m_parent = _parent; |
42 } | 38 } |
43 | 39 |
44 /* | 40 public OnMemoryMonotonicTreeNode(OnMemoryNode _root,OnMemoryMonotonicTree _tree) |
45 * 親関連のメソッド | 41 { |
46 */ | 42 m_node = _root; |
43 m_tree = _tree; | |
44 m_parent = null; | |
45 } | |
47 | 46 |
48 @Override | 47 @Override |
49 public NodeID getID() | 48 public NodeID getID() |
50 { | 49 { |
51 return m_node.getID(); | 50 return m_node.getID(); |
104 } | 103 } |
105 | 104 |
106 @Override | 105 @Override |
107 public void removeAll(Set<ByteBuffer> _keys) | 106 public void removeAll(Set<ByteBuffer> _keys) |
108 { | 107 { |
109 m_node.removeAll(_keys); | 108 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
109 d.removeAll(_keys); | |
110 | |
111 cloneAndTransmit(d); | |
110 } | 112 } |
111 | 113 |
112 @Override | 114 @Override |
113 public void clearAttributes() | 115 public void clearAttributes() |
114 { | 116 { |
115 m_node.clearAttributes(); | 117 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
118 d.clearAttributes(); | |
119 | |
120 cloneAndTransmit(d); | |
121 } | |
122 | |
123 public void cloneAndTransmit(NodeData<SingleNode> _d) | |
124 { | |
125 OnMemoryForest f = (OnMemoryForest)m_node.getForest(); | |
126 OnMemoryNode clone = f.createNode(m_node.getID().update(),_d); | |
127 transmit(m_node,clone); | |
116 } | 128 } |
117 | 129 |
118 /** | 130 /** |
119 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます. | 131 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます. |
120 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します. | 132 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します. |
126 * @param _from 編集元のOnMemoryMonotonicTreeNode | 138 * @param _from 編集元のOnMemoryMonotonicTreeNode |
127 */ | 139 */ |
128 public void transmit(OnMemoryNode _orig,OnMemoryNode _edit) | 140 public void transmit(OnMemoryNode _orig,OnMemoryNode _edit) |
129 { | 141 { |
130 OnMemoryForest f = (OnMemoryForest)m_node.getForest(); | 142 OnMemoryForest f = (OnMemoryForest)m_node.getForest(); |
131 OnMemoryNode clone = f.createNode(m_node.getID(),null); | 143 OnMemoryNode clone = f.createNode(m_node.getID().update(),null); |
132 clone.replaceChild(_orig,_edit); | 144 clone.replace(_edit); |
133 | 145 |
134 if(m_parent != null){ | 146 if(m_parent != null){ |
135 m_parent.transmit(m_node,(OnMemoryNode)clone); | 147 m_parent.transmit(m_node,(OnMemoryNode)clone); |
136 return; | 148 return; |
137 } | 149 } |
138 | |
139 //なにかしたい | |
140 } | 150 } |
141 | 151 |
142 /* | 152 /* |
143 * 子供関連のメソッド | 153 * 子供関連のメソッド |
144 */ | 154 */ |
183 | 193 |
184 @Override | 194 @Override |
185 public MonotonicTreeNode remove(int _index) | 195 public MonotonicTreeNode remove(int _index) |
186 { | 196 { |
187 SingleNode n = m_node.remove(_index); | 197 SingleNode n = m_node.remove(_index); |
188 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,null); | 198 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); |
189 } | 199 } |
190 | 200 |
191 @Override | 201 @Override |
192 public void clearChildren() | 202 public void clearChildren() |
193 { | 203 { |
194 m_node.clearChildren(); | 204 m_node.clearChildren(); |
195 } | 205 } |
206 | |
207 @Override | |
208 public Map<ByteBuffer, ByteBuffer> asMap() | |
209 { | |
210 return m_node.asMap(); | |
211 } | |
212 | |
213 @Override | |
214 public Set<ByteBuffer> getKeySet() | |
215 { | |
216 return m_node.getKeySet(); | |
217 } | |
218 | |
219 @Override | |
220 public Set<String> getUUIDSet() | |
221 { | |
222 return m_node.getUUIDSet(); | |
223 } | |
224 | |
225 @Override | |
226 public MonotonicTreeNode get(String _uuid) | |
227 { | |
228 SingleNode n = m_node.get(_uuid); | |
229 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,this); | |
230 } | |
231 | |
232 @Override | |
233 public MonotonicTreeNode get(int _index) | |
234 { | |
235 SingleNode n = m_node.get(_index); | |
236 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,this); | |
237 } | |
238 | |
239 @Override | |
240 public MonotonicTreeNode replace(MonotonicTreeNode _newChild) | |
241 { | |
242 SingleNode n = m_node.replace(_newChild.getNode()); | |
243 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); | |
244 } | |
245 | |
246 @Override | |
247 public boolean contains(String _id) | |
248 { | |
249 return m_node.contains(_id); | |
250 } | |
251 | |
252 @Override | |
253 public boolean swap(String _uuid1, String _uuid2) | |
254 { | |
255 return m_node.swap(_uuid1,_uuid2); | |
256 } | |
196 } | 257 } |