Mercurial > hg > Members > shoshi > TreeCMSv2
annotate src/treecms/memory/OnMemoryTree.java @ 7:fc19e38b669b
added concurrent access client for cassandr
author | shoshi |
---|---|
date | Thu, 17 Mar 2011 23:24:08 +0900 |
parents | 12604eb6b615 |
children | f96193babac0 |
rev | line source |
---|---|
2 | 1 package treecms.memory; |
2 | |
7 | 3 import java.util.List; |
4 import java.util.Map; | |
5 import java.util.concurrent.atomic.AtomicReference; | |
3
5fa718b63cd5
finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents:
2
diff
changeset
|
6 |
2 | 7 import treecms.api.Forest; |
8 import treecms.api.Node; | |
9 import treecms.api.NodeData; | |
10 import treecms.api.NodeID; | |
11 import treecms.api.Tree; | |
12 | |
7 | 13 /** |
14 * オンメモリのTree実装です。 | |
15 * 木構造のルートとなるNodeをメンバーとして持ち、操作はすべて転送します。 | |
16 * @author shoshi | |
17 */ | |
18 final class OnMemoryTree implements Tree | |
2 | 19 { |
7 | 20 private OnMemoryNode m_root; |
21 private AtomicReference<OnMemoryNode> m_ref; | |
2 | 22 |
7 | 23 /** |
24 * コンストラクタです。 | |
25 * @param _newRoot 木構造のルートノードです。 | |
26 */ | |
27 public OnMemoryTree(OnMemoryNode _newRoot) | |
2 | 28 { |
29 m_root = _newRoot; | |
7 | 30 m_ref = new AtomicReference<OnMemoryNode>(_newRoot); |
2 | 31 } |
32 | |
7 | 33 /** |
34 * Nodeが属するForestを取得します. | |
35 * @return Nodeが属するForest | |
36 */ | |
2 | 37 @Override |
38 public Forest getForest() | |
39 { | |
7 | 40 return m_ref.get().getForest(); |
2 | 41 } |
42 | |
7 | 43 /** |
44 * Nodeに対応するNodeIDを取得します. | |
45 * @return Nodeに対応するNodeID | |
46 */ | |
2 | 47 @Override |
48 public NodeID getID() | |
49 { | |
7 | 50 return m_ref.get().getID(); |
2 | 51 } |
52 | |
7 | 53 /** |
54 * Nodeが保持するデータを取得します.クライアントはこのメソッドを用いて取得されるNodeDataを用いてNodeの内容を<b>変更できません</b>。 | |
55 * @return Nodeが保持するNodeData | |
56 */ | |
2 | 57 @Override |
58 public NodeData getData() | |
59 { | |
7 | 60 return m_ref.get().getData(); |
61 } | |
62 | |
63 /** | |
64 * この木構造のルートNodeを取得します. | |
65 * @return ルートNode | |
66 */ | |
67 @Override | |
68 public Node getRoot() | |
69 { | |
70 return m_ref.get(); | |
71 } | |
72 | |
73 /** | |
74 * 指定されたNodeを子供Nodeとして追加します. | |
75 * @param _child | |
76 */ | |
77 @Override | |
78 public void add(Node _child) | |
79 { | |
80 m_ref.get().add(_child); | |
81 } | |
82 | |
83 /** | |
84 * 指定されたリストに含まれるNodeを,すべて子供Nodeとして追加します. | |
85 * @param _children 追加される子供Nodeを保持するリスト | |
86 */ | |
87 @Override | |
88 public void addAll(List<Node> _children) | |
89 { | |
90 m_ref.get().addAll(_children); | |
2 | 91 } |
92 | |
7 | 93 /** |
94 * 子供Nodeのリストを取得します.. | |
95 * @return 子供Nodeのリスト | |
96 */ | |
2 | 97 @Override |
7 | 98 public List<Node> children() |
2 | 99 { |
7 | 100 return m_ref.get().children(); |
101 } | |
102 | |
103 /** | |
104 * このNodeが保持する値の中で指定されたキーと対応する値を取得します. | |
105 * @param _key データに対応するキー | |
106 * @return キーと対応する値,見つからない場合はnull | |
107 */ | |
108 @Override | |
109 public byte[] get(byte[] _key) | |
110 { | |
111 return m_ref.get().get(_key); | |
112 } | |
113 | |
114 /** | |
115 * このNodeが保持するデータをマップとしてすべて取得します. | |
116 * @return Nodeが保持するすべてのデータのマップ | |
117 */ | |
118 @Override | |
119 public Map<byte[],byte[]> getAll() | |
120 { | |
121 return m_ref.get().getAll(); | |
2 | 122 } |
123 | |
7 | 124 /** |
125 * キーとそれに対応する値を保存します.キーが重複した場合は上書きされます. | |
126 * @param _key キー | |
127 * @param _value 値 | |
128 */ | |
129 @Override | |
130 public void put(byte[] _key,byte[] _value) | |
131 { | |
132 m_ref.get().put(_key,_value); | |
133 } | |
134 | |
135 /** | |
136 * キーとそれに対応する値を複数保持するマップを引数としてとり,マップが保持する値をすべて追加します. | |
137 * @param _map 追加される値のマップ | |
138 */ | |
139 @Override | |
140 public void putAll(Map<byte[], byte[]> _map) | |
141 { | |
142 m_ref.get().putAll(_map); | |
143 } | |
144 | |
145 /** | |
146 * ルートNodeを比較して置き換えます. | |
147 * @param _except 比較する対象 | |
148 * @param _newRoot 一致した場合置き換える対象 | |
149 */ | |
150 public boolean compareAndSwapRootNode(OnMemoryNode _except,OnMemoryNode _newRoot,boolean _force) | |
151 { | |
152 if(_force){ | |
153 return m_ref.compareAndSet(_except,_newRoot); | |
154 } | |
155 | |
156 m_ref.set(_newRoot); | |
157 return true; | |
158 } | |
2 | 159 } |