diff src/treecms/memory/OnMemoryMonotonicTreeNode.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/OnMemoryMonotonicTreeNode.java	Wed Jun 01 15:35:50 2011 +0900
+++ b/src/treecms/memory/OnMemoryMonotonicTreeNode.java	Mon Jun 06 21:49:04 2011 +0900
@@ -11,6 +11,7 @@
 
 import treecms.api.Forest;
 import treecms.api.MonotonicTreeNode;
+import treecms.api.Node;
 import treecms.api.NodeAttributes;
 import treecms.api.NodeChildren;
 import treecms.api.NodeID;
@@ -23,20 +24,20 @@
  */
 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode
 {
-	private OnMemoryNode m_node;
+	private Node m_node;
 	
 	private static final AtomicReferenceFieldUpdater<OnMemoryMonotonicTreeNode,OnMemoryMonotonicTreeNode> m_parentUpdater 
 		= AtomicReferenceFieldUpdater.newUpdater(OnMemoryMonotonicTreeNode.class,OnMemoryMonotonicTreeNode.class,"m_parent");
 	
 	private OnMemoryMonotonicTreeNode m_parent;
 	
-	private final Map<NodeID,OnMemoryMonotonicTreeNode> m_cache;
+	private final Map<String,OnMemoryMonotonicTreeNode> m_cache;
 	
 	public OnMemoryMonotonicTreeNode(OnMemoryNode _target,OnMemoryMonotonicTreeNode _parent)
 	{
 		m_node  = _target;
 		m_parent = _parent;
-		m_cache = new ConcurrentHashMap<NodeID,OnMemoryMonotonicTreeNode>();
+		m_cache = new ConcurrentHashMap<String,OnMemoryMonotonicTreeNode>();
 	}
 	
 	@Override
@@ -72,7 +73,7 @@
 	@Override
 	public synchronized void put(ByteBuffer _key, ByteBuffer _value)
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.put(_key,_value);
 		
 		cloneAndTransmit(d);
@@ -81,7 +82,7 @@
 	@Override
 	public synchronized void putAll(NodeAttributes _map)
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.putAll(_map);
 		
 		cloneAndTransmit(d);
@@ -90,7 +91,7 @@
 	@Override
 	public synchronized void remove(ByteBuffer _key)
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.remove(_key);
 		
 		cloneAndTransmit(d);
@@ -99,7 +100,7 @@
 	@Override
 	public synchronized void removeAll(Set<ByteBuffer> _keys)
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.removeAll(_keys);
 		
 		cloneAndTransmit(d);
@@ -108,32 +109,22 @@
 	@Override
 	public synchronized void clearAttributes()
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.clearAttributes();
 		
 		cloneAndTransmit(d);
 	}
 	
-	public synchronized void cloneAndTransmit(NodeData<OnMemoryNode> _d)
+	public synchronized void cloneAndTransmit(NodeData<Node> _d)
 	{
 		OnMemoryForest f = (OnMemoryForest)m_node.getForest();
-		OnMemoryNode clone = f.createNode(m_node.getID().update(),_d);
+		Node clone = f.createNode(m_node.getID().update(),_d);
 		transmit(m_node,clone);
 		
 		m_node = clone;
 	}
 	
-	/**
-	 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます.
-	 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します.
-	 * 
-	 * RootNodeまで伝搬すると親のNodeはnullとなる.親Nodeは担当するMonotonicTreeのオブジェクトを保持しており,そこにRootNodeが変更されたことを通知する.
-	 * 通知が終わり,処理が戻ってきた時に自身のOnMemoryNodeをクローンした新しいものに書き換えます.
-	 * 
-	 * _fromがnullの場合は,自身が編集元であることを示します.
-	 * @param _from 編集元のOnMemoryMonotonicTreeNode
-	 */
-	public synchronized void transmit(OnMemoryNode _orig,OnMemoryNode _edit)
+	public synchronized void transmit(Node _orig,Node _edit)
 	{
 		OnMemoryForest f = (OnMemoryForest)m_node.getForest();
 		OnMemoryNode clone = f.createNode(m_node.getID().update(),null);
@@ -160,11 +151,17 @@
 	}
 	
 	@Override
