Mercurial > hg > Members > shoshi > TreeCMSv2
diff src/treecms/memory/OnMemoryForest.java @ 21:f3150b37f9be
commit
author | shoshi |
---|---|
date | Mon, 06 Jun 2011 21:49:04 +0900 |
parents | 084de6909451 |
children | fa784faafc78 |
line wrap: on
line diff
--- a/src/treecms/memory/OnMemoryForest.java Wed Jun 01 15:35:50 2011 +0900 +++ b/src/treecms/memory/OnMemoryForest.java Mon Jun 06 21:49:04 2011 +0900 @@ -1,191 +1,74 @@ package treecms.memory; import java.util.Map; -import java.util.Random; -import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import treecms.api.Forest; -import treecms.api.MonotonicTreeNode; +import treecms.api.Node; import treecms.api.NodeID; import treecms.api.MonotonicTree; -import treecms.tree.id.AbstractRandomNodeID; +import treecms.tree.id.RandomNodeID; import treecms.tree.util.NodeData; -/** - * Forestのオンメモリ上の実装. - * @author shoshi - */ public class OnMemoryForest implements Forest { - //Nodeのマップ private final Map<NodeID,OnMemoryNode> m_table; - //最新版Nodeのマップ private final Map<String,OnMemoryNode> m_tipTable; + private final OnMemoryMonotonicTree m_mainTree; - //MainTreeのUUID - private final String m_mainID; - - /** - * コンストラクタ - */ public OnMemoryForest() { m_table = new ConcurrentHashMap<NodeID,OnMemoryNode>(); m_tipTable = new ConcurrentHashMap<String,OnMemoryNode>(); - m_mainID = createNode(null,null).getID().getFamilyID(); + OnMemoryNode root = (OnMemoryNode)create(); + m_mainTree = new OnMemoryMonotonicTree(root); } - /** - * 新しくNodeを作成します - * @param _id Nodeに適用されるNodeID - * @param _newData Nodeが保持するNodeData - * @return 作成されたOnMemoryNode - */ - public OnMemoryNode createNode(NodeID _id,NodeData<OnMemoryNode> _newData) + private NodeID createID(String _fid) { - NodeID newID = (_id != null) ? _id : createID(); - NodeData<OnMemoryNode> newData = (_newData != null) ? _newData : new NodeData<OnMemoryNode>(); - - //newIDとnewDataを元にOnMemoryNodeを生成する. - OnMemoryNode newNode = new OnMemoryNode(this,newID,newData); - - //登録 - m_table.put(newID,newNode); - m_tipTable.put(newID.getFamilyID(),newNode); - - return newNode; - } - - /** - * 新しいNodeIDを作成します - * @return 新しいNodeID - */ - private NodeID createID() - { - return new RandomNodeID(null); + return new RandomNodeID(_fid); } - /** - * NodeIDに対応するNodeを取得します - * @return NodeIDに対応するNode - */ @Override public MonotonicTree get(NodeID _id) { - return m_table.get(_id); + OnMemoryNode node = m_table.get(_id); + return new OnMemoryMonotonicTree(node); } - /** - * 新しくNodeを作成します. - * @return 新しいNode - */ @Override public MonotonicTree create() { - return createNode(null,null); - } - - /** - * NodeDataを保持した新しいNodeを作成します - * @return NodeDataを保持した新しいNode - */ - @Override - public SingleNode create(NodeData<SingleNode> _data) - { - return createNode(null,_data); + OnMemoryNode node = createNode(createID(null),null); + OnMemoryMonotonicTree tree = new OnMemoryMonotonicTree(node); + return tree; } - /** - * 最新のNodeを取得します. - * @return UUIDに対応する最新のNode - */ @Override - public SingleNode getTip(String _uuid) + public MonotonicTree create(NodeData<Node> _data) { - return m_tipTable.get(_uuid); + OnMemoryNode node = createNode(null,_data); + return new OnMemoryMonotonicTree(node); } - /** - * MainTreeを取得します。 - * @return このForestのMainTree - */ + @Override + public MonotonicTree getTip(String _fid) + { + OnMemoryNode node = m_tipTable.get(_fid); + return new OnMemoryMonotonicTree(node); + } + @Override public MonotonicTree getMainTree() { - return new OnMemoryTree(m_tipTable.get(m_mainID)); - } - - @Override - public SingleNode create(NodeID _id,NodeData<SingleNode> _data) - { - return createNode(_id,_data); + return m_mainTree; } - /** - * ランダムにバージョン番号を生成するNodeIDです.ファクトリを内包します. - * @author shoshi - */ - private static class RandomNodeID extends AbstractRandomNodeID + public OnMemoryNode createNode(NodeID _newID,NodeData<Node> _newData) { - /** - * UUID - */ - private String m_uuid; - - /** - * バージョン番号(ランダム値) - */ - private long m_version; - - /** - * コンストラクタ - * @param _uuid 継承するUUID - */ - public RandomNodeID(String _uuid) - { - m_uuid = (_uuid != null) ? _uuid : UUID.randomUUID().toString(); - m_version = (new Random()).nextLong(); - } - - /** - * 新しいRandomNodeIDを作成します。 - * @return 新しいRandomNodeID - */ - @Override - public NodeID create() - { - return new RandomNodeID(null); - } - - /** - * UUIDを継承したRandomNodeIDを作成します. - * @return 新しいRandomNodeID - */ - @Override - public NodeID update() - { - return new RandomNodeID(m_uuid); - } - - /** - * UUIDを取得します. - * @return UUID - */ - @Override - public String getUUID() - { - return m_uuid; - } - - /** - * バージョンを取得します. - * @return バージョン - */ - @Override - public String getVersion() - { - return Long.toHexString(m_version); - } + OnMemoryNode newNode = new OnMemoryNode(this,_newID,_newData); + m_table.put(newNode.getID(),newNode); + m_tipTable.put(newNode.getID().getFamilyID(),newNode); + return newNode; } }