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;
 	}
 }