view src/treecms/memory/OnMemoryTreeNode.java @ 14:8bf59f161b23

separete Node methods to NodeContext , NodeAttribute , NodeChildren
author misaka
date Tue, 17 May 2011 18:44:14 +0900
parents fbbb7e414346
children 22cd920986c5
line wrap: on
line source

package treecms.memory;

import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import treecms.api.Forest;
import treecms.api.Node;
import treecms.api.NodeID;
import treecms.api.TreeNode;

/**
 * DoubleLinkedなNodeであるTreeNodeのOnMemory実装です. 
 * @author shoshi
 */
public class OnMemoryTreeNode implements TreeNode
{
	public OnMemoryTreeNode m_parent;
	public OnMemoryNode m_node;
	
	/**
	 * コンストラクタです.
	 * @param _node 対象となるSingleLinkedなNode
	 * @param _parent 親のOnMemoryTreeNode
	 */
	public OnMemoryTreeNode(OnMemoryNode _node,OnMemoryTreeNode _parent)
	{
		//とりあえず、チェック
		if(_node == null){
			throw new NullPointerException();
		}
		
		m_node = _node;
		
		//このノードがルートの場合、親はnullで構わない.
		m_parent = _parent;
	}
	
	/*
	 * 親関連のメソッド
	 */
	
	@Override
	public NodeID getID()
	{
		return m_node.getID();
	}
	
	@Override
	public Node getNode()
	{
		return m_node;
	}
	
	@Override
	public  TreeNode getParent()
	{
		return m_parent;
	}
	
	@Override
	public Forest getForest()
	{
		return m_node.getForest();
	}
	
	/*
	 * 子供関連のメソッド
	 */

	@Override
	public Iterator<TreeNode> getChildren()
	{
		/* 
		 * m_node(対象ノード)のリストにはNodeが格納されており、TreeNodeのリストを取得するためにはTreeNodeで要素を構成する必要がある.
		 */
		LinkedList<TreeNode> ret = new LinkedList<TreeNode>();
		for(Iterator<Node> it = m_node.getList().iterator();it.hasNext();){
			OnMemoryNode n = (OnMemoryNode)it.next();
			ret.add(new OnMemoryTreeNode(n,this));
		}
		
		return Collections.unmodifiableList(ret).iterator();
	}
	
	@Override
	public void add(TreeNode _child)
	{
		m_node.add(_child.getNode());
	}

	@Override
	public void addAll(NodeChildren _children)
	{
		/*
		 * TreeNodeのリストからNodeのリストへ変換する
		 */
		LinkedList<Node> res = new LinkedList<Node>();
		for(Iterator<TreeNode> it = _children.iterator();it.hasNext();){
			TreeNode tn = it.next();
			res.add(tn.getNode());
		}
		
		m_node.addAll(res);
	}
	
	@Override
	public void removeChild(TreeNode _child)
	{
		m_node.removeChild(_child.getNode());
	}
	
	@Override
	public void removeChildren(List<TreeNode> _children)
	{
		LinkedList<Node> res = new LinkedList<Node>();
		for(Iterator<TreeNode> it = _children.iterator();it.hasNext();){
			TreeNode tn = it.next();
			res.add(tn.getNode());
		}
		
		m_node.removeChildren(res);
	}
	
	@Override
	public void clearChildren()
	{
		m_node.clearChildren();
	}

	/*
	 * 属性関連のメソッド
	 */
	
	@Override
	public ByteBuffer get(ByteBuffer _key)
	{
		return m_node.get(_key);
	}

	@Override
	public Map<ByteBuffer, ByteBuffer> getAll()
	{
		return m_node.getAll();
	}

	@Override
	public void put(ByteBuffer _key,ByteBuffer _value)
	{
		m_node.put(_key,_value);
	}
	
	@Override
	public void putAll(Map<ByteBuffer,ByteBuffer> _map)
	{
		m_node.putAll(_map);
	}
	
	@Override
	public void remove(ByteBuffer _key)
	{
		m_node.remove(_key);
	}
	
	@Override
	public void removeAll(Set<ByteBuffer> _keySet)
	{
		m_node.removeAll(_keySet);
	}
	
	@Override
	public void clear()
	{
		m_node.clear();
	}
}