Mercurial > hg > Members > shoshi > TreeCMSv2
annotate src/treecms/memory/OnMemoryForest.java @ 17:168deb591f21
commit
author | shoshi |
---|---|
date | Tue, 24 May 2011 00:33:12 +0900 |
parents | bb9760760744 |
children | 084de6909451 |
rev | line source |
---|---|
2 | 1 package treecms.memory; |
2 | |
6 | 3 import java.util.Map; |
2 | 4 import java.util.Random; |
5 import java.util.UUID; | |
6 import java.util.concurrent.ConcurrentHashMap; | |
7 import treecms.api.Forest; | |
8 import treecms.api.NodeID; | |
15 | 9 import treecms.api.SingleNode; |
8 | 10 import treecms.api.Tree; |
11 | 11 import treecms.api.MonotonicTree; |
6 | 12 import treecms.tree.id.AbstractRandomNodeID; |
16 | 13 import treecms.tree.util.NodeData; |
2 | 14 |
7 | 15 /** |
16 * Forestのオンメモリ上の実装. | |
17 * @author shoshi | |
18 */ | |
2 | 19 public class OnMemoryForest implements Forest |
20 { | |
7 | 21 //Nodeのマップ |
6 | 22 Map<NodeID,OnMemoryNode> m_table; |
7 | 23 //最新版Nodeのマップ |
6 | 24 Map<String,OnMemoryNode> m_tipTable; |
2 | 25 |
8 | 26 //MainTreeのUUID |
27 String m_mainID; | |
28 | |
7 | 29 /** |
30 * コンストラクタ | |
31 */ | |
2 | 32 public OnMemoryForest() |
33 { | |
34 m_table = new ConcurrentHashMap<NodeID,OnMemoryNode>(); | |
6 | 35 m_tipTable = new ConcurrentHashMap<String,OnMemoryNode>(); |
8 | 36 |
37 m_mainID = createNode(null,null).getID().getUUID(); | |
2 | 38 } |
39 | |
7 | 40 /** |
41 * 新しくNodeを作成します | |
42 * @param _id Nodeに適用されるNodeID | |
43 * @param _newData Nodeが保持するNodeData | |
44 * @return 作成されたOnMemoryNode | |
45 */ | |
15 | 46 public OnMemoryNode createNode(NodeID _id,NodeData<SingleNode> _newData) |
2 | 47 { |
4
f5ed85be5640
finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents:
3
diff
changeset
|
48 NodeID newID = (_id != null) ? _id : createID(); |
15 | 49 NodeData<SingleNode> newData = (_newData != null) ? _newData : new NodeData<SingleNode>(); |
7 | 50 |
51 //newIDとnewDataを元にOnMemoryNodeを生成する. | |
4
f5ed85be5640
finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents:
3
diff
changeset
|
52 OnMemoryNode newNode = new OnMemoryNode(this,newID,newData); |
6 | 53 |
7 | 54 //登録 |
4
f5ed85be5640
finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents:
3
diff
changeset
|
55 m_table.put(newID,newNode); |
6 | 56 m_tipTable.put(newID.getUUID(),newNode); |
57 | |
3
5fa718b63cd5
finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents:
2
diff
changeset
|
58 return newNode; |
2 | 59 } |
60 | |
7 | 61 /** |
62 * 新しいNodeIDを作成します | |
63 * @return 新しいNodeID | |
64 */ | |
65 private NodeID createID() | |
2 | 66 { |
6 | 67 return new RandomNodeID(null); |
2 | 68 } |
69 | |
7 | 70 /** |
71 * NodeIDに対応するNodeを取得します | |
72 * @return NodeIDに対応するNode | |
73 */ | |
2 | 74 @Override |
15 | 75 public SingleNode get(NodeID _id) |
2 | 76 { |
77 return m_table.get(_id); | |
78 } | |
79 | |
7 | 80 /** |
8 | 81 * あるNodeをルートとしてTreeのオブジェクトを取得します。 |
82 * @param _id 木のルートとなるNodeのNodeID | |
83 * @return Tree | |
84 */ | |
85 @Override | |
15 | 86 public Tree getTree(SingleNode _node) |
8 | 87 { |
9 | 88 Forest forest = _node.getForest(); |
89 if(forest != this){ | |
90 throw new IllegalArgumentException(); | |
91 } | |
92 | |
93 return new OnMemoryTree((OnMemoryNode)_node); | |
8 | 94 } |
95 | |
96 /** | |
97 * あるNodeをルートとしたTreeを非破壊的に編集するTreeEditorを取得します。 | |
98 * @param _id 木のルートとなるNodeのNodeID | |
99 * @return TreeEditor | |
100 */ | |
101 @Override | |
16 | 102 public MonotonicTree getMonotonicTree(Tree _tree) |
8 | 103 { |
16 | 104 Forest forest = _tree.getRoot().getForest(); |
105 if(forest != this || !(_tree instanceof OnMemoryTree)){ | |
9 | 106 throw new IllegalArgumentException(); |
107 } | |
108 | |
16 | 109 return new OnMemoryMonotonicTree((OnMemoryTree)_tree); |
8 | 110 } |
111 | |
112 /** | |
7 | 113 * 新しくNodeを作成します. |
114 * @return 新しいNode | |
115 */ | |
2 | 116 @Override |
15 | 117 public SingleNode create() |
2 | 118 { |
4
f5ed85be5640
finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents:
3
diff
changeset
|
119 return createNode(null,null); |
2 | 120 } |
7 | 121 |
122 /** | |
123 * NodeDataを保持した新しいNodeを作成します | |
124 * @return NodeDataを保持した新しいNode | |
125 */ | |
126 @Override | |
15 | 127 public SingleNode create(NodeData<SingleNode> _data) |
7 | 128 { |
129 return createNode(null,_data); | |
130 } | |
131 | |
132 /** | |
133 * 最新のNodeを取得します. | |
134 * @return UUIDに対応する最新のNode | |
135 */ | |
136 @Override | |
15 | 137 public SingleNode getTip(String _uuid) |
2 | 138 { |
7 | 139 return m_tipTable.get(_uuid); |
140 } | |
8 | 141 |
142 /** | |
143 * MainTreeを取得します。 | |
144 * @return このForestのMainTree | |
145 */ | |
146 @Override | |
147 public Tree getMainTree() | |
148 { | |
149 return new OnMemoryTree(m_tipTable.get(m_mainID)); | |
150 } | |
7 | 151 |
17 | 152 @Override |
153 public SingleNode create(NodeID _id,NodeData<SingleNode> _data) | |
154 { | |
155 return createNode(_id,_data); | |
156 } | |
157 | |
7 | 158 /** |
159 * ランダムにバージョン番号を生成するNodeIDです.ファクトリを内包します. | |
160 * @author shoshi | |
161 */ | |
162 private static class RandomNodeID extends AbstractRandomNodeID | |
163 { | |
164 /** | |
165 * UUID | |
166 */ | |
167 private String m_uuid; | |
2 | 168 |
7 | 169 /** |
170 * バージョン番号(ランダム値) | |
171 */ | |
172 private long m_version; | |
173 | |
174 /** | |
175 * コンストラクタ | |
176 * @param _uuid 継承するUUID | |
177 */ | |
6 | 178 public RandomNodeID(String _uuid) |
2 | 179 { |
7 | 180 m_uuid = (_uuid != null) ? _uuid : UUID.randomUUID().toString(); |
2 | 181 m_version = (new Random()).nextLong(); |
182 } | |
183 | |
7 | 184 /** |
185 * 新しいRandomNodeIDを作成します。 | |
186 * @return 新しいRandomNodeID | |
187 */ | |
2 | 188 @Override |
189 public NodeID create() | |
190 { | |
6 | 191 return new RandomNodeID(null); |
2 | 192 } |
193 | |
7 | 194 /** |
195 * UUIDを継承したRandomNodeIDを作成します. | |
196 * @return 新しいRandomNodeID | |
197 */ | |
2 | 198 @Override |
199 public NodeID update() | |
200 { | |
6 | 201 return new RandomNodeID(m_uuid); |
2 | 202 } |
203 | |
7 | 204 /** |
205 * UUIDを取得します. | |
206 * @return UUID | |
207 */ | |
2 | 208 @Override |
209 public String getUUID() | |
210 { | |
211 return m_uuid; | |
212 } | |
213 | |
7 | 214 /** |
215 * バージョンを取得します. | |
216 * @return バージョン | |
217 */ | |
2 | 218 @Override |
219 public String getVersion() | |
220 { | |
221 return Long.toHexString(m_version); | |
222 } | |
223 } | |
224 } |