+	public synchronized Node getNode()
+	{
+		return m_node;
+	}
+	
+	@Override
 	public synchronized List<MonotonicTreeNode> getList()
 	{
 		//NodeのリストよりMonotonicTreeNodeのリストを作成する.
 		NodeChildren<MonotonicTreeNode> res = new NodeChildrenImpl<MonotonicTreeNode>();
-		for(Iterator<OnMemoryNode> it = m_node.getList().iterator();it.hasNext();){
+		for(Iterator<Node> it = m_node.getList().iterator();it.hasNext();){
 			OnMemoryNode n = (OnMemoryNode)it.next();
 			res.add(getCache(n));
 		}
@@ -176,7 +173,7 @@
 	public synchronized boolean add(MonotonicTreeNode _n)
 	{
 		OnMemoryMonotonicTreeNode mono = (OnMemoryMonotonicTreeNode)_n;
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		boolean ret = d.add(mono.m_node);
 		if(ret){
 			cloneAndTransmit(d);
@@ -189,13 +186,13 @@
 	public synchronized boolean addAll(NodeChildren<MonotonicTreeNode> _list)
 	{
 		//MotonicTreeNodeのリストからNodeのリストを作成する.
-		NodeChildren<OnMemoryNode> c = new NodeChildrenImpl<OnMemoryNode>();
+		NodeChildren<Node> c = new NodeChildrenImpl<Node>();
 		for(Iterator<MonotonicTreeNode> it = _list.getList().iterator();it.hasNext();){
 			OnMemoryMonotonicTreeNode mono = (OnMemoryMonotonicTreeNode)it.next();
 			c.add(mono.m_node);
 		}
 		
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		boolean ret = d.addAll(c);
 		if(ret){
 			cloneAndTransmit(d);
@@ -207,8 +204,8 @@
 	@Override
 	public synchronized MonotonicTreeNode remove(int _index)
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
-		OnMemoryNode n = d.remove(_index);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
+		OnMemoryNode n = (OnMemoryNode) d.remove(_index);
 		if(n != null){
 			cloneAndTransmit(d);
 			return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,null);
@@ -220,7 +217,7 @@
 	@Override
 	public synchronized void clearChildren()
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.clearChildren();
 		
 		cloneAndTransmit(d);
@@ -241,7 +238,7 @@
 	@Override
 	public synchronized MonotonicTreeNode get(int _index)
 	{
-		OnMemoryNode n = m_node.get(_index);
+		OnMemoryNode n = (OnMemoryNode) m_node.get(_index);
 		return getCache(n);
 	}
 
@@ -249,8 +246,8 @@
 	public synchronized MonotonicTreeNode replace(MonotonicTreeNode _newChild)
 	{
 		OnMemoryMonotonicTreeNode mono = (OnMemoryMonotonicTreeNode)_newChild;
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
-		OnMemoryNode n = d.replace(mono.m_node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
+		OnMemoryNode n = (OnMemoryNode) d.replace(mono.m_node);
 		
 		if(n != null){
 			cloneAndTransmit(d);
@@ -281,7 +278,7 @@
 	@Override
 	public synchronized MonotonicTreeNode get(String _fid)
 	{
-		OnMemoryNode n = m_node.get(_fid);
+		OnMemoryNode n = (OnMemoryNode) m_node.get(_fid);
 		OnMemoryMonotonicTreeNode mono = getCache(n);
 		
 		return mono;
@@ -290,8 +287,8 @@
 	@Override
 	public synchronized MonotonicTreeNode remove(String _fid)
 	{
-		NodeData<OnMemoryNode> d = new NodeData<OnMemoryNode>(m_node);
-		OnMemoryNode n = d.remove(_fid);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
+		OnMemoryNode n = (OnMemoryNode) d.remove(_fid);
 		
 		cloneAndTransmit(d);