Mercurial > hg > Members > shoshi > TreeCMSv2
diff src/treecms/memory/OnMemoryTreeEditor.java @ 6:12604eb6b615
added javadoc
author | shoshi |
---|---|
date | Mon, 14 Mar 2011 23:24:38 +0900 |
parents | 5fa718b63cd5 |
children | fc19e38b669b |
line wrap: on
line diff
--- a/src/treecms/memory/OnMemoryTreeEditor.java Tue Mar 01 01:29:59 2011 +0900 +++ b/src/treecms/memory/OnMemoryTreeEditor.java Mon Mar 14 23:24:38 2011 +0900 @@ -1,5 +1,9 @@ package treecms.memory; +import java.util.LinkedList; + +import treecms.api.Node; +import treecms.api.NodeData; import treecms.api.TreeEditor; import treecms.merger.Merger; import treecms.merger.ReplaceMerger; @@ -47,4 +51,56 @@ Merger merger = new ReplaceMerger(); m_root = (OnMemoryNode)merger.merge(m_tree.m_root,m_root); } + + @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(),_newData); + m_table.put(clone.getID().getUUID(),clone); + 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. + } + + @Override + public Node getRoot() + { + return m_root; + } }