view src/treecms/api/NodeData.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.api;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * Nodeが保持するデータの集合です.Nodeを大きく変更するときや新しく作成される場合に使用されます.
 * 通常このクラスのインスタンスをNodeから取得した場合,NodeDataインスタンスに変更(set,add)を加えても元のNodeに変更は反映されません.
 * その様に実装してください.
 * @author shoshi
 */
public final class NodeData
{
	/**
	 * 子供Nodeのリスト
	 */
	private List<Node> m_children;
	
	/**
	 * キーと対応する値のマップ
	 */
	private Map<byte[],byte[]> m_attrs;
	
	/**
	 * コンストラクタです.なにもしません
	 */
	public NodeData()
	{
		this(null);
	}
	
	/**
	 * コピーコンストラクタです.NodeDataの内容を防御的にコピーします.
	 * @param _data
	 */
	public NodeData(NodeData _data)
	{
		if(_data != null){
			m_children = new CopyOnWriteArrayList<Node>(_data.m_children);
			m_attrs = new ConcurrentHashMap<byte[],byte[]>(_data.m_attrs);
			return;
		}
		m_children = new CopyOnWriteArrayList<Node>();
		m_attrs = new ConcurrentHashMap<byte[],byte[]>();
	}
	
	/**
	 * 内部でコピーコンストラクタを呼び出します.
	 * @return このNodeDataのコピー
	 */
	public NodeData deepCopy()
	{
		return new NodeData(this);
	}
	
	/**
	 * キーのセットを取得します.
	 * @return キーのセット
	 */
	public Set<byte[]> keySet()
	{
		return m_attrs.keySet();
	}
	
	/**
	 * キーに対応する値を取得します. 
	 * @param _name
	 * @return キーに対応する値
	 */
	public byte[] get(byte[] _name)
	{
		return m_attrs.get(_name);
	}
	
	/**
	 * キーとそれに対応する値を追加します.
	 * @param _name キー
	 * @param _value 値
	 */
	public void put(byte[] _name,byte[] _value)
	{
		m_attrs.put(_name,_value);
	}
	
	/**
	 * キーとそれに対応する値のマップ全体を追加します.
	 * @param _map
	 */
	public void putAll(Map<byte[],byte[]> _map)
	{
		m_attrs.putAll(_map);
	}
	
	/**
	 * 子供Nodeのリストを取得します.<br/>
	 * この取得されたリストは編集できません.編集はadd,addAllより行ってください.
	 * @return 子供Nodeのリスト
	 */
	public List<Node> children()
	{
		return Collections.unmodifiableList(m_children);
	}
	
	/**
	 * 子供Nodeを追加します.
	 * @param _child
	 */
	public void add(Node _child)
	{
		m_children.add(_child);
	}
	
	/**
	 * 子供Nodeリスト全部を子供Nodeとして追加します.
	 * @param _child
	 */
	public void addAll(List<Node> _child)
	{
		m_children.addAll(_child);
	}
	
	/**
	 * 指定されたNodeを子供Nodeのリストから削除します.
	 * @param _child
	 */
	public void remove(Node _child)
	{
		m_children.remove(_child);
	}
	
	/**
	 * 指定されたNodeのリストに含まれるすべてのNodeを子供Nodeのリストから削除します.
	 * @param _child
	 */
	public void removeAll(List<Node> _child)
	{
		m_children.removeAll(_child);
	}
	
	/**
	 * NodeDataが保持しているすべてのキーと値の組のマップを返します.
	 * @return すべてのキーと値のマップ
	 */
	public Map<byte[],byte[]> getAll()
	{
		return Collections.unmodifiableMap(m_attrs);
	}
	
	/**
	 * 子供Nodeのリストをクリアします.(すべて削除します.)
	 */
	public void clear()
	{
		m_children.clear();
	}
}