changeset 26:9cb971a68cc5

added CachedForest.java
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Mon, 18 Jul 2011 20:22:53 +0900
parents c1e7ec6b3d44
children aecc55e87143
files src/treecms/api/NodeTable.java src/treecms/cached/CachedForest.java src/treecms/cached/CachedForestEvent.java src/treecms/cached/CachedForestEventListener.java src/treecms/cached/CachedMemoryForest.java src/treecms/cassandra/CassandraForest.java src/treecms/cassandra/CassandraMonotonicTree.java src/treecms/cassandra/CassandraMonotonicTreeNode.java src/treecms/cassandra/CassandraRandomNodeID.java src/treecms/cassandra/CassandraSingleNode.java src/treecms/cassandra/CassandraTree.java src/treecms/cassandra/CassandraTreeNode.java src/treecms/collections/CopyOnWriteArrayList.java src/treecms/memory/OnMemoryForest.java src/treecms/memory/OnMemoryMonotonicTree.java src/treecms/memory/OnMemoryMonotonicTreeNode.java src/treecms/memory/OnMemoryNode.java src/treecms/memory/test/OnMemoryForestTest.java src/treecms/memory/test/OnMemoryMonotonicTreeTest.java src/treecms/memory/test/OnMemoryNodeTest.java src/treecms/merger/Merger.java src/treecms/merger/ReplaceMerger.java src/treecms/test/AbstractForestTest.java src/treecms/test/AbstractMonotonicTreeTest.java src/treecms/test/AbstractNodeTest.java src/treecms/test/ByteArrayTest.java src/treecms/test/CopyOnWriteTreeMapTest1.java src/treecms/test/GenericsTest.java src/treecms/test/GenericsTest2.java src/treecms/test/JSONParserTest1.java src/treecms/test/NodeIDTest.java src/treecms/test/OrderedSetTest.java src/treecms/test/ReentrantLockTest1.java src/treecms/test/SwingTest1.java src/treecms/test/SynchronizedTest1.java src/treecms/tree/util/CopyOnWriteLinkedList.java src/treecms/tree/util/CopyOnWriteTreeMap.java src/treecms/tree/util/CopyOnWriteTreeMap2.java src/treecms/tree/util/LockableNodeTable.java src/treecms/tree/util/LockableReference.java src/treecms/tree/util/NodeChildrenImpl.java
diffstat 41 files changed, 86 insertions(+), 2411 deletions(-) [+]
line wrap: on
line diff
--- a/src/treecms/api/NodeTable.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-package treecms.api;
-
-public interface NodeTable
-{
-	public void register(Node _newNode);
-	public Node get(NodeID _id);
-	public Node tip(String _fid);
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/cached/CachedForest.java	Mon Jul 18 20:22:53 2011 +0900
@@ -0,0 +1,23 @@
+package treecms.cached;
+
+import treecms.api.Forest;
+import treecms.api.MonotonicTree;
+import treecms.memory.OnMemoryForest;
+import treecms.tree.id.NodeIDProvider;
+
+public class CachedForest implements Forest
+{
+	private final OnMemoryForest m_cache;
+	
+	public CachedForest(NodeIDProvider _provider)
+	{
+		m_cache = new OnMemoryForest(_provider);
+	}
+	
+	@Override
+	public MonotonicTree getMainTree()
+	{
+		MonotonicTree main = m_cache.getMainTree();
+		return main;
+	}
+}
--- a/src/treecms/cached/CachedForestEvent.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-package treecms.cached;
-
-public enum CachedForestEvent
-{
-	ON_CACHE_CHANGED,
-	ON_CACHE_NOT_FOUND,
-	ON_SCHEDULED_UPDATE
-}
--- a/src/treecms/cached/CachedForestEventListener.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-package treecms.cached;
-
-public interface CachedForestEventListener
-{
-	public void onForestEvent(CachedForestEventListener _event);
-}
--- a/src/treecms/cached/CachedMemoryForest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-package treecms.cached;
-
-import java.util.Map;
-
-import treecms.api.Forest;
-import treecms.api.MonotonicTree;
-import treecms.api.NodeID;
-import treecms.api.SingleNode;
-import treecms.api.Tree;
-import treecms.tree.util.NodeData;
-
-public class CachedMemoryForest implements Forest
-{
-	private Map<NodeID,SingleNode> m_nodeCache;
-	private Map<String,SingleNode> m_tipCache;
-	
-	public CachedMemoryForest()
-	{
-		
-	}
-
-	@Override
-	public SingleNode get(NodeID _id)
-	{
-		return null;
-	}
-
-	@Override
-	public SingleNode getTip(String _uuid)
-	{
-		return null;
-	}
-
-	@Override
-	public SingleNode create() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Tree getTree(SingleNode _root) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public MonotonicTree getMonotonicTree(Tree _tree) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode create(NodeData<SingleNode> _data) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Tree getMainTree() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode create(NodeID _id, NodeData<SingleNode> _data) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
--- a/src/treecms/cassandra/CassandraForest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package treecms.cassandra;
-
-import treecms.api.Forest;
-import treecms.api.MonotonicTree;
-import treecms.api.NodeID;
-import treecms.api.SingleNode;
-import treecms.api.Tree;
-import treecms.tree.util.NodeData;
-
-public class CassandraForest implements Forest
-{
-
-	@Override
-	public SingleNode get(NodeID _id)
-	{
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode getTip(String _uuid) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode create() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Tree getTree(SingleNode _root) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public MonotonicTree getMonotonicTree(Tree _tree) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode create(NodeData<SingleNode> _data) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Tree getMainTree() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode create(NodeID _id, NodeData<SingleNode> _data) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	
-	public static NodeID decodeStringID(String _strID)
-	{
-		CassandraRandomNodeID id = CassandraRandomNodeID.decode(_strID);
-		return id;
-	}
-}
--- a/src/treecms/cassandra/CassandraMonotonicTree.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package treecms.cassandra;
-
-import treecms.api.MonotonicTree;
-import treecms.api.MonotonicTreeNode;
-import treecms.api.Tree;
-
-public class CassandraMonotonicTree implements MonotonicTree
-{
-	@Override
-	public boolean commit(boolean _force) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean pull() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean check() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public void merge() {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public MonotonicTreeNode getRoot() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Tree getTree() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
--- a/src/treecms/cassandra/CassandraMonotonicTreeNode.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-package treecms.cassandra;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import treecms.api.Forest;
-import treecms.api.MonotonicTreeNode;
-import treecms.api.NodeAttributes;
-import treecms.api.NodeChildren;
-import treecms.api.NodeID;
-import treecms.api.SingleNode;
-
-public class CassandraMonotonicTreeNode implements MonotonicTreeNode
-{
-
-	@Override
-	public NodeID getID() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Forest getForest() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Map<ByteBuffer, ByteBuffer> asMap() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Set<ByteBuffer> getKeySet() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void put(ByteBuffer _name, ByteBuffer _value) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void putAll(NodeAttributes _attrs) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public ByteBuffer get(ByteBuffer _name) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public NodeAttributes getAll() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void remove(ByteBuffer _name) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void removeAll(Set<ByteBuffer> _keySet) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void clearAttributes() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public List<MonotonicTreeNode> getList() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Set<String> getUUIDSet() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public boolean add(MonotonicTreeNode _child) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean addAll(NodeChildren<MonotonicTreeNode> _children) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public MonotonicTreeNode get(String _uuid) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public MonotonicTreeNode get(int _index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public MonotonicTreeNode remove(String _uuid) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public MonotonicTreeNode remove(int _index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public MonotonicTreeNode replace(MonotonicTreeNode _newChild) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public boolean contains(String _id) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean swap(String _uuid1, String _uuid2) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public void clearChildren() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public MonotonicTreeNode getParent() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode getNode() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
--- a/src/treecms/cassandra/CassandraRandomNodeID.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-package treecms.cassandra;
-
-import java.util.Random;
-import java.util.StringTokenizer;
-import java.util.UUID;
-
-import treecms.api.NodeID;
-import treecms.tree.id.AbstractRandomNodeID;
-
-public class CassandraRandomNodeID extends AbstractRandomNodeID
-{
-	private final long m_version;
-	private final String m_uuid;
-	
-	
-	private CassandraRandomNodeID(String _uuid,String _version)
-	{
-		this(_uuid,Long.parseLong(_version,16));
-	}
-	
-	private CassandraRandomNodeID(String _uuid,long _version)
-	{
-		m_uuid = _uuid;
-		m_version = _version;
-	}
-	
-	@Override
-	public NodeID create()
-	{
-		return newInstance();
-	}
-
-	@Override
-	public String getUUID()
-	{
-		return m_uuid;
-	}
-
-	@Override
-	public String getVersion()
-	{
-		return Long.toString(m_version);
-	}
-
-	@Override
-	public NodeID update()
-	{
-		Random rnd = new Random();
-		CassandraRandomNodeID id = new CassandraRandomNodeID(m_uuid,rnd.nextLong());
-		return id;
-	}
-	
-	public static CassandraRandomNodeID newInstance()
-	{
-		Random rnd = new Random();
-		CassandraRandomNodeID id = new CassandraRandomNodeID(UUID.randomUUID().toString(),rnd.nextLong());
-		return id;
-	}
-
-	public static CassandraRandomNodeID decode(String _id)
-	{
-		// UUID@Version
-		StringTokenizer tokens = new StringTokenizer(_id,"@");
-		
-		try{
-			String uuid = tokens.nextToken();
-			String version = tokens.nextToken();
-			
-			CassandraRandomNodeID id = new CassandraRandomNodeID(uuid,version);
-			
-			return id;
-		}catch(Exception _e){
-			throw new IllegalArgumentException(_e);
-		}
-	}
-}
--- a/src/treecms/cassandra/CassandraSingleNode.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-package treecms.cassandra;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import treecms.api.Forest;
-import treecms.api.NodeAttributes;
-import treecms.api.NodeChildren;
-import treecms.api.NodeID;
-import treecms.api.SingleNode;
-import treecms.tree.util.NodeAttributesImpl;
-import treecms.tree.util.NodeChildrenImpl;
-
-public class CassandraSingleNode implements SingleNode
-{
-	private final CassandraForest m_forest;
-	private final NodeID m_id;
-	
-	private final NodeChildren<SingleNode> m_children;
-	private final NodeAttributes m_attrs;
-	
-	public CassandraSingleNode(CassandraForest _forest,NodeID _id)
-	{
-		m_forest = _forest;
-		m_id = _id;
-		
-		m_children = new NodeChildrenImpl<SingleNode>();
-		m_attrs = new NodeAttributesImpl();
-	}
-
-	@Override
-	public NodeID getID()
-	{
-		return m_id;
-	}
-
-	@Override
-	public Forest getForest()
-	{
-		return m_forest;
-	}
-	
-	@Override
-	public List<SingleNode> getList()
-	{
-		return m_children.getList();
-	}
-
-	@Override
-	public Set<String> getUUIDSet()
-	{
-		return m_children.getUUIDSet();
-	}
-
-	@Override
-	public boolean add(SingleNode _child)
-	{
-		return m_children.add(_child);
-	}
-
-	@Override
-	public boolean addAll(NodeChildren<SingleNode> _children)
-	{
-		return m_children.addAll(_children);
-	}
-
-	@Override
-	public SingleNode get(String _uuid)
-	{
-		return m_children.get(_uuid);
-	}
-
-	@Override
-	public SingleNode get(int _index)
-	{
-		return m_children.get(_index);
-	}
-
-	@Override
-	public SingleNode remove(String _uuid)
-	{
-		return m_children.remove(_uuid);
-	}
-
-	@Override
-	public SingleNode remove(int _index)
-	{
-		return m_children.remove(_index);
-	}
-
-	@Override
-	public SingleNode replace(SingleNode _newChild)
-	{
-		return m_children.replace(_newChild);
-	}
-
-	@Override
-	public boolean contains(String _id)
-	{
-		return m_children.contains(_id);
-	}
-
-	@Override
-	public boolean swap(String _uuid1, String _uuid2)
-	{
-		return m_children.swap(_uuid1, _uuid2);
-	}
-
-	@Override
-	public void clearChildren()
-	{
-		m_children.clearChildren();
-	}
-
-	@Override
-	public Map<ByteBuffer, ByteBuffer> asMap()
-	{
-		return m_attrs.asMap();
-	}
-
-	@Override
-	public Set<ByteBuffer> getKeySet()
-	{
-		return m_attrs.getKeySet();
-	}
-
-	@Override
-	public void put(ByteBuffer _name, ByteBuffer _value)
-	{
-		m_attrs.put(_name,_value);
-	}
-
-	@Override
-	public void putAll(NodeAttributes _attrs) 
-	{
-		m_attrs.putAll(_attrs);
-	}
-
-	@Override
-	public ByteBuffer get(ByteBuffer _name)
-	{
-		return m_attrs.get(_name);
-	}
-
-	@Override
-	public NodeAttributes getAll()
-	{
-		return m_attrs.getAll();
-	}
-
-	@Override
-	public void remove(ByteBuffer _name)
-	{
-		m_attrs.remove(_name);
-	}
-
-	@Override
-	public void removeAll(Set<ByteBuffer> _keySet)
-	{
-		m_attrs.removeAll(_keySet);
-	}
-
-	@Override
-	public void clearAttributes()
-	{
-		m_attrs.clearAttributes();
-	}
-}
--- a/src/treecms/cassandra/CassandraTree.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-package treecms.cassandra;
-
-import treecms.api.Tree;
-import treecms.api.TreeNode;
-
-public class CassandraTree implements Tree {
-
-	@Override
-	public TreeNode getRoot() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
--- a/src/treecms/cassandra/CassandraTreeNode.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-package treecms.cassandra;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import treecms.api.Forest;
-import treecms.api.NodeAttributes;
-import treecms.api.NodeChildren;
-import treecms.api.NodeID;
-import treecms.api.SingleNode;
-import treecms.api.TreeNode;
-
-public class CassandraTreeNode implements TreeNode
-{
-
-	@Override
-	public NodeID getID() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Forest getForest() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Map<ByteBuffer, ByteBuffer> asMap() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Set<ByteBuffer> getKeySet() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void put(ByteBuffer _name, ByteBuffer _value) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void putAll(NodeAttributes _attrs) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public ByteBuffer get(ByteBuffer _name) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public NodeAttributes getAll() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void remove(ByteBuffer _name) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void removeAll(Set<ByteBuffer> _keySet) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void clearAttributes() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public List<TreeNode> getList() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Set<String> getUUIDSet() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public boolean add(TreeNode _child) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean addAll(NodeChildren<TreeNode> _children) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public TreeNode get(String _uuid) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public TreeNode get(int _index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public TreeNode remove(String _uuid) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public TreeNode remove(int _index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public TreeNode replace(TreeNode _newChild) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public boolean contains(String _id) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean swap(String _uuid1, String _uuid2) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public void clearChildren() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public TreeNode getParent() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SingleNode getNode() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
--- a/src/treecms/collections/CopyOnWriteArrayList.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,237 +0,0 @@
-package treecms.collections;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.RandomAccess;
-import java.util.concurrent.locks.ReentrantLock;
-
-
-public class CopyOnWriteArrayList<E> implements List<E> , RandomAccess
-{
-	private volatile Object[] m_array;
-	private final ReentrantLock m_lock;
-	
-	public CopyOnWriteArrayList()
-	{
-		m_array = new Object[0];
-		m_lock = new ReentrantLock();
-	}
-	
-	public CopyOnWriteArrayList(List<E> _list)
-	{
-		this();
-		if(_list instanceof CopyOnWriteArrayList){
-			CopyOnWriteArrayList<E> list = (CopyOnWriteArrayList<E>)_list;
-			m_array = list.m_array;
-		}
-	}
-
-	@Override
-	public int size()
-	{
-		return m_array.length;
-	}
-
-	@Override
-	public boolean isEmpty()
-	{
-		return (size() == 0) ? true : false;
-	}
-
-	@Override
-	public boolean contains(Object _o)
-	{
-		Object[] array = m_array;
-		for(Object item : array){
-			if(item.equals(_o)){
-				return true;
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public Iterator<E> iterator()
-	{
-		List<E> list = (List<E>)Arrays.asList(m_array);
-		return Collections.unmodifiableList(list).iterator();
-	}
-
-	@Override
-	public Object[] toArray()
-	{
-		return Arrays.copyOf(m_array,size());
-	}
-
-	@Override
-	public <T> T[] toArray(T[] _a)
-	{
-		final Object[] ret;
-		int size = size();
-		if(_a.length < size){
-			ret = Arrays.copyOf(m_array,size);
-		}else{
-			System.arraycopy(m_array,0,_a,0,size);
-			ret = _a;
-		}
-		
-		return (T[])ret;
-	}
-
-	@Override
-	public synchronized boolean add(E e)
-	{
-		int size = m_array.length;
-		Object[] newArray = new Object[size + 1];
-		System.arraycopy(m_array,0,newArray,0,size);
-		newArray[size] = e;
-		m_array = newArray;
-		return true;
-	}
-
-	@Override
-	public synchronized boolean remove(Object o)
-	{
-		int size = size();
-		Object[] array = new Object[size - 1];
-		
-		for(int i = 0;i < size;i ++){
-			Object item = m_array[i];
-			if(item.equals(o)){
-				for(i = i + 1;i < size;i ++){
-					array[i - 1] = m_array[i];
-				}
-				
-				m_array = array;
-				return true;
-			}
-			array[i] = item;
-		}
-		
-		return false;
-	}
-
-	@Override
-	public boolean containsAll(Collection<?> c)
-	{
-		boolean ret = true;
-		for(Object e1 : c){
-			ret = ret & contains(e1);
-		}
-		return ret;
-	}
-
-	@Override
-	public synchronized boolean addAll(Collection<? extends E> c)
-	{
-		Object[] array = new Object[size() + c.size()];
-		System.arraycopy(m_array,0,array,0,m_array.length);
-		
-		int i = m_array.length + 1;
-		for(Object e : c){
-			array[i] = e;
-			i++;
-		}
-		return true;
-	}
-
-	@Override
-	public synchronized boolean addAll(int index, Collection<? extends E> c)
-	{
-		Object[] array = new Object[size() + c.size()];
-		System.arraycopy(m_array,0,array,0,index);
-		
-		int i = index + 1;
-		for(Object e : c){
-			array[i] = e;
-			i ++;
-		}
-		
-		System.arraycopy(m_array,index + 1,array,i + 1,size() - index);
-		m_array = array;
-		return true;
-	}
-
-	@Override
-	public boolean removeAll(Collection<?> c)
-	{
-		Object[] array = new Object[size() - c.size()];
-		
-		return false;
-	}
-
-	@Override
-	public boolean retainAll(Collection<?> c)
-	{
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public void clear() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public E get(int index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public E set(int index, E element) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void add(int index, E element) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public E remove(int index) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public int indexOf(Object o) {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-
-	@Override
-	public int lastIndexOf(Object o) {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-
-	@Override
-	public ListIterator<E> listIterator()
-	{
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public ListIterator<E> listIterator(int index)
-	{
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public List<E> subList(int fromIndex, int toIndex)
-	{
-		return null;
-	}
-
-}
--- a/src/treecms/memory/OnMemoryForest.java	Tue Jul 12 14:39:35 2011 +0900
+++ b/src/treecms/memory/OnMemoryForest.java	Mon Jul 18 20:22:53 2011 +0900
@@ -3,23 +3,20 @@
 import java.nio.ByteBuffer;
 import java.util.Map;
 import java.util.Set;
-
 import treecms.api.Forest;
 import treecms.api.MonotonicTree;
 import treecms.api.MonotonicTreeNode;
-import treecms.api.NodeID;
-import treecms.tree.id.IncrementalID;
-import treecms.tree.id.RandomNodeID;
+import treecms.tree.id.IncrementalIDProvider;
+import treecms.tree.id.NodeIDProvider;
 
 public class OnMemoryForest implements Forest
 {
 	public static void main(String _args[])
 	{
-		OnMemoryForest f = new OnMemoryForest();
+		OnMemoryForest f = new OnMemoryForest(new IncrementalIDProvider("test",0));
 		MonotonicTree main = f.getMainTree();
 		MonotonicTreeNode root = main.getRoot();
 		MonotonicTreeNode ch1 = root.create(null);
-		MonotonicTreeNode ch2 = root.create(null);
 		MonotonicTreeNode ch11 = ch1.create(null);
 		
 		ByteBuffer key1 = ByteBuffer.wrap("hoge".getBytes());
@@ -51,12 +48,9 @@
 	
 	private final OnMemoryMonotonicTree m_tree;
 	
-	public OnMemoryForest()
+	public OnMemoryForest(NodeIDProvider _provider)
 	{
-		NodeID id = new IncrementalID("ROOT");
-		OnMemoryNode newNode = new OnMemoryNode(id,null);
-		
-		m_tree = OnMemoryMonotonicTree.createInstance(newNode,null);
+		m_tree = OnMemoryMonotonicTree.createInstance(_provider,null);
 	}
 	
 	@Override
--- a/src/treecms/memory/OnMemoryMonotonicTree.java	Tue Jul 12 14:39:35 2011 +0900
+++ b/src/treecms/memory/OnMemoryMonotonicTree.java	Mon Jul 18 20:22:53 2011 +0900
@@ -2,32 +2,45 @@
 
 import treecms.api.MonotonicTree;
 import treecms.api.MonotonicTreeNode;
-import treecms.tree.util.LockableNodeTable;
+import treecms.api.Node;
+import treecms.tree.id.NodeIDProvider;
 
 public class OnMemoryMonotonicTree implements MonotonicTree
 {
 	private final OnMemoryMonotonicTree m_tree;
-	private final LockableNodeTable m_table;
-	private final OnMemoryMonotonicTreeNode m_root;
+	private volatile OnMemoryMonotonicTreeNode m_root;
 	
-	private OnMemoryMonotonicTree(OnMemoryNode _root,OnMemoryMonotonicTree _tree)
+	private OnMemoryMonotonicTree(NodeIDProvider _provider,OnMemoryMonotonicTree _tree)
 	{
 		m_tree = _tree;
-		m_table = new LockableNodeTable();
-		m_table.register(_root);
-		m_root = new OnMemoryMonotonicTreeNode(_root,null,m_table);
+		m_root = new OnMemoryMonotonicTreeNode(new OnMemoryNode(_provider.create(),null),null);
 	}
 	
-	public static OnMemoryMonotonicTree createInstance(OnMemoryNode _root,OnMemoryMonotonicTree _tree)
+	public static OnMemoryMonotonicTree createInstance(NodeIDProvider _provider,OnMemoryMonotonicTree _tree)
 	{
-		OnMemoryMonotonicTree tree = new OnMemoryMonotonicTree(_root,_tree);
+		OnMemoryMonotonicTree tree = new OnMemoryMonotonicTree(_provider,_tree);
 		return tree;
 	}
 	
 	public OnMemoryNode get(String _fid)
 	{
-		OnMemoryNode node = (OnMemoryNode)m_table.tip(_fid);
-		return node;
+		return (OnMemoryNode)search(_fid,m_root.getNode());
+	}
+	
+	private Node search(String _fid,Node _node)
+	{
+		if(_node.getID().getFamilyID().equals(_fid)){
+			return _node;
+		}
+		
+		for(Node child : _node.getList()){
+			Node ret = search(_fid,child);
+			if(ret != null){
+				return ret;
+			}
+		}
+		
+		return null;
 	}
 	
 	@Override
--- a/src/treecms/memory/OnMemoryMonotonicTreeNode.java	Tue Jul 12 14:39:35 2011 +0900
+++ b/src/treecms/memory/OnMemoryMonotonicTreeNode.java	Mon Jul 18 20:22:53 2011 +0900
@@ -11,65 +11,47 @@
 import treecms.api.Node;
 import treecms.api.NodeAttributes;
 import treecms.api.NodeID;
-import treecms.tree.util.LockableNodeTable;
 import treecms.tree.util.NodeData;
 
 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode
 {
-	private volatile OnMemoryMonotonicTreeNode m_parent;
+	private final OnMemoryMonotonicTreeNode m_parent;
 	private OnMemoryNode m_node;
-	private final LockableNodeTable m_table;
 	
-	public OnMemoryMonotonicTreeNode(OnMemoryNode _node,OnMemoryMonotonicTreeNode _parent,LockableNodeTable _table)
+	public OnMemoryMonotonicTreeNode(OnMemoryNode _node,OnMemoryMonotonicTreeNode _parent)
 	{
 		m_node = _node;
-		m_table = _table;
 		m_parent = _parent;
 	}
 	
 	@Override
 	public NodeID getID()
 	{
-		OnMemoryNode n = (OnMemoryNode)getNode();
-		return n.getID();
+		return m_node.getID();
 	}
 
 	@Override
 	public MonotonicTreeNode getParent()
 	{
-		if(m_parent == null){
-			return null;
-		}
-		
-		OnMemoryNode node = (OnMemoryNode)getNode();
-			
-		//check , does parent contain the node.
-		if(!m_parent.contains(node.getID())){
-			m_parent = null;
-		}
-		
 		return m_parent;
 	}
 	
 	@Override
 	public ByteBuffer get(ByteBuffer _key)
 	{
-		OnMemoryNode node = (OnMemoryNode)getNode();
-		return node.get(_key);
+		return m_node.get(_key);
 	}
 
 	@Override
 	public NodeAttributes getAll()
 	{
-		OnMemoryNode node = (OnMemoryNode)getNode();
-		return node.getAll();
+		return m_node.getAll();
 	}
 
 	@Override
 	public void put(ByteBuffer _key, ByteBuffer _value)
 	{
-		OnMemoryNode n = (OnMemoryNode)getNode();
-		NodeData<Node> d = new NodeData<Node>(n,n);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.put(_key,_value);
 		
 		cloneAndTransmit(d);
@@ -78,8 +60,7 @@
 	@Override
 	public void putAll(NodeAttributes _map)
 	{
-		OnMemoryNode n = (OnMemoryNode)getNode();
-		NodeData<Node> d = new NodeData<Node>(n,n);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.putAll(_map);
 		
 		cloneAndTransmit(d);
@@ -88,8 +69,7 @@
 	@Override
 	public void remove(ByteBuffer _key)
 	{
-		OnMemoryNode n = (OnMemoryNode)getNode();
-		NodeData<Node> d = new NodeData<Node>(n,n);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.remove(_key);
 		
 		cloneAndTransmit(d);
@@ -98,8 +78,7 @@
 	@Override
 	public void removeAll(Set<ByteBuffer> _keys)
 	{
-		OnMemoryNode n = (OnMemoryNode)getNode();
-		NodeData<Node> d = new NodeData<Node>(n,n);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.removeAll(_keys);
 		
 		cloneAndTransmit(d);
@@ -108,8 +87,7 @@
 	@Override
 	public void clearAttributes()
 	{
-		OnMemoryNode n = (OnMemoryNode)getNode();
-		NodeData<Node> d = new NodeData<Node>(n,n);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.clearAttributes();
 		
 		cloneAndTransmit(d);
@@ -117,20 +95,12 @@
 	
 	public void cloneAndTransmit(NodeData<Node> _d)
 	{
-		String fid = m_node.getID().getFamilyID();
-		
-		m_table.lock(fid);
-		
-		OnMemoryNode node = (OnMemoryNode)m_table.tip(fid);
-		NodeID newID = node.getID().update();
+		NodeID newID = m_node.getID().update();
 		OnMemoryNode clone = new OnMemoryNode(newID,_d);
-		m_table.register(clone);
-		
-		m_table.unlock(fid);
 		
 		OnMemoryMonotonicTreeNode parent = (OnMemoryMonotonicTreeNode)getParent();
 		if(parent != null){ 
-			parent.transmit(node,clone);
+			parent.transmit(m_node,clone);
 		}
 		
 		m_node = clone;
@@ -138,24 +108,17 @@
 	
 	public boolean transmit(Node _orig,Node _edit)
 	{
-		String fid = m_node.getID().getFamilyID();
-		m_table.lock(fid);
-		OnMemoryNode node = (OnMemoryNode)getNode();
-		
-		NodeData<Node> d = new NodeData<Node>(node,node);
+		NodeData<Node> d = new NodeData<Node>(m_node,m_node);
 		d.replace(_edit);
-		NodeID newID = node.getID().update();
+		NodeID newID = m_node.getID().update();
 		OnMemoryNode clone = new OnMemoryNode(newID,d);
 		
-		m_table.register(clone);
-		m_table.unlock(fid);
-		
 		m_node = clone;
-		
 		OnMemoryMonotonicTreeNode parent = (OnMemoryMonotonicTreeNode)getParent();
 		if(parent != null){
-			return m_parent.transmit(node,clone);
+			return m_parent.transmit(m_node,clone);
 		}
+		
 		return true;
 	}
 	
@@ -174,7 +137,7 @@
 		ArrayList<MonotonicTreeNode> list = new ArrayList<MonotonicTreeNode>(size);
 		for(Iterator<Node> it = node.getList().iterator();it.hasNext();){
 			OnMemoryNode n = (OnMemoryNode)it.next();
-			OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(n,this,m_table);
+			OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(n,this);
 			list.add(tn);
 		}
 		
@@ -191,7 +154,7 @@
 		if(deleted != null){
 			cloneAndTransmit(d);
 			
-			OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(deleted,null,m_table);
+			OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(deleted,null);
 			return tn;
 		}
 		
@@ -230,7 +193,7 @@
 	public MonotonicTreeNode get(int _index)
 	{
 		OnMemoryNode node = (OnMemoryNode)getNode();
-		OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(node,this,m_table);
+		OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(node,this);
 		return tn;
 	}
 
@@ -267,7 +230,7 @@
 	public MonotonicTreeNode get(String _fid)
 	{
 		OnMemoryNode node = (OnMemoryNode)m_node.get(_fid);
-		OnMemoryMonotonicTreeNode mono = new OnMemoryMonotonicTreeNode(node,this,m_table);
+		OnMemoryMonotonicTreeNode mono = new OnMemoryMonotonicTreeNode(node,this);
 		return mono;
 	}
 
@@ -280,7 +243,7 @@
 		OnMemoryNode deleted = (OnMemoryNode)d.remove(_fid);
 		
 		cloneAndTransmit(d);
-		return new OnMemoryMonotonicTreeNode(deleted,null,m_table);
+		return new OnMemoryMonotonicTreeNode(deleted,null);
 	}
 
 	@Override
@@ -288,14 +251,13 @@
 	{
 		NodeID newID = getNode().getID().create();
 		OnMemoryNode newNode = new OnMemoryNode(newID,new NodeData<Node>(null,_attr));
-		m_table.register(newNode);
 		
 		OnMemoryNode thisNode = (OnMemoryNode)getNode();
 		NodeData<Node> d = new NodeData<Node>(thisNode,thisNode);
 		d.add(newNode);
 		cloneAndTransmit(d);
 		
-		OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(newNode,this,m_table);
+		OnMemoryMonotonicTreeNode tn = new OnMemoryMonotonicTreeNode(newNode,this);
 		return tn;
 	}
 	
--- a/src/treecms/memory/OnMemoryNode.java	Tue Jul 12 14:39:35 2011 +0900
+++ b/src/treecms/memory/OnMemoryNode.java	Mon Jul 18 20:22:53 2011 +0900
@@ -4,6 +4,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import treecms.api.Node;
 import treecms.api.NodeAttributes;
 import treecms.api.NodeID;
@@ -83,19 +84,19 @@
 	}
 
 	@Override
-	public Node create(NodeAttributes _attr)
+	public OnMemoryNode create(NodeAttributes _attr)
 	{
 		throw new UnsupportedOperationException(ERR_READONLY);
 	}
 
 	@Override
-	public Node remove(String _uuid)
+	public OnMemoryNode remove(String _uuid)
 	{
 		throw new UnsupportedOperationException(ERR_READONLY);
 	}
 
 	@Override
-	public Node remove(int _index)
+	public OnMemoryNode remove(int _index)
 	{
 		throw new UnsupportedOperationException(ERR_READONLY);
 	}
--- a/src/treecms/memory/test/OnMemoryForestTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-package treecms.memory.test;
-
-import org.junit.runner.JUnitCore;
-import treecms.api.Forest;
-import treecms.memory.OnMemoryForest;
-import treecms.test.AbstractForestTest;
-
-public class OnMemoryForestTest extends AbstractForestTest
-{
-	public static void main(String _args[])
-	{
-		JUnitCore.main(OnMemoryForestTest.class.getName());
-	}
-	
-	@Override
-	public Forest getInstance()
-	{
-		OnMemoryForest forest = new OnMemoryForest();
-		return forest;
-	}
-}
--- a/src/treecms/memory/test/OnMemoryMonotonicTreeTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package treecms.memory.test;
-
-import org.junit.runner.JUnitCore;
-
-import treecms.api.Forest;
-import treecms.memory.OnMemoryForest;
-import treecms.test.AbstractMonotonicTreeTest;
-
-public class OnMemoryMonotonicTreeTest extends AbstractMonotonicTreeTest
-{
-	public static void main(String _args[])
-	{
-		JUnitCore.main(OnMemoryMonotonicTreeTest.class.getName());
-	}
-	@Override
-	public Forest getForest()
-	{
-		OnMemoryForest f = new OnMemoryForest();
-		return f;
-	}
-	
-}
--- a/src/treecms/memory/test/OnMemoryNodeTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-package treecms.memory.test;
-
-import org.junit.runner.JUnitCore;
-import treecms.api.SingleNode;
-import treecms.memory.OnMemoryForest;
-import treecms.test.AbstractNodeTest;
-
-public class OnMemoryNodeTest extends AbstractNodeTest
-{
-	public static void main(String _args[])
-	{
-		JUnitCore.main(OnMemoryForest.class.getName());
-	}
-	
-	private OnMemoryForest m_forest;
-	
-	public OnMemoryNodeTest()
-	{
-		m_forest = new OnMemoryForest();
-	}
-	
-	@Override
-	public SingleNode getInstance()
-	{
-		return m_forest.create();
-	}
-
-}
--- a/src/treecms/merger/Merger.java	Tue Jul 12 14:39:35 2011 +0900
+++ b/src/treecms/merger/Merger.java	Mon Jul 18 20:22:53 2011 +0900
@@ -1,8 +1,10 @@
 package treecms.merger;
 
-import treecms.api.Node;
+import treecms.api.NodeAttributes;
+import treecms.api.NodeChildren;
+import treecms.api.NodeContext;
 
-public interface Merger<T extends Node<T>>
+public interface Merger<T extends NodeAttributes & NodeContext & NodeChildren<T>>
 {
 	public T merge(T _tree1,T _tree2);
 }
--- a/src/treecms/merger/ReplaceMerger.java	Tue Jul 12 14:39:35 2011 +0900
+++ b/src/treecms/merger/ReplaceMerger.java	Mon Jul 18 20:22:53 2011 +0900
@@ -1,8 +1,10 @@
 package treecms.merger;
 
-import treecms.api.Node;
+import treecms.api.NodeAttributes;
+import treecms.api.NodeChildren;
+import treecms.api.NodeContext;
 
-public class ReplaceMerger<T extends Node<T>> implements Merger<T>
+public class ReplaceMerger<T extends NodeAttributes & NodeContext & NodeChildren<T>> implements Merger<T>
 {
 	public T merge(T _tree1,T _tree2)
 	{
--- a/src/treecms/test/AbstractForestTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-package treecms.test;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
-import junit.framework.Assert;
-import org.junit.Test;
-import treecms.api.Forest;
-import treecms.api.MonotonicTree;
-import treecms.api.MonotonicTreeNode;
-import treecms.api.NodeID;
-import treecms.tree.util.NodeData;
-
-public abstract class AbstractForestTest
-{
-	public abstract Forest getInstance();
-	
-	@Test
-	public void testGetMainTree()
-	{
-		Forest f = getInstance();
-		MonotonicTree t = f.getMainTree();
-		
-		Assert.assertNotNull(t);
-	}
-}
--- a/src/treecms/test/AbstractMonotonicTreeTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-package treecms.test;
-
-import java.nio.ByteBuffer;
-
-import junit.framework.Assert;
-
-import org.junit.Test;
-import treecms.api.Forest;
-import treecms.api.MonotonicTree;
-import treecms.api.SingleNode;
-import treecms.api.MonotonicTreeNode;
-import treecms.api.Tree;
-import treecms.tree.util.NodeChildrenImpl;
-import treecms.tree.util.NodeFinder;
-
-public abstract class AbstractMonotonicTreeTest
-{
-	public abstract Forest getForest();
-	
-	@Test
-	public void testInitialize()
-	{
-		Forest f = getForest();
-		Tree t = f.getMainTree();
-		MonotonicTree mt = f.getMonotonicTree(t);
-		MonotonicTreeNode n = mt.getRoot();
-		
-		Assert.assertEquals(true,t.getRoot().getID().equals(n.getID()));
-	}
-	
-	@Test
-	public void testEdit()
-	{
-		Forest forest = getForest();
-		SingleNode root = forest.create();
-		
-		SingleNode n1 = forest.create();
-		SingleNode n11 = forest.create();
-		SingleNode n12 = forest.create();
-		n1.addAll(new NodeChildrenImpl<SingleNode>(n11,n12));
-		
-		SingleNode n2 = forest.create();
-		SingleNode n21 = forest.create();
-		SingleNode n22 = forest.create();
-		n2.addAll(new NodeChildrenImpl<SingleNode>(n21,n22));
-		
-		SingleNode n221 = forest.create();
-		n22.add(n221);
-		
-		root.addAll(new NodeChildrenImpl<SingleNode>(n1,n2));
-		
-		MonotonicTree tree = forest.getMonotonicTree(forest.getTree(root));
-		NodeFinder<MonotonicTreeNode> finder = new NodeFinder<MonotonicTreeNode>(tree.getRoot());
-		MonotonicTreeNode node = finder.findByNodeID(n221.getID());
-		node.put(ByteBuffer.wrap("test".getBytes()),ByteBuffer.wrap("value".getBytes()));
-		
-		
-	}
-}
--- a/src/treecms/test/AbstractNodeTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package treecms.test;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-import junit.framework.Assert;
-import org.junit.Test;
-import treecms.api.NodeChildren;
-import treecms.api.NodeID;
-import treecms.tree.util.NodeChildrenImpl;
-
-public abstract class AbstractNodeTest
-{
-	public abstract Node getInstance();
-	
-	@Test
-	public void testGetID()
-	{
-		Node n = getInstance();
-		Assert.assertNotNull(getInstance().getID());
-	}
-	
-	@Test
-	public void testGetData()
-	{
-		Assert.assertNotNull(getInstance().getList());
-		Assert.assertNotNull(getInstance().getAll());
-	}
-	
-	@Test
-	public void testGetForest()
-	{
-		Assert.assertNotNull(getInstance().getForest());
-	}
-	
-	@Test
-	public void testAddChildren()
-	{
-		SingleNode node = getInstance();
-		
-		SingleNode ch1 = node.getForest().create();
-		SingleNode ch2 = node.getForest().create();
-		SingleNode ch3 = node.getForest().create();
-		
-		NodeChildren<SingleNode> list = new NodeChildrenImpl<SingleNode>(ch1,ch2,ch3);
-		node.addAll(list);
-		
-		List<SingleNode> children = node.getList();
-		int size = list.getList().size();
-		for(int i = 0;i < size;i ++){
-			NodeID id1 = children.get(i).getID();
-			NodeID id2 = list.get(i).getID();
-			
-			Assert.assertEquals(true,id1.equals(id2));
-		}
-	}
-	
-	@Test
-	public void testSetAndGetAttribute()
-	{
-		SingleNode node = getInstance();
-		byte[] name = "test".getBytes();
-		byte[] value = "test".getBytes();
-		
-		node.put(ByteBuffer.wrap(name),ByteBuffer.wrap(value));
-		Assert.assertEquals(true,node.get(ByteBuffer.wrap(name)).equals(ByteBuffer.wrap(value)));
-	}
-}
--- a/src/treecms/test/ByteArrayTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-package treecms.test;
-
-public class ByteArrayTest
-{
-	public static void main(String _args[])
-	{
-		byte key1[] = new byte[]{12,23,23,43};
-		byte key2[] = new byte[]{12,23,23,43};
-		
-		System.out.println(key1.equals(key2));
-	}
-}
--- a/src/treecms/test/CopyOnWriteTreeMapTest1.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-package treecms.test;
-
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import treecms.tree.util.CopyOnWriteTreeMap;
-
-public class CopyOnWriteTreeMapTest1
-{
-	public static void main(String _args[])
-	{
-		ExecutorService service = Executors.newFixedThreadPool(5);
-		
-		
-	}
-	
-	private static class ReaderTask implements Runnable
-	{
-		private final CopyOnWriteTreeMap m_map;
-		
-		public ReaderTask(CopyOnWriteTreeMap _map,List<String> _keys)
-		{
-			m_map = _map;
-		}
-		
-		@Override
-		public void run()
-		{
-		}
-	}
-	
-	private static class WriterTask implements Runnable
-	{
-		private final CopyOnWriteTreeMap<String,String> m_map;
-		
-		public WriterTask(CopyOnWriteTreeMap<String,String> _map)
-		{
-			m_map = _map;
-		}
-		
-		@Override
-		public void run()
-		{
-		}
-	}
-}
--- a/src/treecms/test/GenericsTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-package treecms.test;
-
-import java.util.List;
-
-public class GenericsTest<E extends Foo>
-{
-	public static void main(String _args[])
-	{
-		new GenericsTest<Hoge>();
-	}
-	
-	public GenericsTest()
-	{
-	}
-	
-	public GenericsTest(E _instance)
-	{
-	}
-}
-
-class FooBar implements Bar<FooBar>
-{
-
-	@Override
-	public Foo get() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public List<Foo> list(Foo _f) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	
-}
-
-interface Foo
-{
-	public Foo get();
-	public List<Foo> list(Foo _f);
-}
-
-interface Hoge extends Foo
-{
-	@Override
-	public Hoge get();
-	
-	public List<Foo> list(Hoge _h);
-}
-
-interface Bar<T extends Foo> extends Foo
-{
-}
-
-interface Foo2<T extends Foo>
-{
-}
-
-class FooBar2<Bar> implements Foo2
-{
-}
-
-
-
-
--- a/src/treecms/test/GenericsTest2.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-package treecms.test;
-
-public class GenericsTest2
-{
-
-}
-
-interface Attributes
-{
-	void a();
-}
-
-interface Children<T extends Node<T>>
-{
-	void b();
-}
-
-interface Context
-{
-	void c();
-}
-
-interface Node<T extends Node<T>> extends Attributes , Children<T> , Context
-{
-}
-
-interface SingleNode extends Node<SingleNode>
-{
-	
-}
-
-class ChildrenImpl implements Children<SingleNode>
-{
-
-	@Override
-	public void b() {
-		// TODO Auto-generated method stub
-		
-	}
-	
-}
--- a/src/treecms/test/JSONParserTest1.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package treecms.test;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.json.simple.JSONArray;
-import org.json.simple.parser.ContainerFactory;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-
-public class JSONParserTest1
-{
-	public static void main(String _args[]) throws ParseException
-	{
-		//test1
-		String s = "[]";
-		JSONParser p = new JSONParser();
-		JSONArray array = (JSONArray)p.parse(s);
-		System.out.println(array.size());
-		
-		//test2
-		String json = "";
-		ContainerFactory factory = new ContainerFactory(){
-
-			@Override
-			public List<Object> creatArrayContainer() {
-				return new LinkedList<Object>();
-			}
-
-			@Override
-			public Map<Object,Object> createObjectContainer() {
-				return new HashMap<Object,Object>();
-			}
-			
-		};
-		
-		JSONParser p2 = new JSONParser();
-		LinkedList<Object> list = (LinkedList<Object>)p2.parse(json,factory);
-		for(Object item : list){
-			System.out.println(item.toString());
-		}
-	}
-}
--- a/src/treecms/test/NodeIDTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-package treecms.test;
-
-import junit.framework.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import treecms.api.NodeID;
-
-public class NodeIDTest
-{
-	NodeID m_newID;
-	
-	public NodeIDTest(NodeID _id)
-	{
-		m_newID = _id;
-	}
-	
-	@Before
-	public void testCreateID()
-	{
-		NodeID newID = m_newID.create();
-		Assert.assertNull(newID);
-	}
-	
-	@Test
-	public void testCompareID()
-	{
-		NodeID newID = m_newID.create();
-		Assert.assertEquals(true,m_newID.equals(m_newID));
-		Assert.assertEquals(false,m_newID.equals(newID));
-	}
-	
-	@Test
-	public void testUpdateID()
-	{
-		NodeID newID = m_newID.update();
-		Assert.assertEquals(true,m_newID.isFamily(newID));
-	}
-}
--- a/src/treecms/test/OrderedSetTest.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-package treecms.test;
-
-import java.util.LinkedHashSet;
-
-public class OrderedSetTest
-{
-	public static void main(String _args[])
-	{
-		LinkedHashSet<Integer> set = new LinkedHashSet<Integer>();
-		set.add(1);
-		set.add(2);
-		set.add(3);
-		
-		for(Integer i : set){
-			System.out.println(i);
-		}
-	}
-}
--- a/src/treecms/test/ReentrantLockTest1.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-package treecms.test;
-
-import java.io.IOException;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class ReentrantLockTest1
-{
-	public static void main(String _args[]) throws Exception
-	{
-		final ReentrantLock lock = new ReentrantLock();
-		
-		Runnable r = new Runnable(){
-			@Override
-			public void run()
-			{
-				String name = Thread.currentThread().getName();
-				synchronized(lock){
-					System.out.println(name + ": acquire lock");
-					try {
-						System.in.read();
-						System.out.println(name + ": is dead");
-						return;
-					} catch (IOException _e) {
-						_e.printStackTrace();
-					}
-				}
-			}
-		};
-		
-		Thread th1 = new Thread(r);
-		Thread th2 = new Thread(r);
-		
-		th1.start();
-		th2.start();
-		
-		th1.join();
-		th2.join();
-	}
-}
--- a/src/treecms/test/SwingTest1.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-package treecms.test;
-
-import java.awt.BorderLayout;
-import java.awt.Container;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.*;
-
-public class SwingTest1
-{
-	public static void main(String _args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException
-	{
-		UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
-		JFrame f = new JFrame("");
-		JButton btn = new JButton("btn!");
-		Container cnt = f.getContentPane();
-		cnt.setLayout(new BorderLayout());
-		cnt.add(btn,BorderLayout.CENTER);
-		
-		
-		final JPopupMenu menu = new JPopupMenu();
-		JMenuItem item = new JMenuItem("test1");
-		menu.add(item);
-		
-		btn.addActionListener(new ActionListener(){
-			@Override
-			public void actionPerformed(ActionEvent e)
-			{
-				menu.setVisible(true);
-			}
-		});
-		
-		f.setVisible(true);
-		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-	}
-}
--- a/src/treecms/test/SynchronizedTest1.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-package treecms.test;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-public class SynchronizedTest1
-{
-	public static void main(String _args[]) throws InterruptedException, IOException
-	{
-		Object lock = new Object();
-		
-		new MyThread(lock).start();
-		new MyThread(lock).start();
-		new MyThread(lock).start();
-		new MyThread(lock).start();
-		new MyThread(lock).start();
-		new MyThread(lock).start();
-		
-		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
-		br.readLine();
-		
-		synchronized(lock){
-			lock.notifyAll();
-		}
-		
-		Thread.sleep(100);
-	}
-	
-	private static class MyThread extends Thread
-	{
-		private final Object m_lock;
-		
-		public MyThread(Object _lock)
-		{
-			m_lock = _lock;
-		}
-		
-		public void run()
-		{
-			synchronized(m_lock){
-				try{
-					m_lock.wait();
-					System.out.println("done wating..");
-				}catch(InterruptedException _e){
-					_e.printStackTrace();
-				}
-			}
-		}
-	}
-}
--- a/src/treecms/tree/util/CopyOnWriteLinkedList.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-package treecms.tree.util;
-
-public class CopyOnWriteLinkedList<T>
-{
-	public CopyOnWriteLinkedList()
-	{
-		
-	}
-}
--- a/src/treecms/tree/util/CopyOnWriteTreeMap.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-package treecms.tree.util;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Random;
-import java.util.TreeMap;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class CopyOnWriteTreeMap<K extends Comparable<K>,V>
-{
-	private volatile TreeNode<K,V> m_read;
-	private volatile TreeNode<K,V> m_write;
-	
-	private final Object m_writeLock;
-	public static void main(String _args[]) throws InterruptedException, IOException
-	{
-		System.in.read();
-		
-		final CopyOnWriteTreeMap<String,String> map = new CopyOnWriteTreeMap<String,String>();
-		//final Map<String,String> map = Collections.synchronizedMap(new TreeMap<String,String>());
-		final LinkedList<String> keys = new LinkedList<String>();
-		
-		Random r = new Random();
-		for(int i = 0;i < 10000;i ++){
-			String str = Long.toHexString(r.nextLong());
-			keys.add(str);
-		}
-		
-		ExecutorService service = Executors.newFixedThreadPool(5);
-		
-		Callable<Object> writer = new Callable<Object>(){
-			@Override
-			public Object call() throws Exception
-			{
-				long mill = System.currentTimeMillis();
-				for(String str : keys){
-					map.put(str,str);
-				}
-				System.out.println("Writer :"+ (System.currentTimeMillis() - mill));
-				return null;
-			}
-		};
-		
-		Callable<Object> reader = new Callable<Object>(){
-			@Override
-			public Object call() throws Exception
-			{
-				long mill = System.currentTimeMillis();
-				for(String str : keys){
-					map.get(str);
-				}
-				System.out.println("Reader :"+ (System.currentTimeMillis() - mill));
-				
-				return null;
-			}
-		};
-		
-		service.submit(reader);
-		service.submit(writer);
-		service.submit(writer);
-		service.submit(writer);
-		service.submit(writer);
-		service.submit(writer);
-		
-		service.shutdown();
-		service.awaitTermination(Long.MAX_VALUE,TimeUnit.DAYS);
-		
-		System.in.read();
-	}
-	
-	public CopyOnWriteTreeMap()
-	{
-		m_read = m_write = null;
-		m_writeLock = new Object();
-	}
-	
-	public V get(K _key)
-	{
-		if(m_read == null){
-			return null;
-		}
-		
-		TreeNode<K,V> tn = m_read;
-		
-		while(tn != null){
-			K key = tn.key();
-			int result = key.compareTo(_key);
-			if(result == 0){
-				//find
-				return tn.value();
-			}else if(result > 0){
-				//go right
-				TreeNode<K,V> r = tn.getRight();
-				tn = r;
-			}else{
-				//go left
-				TreeNode<K,V> l = tn.getLeft();
-				tn = l;
-			}
-		}
-		
-		return null;
-	}
-	
-	public void put(K _key,V _value) throws InterruptedException
-	{
-		TreeNode<K,V> cur;
-		synchronized(m_writeLock){
-			if(m_write == null){
-				m_write = new TreeNode<K,V>(_key,_value);
-				m_write.unlock();
-				m_read = m_write;
-				return;
-			}
-		
-			m_write = m_write.copy();
-			cur = m_write;
-		}
-		
-		while(true){
-			K key = cur.key(); 
-			int result = key.compareTo(_key);
-			
-			if(result > 0){
-				TreeNode<K,V> r = cur.getRight();
-				if(r == null){
-					r = new TreeNode<K,V>(_key,_value);
-					cur.setRight(r);
-					r.unlock();
-					cur.unlock();
-					break;
-				}
-				TreeNode<K,V> cp = r.copy();
-				cur.setRight(cp);
-				cur.unlock();
-				cur = cp;
-				
-			}else if(result < 0){
-				TreeNode<K,V> l = cur.getLeft();
-				if(l == null){
-					l = new TreeNode<K,V>(_key,_value);
-					cur.setLeft(l);
-					l.unlock();
-					cur.unlock();
-					break;
-				}
-				TreeNode<K,V> cp = l.copy();
-				cur.setLeft(cp);
-				cur.unlock();
-				cur = cp;
-			}else{
-				cur.setValue(_value);
-				cur.unlock();
-				m_read = m_write;
-				return;
-			}
-		}
-		
-		m_read = m_write;
-	}
-	
-	private static class TreeNode<K,V>
-	{
-		TreeNode<K,V> m_left;
-		TreeNode<K,V> m_right;
-		
-		private K m_key;
-		private V m_value;
-		private volatile boolean m_flag;
-		private final CountDownLatch m_latch;
-		
-		public TreeNode(K _key,V _value)
-		{
-			this(_key,_value,null,null);
-		}
-		
-		private TreeNode(K _key,V _value,TreeNode<K,V> _left,TreeNode<K,V> _right)
-		{
-			m_key = _key;
-			m_value = _value;
-			m_left = _left;
-			m_right = _right;
-			m_latch = new CountDownLatch(1);
-			m_flag = true;
-		}
-		
-		public K key()
-		{
-			return m_key;
-		}
-		
-		public V value()
-		{
-			return m_value;
-		}
-		
-		public void setValue(V _value)
-		{
-			m_value = _value;
-		}
-		
-		public void setKey(K _key)
-		{
-			m_key = _key;
-		}
-	
-		public void setLeft(TreeNode<K,V> _left)
-		{
-			m_left = _left;
-		}
-		
-		public void setRight(TreeNode<K,V> _right)
-		{
-			m_right = _right;
-		}
-		
-		public TreeNode<K,V> getLeft()
-		{
-			return m_left;
-		}
-		
-		public TreeNode<K,V> getRight()
-		{
-			return m_right;
-		}
-		
-		public void unlock() throws InterruptedException
-		{
-			m_flag = false;
-			m_latch.countDown();
-		}
-		
-		public TreeNode<K,V> copy() throws InterruptedException
-		{
-			if(m_flag){
-				m_latch.await();
-			}
-			return new TreeNode<K,V>(m_key,m_value,m_left,m_right);
-		}
-	}
-}
--- a/src/treecms/tree/util/CopyOnWriteTreeMap2.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,247 +0,0 @@
-package treecms.tree.util;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Random;
-import java.util.TreeMap;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class CopyOnWriteTreeMap2<K extends Comparable<K>,V>
-{
-	private volatile TreeNode<K,V> m_read;
-	private final AtomicReference<TreeNode<K,V>> m_write;
-	
-	public static void main(String _args[]) throws InterruptedException
-	{
-		final CopyOnWriteTreeMap<String,String> map = new CopyOnWriteTreeMap<String,String>();
-		//final Map<String,String> map = Collections.synchronizedMap(new TreeMap<String,String>());
-		//final CopyOnWriteTreeMap2<String,String> map = new CopyOnWriteTreeMap2<String,String>();
-		final LinkedList<String> keys = new LinkedList<String>();
-		
-		Random r = new Random();
-		for(int i = 0;i < 5000;i ++){
-			String str = Long.toHexString(r.nextLong());
-		//	map.put(str,str);
-			keys.add(str);
-		}
-		
-		ExecutorService service = Executors.newFixedThreadPool(5);
-		
-		Callable<Object> task = new Callable<Object>(){
-			@Override
-			public Object call() throws Exception
-			{
-				long mill = System.currentTimeMillis();
-				for(String str : keys){
-					map.put(str,str);
-				}
-				System.out.println(System.currentTimeMillis() - mill);
-				
-				return null;
-			}
-		};
-		
-		service.submit(task);
-		service.submit(task);
-		service.submit(task);
-		service.submit(task);
-		service.submit(task);
-		
-		service.shutdown();
-		service.awaitTermination(Long.MAX_VALUE,TimeUnit.DAYS);
-		
-		for(String key : keys){
-			String val = map.get(key);
-			if(!val.equals(key)){
-				System.out.println("val("+key+") is ok");
-			}
-		}
-	}
-	
-	public CopyOnWriteTreeMap2()
-	{
-		m_read = null;
-		m_write = new AtomicReference<TreeNode<K,V>>();
-	}
-	
-	public V get(K _key)
-	{
-		if(m_read == null){
-			return null;
-		}
-		
-		TreeNode<K,V> tn = m_read;
-		
-		while(tn != null){
-			K key = tn.key();
-			int result = key.compareTo(_key);
-			if(result == 0){
-				//find
-				return tn.value();
-			}else if(result > 0){
-				//go right
-				TreeNode<K,V> r = tn.getRight();
-				tn = r;
-			}else{
-				//go left
-				TreeNode<K,V> l = tn.getLeft();
-				tn = l;
-			}
-		}
-		
-		return null;
-	}
-	
-	public void put(K _key,V _value) throws InterruptedException
-	{
-		TreeNode<K,V> root;
-		TreeNode<K,V> cur;
-		while(true){
-			root = m_write.get();
-			if(root == null){
-				root = new TreeNode<K,V>(_key,_value);
-				root.unlock();
-				if(m_write.compareAndSet(null,root)){
-					m_read = root;
-					return;
-				}
-				continue;
-			}
-		
-			cur = root.copy();
-			if(m_write.compareAndSet(root,cur)){
-				break;
-			}
-		}
-		
-		while(true){
-			K key = cur.key(); 
-			int result = key.compareTo(_key);
-			
-			if(result > 0){
-				TreeNode<K,V> r = cur.getRight();
-				if(r == null){
-					r = new TreeNode<K,V>(_key,_value);
-					cur.setRight(r);
-					r.unlock();
-					cur.unlock();
-					break;
-				}
-				TreeNode<K,V> cp = r.copy();
-				cur.setRight(cp);
-				cur.unlock();
-				cur = cp;
-				
-			}else if(result < 0){
-				TreeNode<K,V> l = cur.getLeft();
-				if(l == null){
-					l = new TreeNode<K,V>(_key,_value);
-					cur.setLeft(l);
-					l.unlock();
-					cur.unlock();
-					break;
-				}
-				TreeNode<K,V> cp = l.copy();
-				cur.setLeft(cp);
-				cur.unlock();
-				cur = cp;
-			}else{
-				cur.setValue(_value);
-				cur.unlock();
-				m_read = root;
-				return;
-			}
-		}
-		
-		m_read = root;
-	}
-	
-	private static class TreeNode<K,V>
-	{
-		TreeNode<K,V> m_left;
-		TreeNode<K,V> m_right;
-		
-		private K m_key;
-		private V m_value;
-		private volatile boolean m_flag;
-		private final CountDownLatch m_latch;
-		
-		public TreeNode(K _key,V _value)
-		{
-			this(_key,_value,null,null);
-		}
-		
-		private TreeNode(K _key,V _value,TreeNode<K,V> _left,TreeNode<K,V> _right)
-		{
-			m_key = _key;
-			m_value = _value;
-			m_left = _left;
-			m_right = _right;
-			m_latch = new CountDownLatch(1);
-			m_flag = true;
-		}
-		
-		public K key()
-		{
-			return m_key;
-		}
-		
-		public V value()
-		{
-			return m_value;
-		}
-		
-		public void setValue(V _value)
-		{
-			m_value = _value;
-		}
-		
-		public void setKey(K _key)
-		{
-			m_key = _key;
-		}
-	
-		public void setLeft(TreeNode<K,V> _left)
-		{
-			m_left = _left;
-		}
-		
-		public void setRight(TreeNode<K,V> _right)
-		{
-			m_right = _right;
-		}
-		
-		public TreeNode<K,V> getLeft()
-		{
-			return m_left;
-		}
-		
-		public TreeNode<K,V> getRight()
-		{
-			return m_right;
-		}
-		
-		public void unlock() throws InterruptedException
-		{
-			m_flag = false;
-			m_latch.countDown();
-		}
-		
-		public TreeNode<K,V> copy() throws InterruptedException
-		{
-			if(m_flag){
-				m_latch.await();
-			}
-			return new TreeNode<K,V>(m_key,m_value,m_left,m_right);
-		}
-	}
-}
--- a/src/treecms/tree/util/LockableNodeTable.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-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;
-	}
-
-}
--- a/src/treecms/tree/util/LockableReference.java	Tue Jul 12 14:39:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-package treecms.tree.util;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class LockableReference<V> 
-{
-	public static void main(String _args[]) throws InterruptedException
-	{
-		//test code for LockableReference<V>
-		
-		Integer i = new Integer(10);
-		final LockableReference<Integer> ref = new LockableReference<Integer>(i);
-		
-		Runnable r = new Runnable(){
-			@Override
-			public void run()
-			{
-				String name = Thread.currentThread().getName();
-				System.out.println(name + ": acquire lock");
-				ref.lock();
-				System.out.println(name + ": locked");
-				System.out.println(name + ": ref is " + ref.get());
-				ref.put(2);
-				BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
-				try {
-					br.readLine();
-				}catch(IOException _e){
-					_e.printStackTrace();
-				}
-				ref.unlock();
-			}
-		};
-		
-		Thread th1 = new Thread(r);
-		Thread th2 = new Thread(r);
-		
-		th1.start();
-		th2.start();
-		
-		th1.join();
-		th2.join();
-	}
-	
-	private final AtomicReference<V> m_ref;
-	private final ReentrantLock m_lock;
-	
-	public LockableReference(V _ref)
-	{
-		m_ref = new AtomicReference<V>(_ref);
-		m_lock = new ReentrantLock(true);
-	}
-	
-	public V get()
-	{
-		V ret;
-		m_lock.lock();
-		ret = m_ref.get();
-		m_lock.unlock();
-		return ret;
-	}
-	
-	public boolean isLocked()
-	{
-		return m_lock.isLocked();
-	}
-	
-	public void put(V _ref)
-	{
-		m_lock.lock();
-		m_ref.set(_ref);
-		m_lock.unlock();
-	}
-	
-	public void lock()
-	{
-		m_lock.lock();
-	}
-	
-	public void unlock()
-	{
-		m_lock.unlock();
-	}
-}
--- a/src/treecms/tree/util/NodeChildrenImpl.java	Tue Jul 12 14:39:35 2011 +0900
+++ b/src/treecms/tree/util/NodeChildrenImpl.java	Mon Jul 18 20:22:53 2011 +0900
@@ -1,9 +1,7 @@
 package treecms.tree.util;
 
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;