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 }