changeset 2:4a5ee88f02cf

added OnMemoryForest
author shoshi
date Wed, 16 Feb 2011 21:08:32 +0900
parents bdde898e8ef9
children 5fa718b63cd5
files src/treecms/api/Forest.java src/treecms/api/Node.java src/treecms/api/NodeData.java src/treecms/api/Tree.java src/treecms/memory/OnMemoryForest.java src/treecms/memory/OnMemoryNode.java src/treecms/memory/OnMemoryTree.java src/treecms/memory/OnMemoryTreeEditor.java
diffstat 8 files changed, 383 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/treecms/api/Forest.java	Wed Feb 16 17:06:51 2011 +0900
+++ b/src/treecms/api/Forest.java	Wed Feb 16 21:08:32 2011 +0900
@@ -3,5 +3,5 @@
 public interface Forest
 {
 	Node get(NodeID _id);
-	Tree tree(Node _newRoot);
+	Node create();
 }
--- a/src/treecms/api/Node.java	Wed Feb 16 17:06:51 2011 +0900
+++ b/src/treecms/api/Node.java	Wed Feb 16 21:08:32 2011 +0900
@@ -1,8 +1,9 @@
 package treecms.api;
 
-public interface Node extends Iterable<Node>
+public interface Node
 {
 	public NodeID getID();
 	public NodeData getData();
 	public NodeData newData();
+	public Forest getForest();
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/api/NodeData.java	Wed Feb 16 21:08:32 2011 +0900
@@ -0,0 +1,14 @@
+package treecms.api;
+
+import java.util.List;
+
+public interface NodeData
+{
+	public String get();
+	public void set(String _str);
+	
+	public List<Node> list();
+	public void add(List<Node> _child);
+	public void del(List<Node> _child);
+	public void clear();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/api/Tree.java	Wed Feb 16 21:08:32 2011 +0900
@@ -0,0 +1,7 @@
+package treecms.api;
+
+public interface Tree extends Node
+{
+	Node getNodeByUUID(String _uuid);
+	Node updateTree(Node _target,NodeData _newData);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/memory/OnMemoryForest.java	Wed Feb 16 21:08:32 2011 +0900
@@ -0,0 +1,85 @@
+package treecms.memory;
+
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import treecms.api.Forest;
+import treecms.api.Node;
+import treecms.api.NodeID;
+import treecms.tree.id.RandomNodeID;
+
+public class OnMemoryForest implements Forest
+{
+	ConcurrentHashMap<NodeID,OnMemoryNode> m_table;
+	
+	public OnMemoryForest()
+	{
+		m_table = new ConcurrentHashMap<NodeID,OnMemoryNode>();
+	}
+	
+	public OnMemoryNode createNode(NodeID _id)
+	{
+		if(_id == null){
+			return new OnMemoryNode(this,createID());
+		}
+		return new OnMemoryNode(this,_id);
+	}
+	
+	NodeID createID()
+	{
+		return new RandomNodeIDImpl(null);
+	}
+
+	@Override
+	public Node get(NodeID _id)
+	{
+		return m_table.get(_id);
+	}
+	
+	@Override
+	public Node create()
+	{
+		return createNode(null);
+	}
+	
+	class RandomNodeIDImpl extends RandomNodeID
+	{
+		String m_uuid;
+		long m_version;
+		
+		public RandomNodeIDImpl(String _uuid)
+		{
+			if(_uuid != null){
+			 	m_uuid = _uuid;
+			}else{
+				m_uuid = UUID.randomUUID().toString();
+			}
+			m_version = (new Random()).nextLong();
+		}
+
+		@Override
+		public NodeID create()
+		{
+			return new RandomNodeIDImpl(null);
+		}
+
+		@Override
+		public NodeID update()
+		{
+			return new RandomNodeIDImpl(m_uuid);
+		}
+
+		@Override
+		public String getUUID()
+		{
+			return m_uuid;
+		}
+
+		@Override
+		public String getVersion()
+		{
+			return Long.toHexString(m_version);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/memory/OnMemoryNode.java	Wed Feb 16 21:08:32 2011 +0900
@@ -0,0 +1,94 @@
+package treecms.memory;
+
+import java.util.LinkedList;
+import java.util.List;
+import treecms.api.Forest;
+import treecms.api.Node;
+import treecms.api.NodeData;
+import treecms.api.NodeID;
+
+public class OnMemoryNode implements Node
+{
+	NodeID m_id;
+	OnMemoryForest m_forest;
+	NodeData m_data;
+	
+	public OnMemoryNode(OnMemoryForest _forest,NodeID _id)
+	{
+		m_id = _id;
+		m_forest = _forest;
+		m_data = new NodeDataImpl();
+	}
+	
+	@Override
+	public Forest getForest()
+	{
+		return m_forest;
+	}
+	
+	@Override
+	public NodeID getID()
+	{
+		return m_id;
+	}
+
+	@Override
+	public NodeData getData()
+	{
+		return m_data;
+	}
+
+	@Override
+	public NodeData newData()
+	{
+		return new NodeDataImpl();
+	}
+
+	class NodeDataImpl implements NodeData
+	{
+		List<Node> m_children;
+		String m_value;
+		
+		public NodeDataImpl()
+		{
+			m_children = new LinkedList<Node>();
+		}
+		
+		@Override
+		public List<Node> list()
+		{
+			return m_children;
+		}
+		
+		@Override
+		public String get()
+		{
+			return m_value;
+		}
+
+		@Override
+		public void set(String _str)
+		{
+			m_value = _str;
+		}
+
+		@Override
+		public void add(List<Node> _child)
+		{
+			m_children.addAll(_child);
+		}
+
+		@Override
+		public void del(List<Node> _child)
+		{
+			m_children.removeAll(_child);
+		}
+
+		@Override
+		public void clear()
+		{
+			m_children.clear();
+		}
+		
+	}
+}
--- /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.
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/memory/OnMemoryTreeEditor.java	Wed Feb 16 21:08:32 2011 +0900
@@ -0,0 +1,76 @@
+package treecms.memory;
+
+import treecms.api.Forest;
+import treecms.api.Node;
+import treecms.api.NodeData;
+import treecms.api.NodeID;
+import treecms.api.TreeEditor;
+
+public class OnMemoryTreeEditor implements TreeEditor
+{
+	public OnMemoryTreeEditor(OnMemoryTree _tree)
+	{
+		
+	}
+	
+	@Override
+	public Forest getForest()
+	{
+		return null;
+	}
+	
+	@Override
+	public Node getNodeByUUID(String _uuid)
+	{
+		return null;
+	}
+
+	@Override
+	public Node updateTree(Node _target, NodeData _newData)
+	{
+		return null;
+	}
+
+	@Override
+	public NodeID getID()
+	{
+		return null;
+	}
+
+	@Override
+	public NodeData getData()
+	{
+		return null;
+	}
+
+	@Override
+	public NodeData newData()
+	{
+		return null;
+	}
+
+	@Override
+	public boolean commit(boolean _force)
+	{
+		return false;
+	}
+
+	@Override
+	public boolean pull()
+	{
+		return false;
+	}
+
+	@Override
+	public boolean check()
+	{
+		return false;
+	}
+
+	@Override
+	public void merge()
+	{
+	}
+
+
+}