Mercurial > hg > Members > shoshi > TreeCMSv2
annotate src/treecms/memory/OnMemoryForest.java @ 15:22cd920986c5
commit
author | misaka |
---|---|
date | Tue, 17 May 2011 21:25:17 +0900 |
parents | 85061e874775 |
children | bb9760760744 |
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; | |
4
f5ed85be5640
finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents:
3
diff
changeset
|
8 import treecms.api.NodeData; |
2 | 9 import treecms.api.NodeID; |
15 | 10 import treecms.api.SingleNode; |
8 | 11 import treecms.api.Tree; |
11 | 12 import treecms.api.MonotonicTree; |
6 | 13 import treecms.tree.id.AbstractRandomNodeID; |
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 | |
15 | 102 public MonotonicTree getMonotonicTree(SingleNode _node) |
8 | 103 { |
15 | 104 Forest forest = _node.getForest(); |
9 | 105 if(forest != this){ |
106 throw new IllegalArgumentException(); | |
107 } | |
108 | |
15 | 109 return new OnMemoryMonotonicTree((OnMemoryNode)_node); |
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 |
152 /** | |
153 * ランダムにバージョン番号を生成するNodeIDです.ファクトリを内包します. | |
154 * @author shoshi | |
155 */ | |
156 private static class RandomNodeID extends AbstractRandomNodeID | |
157 { | |
158 /** | |
159 * UUID | |
160 */ | |
161 private String m_uuid; | |
2 | 162 |
7 | 163 /** |
164 * バージョン番号(ランダム値) | |
165 */ | |
166 private long m_version; | |
167 | |
168 /** | |
169 * コンストラクタ | |
170 * @param _uuid 継承するUUID | |
171 */ | |
6 | 172 public RandomNodeID(String _uuid) |
2 | 173 { |
7 | 174 m_uuid = (_uuid != null) ? _uuid : UUID.randomUUID().toString(); |
2 | 175 m_version = (new Random()).nextLong(); |
176 } | |
177 | |
7 | 178 /** |
179 * 新しいRandomNodeIDを作成します。 | |
180 * @return 新しいRandomNodeID | |
181 */ | |
2 | 182 @Override |
183 public NodeID create() | |
184 { | |
6 | 185 return new RandomNodeID(null); |
2 | 186 } |
187 | |
7 | 188 /** |
189 * UUIDを継承したRandomNodeIDを作成します. | |
190 * @return 新しいRandomNodeID | |
191 */ | |
2 | 192 @Override |
193 public NodeID update() | |
194 { | |
6 | 195 return new RandomNodeID(m_uuid); |
2 | 196 } |
197 | |
7 | 198 /** |
199 * UUIDを取得します. | |
200 * @return UUID | |
201 */ | |
2 | 202 @Override |
203 public String getUUID() | |
204 { | |
205 return m_uuid; | |
206 } | |
207 | |
7 | 208 /** |
209 * バージョンを取得します. | |
210 * @return バージョン | |
211 */ | |
2 | 212 @Override |
213 public String getVersion() | |
214 { | |
215 return Long.toHexString(m_version); | |
216 } | |
217 } | |
218 } |