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 }