Mercurial > hg > Members > shoshi > TreeCMSv2
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 } |