# HG changeset patch # User shoshi # Date 1297858112 -32400 # Node ID 4a5ee88f02cf02164ef1f8d2f3bcea24f59c5310 # Parent bdde898e8ef901fbfadec9b0c92dfb62d959e9cf added OnMemoryForest diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/api/Forest.java --- 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(); } diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/api/Node.java --- 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 +public interface Node { public NodeID getID(); public NodeData getData(); public NodeData newData(); + public Forest getForest(); } \ No newline at end of file diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/api/NodeData.java --- /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 list(); + public void add(List _child); + public void del(List _child); + public void clear(); +} diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/api/Tree.java --- /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); +} diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/memory/OnMemoryForest.java --- /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 m_table; + + public OnMemoryForest() + { + m_table = new ConcurrentHashMap(); + } + + 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); + } + } +} diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/memory/OnMemoryNode.java --- /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 m_children; + String m_value; + + public NodeDataImpl() + { + m_children = new LinkedList(); + } + + @Override + public List 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 _child) + { + m_children.addAll(_child); + } + + @Override + public void del(List _child) + { + m_children.removeAll(_child); + } + + @Override + public void clear() + { + m_children.clear(); + } + + } +} diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/memory/OnMemoryTree.java --- /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 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 findAndClone(OnMemoryNode _parent,OnMemoryNode _target,NodeData _newData) + { + if(_parent.getID().isFamily(_target.getID())){ + //find. + LinkedList path = new LinkedList(); + OnMemoryNode clone = cloneNode((OnMemoryNode)_parent,_newData); + path.addFirst(clone); + return path; + } + + for(Node child : _parent.getData().list()){ + LinkedList 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. + } + +} diff -r bdde898e8ef9 -r 4a5ee88f02cf src/treecms/memory/OnMemoryTreeEditor.java --- /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() + { + } + + +}