view src/treecms/api/NodeData.java @ 13:c8601b0fa8a3

added Predicate and PredicateList
author shoshi
date Wed, 11 May 2011 22:08:20 +0900
parents fbbb7e414346
children 8bf59f161b23
line wrap: on
line source

package treecms.api;

import java.nio.ByteBuffer;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections.list.SetUniqueList;

/**
 * Node が保持するデータのスナップショットです.Node を大きく変更するときや新しく作成される場合に使用されます.
 * 通常このクラスのインスタンスを Node から取得した場合,NodeData インスタンスに変更(set,add)を加えても元の Node に変更は反映されません.
 * その様に実装してください.
 * 
 * このクラスは Node が保持するデータのうち 子供ノードのリスト・属性のマップ のみ保持しています.つまり,ノードが持っているはずの ID は保持していません.
 * getID,getForest を呼び出すと UnsupportedOperationException をスローします.
 * @author shoshi
 */
public final class NodeData implements Node
{
	/**
	 * 子供 Node の List
	 * 子供 Node の List は重複する Node を許可しない.
	 */
	private List<Node> m_children;
	
	/**
	 * Key と対応する Value の Map
	 */
	private Map<ByteBuffer,ByteBuffer> m_attrs;
	
	/**
	 * コンストラクタです.なにもしません
	 */
	public NodeData()
	{
		this(null);
	}
	
	/**
	 * コピーコンストラクタです.
	 * NodeData の内容を防御的にコピーします.
	 * @param _data
	 */
	public NodeData(NodeData _data)
	{
		if(_data != null){
			// SetUniqueList を使用することにより,List の重複要素を許可しない.
			m_children = SetUniqueList.decorate(_data.m_children);
			m_attrs = new HashMap<ByteBuffer,ByteBuffer>(_data.m_attrs);
			return;
		}
		m_children = SetUniqueList.decorate(new ArrayList<Node>());
		m_attrs = new HashMap<ByteBuffer,ByteBuffer>();
	}
	
	/**
	 * 内部でコピーコンストラクタを呼び出します.
	 * @return この NodeData のコピー
	 */
	public NodeData deepCopy()
	{
		return new NodeData(this);
	}
	
	@Override
	public NodeID getID()
	{
		//このクラスはデータのみ保持する.
		return null;
	}

	@Override
	public NodeData getData()
	{
		return new NodeData(this);
	}

	@Override
	public Forest getForest()
	{
		//このクラスはデータのみ保持する.
		return null;
	}
	
	/*
	 * 属性関連
	 */
	
	public Set<ByteBuffer> keySet()
	{
		return m_attrs.keySet();
	}
	
	@Override
	public ByteBuffer get(ByteBuffer _name)
	{
		return m_attrs.get(_name);
	}
	
	@Override
	public Map<ByteBuffer,ByteBuffer> getAll()
	{
		return Collections.unmodifiableMap(this.m_attrs);
	}
	
	@Override
	public void put(ByteBuffer _name,ByteBuffer _value)
	{
		m_attrs.put(_name,_value);
	}
	
	@Override
	public void putAll(Map<ByteBuffer,ByteBuffer> _map)
	{
		m_attrs.putAll(_map);
	}
	
	@Override
	public void remove(ByteBuffer _name)
	{
		m_attrs.remove(_name);
	}
	
	@Override
	public void removeAll(Set<ByteBuffer> _keySet)
	{
		for(ByteBuffer _key : _keySet){
			m_attrs.remove(_key);
		}
	}
	
	@Override
	public void clear()
	{
		m_attrs.clear();
	}
	
	/*
	 * 子供関連
	 */
	
	@Override
	public Iterator<Node> getChildren()
	{
		return Collections.unmodifiableList(m_children).iterator();
	}
	
	@Override
	public void addChild(Node _child)
	{
		m_children.add(_child);
	}
	
	@Override
	public void addChildren(List<Node> _child)
	{
		m_children.addAll(_child);
	}
	
	@Override
	public void removeChild(Node _child)
	{
		m_children.remove(_child);
	}
	
	@Override
	public void removeChildren(List<Node> _child)
	{
		m_children.removeAll(_child);
	}
	
	@Override
	public void clearChildren()
	{
		m_children.clear();
	}
	
	@Override
	public Node cloneNode(NodeData _data)
	{
		throw new UnsupportedOperationException();
	}
}