comparison src/treecms/api/NodeData.java @ 12:fbbb7e414346

modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
author shoshi
date Wed, 11 May 2011 03:34:01 +0900
parents 85061e874775
children c8601b0fa8a3
comparison
equal deleted inserted replaced
11:85061e874775 12:fbbb7e414346
1 package treecms.api; 1 package treecms.api;
2 2
3 import java.nio.ByteBuffer; 3 import java.nio.ByteBuffer;
4
5 import java.util.ArrayList;
4 import java.util.Collections; 6 import java.util.Collections;
7 import java.util.HashMap;
8 import java.util.Iterator;
5 import java.util.List; 9 import java.util.List;
6 import java.util.Map; 10 import java.util.Map;
7 import java.util.Set; 11 import java.util.Set;
8 import java.util.concurrent.ConcurrentHashMap; 12 import org.apache.commons.collections.list.SetUniqueList;
9 import java.util.concurrent.CopyOnWriteArrayList;
10 13
11 /** 14 /**
12 * Nodeが保持するデータの集合です.Nodeを大きく変更するときや新しく作成される場合に使用されます. 15 * Node が保持するデータのスナップショットです.Node を大きく変更するときや新しく作成される場合に使用されます.
13 * 通常このクラスのインスタンスをNodeから取得した場合,NodeDataインスタンスに変更(set,add)を加えても元のNodeに変更は反映されません. 16 * 通常このクラスのインスタンスを Node から取得した場合,NodeData インスタンスに変更(set,add)を加えても元の Node に変更は反映されません.
14 * その様に実装してください. 17 * その様に実装してください.
18 *
19 * このクラスは Node が保持するデータのうち 子供ノードのリスト・属性のマップ のみ保持しています.つまり,ノードが持っているはずの ID は保持していません.
20 * getID,getForest を呼び出すと UnsupportedOperationException をスローします.
15 * @author shoshi 21 * @author shoshi
16 */ 22 */
17 public final class NodeData implements Node 23 public final class NodeData implements Node
18 { 24 {
19 /** 25 /**
20 * 子供Nodeのリスト 26 * 子供 Node の List
27 * 子供 Node の List は重複する Node を許可しない.
21 */ 28 */
22 private List<Node> m_children; 29 private List<Node> m_children;
23 30
24 /** 31 /**
25 * キーと対応する値のマップ 32 * Key と対応する Value の Map
26 */ 33 */
27 private Map<ByteBuffer,ByteBuffer> m_attrs; 34 private Map<ByteBuffer,ByteBuffer> m_attrs;
28 35
29 /** 36 /**
30 * コンストラクタです.なにもしません 37 * コンストラクタです.なにもしません
33 { 40 {
34 this(null); 41 this(null);
35 } 42 }
36 43
37 /** 44 /**
38 * コピーコンストラクタです.NodeDataの内容を防御的にコピーします. 45 * コピーコンストラクタです.
46 * NodeData の内容を防御的にコピーします.
39 * @param _data 47 * @param _data
40 */ 48 */
41 public NodeData(NodeData _data) 49 public NodeData(NodeData _data)
42 { 50 {
43 if(_data != null){ 51 if(_data != null){
44 m_children = new CopyOnWriteArrayList<Node>(_data.m_children); 52 // SetUniqueList を使用することにより,List の重複要素を許可しない.
45 m_attrs = new ConcurrentHashMap<ByteBuffer,ByteBuffer>(_data.m_attrs); 53 m_children = SetUniqueList.decorate(_data.m_children);
54 m_attrs = new HashMap<ByteBuffer,ByteBuffer>(_data.m_attrs);
46 return; 55 return;
47 } 56 }
48 m_children = new CopyOnWriteArrayList<Node>(); 57 m_children = SetUniqueList.decorate(new ArrayList<Node>());
49 m_attrs = new ConcurrentHashMap<ByteBuffer,ByteBuffer>(); 58 m_attrs = new HashMap<ByteBuffer,ByteBuffer>();
50 } 59 }
51 60
52 /** 61 /**
53 * 内部でコピーコンストラクタを呼び出します. 62 * 内部でコピーコンストラクタを呼び出します.
54 * @return このNodeDataのコピー 63 * @return この NodeData のコピー
55 */ 64 */
56 public NodeData deepCopy() 65 public NodeData deepCopy()
57 { 66 {
58 return new NodeData(this); 67 return new NodeData(this);
59 } 68 }
60 69
61 /**
62 * キーのセットを取得します.
63 * @return キーのセット
64 */
65 public Set<ByteBuffer> keySet()
66 {
67 return m_attrs.keySet();
68 }
69
70 /**
71 * キーに対応する値を取得します.
72 * @param _name
73 * @return キーに対応する値
74 */
75 public ByteBuffer get(ByteBuffer _name)
76 {
77 return m_attrs.get(_name);
78 }
79
80 /**
81 * キーとそれに対応する値を追加します.
82 * @param _name キー
83 * @param _value 値
84 */
85 public void put(ByteBuffer _name,ByteBuffer _value)
86 {
87 m_attrs.put(_name,_value);
88 }
89
90 /**
91 * キーとその対応する値をマップから削除します
92 * @param _name
93 */
94 public void remove(ByteBuffer _name)
95 {
96 m_attrs.remove(_name);
97 }
98
99 /**
100 * キーとそれに対応する値のマップ全体を追加します.
101 * @param _map
102 */
103 public void putAll(Map<ByteBuffer,ByteBuffer> _map)
104 {
105 m_attrs.putAll(_map);
106 }
107
108 /**
109 * 子供Nodeのリストを取得します.<br/>
110 * この取得されたリストは編集できません.編集はadd,addAllより行ってください.
111 * @return 子供Nodeのリスト
112 */
113 public List<Node> children()
114 {
115 return Collections.unmodifiableList(m_children);
116 }
117
118 /**
119 * 子供Nodeを追加します.
120 * @param _child
121 */
122 public void add(Node _child)
123 {
124 m_children.add(_child);
125 }
126
127 /**
128 * 子供Nodeリスト全部を子供Nodeとして追加します.
129 * @param _child
130 */
131 public void addAll(List<Node> _child)
132 {
133 m_children.addAll(_child);
134 }
135
136 /**
137 * 指定されたNodeを子供Nodeのリストから削除します.
138 * @param _child
139 */
140 public void remove(Node _child)
141 {
142 m_children.remove(_child);
143 }
144
145 /**
146 * 指定されたNodeのリストに含まれるすべてのNodeを子供Nodeのリストから削除します.
147 * @param _child
148 */
149 public void removeAll(List<Node> _child)
150 {
151 m_children.removeAll(_child);
152 }
153
154 /**
155 * NodeDataが保持しているすべてのキーと値の組のマップを返します.
156 * @return すべてのキーと値のマップ
157 */
158 public Map<ByteBuffer,ByteBuffer> getAll()
159 {
160 return Collections.unmodifiableMap(m_attrs);
161 }
162
163 /**
164 * 子供Nodeのリストをクリアします.(すべて削除します.)
165 */
166 public void clear()
167 {
168 m_children.clear();
169 }
170
171 @Override 70 @Override
172 public NodeID getID() 71 public NodeID getID()
173 { 72 {
73 //このクラスはデータのみ保持する.
174 return null; 74 return null;
175 } 75 }
176 76
177 @Override 77 @Override
178 public NodeData getData() 78 public NodeData getData()
179 { 79 {
180 return this; 80 return new NodeData(this);
181 } 81 }
182 82
183 @Override 83 @Override
184 public Forest getForest() 84 public Forest getForest()
185 { 85 {
86 //このクラスはデータのみ保持する.
186 return null; 87 return null;
187 } 88 }
89
90 /*
91 * 属性関連
92 */
93
94 public Set<ByteBuffer> keySet()
95 {
96 return m_attrs.keySet();
97 }
98
99 @Override
100 public ByteBuffer get(ByteBuffer _name)
101 {
102 return m_attrs.get(_name);
103 }
104
105 @Override
106 public Map<ByteBuffer,ByteBuffer> getAll()
107 {
108 return Collections.unmodifiableMap(this.m_attrs);
109 }
110
111 @Override
112 public void put(ByteBuffer _name,ByteBuffer _value)
113 {
114 m_attrs.put(_name,_value);
115 }
116
117 @Override
118 public void putAll(Map<ByteBuffer,ByteBuffer> _map)
119 {
120 m_attrs.putAll(_map);
121 }
122
123 @Override
124 public void remove(ByteBuffer _name)
125 {
126 m_attrs.remove(_name);
127 }
128
129 @Override
130 public void removeAll(Set<ByteBuffer> _keySet)
131 {
132 for(ByteBuffer _key : _keySet){
133 m_attrs.remove(_key);
134 }
135 }
136
137 @Override
138 public void clear()
139 {
140 m_attrs.clear();
141 }
142
143 /*
144 * 子供関連
145 */
146
147 @Override
148 public Iterator<Node> getChildren()
149 {
150 return Collections.unmodifiableList(m_children).iterator();
151 }
152
153 @Override
154 public void addChild(Node _child)
155 {
156 m_children.add(_child);
157 }
158
159 @Override
160 public void addChildren(List<Node> _child)
161 {
162 m_children.addAll(_child);
163 }
164
165 @Override
166 public void removeChild(Node _child)
167 {
168 m_children.remove(_child);
169 }
170
171 @Override
172 public void removeChildren(List<Node> _child)
173 {
174 m_children.removeAll(_child);
175 }
176
177 @Override
178 public void clearChildren()
179 {
180 m_children.clear();
181 }
188 } 182 }