view 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 source

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.
	}

}