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