view src/treecms/tree/cassandra/v1/CassandraTree.java @ 4:f5ed85be5640

finished treecms.cassandra.v1 implementation (not tested yet)
author shoshi
date Thu, 24 Feb 2011 21:30:18 +0900
parents
children 87bba22e4fa2
line wrap: on
line source

package treecms.tree.cassandra.v1;

import java.util.LinkedList;
import java.util.concurrent.ConcurrentHashMap;
import treecms.api.Forest;
import treecms.api.Node;
import treecms.api.NodeData;
import treecms.api.NodeID;
import treecms.api.Tree;

public class CassandraTree implements Tree
{
	CassandraNode m_root;
	CassandraForest m_forest;
	ConcurrentHashMap<String,CassandraNode> m_table;
	
	CassandraTree(CassandraNode _node,CassandraForest _forest)
	{
		m_root = _node;
		m_forest = _forest;
		m_table = new ConcurrentHashMap<String,CassandraNode>();
	}

	@Override
	public NodeID getID()
	{
		return m_root.getID();
	}

	@Override
	public NodeData getData()
	{
		return m_root.getData();
	}

	@Override
	public Forest getForest()
	{
		return m_forest;
	}

	@Override
	public Node getRoot()
	{
		return m_root;
	}

	@Override
	public Node getNodeByUUID(String _uuid)
	{
		return m_table.get(_uuid);
	}

	@Override
	public synchronized Node updateTree(Node _target,NodeData _newData)
	{
		LinkedList<CassandraNode> path = findPath(m_root,(CassandraNode)_target,_newData);
		
		if(path == null)
		{
			//not found.
			return null;
		}
		
		
		//clone
		
		m_root = path.peekFirst();
		return path.peekLast();
	}
	
	CassandraNode cloneNode(CassandraNode _target,NodeData _newData)
	{
		CassandraNode clone = (CassandraNode)m_forest.createNode(_target.getID().update(),_newData);
		m_table.put(clone.getID().getUUID(),clone);
		return clone;
	}
	
	LinkedList<CassandraNode> findPath(CassandraNode _parent,CassandraNode _target,NodeData _newData)
	{
		if(_parent.getID().isFamily(_target.getID())){
			//find.
			LinkedList<CassandraNode> path = new LinkedList<CassandraNode>();
			path.addFirst(_target);
			return path;
		}
		
		for(Node child : _parent.getData().list()){
			LinkedList<CassandraNode> path = findPath((CassandraNode)child,_target,_newData);
			if(path != null){
				path.addFirst(_parent);
				return path;
			}
		}
		
		return null; //not found.
	}
}