Mercurial > hg > Members > shoshi > TreeCMSv2
comparison src/treecms/memory/OnMemoryForest.java @ 21:f3150b37f9be
commit
author | shoshi |
---|---|
date | Mon, 06 Jun 2011 21:49:04 +0900 |
parents | 084de6909451 |
children | fa784faafc78 |
comparison
equal
deleted
inserted
replaced
20:084de6909451 | 21:f3150b37f9be |
---|---|
1 package treecms.memory; | 1 package treecms.memory; |
2 | 2 |
3 import java.util.Map; | 3 import java.util.Map; |
4 import java.util.Random; | |
5 import java.util.UUID; | |
6 import java.util.concurrent.ConcurrentHashMap; | 4 import java.util.concurrent.ConcurrentHashMap; |
7 import treecms.api.Forest; | 5 import treecms.api.Forest; |
8 import treecms.api.MonotonicTreeNode; | 6 import treecms.api.Node; |
9 import treecms.api.NodeID; | 7 import treecms.api.NodeID; |
10 import treecms.api.MonotonicTree; | 8 import treecms.api.MonotonicTree; |
11 import treecms.tree.id.AbstractRandomNodeID; | 9 import treecms.tree.id.RandomNodeID; |
12 import treecms.tree.util.NodeData; | 10 import treecms.tree.util.NodeData; |
13 | 11 |
14 /** | |
15 * Forestのオンメモリ上の実装. | |
16 * @author shoshi | |
17 */ | |
18 public class OnMemoryForest implements Forest | 12 public class OnMemoryForest implements Forest |
19 { | 13 { |
20 //Nodeのマップ | |
21 private final Map<NodeID,OnMemoryNode> m_table; | 14 private final Map<NodeID,OnMemoryNode> m_table; |
22 //最新版Nodeのマップ | |
23 private final Map<String,OnMemoryNode> m_tipTable; | 15 private final Map<String,OnMemoryNode> m_tipTable; |
16 private final OnMemoryMonotonicTree m_mainTree; | |
24 | 17 |
25 //MainTreeのUUID | |
26 private final String m_mainID; | |
27 | |
28 /** | |
29 * コンストラクタ | |
30 */ | |
31 public OnMemoryForest() | 18 public OnMemoryForest() |
32 { | 19 { |
33 m_table = new ConcurrentHashMap<NodeID,OnMemoryNode>(); | 20 m_table = new ConcurrentHashMap<NodeID,OnMemoryNode>(); |
34 m_tipTable = new ConcurrentHashMap<String,OnMemoryNode>(); | 21 m_tipTable = new ConcurrentHashMap<String,OnMemoryNode>(); |
35 | 22 |
36 m_mainID = createNode(null,null).getID().getFamilyID(); | 23 OnMemoryNode root = (OnMemoryNode)create(); |
24 m_mainTree = new OnMemoryMonotonicTree(root); | |
37 } | 25 } |
38 | 26 |
39 /** | 27 private NodeID createID(String _fid) |
40 * 新しくNodeを作成します | |
41 * @param _id Nodeに適用されるNodeID | |
42 * @param _newData Nodeが保持するNodeData | |
43 * @return 作成されたOnMemoryNode | |
44 */ | |
45 public OnMemoryNode createNode(NodeID _id,NodeData<OnMemoryNode> _newData) | |
46 { | 28 { |
47 NodeID newID = (_id != null) ? _id : createID(); | 29 return new RandomNodeID(_fid); |
48 NodeData<OnMemoryNode> newData = (_newData != null) ? _newData : new NodeData<OnMemoryNode>(); | |
49 | |
50 //newIDとnewDataを元にOnMemoryNodeを生成する. | |
51 OnMemoryNode newNode = new OnMemoryNode(this,newID,newData); | |
52 | |
53 //登録 | |
54 m_table.put(newID,newNode); | |
55 m_tipTable.put(newID.getFamilyID(),newNode); | |
56 | |
57 return newNode; | |
58 } | |
59 | |
60 /** | |
61 * 新しいNodeIDを作成します | |
62 * @return 新しいNodeID | |
63 */ | |
64 private NodeID createID() | |
65 { | |
66 return new RandomNodeID(null); | |
67 } | 30 } |
68 | 31 |
69 /** | |
70 * NodeIDに対応するNodeを取得します | |
71 * @return NodeIDに対応するNode | |
72 */ | |
73 @Override | 32 @Override |
74 public MonotonicTree get(NodeID _id) | 33 public MonotonicTree get(NodeID _id) |
75 { | 34 { |
76 return m_table.get(_id); | 35 OnMemoryNode node = m_table.get(_id); |
36 return new OnMemoryMonotonicTree(node); | |
77 } | 37 } |
78 | 38 |
79 /** | |
80 * 新しくNodeを作成します. | |
81 * @return 新しいNode | |
82 */ | |
83 @Override | 39 @Override |
84 public MonotonicTree create() | 40 public MonotonicTree create() |
85 { | 41 { |
86 return createNode(null,null); | 42 OnMemoryNode node = createNode(createID(null),null); |
43 OnMemoryMonotonicTree tree = new OnMemoryMonotonicTree(node); | |
44 return tree; | |
87 } | 45 } |
88 | 46 |
89 /** | |
90 * NodeDataを保持した新しいNodeを作成します | |
91 * @return NodeDataを保持した新しいNode | |
92 */ | |
93 @Override | 47 @Override |
94 public SingleNode create(NodeData<SingleNode> _data) | 48 public MonotonicTree create(NodeData<Node> _data) |
95 { | 49 { |
96 return createNode(null,_data); | 50 OnMemoryNode node = createNode(null,_data); |
51 return new OnMemoryMonotonicTree(node); | |
97 } | 52 } |
98 | 53 |
99 /** | |
100 * 最新のNodeを取得します. | |
101 * @return UUIDに対応する最新のNode | |
102 */ | |
103 @Override | 54 @Override |
104 public SingleNode getTip(String _uuid) | 55 public MonotonicTree getTip(String _fid) |
105 { | 56 { |
106 return m_tipTable.get(_uuid); | 57 OnMemoryNode node = m_tipTable.get(_fid); |
58 return new OnMemoryMonotonicTree(node); | |
107 } | 59 } |
108 | 60 |
109 /** | |
110 * MainTreeを取得します。 | |
111 * @return このForestのMainTree | |
112 */ | |
113 @Override | 61 @Override |
114 public MonotonicTree getMainTree() | 62 public MonotonicTree getMainTree() |
115 { | 63 { |
116 return new OnMemoryTree(m_tipTable.get(m_mainID)); | 64 return m_mainTree; |
117 } | 65 } |
118 | 66 |
119 @Override | 67 public OnMemoryNode createNode(NodeID _newID,NodeData<Node> _newData) |
120 public SingleNode create(NodeID _id,NodeData<SingleNode> _data) | |
121 { | 68 { |
122 return createNode(_id,_data); | 69 OnMemoryNode newNode = new OnMemoryNode(this,_newID,_newData); |
123 } | 70 m_table.put(newNode.getID(),newNode); |
124 | 71 m_tipTable.put(newNode.getID().getFamilyID(),newNode); |
125 /** | 72 return newNode; |
126 * ランダムにバージョン番号を生成するNodeIDです.ファクトリを内包します. | |
127 * @author shoshi | |
128 */ | |
129 private static class RandomNodeID extends AbstractRandomNodeID | |
130 { | |
131 /** | |
132 * UUID | |
133 */ | |
134 private String m_uuid; | |
135 | |
136 /** | |
137 * バージョン番号(ランダム値) | |
138 */ | |
139 private long m_version; | |
140 | |
141 /** | |
142 * コンストラクタ | |
143 * @param _uuid 継承するUUID | |
144 */ | |
145 public RandomNodeID(String _uuid) | |
146 { | |
147 m_uuid = (_uuid != null) ? _uuid : UUID.randomUUID().toString(); | |
148 m_version = (new Random()).nextLong(); | |
149 } | |
150 | |
151 /** | |
152 * 新しいRandomNodeIDを作成します。 | |
153 * @return 新しいRandomNodeID | |
154 */ | |
155 @Override | |
156 public NodeID create() | |
157 { | |
158 return new RandomNodeID(null); | |
159 } | |
160 | |
161 /** | |
162 * UUIDを継承したRandomNodeIDを作成します. | |
163 * @return 新しいRandomNodeID | |
164 */ | |
165 @Override | |
166 public NodeID update() | |
167 { | |
168 return new RandomNodeID(m_uuid); | |
169 } | |
170 | |
171 /** | |
172 * UUIDを取得します. | |
173 * @return UUID | |
174 */ | |
175 @Override | |
176 public String getUUID() | |
177 { | |
178 return m_uuid; | |
179 } | |
180 | |
181 /** | |
182 * バージョンを取得します. | |
183 * @return バージョン | |
184 */ | |
185 @Override | |
186 public String getVersion() | |
187 { | |
188 return Long.toHexString(m_version); | |
189 } | |
190 } | 73 } |
191 } | 74 } |