diff src/treecms/memory/OnMemoryTree.java @ 2:4a5ee88f02cf

added OnMemoryForest
author shoshi
date Wed, 16 Feb 2011 21:08:32 +0900
parents
children 5fa718b63cd5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/memory/OnMemoryTree.java	Wed Feb 16 21:08:32 2011 +0900
@@ -0,0 +1,104 @@
+package treecms.memory;
+
+import java.util.LinkedList;
+import treecms.api.Forest;
+import treecms.api.Node;
+import treecms.api.NodeData;
+import treecms.api.NodeID;
+import treecms.api.Tree;
+
+public class OnMemoryTree implements Tree
+{
+	OnMemoryNode m_root;
+	OnMemoryForest m_forest;
+	
+	public OnMemoryTree(OnMemoryNode _newRoot,OnMemoryForest _forest)
+	{
+		m_root = _newRoot;
+		m_forest = _forest;
+	}
+	
+	@Override
+	public Forest getForest()
+	{
+		return m_forest;
+	}
+
+	@Override
+	public NodeID getID()
+	{
+		return m_root.getID();
+	}
+
+	@Override
+	public NodeData getData()
+	{
+		return m_root.getData();
+	}
+
+	@Override
+	public NodeData newData()
+	{
+		return m_root.newData();
+	}
+
+	@Override
+	public Node getNodeByUUID(String _uuid)
+	{
+		return null;
+	}
+
+	@Override
+	public synchronized Node updateTree(Node _target,NodeData _newData)
+	{
+		LinkedList<OnMemoryNode> path = findAndClone(m_root,(OnMemoryNode)_target,_newData);
+		
+		if(path == null)
+		{
+			//not found.
+			return null;
+		}
+		
+		m_root = path.peekFirst();
+		return path.peekLast();
+	}
+	
+	OnMemoryNode cloneNode(OnMemoryNode _target,NodeData _newData)
+	{
+		OnMemoryNode clone = m_forest.createNode(_target.getID().update());
+		
+		if(_newData != null){
+			clone.m_data.add(_newData.list());
+			clone.m_data.set(_newData.get());
+		}else{
+			clone.m_data.add(_target.m_data.list());
+			clone.m_data.set(_target.m_data.get());
+		}
+		return clone;
+	}
+	
+	LinkedList<OnMemoryNode> findAndClone(OnMemoryNode _parent,OnMemoryNode _target,NodeData _newData)
+	{
+		if(_parent.getID().isFamily(_target.getID())){
+			//find.
+			LinkedList<OnMemoryNode> path = new LinkedList<OnMemoryNode>();
+			OnMemoryNode clone = cloneNode((OnMemoryNode)_parent,_newData);
+			path.addFirst(clone);
+			return path;
+		}
+		
+		for(Node child : _parent.getData().list()){
+			LinkedList<OnMemoryNode> path = findAndClone((OnMemoryNode)child,_target,_newData);
+			if(path != null){
+				OnMemoryNode clone = cloneNode((OnMemoryNode)_parent,null);
+				clone.getData().list().remove(child);
+				clone.getData().list().add(path.peekFirst());
+				path.addFirst(clone);
+				return path;
+			}
+		}
+		
+		return null; //not found.
+	}
+
+}