view src/treecms/tree/util/LockableNodeTable.java @ 25:c1e7ec6b3d44

commit
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Tue, 12 Jul 2011 14:39:35 +0900
parents src/treecms/tree/util/NodeTableImpl.java@77a894c0b919
children
line wrap: on
line source

package treecms.tree.util;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import treecms.api.Node;
import treecms.api.NodeID;
import treecms.api.NodeTable;

public class LockableNodeTable implements NodeTable
{
	private final ConcurrentMap<NodeID,Node> m_nodes;
	private final ConcurrentMap<String,LockableReference<Node>> m_tips;
	
	public LockableNodeTable()
	{
		m_nodes = new ConcurrentHashMap<NodeID,Node>();
		m_tips = new ConcurrentHashMap<String,LockableReference<Node>>();
	}

	@Override
	public void register(Node _newNode)
	{
		NodeID id = _newNode.getID();
		m_nodes.put(id,_newNode);
		
		LockableReference<Node> ref = m_tips.putIfAbsent(id.getFamilyID(),new LockableReference<Node>(_newNode));
		if(ref != null){
			ref.lock();
			ref.put(_newNode);
			ref.unlock();
		}
	}

	@Override
	public Node get(NodeID _id)
	{
		return m_nodes.get(_id);
	}

	@Override
	public Node tip(String _fid)
	{
		LockableReference<Node> ref = m_tips.get(_fid);
		if(ref == null){
			return null;
		}
		return ref.get();
	}
	
	public boolean unlock(String _fid)
	{
		LockableReference<Node> ref = m_tips.get(_fid);
		
		if(ref == null){
			return false;
		}
		
		ref.unlock();
		return true;
	}
	
	public boolean lock(String _fid)
	{
		LockableReference<Node> ref = m_tips.get(_fid);
		if(ref == null){
			return false;
		}
		
		ref.lock();
		return true;
	}

}