view src/treecms/memory/OnMemoryTree.java @ 7:fc19e38b669b

added concurrent access client for cassandr
author shoshi
date Thu, 17 Mar 2011 23:24:08 +0900
parents 12604eb6b615
children f96193babac0
line wrap: on
line source

package treecms.memory;

import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

import treecms.api.Forest;
import treecms.api.Node;
import treecms.api.NodeData;
import treecms.api.NodeID;
import treecms.api.Tree;

/**
 * オンメモリのTree実装です。
 * 木構造のルートとなるNodeをメンバーとして持ち、操作はすべて転送します。
 * @author shoshi
 */
final class OnMemoryTree implements Tree
{
	private OnMemoryNode m_root;
	private AtomicReference<OnMemoryNode> m_ref;
	
	/**
	 * コンストラクタです。
	 * @param _newRoot 木構造のルートノードです。
	 */
	public OnMemoryTree(OnMemoryNode _newRoot)
	{
		m_root = _newRoot;
		m_ref = new AtomicReference<OnMemoryNode>(_newRoot);
	}
	
	/**
	 * Nodeが属するForestを取得します.
	 * @return Nodeが属するForest
	 */
	@Override
	public Forest getForest()
	{
		return m_ref.get().getForest();
	}

	/**
	 * Nodeに対応するNodeIDを取得します.
	 * @return Nodeに対応するNodeID
	 */
	@Override
	public NodeID getID()
	{
		return m_ref.get().getID();
	}

	/**
	 * Nodeが保持するデータを取得します.クライアントはこのメソッドを用いて取得されるNodeDataを用いてNodeの内容を<b>変更できません</b>。
	 * @return Nodeが保持するNodeData
	 */
	@Override
	public NodeData getData()
	{
		return m_ref.get().getData();
	}

	/**
	 * この木構造のルートNodeを取得します.
	 * @return ルートNode
	 */	
	@Override
	public Node getRoot()
	{
		return m_ref.get();
	}

	/**
	 * 指定されたNodeを子供Nodeとして追加します.
	 * @param _child
	 */
	@Override
	public void add(Node _child)
	{
		m_ref.get().add(_child);
	}

	/**
	 * 指定されたリストに含まれるNodeを,すべて子供Nodeとして追加します.
	 * @param _children 追加される子供Nodeを保持するリスト
	 */
	@Override
	public void addAll(List<Node> _children)
	{
		m_ref.get().addAll(_children);
	}

	/**
	 * 子供Nodeのリストを取得します..
	 * @return 子供Nodeのリスト
	 */
	@Override
	public List<Node> children()
	{
		return m_ref.get().children();
	}
	
	/**
	 * このNodeが保持する値の中で指定されたキーと対応する値を取得します.
	 * @param _key データに対応するキー
	 * @return キーと対応する値,見つからない場合はnull
	 */
	@Override
	public byte[] get(byte[] _key)
	{
		return m_ref.get().get(_key);
	}

	/**
	 * このNodeが保持するデータをマップとしてすべて取得します.
	 * @return Nodeが保持するすべてのデータのマップ
	 */
	@Override
	public Map<byte[],byte[]> getAll()
	{
		return m_ref.get().getAll();
	}

	/**
	 * キーとそれに対応する値を保存します.キーが重複した場合は上書きされます.
	 * @param _key キー
	 * @param _value 値
	 */
	@Override
	public void put(byte[] _key,byte[] _value)
	{
		m_ref.get().put(_key,_value);
	}

	/**
	 * キーとそれに対応する値を複数保持するマップを引数としてとり,マップが保持する値をすべて追加します.
	 * @param _map 追加される値のマップ
	 */
	@Override
	public void putAll(Map<byte[], byte[]> _map)
	{
		m_ref.get().putAll(_map);
	}
	
	/**
	 * ルートNodeを比較して置き換えます.
	 * @param _except 比較する対象 
	 * @param _newRoot 一致した場合置き換える対象
	 */
	public boolean compareAndSwapRootNode(OnMemoryNode _except,OnMemoryNode _newRoot,boolean _force)
	{
		if(_force){
			return m_ref.compareAndSet(_except,_newRoot);
		}
		
		m_ref.set(_newRoot);
		return true;
	}
}