Mercurial > hg > Members > shoshi > TreeCMSv2
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. + } + +}