view src/treecms/proto/simple/SimpleTreeBuilder.java @ 24:f0c35d444982

commit
author ShoshiTAMAKI
date Sun, 24 Oct 2010 15:45:13 +0900
parents a3f8f5da4947
children 99346c04a3cf
line wrap: on
line source

package treecms.proto.simple;

import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

import treecms.proto.api.Node;
import treecms.proto.api.TreeBuilder;

public class SimpleTreeBuilder implements TreeBuilder
{
	private Node m_root;
	
	private AtomicLong m_ids;
	private ConcurrentHashMap<Thread,NodeUUID> m_idMap;
	
	public SimpleTreeBuilder()
	{
		m_idMap = new ConcurrentHashMap<Thread,NodeUUID>();
		m_ids = new AtomicLong();
		
		m_root = new SimpleNode(generateUUID());
	}
	
	public Node getContents()
	{
		return m_root;
	}
	
	public Node createNode()
	{
		return new SimpleNode(generateUUID());
	}
	
	public String generateUUID()
	{
		return generateUUID_AtomicLong();
		//return generateUUID_ThreadLocal();
	}
	
	public String generateUUID_AtomicLong()
	{
		//blocking?
		return Long.toString(m_ids.getAndIncrement());
	}
	
	public String generateUUID_ThreadLocal()
	{
		NodeUUID uuid;
		uuid = m_idMap.get(Thread.currentThread());
		if(uuid == null){
			uuid = new NodeUUID();
			m_idMap.put(Thread.currentThread(),uuid);
		}
		
		return uuid.getAndIncrement();
	}

	private class NodeUUID
	{
		private UUID m_uuid;
		private long m_counter;
		
		public NodeUUID()
		{
			m_uuid = UUID.randomUUID(); 
			m_counter = 0;
		}
		
		public String getAndIncrement()
		{
			String ret = m_uuid.toString() + "-" + m_counter;
			m_counter++;
			return ret;
		}
	}
}