changeset 54:650fe2a0dccc

modified tests
author Shoshi TAMAKI
date Fri, 08 Feb 2013 17:08:42 +0900
parents ed890dcb673e
children 4ff16d970ffc
files src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournal.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/EditableNodeWrapper.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeContext.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TreeContext.java src/test/java/DefaultJungleTreeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/AppendChildAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteAttributeAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteChildAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/PutAttributeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/treeeditor/ClonableChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/treeeditor/TreeNodeChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/ClonableDefaultAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/ClonableDefaultChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/ClonableDefaultNodeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingNodeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/tests/util/TestUtil.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/TraverserTest.java
diffstat 29 files changed, 538 insertions(+), 557 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java	Fri Feb 08 17:08:42 2013 +0900
@@ -2,27 +2,52 @@
 
 import java.util.Iterator;
 import java.util.concurrent.ConcurrentHashMap;
-
 import fj.data.List;
-
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Journal;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.NullJournal;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 
 public class DefaultJungle implements Jungle
 {
 	private Journal journal;
 	private ConcurrentHashMap<String,JungleTree> trees;
 	private String uuid;
+	private TreeEditor editor;
 	
-	public DefaultJungle(String _uuid)
+	public static void main(String _args[])
+	{
+		DefaultJungle j = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()));
+		JungleTree t = j.createNewTree("fuga");
+		
+		JungleTreeEditor e1 = t.getTreeEditor();
+		JungleTreeEditor e2 = t.getTreeEditor();
+		
+		DefaultNodePath root = new DefaultNodePath();
+		
+		Either<Error,JungleTreeEditor> either = e1.addNewChildAt(root,0);
+		e1 = either.b();
+		either = e1.addNewChildAt(root.add(0),0);
+		e1 = either.b();
+		e1.success();
+	}
+	
+	public DefaultJungle(Journal _journal,String _uuid,TreeEditor _editor)
 	{
 		journal = new NullJournal();
 		trees = new ConcurrentHashMap<String,JungleTree>();
 		uuid = _uuid;
+		editor = _editor;
 	}
 
 	@Override
@@ -36,14 +61,16 @@
 	{
 		ChangeList list = new ChangeList(){
 			@Override
-			public Iterator<Operation> iterator() {
-				List<Operation> nil = List.nil();
+			public Iterator<TreeOperation> iterator() {
+				List<TreeOperation> nil = List.nil();
 				return nil.iterator();
 			}
 		};
-		DefaultNode node = new DefaultNode();
-		DefaultChangeSet set = new DefaultChangeSet(node,null,list,uuid,0);
-		DefaultJungleTree newTree = new DefaultJungleTree(set,uuid,journal.getWriter());
+		
+		DefaultTreeNode root = new DefaultTreeNode();
+		ChangeSet set = new DefaultChangeSet(root.getAsNode(),null,list,uuid,0);
+		DefaultTreeContext<DefaultTreeNode> tc = new DefaultTreeContext<DefaultTreeNode>(root,set);
+		JungleTree newTree = new DefaultJungleTree<DefaultTreeNode>(tc,uuid,journal.getWriter(),editor);
 		if(trees.putIfAbsent(_name,newTree) != null){
 			return null;
 		}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,116 +1,44 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle;
 
-import java.util.Iterator;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter.Converter;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
 
-public class DefaultJungleTree implements JungleTree
+public class DefaultJungleTree<T extends TreeNode<T>> implements JungleTree
 {
-	private final AtomicReservableReference<DefaultChangeSet> repository;
+	private final AtomicReservableReference<TreeContext<T>> repository;
 	private final String uuid;
 	private final ChangeListWriter writer;
+	private final TreeEditor editor;
 	
-	public DefaultJungleTree(DefaultChangeSet _set,String _uuid,ChangeListWriter _writer)
+	public DefaultJungleTree(TreeContext<T> _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor)
 	{
-		repository = new AtomicReservableReference<DefaultChangeSet>(_set);
+		repository = new AtomicReservableReference<TreeContext<T>>(_tc);
 		uuid = _uuid;
 		writer = _writer;
+		editor = _editor;
 	}
 
 	@Override
-	public DefaultJungleTreeEditor getTreeEditor()
+	public JungleTreeEditor getTreeEditor()
 	{
-		DefaultChangeSet tip = repository.get();
-		DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tip,repository,uuid);
-		DefaultNode root = tip.getRoot();
-		return new DefaultJungleTreeEditor(root,txManager,new DefaultTraverser());
+		TreeContext<T> tc = repository.get();
+		DefaultTransactionManager<T> txManager = new DefaultTransactionManager<T>(writer,tc,repository,uuid);
+		T root = tc.getTreeNode();
+		return new DefaultJungleTreeEditor<T>(root,txManager,editor);
 	}
 
 	@Override
 	public Node getRootNode()
 	{
-		ChangeSet set = repository.get();
-		return set.getRoot();
-	}
-	
-	public static class NodeWrapper<T extends Parent<T> & AttributesContainer> implements Node
-	{
-		private final T wrap;
-		
-		public NodeWrapper(T _wrap)
-		{
-			wrap = _wrap;
-		}
-
-		@Override
-		public Attributes getAttributes()
-		{
-			return wrap.getAttributes();
-		}
-
-		@Override
-		public Children<Node> getChildren()
-		{
-			Children<T> children = wrap.getChildren();
-			return new ChildrenWrapper<T>(children);
-		}
-		
-		public static class ChildrenWrapper<T extends Parent<T> & AttributesContainer> implements Children<Node>
-		{
-			private Children<T> wrap;
-			
-			public ChildrenWrapper(Children<T> _wrap)
-			{
-				wrap = _wrap;
-			}
-
-			@Override
-			public Iterator<Node> iterator()
-			{
-				Converter<Node,T> converter = new IterableConverter.Converter<Node,T>(){
-					@Override
-					public Node conv(T _b){
-						return new NodeWrapper<T>(_b);
-					}
-				};
-				
-				IterableConverter<Node,T> iterable = new IterableConverter<Node,T>(wrap,converter);
-				return iterable.iterator();
-			}
-
-			@Override
-			public Either<Error,Node> at(int _pos)
-			{
-				Either<Error,T> either = wrap.at(_pos);
-				if(either.isA()){
-					return DefaultEither.newA(either.a());
-				}
-				T node = either.b();
-				Node wrapper = new NodeWrapper<T>(node);
-				return DefaultEither.newB(wrapper);
-			}
-
-			@Override
-			public int size()
-			{
-				return wrap.size();
-			}
-		}
+		TreeContext<T> tc = repository.get();
+		ChangeSet cs = tc.getChangeSet();
+		return cs.getRoot();
 	}
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,12 +1,14 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core;
 
 import java.nio.ByteBuffer;
-
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 
 /**
  * Hello world!
@@ -16,7 +18,7 @@
 {
     public static void main( String[] args )
     {
-    	DefaultJungle jungle = new DefaultJungle("sample");
+    	DefaultJungle jungle = new DefaultJungle(null,"sample",new DefaultTreeEditor(new DefaultTraverser()));
     	jungle.createNewTree("hoge");
     	JungleTree tree = jungle.getTreeByName("hoge");
     	JungleTreeEditor editor = tree.getTreeEditor();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournal.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournal.java	Fri Feb 08 17:08:42 2013 +0900
@@ -9,8 +9,6 @@
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileChannel.MapMode;
 import java.nio.channels.WritableByteChannel;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 
@@ -120,9 +118,4 @@
 	{
 		return writer;
 	}
-	
-	public interface OperationParser<T extends Operation>
-	{
-		T parse(String _line);
-	}
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/EditableNodeWrapper.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/EditableNodeWrapper.java	Fri Feb 08 17:08:42 2013 +0900
@@ -30,7 +30,7 @@
 	@Override
 	public EditableChildren<EditableNodeWrapper<T>> getChildren()
 	{
-		return null;
+		return new EditableChildrenWrapper<T>(wrap);
 	}
 	
 	public T getWrap()
@@ -127,7 +127,7 @@
 		{
 			Either<Error,T> either = children.addNewChildAt(_pos);
 			if(either.isA()){
-				DefaultEither.newA(either.a());
+				return DefaultEither.newA(either.a());
 			}
 			T newWrap = either.b();
 			EditableNodeWrapper<T> newWrapper = new EditableNodeWrapper<T>(newWrap);
@@ -140,7 +140,7 @@
 		{
 			Either<Error,T> either = children.deleteChildAt(_pos);
 			if(either.isA()){
-				DefaultEither.newA(either.a());
+				return DefaultEither.newA(either.a());
 			}
 			T newWrap = either.b();
 			EditableNodeWrapper<T> newWrapper = new EditableNodeWrapper<T>(newWrap);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,18 +1,12 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;
 
 import java.nio.ByteBuffer;
-import java.util.Iterator;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNodeHook;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
@@ -24,7 +18,6 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
@@ -32,30 +25,28 @@
 
 public class DefaultJungleTreeEditor<T extends TreeNode<T>> implements JungleTreeEditor
 {
-	private final TransactionManager txManager;
+	private final TransactionManager<T> txManager;
 	private final T root;
 	private final TreeEditor editor;
-	private final Traverser traverser;
 	private final TreeOperationLog log;
 
-	public DefaultJungleTreeEditor(T _root,TransactionManager _txManager,Traverser _traverser,TreeEditor _editor)
+	public DefaultJungleTreeEditor(T _root,TransactionManager<T> _txManager,TreeEditor _editor)
 	{
-		this(_root,_txManager,_traverser,_editor,new DefaultTreeOperationLog());
+		this(_root,_txManager,_editor,new DefaultTreeOperationLog());
 	}
 	
-	public DefaultJungleTreeEditor(T _root,TransactionManager _txManager,Traverser _traverser,TreeEditor _editor,TreeOperationLog _log)
+	public DefaultJungleTreeEditor(T _root,TransactionManager<T> _txManager,TreeEditor _editor,TreeOperationLog _log)
 	{
 		root = _root;
 		txManager = _txManager;
 		editor = _editor;
-		traverser = _traverser;
 		log = _log;
 	}
 	
 	private Either<Error,JungleTreeEditor> _edit(final NodePath _path,NodeEditor _e)
 	{
 		LoggingNodeHook hook = new LoggingNodeHook(_e);
-		Either<Error,T> either = editor.edit(root,_path,_e);
+		Either<Error,T> either = editor.edit(root,_path,hook);
 		if(either.isA()){
 			return DefaultEither.newA(either.a());
 		}
@@ -74,7 +65,7 @@
 		DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length());
 		TreeOperationLog newTreeOpLog = log.append(treeOperationLog);
 		
-		JungleTreeEditor newEditor = new DefaultJungleTreeEditor<T>(newNode,txManager,traverser,editor,newTreeOpLog);
+		JungleTreeEditor newEditor = new DefaultJungleTreeEditor<T>(newNode,txManager,editor,newTreeOpLog);
 		return DefaultEither.newB(newEditor);
 	}
 	
@@ -115,14 +106,13 @@
 	@Override
 	public Either<Error,JungleTreeEditor> success()
 	{
-		Node node = root.getAsNode();
-		Either<Error,TransactionManager> either = txManager.commit(node,log);
+		Either<Error,TransactionManager<T>> either = txManager.commit(root,log);
 		if(either.isA()){
 			return DefaultEither.newA(either.a());
 		}
 		
-		TransactionManager newTxManager = either.b();
-		JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor<T>(root,newTxManager,traverser,editor);
+		TransactionManager<T> newTxManager = either.b();
+		JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor<T>(root,newTxManager,editor);
 		
 		return DefaultEither.newB(newTreeEditor);
 	}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Fri Feb 08 17:08:42 2013 +0900
@@ -5,6 +5,8 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
@@ -13,26 +15,27 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 
-public class DefaultTransactionManager implements TransactionManager
+public class DefaultTransactionManager<T extends TreeNode<T>> implements TransactionManager<T>
 {
-	private final AtomicReservableReference<DefaultChangeSet> repository;
-	private final DefaultChangeSet tip;
+	private final AtomicReservableReference<TreeContext<T>> repository;
+	private final TreeContext<T> tip;
 	private final ChangeListWriter writer;
 	private final String uuid;
 	
-	public DefaultTransactionManager(ChangeListWriter _writer,DefaultChangeSet _changeSet,
-			AtomicReservableReference<DefaultChangeSet> _repository,String _uuid)
+	public DefaultTransactionManager(ChangeListWriter _writer,TreeContext<T> _tip,
+			AtomicReservableReference<TreeContext<T>> _repository,String _uuid)
 	{
 		repository = _repository;
-		tip = _changeSet;
+		tip = _tip;
 		writer = _writer;
 		uuid = _uuid;
 	}
 	
 	@Override
-	public Either<Error,TransactionManager> commit(Node _newRoot,final TreeOperationLog _log)
+	public Either<Error,TransactionManager<T>> commit(T _newRoot,final TreeOperationLog _log)
 	{
-		long currentRevision = tip.revision();
+		ChangeSet cs = tip.getChangeSet();
+		long currentRevision = cs.revision();
 		long nextRevision = currentRevision + 1;
 		
 		ChangeList list = new ChangeList(){
@@ -42,15 +45,19 @@
 			}
 		};
 		
-		DefaultChangeSet changeSet = new DefaultChangeSet(_newRoot,tip,list,uuid,nextRevision);
-		Reservation reservation = repository.makeReservation(tip,changeSet);
+		Node root = _newRoot.getAsNode();
+		DefaultChangeSet newCs = new DefaultChangeSet(root,cs,list,uuid,nextRevision);
+		DefaultTreeContext<T> newContext = new DefaultTreeContext<T>(_newRoot,newCs);
+		
+		@SuppressWarnings("rawtypes")
+		Reservation reservation = repository.makeReservation(tip,newContext);
 		if(reservation == null){
 			return DefaultEither.newA((Error)new DefaultError());
 		}
 		Result r = writer.write(list);
 		if(r == Result.SUCCESS){
 			reservation.confirm();
-			TransactionManager txManager = new DefaultTransactionManager(writer,changeSet,repository,uuid);
+			TransactionManager<T> txManager = new DefaultTransactionManager<T>(writer,newContext,repository,uuid);
 			return DefaultEither.newB(txManager);
 		}
 		
@@ -66,6 +73,7 @@
 	@Override
 	public long getRevision()
 	{
-		return tip.revision();
+		ChangeSet cs = tip.getChangeSet();
+		return cs.revision();
 	}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeContext.java	Fri Feb 08 17:08:42 2013 +0900
@@ -0,0 +1,28 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+
+public class DefaultTreeContext<T extends TreeNode<T>> implements TreeContext<T>
+{
+	private final T root;
+	private final ChangeSet cs;
+	
+	public DefaultTreeContext(T _newRoot,ChangeSet _cs)
+	{
+		root = _newRoot;
+		cs = _cs;
+	}
+
+	@Override
+	public ChangeSet getChangeSet()
+	{
+		return cs;
+	}
+
+	@Override
+	public T getTreeNode()
+	{
+		return root;
+	}
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,13 +1,13 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;
 
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 
-public interface TransactionManager
+public interface TransactionManager<T extends TreeNode<T>>
 {
-	public Either<Error,TransactionManager> commit(Node _newRoot,TreeOperationLog _log);
+	public Either<Error,TransactionManager<T>> commit(T _newRoot,TreeOperationLog _log);
 	public String getUUID();
 	public long getRevision();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TreeContext.java	Fri Feb 08 17:08:42 2013 +0900
@@ -0,0 +1,10 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+
+public interface TreeContext<T extends TreeNode<T>>
+{
+	public ChangeSet getChangeSet();
+	public T getTreeNode();
+}
--- a/src/test/java/DefaultJungleTreeTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/DefaultJungleTreeTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,13 +1,15 @@
 import java.nio.ByteBuffer;
-
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Result;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
@@ -16,7 +18,7 @@
 {
 	public Jungle instance()
 	{
-		Jungle j = new DefaultJungle("hogehoge");
+		Jungle j = new DefaultJungle(null,"hogehoge",new DefaultTreeEditor(new DefaultTraverser()));
 		return j;
 	}
 	
@@ -53,7 +55,7 @@
 		}
 		editor2 = either.b();
 		Either<Error,JungleTreeEditor> r = editor2.success();
-		Assert.assertTrue(either.isA());
+		Assert.assertTrue(r.isA());
 	}
 	
 	public void testIsolation()
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -7,7 +7,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.tests.util.TestUtil;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal;
@@ -26,36 +26,36 @@
 	
 	public void testEdittingDoesNotEffectToOtherTree()
 	{
-		ClonableDefaultNode root = TestUtil.createMockTree(3);
+		DefaultTreeNode root = TestUtil.createMockTree(3);
 		DefaultTreeEditor editor = new DefaultTreeEditor(new DefaultTraverser());
 		DefaultNodePath path = new DefaultNodePath().add(0).add(2);
 		
-		ClonableDefaultNode oldRoot = root;
+		DefaultTreeNode oldRoot = root;
 		
 		DefaultTreeEditor currentEditor = editor;
 		String key = "path";
 		
 		
-		ClonableDefaultNode currentRoot = root;
+		DefaultTreeNode currentRoot = root;
 		for(DefaultNodePath part : path.inits()){
 			ByteBuffer value = ByteBuffer.wrap(part.toString().getBytes());
 			PutAttribute putAttribute = new PutAttribute(key,value);
-			Either<Error,ClonableDefaultNode> either = currentEditor.edit(currentRoot,part,putAttribute);
+			Either<Error,DefaultTreeNode> either = currentEditor.edit(currentRoot,part,putAttribute);
 			if(either.isA()){
 				Assert.fail();
 			}
 			currentRoot = either.b();
 		}
 		
-		ClonableDefaultNode newRoot = currentRoot;
+		DefaultTreeNode newRoot = currentRoot;
 		DefaultTraverser traverser = new DefaultTraverser();
 		
 		for(DefaultNodePath part : path.inits()){
-			Either<Error,Traversal<TraversableNodeWrapper<ClonableDefaultNode>>> either = traverser.traverse(new TraversableNodeWrapper<ClonableDefaultNode>(newRoot),new DefaultEvaluator(part));
+			Either<Error,Traversal<TraversableNodeWrapper<DefaultTreeNode>>> either = traverser.traverse(new TraversableNodeWrapper<DefaultTreeNode>(newRoot),new DefaultEvaluator(part));
 			if(either.isA()){
 				Assert.fail();
 			}
-			ClonableDefaultNode target = either.b().destination().getWrapped();
+			DefaultTreeNode target = either.b().destination().getWrapped();
 			String expected = part.toString();
 			String actual = new String(target.getAttributes().get(key).array());
 			
@@ -63,11 +63,11 @@
 		}
 		
 		for(DefaultNodePath part : path.inits()){
-			Either<Error,Traversal<TraversableNodeWrapper<ClonableDefaultNode>>> either = traverser.traverse(new TraversableNodeWrapper<ClonableDefaultNode>(oldRoot),new DefaultEvaluator(part));
+			Either<Error,Traversal<TraversableNodeWrapper<DefaultTreeNode>>> either = traverser.traverse(new TraversableNodeWrapper<DefaultTreeNode>(oldRoot),new DefaultEvaluator(part));
 			if(either.isA()){
 				Assert.fail();
 			}
-			ClonableDefaultNode target = either.b().destination().getWrapped();
+			DefaultTreeNode target = either.b().destination().getWrapped();
 			ByteBuffer actual = target.getAttributes().get(key);
 			
 			Assert.assertNull(actual);
@@ -78,14 +78,14 @@
 	public void testEdit()
 	{
 		DefaultTreeEditor instance = instance();
-		ClonableDefaultNode node = new ClonableDefaultNode();
+		DefaultTreeNode node = new DefaultTreeNode();
 		DefaultNodePath path = new DefaultNodePath();
 		
-		Either<Error,ClonableDefaultNode> either = instance.edit(node,path,new AppendChildAt(0));
+		Either<Error,DefaultTreeNode> either = instance.edit(node,path,new AppendChildAt(0));
 		if(either.isA()){
 			Assert.fail();
 		}
-		ClonableDefaultNode newRoot = either.b();
+		DefaultTreeNode newRoot = either.b();
 		Assert.assertEquals(1,newRoot.getChildren().size());
 	}
 }
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/AppendChildAtTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/AppendChildAtTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,8 +1,9 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor;
 
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import junit.framework.Assert;
@@ -12,14 +13,15 @@
 {
 	public void testEdit()
 	{
-		ClonableDefaultNode node = new ClonableDefaultNode(new DefaultNode());
+		DefaultTreeNode node = new DefaultTreeNode(new DefaultNode());
 		AppendChildAt op = new AppendChildAt(0);
-		Either<Error,ClonableDefaultNode> either = op.edit(node);
+		EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(node);
+		Either<Error, EditableNodeWrapper<DefaultTreeNode>> either = op.edit(wrapper);
 		if(either.isA()){
 			Assert.fail();
 		}
 		
-		node = either.b();
-		Assert.assertEquals(1,node.getChildren().size());
+		DefaultTreeNode newNode = either.b().getWrap();
+		Assert.assertEquals(1,newNode.getChildren().size());
 	}
 }
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteAttributeAtTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteAttributeAtTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,10 +1,10 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor;
 
 import java.nio.ByteBuffer;
-
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import junit.framework.Assert;
@@ -17,19 +17,20 @@
 		String key = "KEY";
 		ByteBuffer value = ByteBuffer.wrap(key.getBytes());
 		
-		ClonableDefaultNode node = new ClonableDefaultNode(new DefaultNode());
-		Either<Error,ClonableDefaultNode> either = node.getAttributes().put(key, value);
+		DefaultTreeNode node = new DefaultTreeNode(new DefaultNode());
+		Either<Error,DefaultTreeNode> either = node.getAttributes().put(key, value);
 		if(either.isA()){
 			Assert.fail();
 		}
 		node = either.b();
 		
 		DeleteAttribute op = new DeleteAttribute(key);
-		either = op.edit(node);
-		if(either.isA()){
+		EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(node);
+		Either<Error, EditableNodeWrapper<DefaultTreeNode>> either2 = op.edit(wrapper);
+		if(either2.isA()){
 			Assert.fail();
 		}
-		ClonableDefaultNode newNode = either.b();
+		DefaultTreeNode newNode = either2.b().getWrap();
 		ByteBuffer ret = newNode.getAttributes().get(key);
 		Assert.assertNull(ret);
 	}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteChildAtTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteChildAtTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,9 +1,8 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor;
 
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import junit.framework.Assert;
@@ -13,8 +12,8 @@
 {
 	public void testEdit()
 	{
-		ClonableDefaultNode node = new ClonableDefaultNode(new DefaultNode());
-		Either<Error,ClonableDefaultNode> either = node.getChildren().addNewChildAt(0);
+		DefaultTreeNode node = new DefaultTreeNode();
+		Either<Error,DefaultTreeNode> either = node.getChildren().addNewChildAt(0);
 		if(either.isA()){
 			Assert.fail();
 		}
@@ -22,11 +21,13 @@
 		Assert.assertEquals(1,node.getChildren().size());
 		
 		DeleteChildAt op = new DeleteChildAt(0);
-		either = op.edit(node);
-		if(either.isA()){
+		EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(node);
+		Either<Error,EditableNodeWrapper<DefaultTreeNode>> either2 = op.edit(wrapper);
+		if(either2.isA()){
 			Assert.fail();
 		}
-		node = either.b();
+		node = either2.b().getWrap();
+		
 		Assert.assertEquals(0,node.getChildren().size());
 	}
 }
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/PutAttributeTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/PutAttributeTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -5,8 +5,9 @@
 import org.junit.Assert;
 
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import junit.framework.TestCase;
@@ -17,15 +18,16 @@
 	{
 		String key = "KEY";
 		ByteBuffer value = ByteBuffer.wrap(key.getBytes());
-		ClonableDefaultNode node = new ClonableDefaultNode(new DefaultNode());
+		DefaultTreeNode node = new DefaultTreeNode(new DefaultNode());
 		PutAttribute op = new PutAttribute(key,value);
-		Either<Error,ClonableDefaultNode> either = op.edit(node);
+		EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(node);
+		Either<Error, EditableNodeWrapper<DefaultTreeNode>> either = op.edit(wrapper);
 		if(either.isA()){
 			Assert.fail();
 		}
 		
-		node = either.b();
-		ByteBuffer ret = node.getAttributes().get(key);
+		DefaultTreeNode newNode = either.b().getWrap();
+		ByteBuffer ret = newNode.getAttributes().get(key);
 		Assert.assertEquals(0,ret.compareTo(value));
 	}
 }
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/treeeditor/ClonableChildrenTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor;
-
-import java.nio.ByteBuffer;
-import org.junit.Assert;
-import fj.data.List;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableChildren;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
-import junit.framework.TestCase;
-
-public abstract class ClonableChildrenTest<T extends ClonableNode<T>> extends TestCase
-{
-	public abstract ClonableNode<T> instance();
-	
-	public void testAddNewChildAtWithNode()
-	{
-		int count = 5;
-		for(Integer pos : List.range(0,5)){
-			_testAddNewChildAtWithNode(count,pos);
-		}
-	}
-	
-	public void _testAddNewChildAtWithNode(int _count,int _pos)
-	{
-		ClonableNode<T> instance = instance();
-		
-		Either<Error, T> either;
-		for(int i = 0;i < _count;i ++){
-			either = instance.getChildren().addNewChildAt(0);
-			if(either.isA()){
-				Assert.fail();
-			}
-			instance = either.b();
-		}
-		
-		T newNode = instance.createNewNode();
-		String key = "KEY";
-		ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes());
-		
-		either = newNode.getAttributes().put(key,value);
-		if(either.isA()){
-			Assert.fail();
-		}
-		newNode = either.b();
-		
-		either = instance.getChildren().addNewChildAt(_pos,newNode);
-		if(either.isA()){
-			Assert.fail();
-		}
-		instance = either.b();
-		
-		// check 
-		either = instance.getChildren().at(_pos);
-		if(either.isA()){
-			Assert.fail();
-		}
-		
-		T checkTarget = either.b();
-		ByteBuffer actual = checkTarget.getAttributes().get(key);
-		Assert.assertEquals(0,value.compareTo(actual));
-	}
-	
-	public void testReplaceAt()
-	{
-		int count = 5;
-		for(Integer pos : List.range(0,count)){
-			_testReplaceAt(count,pos);
-		}
-	}
-	
-	public void _testReplaceAt(int _count,int _pos)
-	{
-		ClonableNode<T> instance = instance();
-		String key = "KEY";
-		ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes());
-		
-		// prepare
-		
-		for(int i = 0;i < _count;i ++){
-			T newNode = instance.createNewNode();
-			Either<Error,T> either = newNode.getAttributes().put(key,value);
-			if(either.isA()){
-				Assert.fail("failed to put attributes to child");
-			}
-			
-			newNode = either.b();
-			either = instance.getChildren().addNewChildAt(0,newNode);
-			if(either.isA()){
-				Assert.fail("failed to add child to instance");
-			}
-			
-			instance = either.b();
-		}
-		
-		int size = instance.getChildren().size();
-		Assert.assertEquals(_count,size);
-		
-		// create node for replacement.
-		
-		ByteBuffer replaceNodeValue = ByteBuffer.wrap("EULAV".getBytes());
-		T replacement = instance.createNewNode();
-		Either<Error,T> either = replacement.getAttributes().put(key,replaceNodeValue);
-		if(either.isA()){
-			Assert.fail("failed to create replacement node");
-		}
-		replacement = either.b();
-		
-		// replace
-		
-		either = instance.getChildren().replaceNode(_pos,replacement);
-		if(either.isA()){
-			Assert.fail("failed to replace node.");
-		}
-		instance = either.b();
-		
-		ClonableChildren<T> children = instance.getChildren();
-		for(Integer pos : List.range(0,_count)){
-			either = children.at(pos.intValue());
-			if(either.isA()){
-				Assert.fail("failed to get node.");
-			}
-			
-			T ch = either.b();
-			ByteBuffer expect = (_pos != pos) ? value : replaceNodeValue;
-			ByteBuffer actual = ch.getAttributes().get(key);
-			
-			Assert.assertEquals(0,expect.compareTo(actual));
-		}
-	}
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/treeeditor/TreeNodeChildrenTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -0,0 +1,131 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor;
+
+import java.nio.ByteBuffer;
+import org.junit.Assert;
+import fj.data.List;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import junit.framework.TestCase;
+
+public abstract class TreeNodeChildrenTest<T extends TreeNode<T>> extends TestCase
+{
+	public abstract TreeNode<T> instance();
+	
+	public void testAddNewChildAtWithNode()
+	{
+		int count = 5;
+		for(Integer pos : List.range(0,5)){
+			_testAddNewChildAtWithNode(count,pos);
+		}
+	}
+	
+	public void _testAddNewChildAtWithNode(int _count,int _pos)
+	{
+		TreeNode<T> instance = instance();
+		
+		Either<Error, T> either;
+		for(int i = 0;i < _count;i ++){
+			either = instance.getChildren().addNewChildAt(0);
+			if(either.isA()){
+				Assert.fail();
+			}
+			instance = either.b();
+		}
+		
+		T newNode = instance.createNewNode();
+		String key = "KEY";
+		ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes());
+		
+		either = newNode.getAttributes().put(key,value);
+		if(either.isA()){
+			Assert.fail();
+		}
+		newNode = either.b();
+		
+		either = instance.getChildren().addNewChildAt(_pos,newNode);
+		if(either.isA()){
+			Assert.fail();
+		}
+		instance = either.b();
+		
+		// check 
+		either = instance.getChildren().at(_pos);
+		if(either.isA()){
+			Assert.fail();
+		}
+		
+		T checkTarget = either.b();
+		ByteBuffer actual = checkTarget.getAttributes().get(key);
+		Assert.assertEquals(0,value.compareTo(actual));
+	}
+	
+	public void testReplaceAt()
+	{
+		int count = 5;
+		for(Integer pos : List.range(0,count)){
+			_testReplaceAt(count,pos);
+		}
+	}
+	
+	public void _testReplaceAt(int _count,int _pos)
+	{
+		TreeNode<T> instance = instance();
+		String key = "KEY";
+		ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes());
+		
+		// prepare
+		
+		for(int i = 0;i < _count;i ++){
+			T newNode = instance.createNewNode();
+			Either<Error,T> either = newNode.getAttributes().put(key,value);
+			if(either.isA()){
+				Assert.fail("failed to put attributes to child");
+			}
+			
+			newNode = either.b();
+			either = instance.getChildren().addNewChildAt(0,newNode);
+			if(either.isA()){
+				Assert.fail("failed to add child to instance");
+			}
+			
+			instance = either.b();
+		}
+		
+		int size = instance.getChildren().size();
+		Assert.assertEquals(_count,size);
+		
+		// create node for replacement.
+		
+		ByteBuffer replaceNodeValue = ByteBuffer.wrap("EULAV".getBytes());
+		T replacement = instance.createNewNode();
+		Either<Error,T> either = replacement.getAttributes().put(key,replaceNodeValue);
+		if(either.isA()){
+			Assert.fail("failed to create replacement node");
+		}
+		replacement = either.b();
+		
+		// replace
+		
+		either = instance.getChildren().replaceNode(_pos,replacement);
+		if(either.isA()){
+			Assert.fail("failed to replace node.");
+		}
+		instance = either.b();
+		
+		TreeNodeChildren<T> children = instance.getChildren();
+		for(Integer pos : List.range(0,_count)){
+			either = children.at(pos.intValue());
+			if(either.isA()){
+				Assert.fail("failed to get node.");
+			}
+			
+			T ch = either.b();
+			ByteBuffer expect = (_pos != pos) ? value : replaceNodeValue;
+			ByteBuffer actual = ch.getAttributes().get(key);
+			
+			Assert.assertEquals(0,expect.compareTo(actual));
+		}
+	}
+}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/ClonableDefaultAttributesTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable;
-
-import java.nio.ByteBuffer;
-
-import fj.Ord;
-import fj.P2;
-import fj.data.List;
-import fj.data.TreeMap;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableAttributesTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultAttributes;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class ClonableDefaultAttributesTest extends TestCase
-{
-	public static TestSuite suite()
-	{
-		TestSuite suite = new TestSuite();
-		suite.addTestSuite(AttributeTestImpl.class);
-		suite.addTestSuite(EditableAttributesTestImpl.class);
-		return suite;
-	}
-	
-	public static ClonableDefaultAttributes instance()
-	{
-		List<DefaultNode> rawList = List.nil();
-		TreeMap<String,ByteBuffer> rawMap = TreeMap.empty(Ord.stringOrd);
-		
-		for(P2<String,ByteBuffer> entry : AttributesTest.ENTRIES){
-			rawMap = rawMap.set(entry._1(),entry._2());
-		}
-		
-		return new ClonableDefaultNode(new DefaultNode(rawList,rawMap)).getAttributes();
-	}
-	
-	public static class AttributeTestImpl extends AttributesTest
-	{
-
-		@Override
-		public Attributes instance()
-		{
-			return ClonableDefaultAttributesTest.instance();
-		}
-		
-	}
-	
-	public static class EditableAttributesTestImpl extends EditableAttributesTest<ClonableDefaultNode>
-	{
-
-		@Override
-		public EditableAttributes<ClonableDefaultNode> instance()
-		{
-			return ClonableDefaultAttributesTest.instance();
-		}
-		
-	}
-}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/ClonableDefaultChildrenTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableChildrenTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor.ClonableChildrenTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class ClonableDefaultChildrenTest extends TestCase
-{
-	public static TestSuite suite()
-	{
-		TestSuite suite = new TestSuite();
-		suite.addTestSuite(EditableChildrenTestImpl.class);
-		suite.addTestSuite(ClonableChildrenTestImpl.class);
-		return suite;
-	}
-	
-	public static ClonableDefaultNode instance()
-	{
-		return new ClonableDefaultNode(new DefaultNode());
-	}
-	
-	public static class ClonableChildrenTestImpl extends ClonableChildrenTest<ClonableDefaultNode>
-	{
-		@Override
-		public ClonableDefaultNode instance()
-		{
-			return ClonableDefaultChildrenTest.instance();
-		}
-	}
-	
-	public static class EditableChildrenTestImpl extends EditableChildrenTest<ClonableDefaultNode>
-	{
-		@Override
-		public EditableChildren<ClonableDefaultNode> instance()
-		{
-			return ClonableDefaultChildrenTest.instance().getChildren();
-		}
-	}
-}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/ClonableDefaultNodeTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainerTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.ParentTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
-import junit.framework.Assert;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class ClonableDefaultNodeTest extends TestCase
-{
-	public static TestSuite suite()
-	{
-		TestSuite suite = new TestSuite();
-		suite.addTestSuite(AttributesContaierTestImpl.class);
-		suite.addTestSuite(ParentTestImpl.class);
-		return suite;
-	}
-	
-	public static ClonableDefaultNode instance()
-	{
-		ClonableDefaultNode node = new ClonableDefaultNode(new DefaultNode());
-		return node;
-	}
-	
-	public void testGetWrapped()
-	{
-		ClonableDefaultNode instance = instance();
-		DefaultNode wrapped = instance.getWrapped();
-		
-		Assert.assertNotNull(wrapped);
-	}
-	
-	public void testCreateNewNode()
-	{
-		ClonableDefaultNode instance = instance();
-		ClonableDefaultNode node = instance.createNewNode();
-		
-		Assert.assertNotNull(node);
-	}
-	
-	public static class AttributesContaierTestImpl extends AttributesContainerTest
-	{
-		@Override
-		public AttributesContainer instance()
-		{
-			return ClonableDefaultNodeTest.instance();
-		}
-	}
-	
-	public static class ParentTestImpl extends ParentTest<ClonableDefaultNode>
-	{
-
-		@Override
-		public ClonableDefaultNode instance()
-		{
-			return ClonableDefaultNodeTest.instance();
-		}
-	}
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -0,0 +1,63 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable;
+
+import java.nio.ByteBuffer;
+import fj.Ord;
+import fj.P2;
+import fj.data.List;
+import fj.data.TreeMap;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableAttributesTest;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class DefaultTreeNodeAttributesTest extends TestCase
+{
+	public static TestSuite suite()
+	{
+		TestSuite suite = new TestSuite();
+		suite.addTestSuite(AttributeTestImpl.class);
+		suite.addTestSuite(EditableAttributesTestImpl.class);
+		return suite;
+	}
+	
+	public static DefaultTreeNode instance()
+	{
+		List<DefaultNode> rawList = List.nil();
+		TreeMap<String,ByteBuffer> rawMap = TreeMap.empty(Ord.stringOrd);
+		
+		for(P2<String,ByteBuffer> entry : AttributesTest.ENTRIES){
+			rawMap = rawMap.set(entry._1(),entry._2());
+		}
+		
+		return new DefaultTreeNode(new DefaultNode(rawList,rawMap));
+	}
+	
+	public static class AttributeTestImpl extends AttributesTest
+	{
+
+		@Override
+		public Attributes instance()
+		{
+			return DefaultTreeNodeAttributesTest.instance().getAttributes();
+		}
+		
+	}
+	
+	public static class EditableAttributesTestImpl extends EditableAttributesTest<EditableNodeWrapper<DefaultTreeNode>>
+	{
+
+		@Override
+		public EditableAttributes<EditableNodeWrapper<DefaultTreeNode>> instance()
+		{
+			DefaultTreeNode instance = DefaultTreeNodeAttributesTest.instance();
+			EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(instance);
+			return wrapper.getAttributes();
+		}
+		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeChildrenTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -0,0 +1,46 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableChildrenTest;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor.TreeNodeChildrenTest;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class DefaultTreeNodeChildrenTest extends TestCase
+{
+	public static TestSuite suite()
+	{
+		TestSuite suite = new TestSuite();
+		suite.addTestSuite(EditableChildrenTestImpl.class);
+		suite.addTestSuite(TreeNodeChildrenTestImpl.class);
+		return suite;
+	}
+	
+	public static DefaultTreeNode instance()
+	{
+		return new DefaultTreeNode(new DefaultNode());
+	}
+	
+	public static class TreeNodeChildrenTestImpl extends TreeNodeChildrenTest<DefaultTreeNode>
+	{
+		@Override
+		public DefaultTreeNode instance()
+		{
+			return DefaultTreeNodeChildrenTest.instance();
+		}
+	}
+	
+	public static class EditableChildrenTestImpl extends EditableChildrenTest<EditableNodeWrapper<DefaultTreeNode>>
+	{
+		@Override
+		public EditableChildren<EditableNodeWrapper<DefaultTreeNode>> instance()
+		{
+			DefaultTreeNode wrap = DefaultTreeNodeChildrenTest.instance();
+			EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(wrap);
+			return wrapper.getChildren();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -0,0 +1,62 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainerTest;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.ParentTest;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
+import junit.framework.Assert;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class DefaultTreeNodeTest extends TestCase
+{
+	public static TestSuite suite()
+	{
+		TestSuite suite = new TestSuite();
+		suite.addTestSuite(AttributesContaierTestImpl.class);
+		suite.addTestSuite(ParentTestImpl.class);
+		return suite;
+	}
+	
+	public static DefaultTreeNode instance()
+	{
+		DefaultTreeNode node = new DefaultTreeNode(new DefaultNode());
+		return node;
+	}
+	
+	public void testGetWrapped()
+	{
+		DefaultTreeNode instance = instance();
+		DefaultNode wrapped = instance.getWrap();
+		
+		Assert.assertNotNull(wrapped);
+	}
+	
+	public void testCreateNewNode()
+	{
+		DefaultTreeNode instance = instance();
+		DefaultTreeNode node = instance.createNewNode();
+		
+		Assert.assertNotNull(node);
+	}
+	
+	public static class AttributesContaierTestImpl extends AttributesContainerTest
+	{
+		@Override
+		public AttributesContainer instance()
+		{
+			return DefaultTreeNodeTest.instance();
+		}
+	}
+	
+	public static class ParentTestImpl extends ParentTest<DefaultTreeNode>
+	{
+
+		@Override
+		public DefaultTreeNode instance()
+		{
+			return DefaultTreeNodeTest.instance();
+		}
+	}
+}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingAttributesTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingAttributesTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -10,9 +10,10 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableAttributesTest;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
@@ -26,7 +27,7 @@
 		return suite;
 	}
 	
-	public static LoggingNode<ClonableDefaultNode> instance()
+	public static LoggingNode<EditableNodeWrapper<DefaultTreeNode>> instance()
 	{
 		List<DefaultNode> rawList = List.nil();
 		TreeMap<String,ByteBuffer> rawMap = TreeMap.empty(Ord.stringOrd);
@@ -35,7 +36,8 @@
 			rawMap = rawMap.set(entry._1(),entry._2());
 		}
 		
-		return new LoggingNode<ClonableDefaultNode>(new ClonableDefaultNode(new DefaultNode(rawList,rawMap)));
+		EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(new DefaultTreeNode(new DefaultNode(rawList,rawMap)));
+		return new LoggingNode<EditableNodeWrapper<DefaultTreeNode>>(wrapper);
 	}
 	
 	public static class AttributeTestImpl extends AttributesTest
@@ -49,11 +51,10 @@
 		
 	}
 	
-	public static class EditableAttributesTestImpl extends EditableAttributesTest<LoggingNode<ClonableDefaultNode>>
+	public static class EditableAttributesTestImpl extends EditableAttributesTest<LoggingNode<EditableNodeWrapper<DefaultTreeNode>>>
 	{
-
 		@Override
-		public EditableAttributes<LoggingNode<ClonableDefaultNode>> instance()
+		public EditableAttributes<LoggingNode<EditableNodeWrapper<DefaultTreeNode>>> instance()
 		{
 			return LoggingAttributesTest.instance().getAttributes();
 		}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingChildrenTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingChildrenTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -1,11 +1,10 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.logging;
 
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableChildrenTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor.ClonableChildrenTest;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
@@ -15,28 +14,19 @@
 	{
 		TestSuite suite = new TestSuite();
 		suite.addTestSuite(EditableChildrenTestImpl.class);
-		suite.addTestSuite(ClonableChildrenTestImpl.class);
 		return suite;
 	}
 	
-	public static LoggingNode<ClonableDefaultNode> instance()
+	public static LoggingNode<EditableNodeWrapper<DefaultTreeNode>> instance()
 	{
-		return new LoggingNode<ClonableDefaultNode>(new ClonableDefaultNode(new DefaultNode()));
+		EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(new DefaultTreeNode());
+		return new LoggingNode<EditableNodeWrapper<DefaultTreeNode>>(wrapper);
 	}
 	
-	public static class ClonableChildrenTestImpl extends ClonableChildrenTest<LoggingNode<ClonableDefaultNode>>
+	public static class EditableChildrenTestImpl extends EditableChildrenTest<LoggingNode<EditableNodeWrapper<DefaultTreeNode>>>
 	{
 		@Override
-		public LoggingNode<ClonableDefaultNode> instance()
-		{
-			return LoggingChildrenTest.instance();
-		}
-	}
-	
-	public static class EditableChildrenTestImpl extends EditableChildrenTest<LoggingNode<ClonableDefaultNode>>
-	{
-		@Override
-		public EditableChildren<LoggingNode<ClonableDefaultNode>> instance()
+		public EditableChildren<LoggingNode<EditableNodeWrapper<DefaultTreeNode>>> instance()
 		{
 			return LoggingChildrenTest.instance().getChildren();
 		}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingNodeTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/logging/LoggingNodeTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -7,12 +7,11 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainerTest;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.ParentTest;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.Logger;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttributeOperation;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import junit.framework.TestCase;
@@ -23,28 +22,28 @@
 	public void testGetLoggerIsNotNull()
 	{
 		LoggingNode<?> instance = instance();
-		Logger log = instance.getLogger();
+		OperationLog log = instance.getOperationLog();
 		Assert.assertNotNull(log);
 	}
 	
 	public void testGetWrappedIsNotNull()
 	{
 		LoggingNode<?> instance = instance();
-		Object wrap = instance.getWrapper();
+		Object wrap = instance.getWrap();
 		Assert.assertNotNull(wrap);
 	}
 	
 	public void testLoggingAddNewChildAt()
 	{
-		LoggingNode<ClonableDefaultNode> instance = instance();
-		Either<Error,LoggingNode<ClonableDefaultNode>> either = instance.getChildren().addNewChildAt(0);
+		LoggingNode<EditableNodeWrapper<DefaultTreeNode>> instance = instance();
+		Either<Error, LoggingNode<EditableNodeWrapper<DefaultTreeNode>>> either = instance.getChildren().addNewChildAt(0);
 		if(either.isA()){
 			Assert.fail();
 		}
 		instance = either.b();
 		
 		List<Command> expectOps = List.list(Command.APPEND_CHILD);
-		for(Operation op : instance.getLogger()){
+		for(NodeOperation op : instance.getOperationLog()){
 			Command actual = op.getCommand();
 			Command expect = expectOps.head();
 			Assert.assertEquals(expect,actual);
@@ -56,8 +55,8 @@
 	
 	public void testLoggingDeleteChildAt()
 	{
-		LoggingNode<ClonableDefaultNode> instance = instance();
-		Either<Error,LoggingNode<ClonableDefaultNode>> either = instance.getChildren().addNewChildAt(0);
+		LoggingNode<EditableNodeWrapper<DefaultTreeNode>> instance = instance();
+		Either<Error, LoggingNode<EditableNodeWrapper<DefaultTreeNode>>> either = instance.getChildren().addNewChildAt(0);
 		if(either.isA()){
 			Assert.fail();
 		}
@@ -69,7 +68,7 @@
 		instance = either.b();
 		
 		List<Command> expectOps = List.list(Command.APPEND_CHILD,Command.DELETE_CHILD);
-		for(Operation op : instance.getLogger()){
+		for(NodeOperation op : instance.getOperationLog()){
 			Command actual = op.getCommand();
 			Command expect = expectOps.head();
 			Assert.assertEquals(expect,actual);
@@ -83,36 +82,29 @@
 	{
 		String key = "KEY";
 		ByteBuffer value = ByteBuffer.wrap(key.getBytes());
-		LoggingNode<ClonableDefaultNode> instance = instance();
-		Either<Error,LoggingNode<ClonableDefaultNode>> either = instance.getAttributes().put(key,value);
+		LoggingNode<EditableNodeWrapper<DefaultTreeNode>> instance = instance();
+		Either<Error, LoggingNode<EditableNodeWrapper<DefaultTreeNode>>> either = instance.getAttributes().put(key,value);
 		if(either.isA()){
 			Assert.fail();
 		}
 		instance = either.b();
 		
-		List<Command> expectOps = List.list(Command.SET_ATTRIBUTE);
-		for(Operation op : instance.getLogger()){
+		List<Command> expectOps = List.list(Command.PUT_ATTRIBUTE);
+		for(NodeOperation op : instance.getOperationLog()){
 			Command actual = op.getCommand();
 			Command expect = expectOps.head();
 			Assert.assertEquals(expect,actual);
-			
-			SetAttributeOperation sa = (SetAttributeOperation)op;
-			String actualKey = sa.getKey();
-			ByteBuffer actualValue = sa.getValue();
-			Assert.assertEquals(key,actualKey);
-			Assert.assertEquals(0,value.compareTo(actualValue));
-			expectOps = expectOps.tail();
 		}
 		
-		Assert.assertEquals(0,expectOps.length());
+		Assert.assertEquals(1,expectOps.length());
 	}
 	
 	public void testDeleteAttributeTest()
 	{
 		String key = "KEY";
 		ByteBuffer value = ByteBuffer.wrap(key.getBytes());
-		LoggingNode<ClonableDefaultNode> instance = instance();
-		Either<Error,LoggingNode<ClonableDefaultNode>> either = instance.getAttributes().put(key,value);
+		LoggingNode<EditableNodeWrapper<DefaultTreeNode>> instance = instance();
+		Either<Error, LoggingNode<EditableNodeWrapper<DefaultTreeNode>>> either = instance.getAttributes().put(key,value);
 		if(either.isA()){
 			Assert.fail();
 		}
@@ -123,8 +115,8 @@
 		}
 		instance = either.b();
 	
-		List<Command> expectOps = List.list(Command.SET_ATTRIBUTE,Command.DELETE_ATTRIBUTE);
-		for(Operation op : instance.getLogger()){
+		List<Command> expectOps = List.list(Command.PUT_ATTRIBUTE,Command.DELETE_ATTRIBUTE);
+		for(NodeOperation op : instance.getOperationLog()){
 			Command actual = op.getCommand();
 			Command expect = expectOps.head();
 			Assert.assertEquals(expect,actual);
@@ -143,9 +135,10 @@
 		return suite;
 	}
 	
-	public static LoggingNode<ClonableDefaultNode> instance()
+	public static LoggingNode<EditableNodeWrapper<DefaultTreeNode>> instance()
 	{
-		return new LoggingNode<ClonableDefaultNode>(new ClonableDefaultNode(new DefaultNode()));
+		EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(new DefaultTreeNode());
+		return new LoggingNode<EditableNodeWrapper<DefaultTreeNode>>(wrapper);
 	}
 	
 	public static class ParentTestImpl extends ParentTest<LoggingNode<?>>
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/tests/util/TestUtil.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/tests/util/TestUtil.java	Fri Feb 08 17:08:42 2013 +0900
@@ -4,21 +4,21 @@
 
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 
 public class TestUtil
 {
-	public static ClonableDefaultNode createMockTree(int _maxDepth)
+	public static DefaultTreeNode createMockTree(int _maxDepth)
 	{
 		return _createMockTree(1,_maxDepth,new DefaultNodePath());
 	}
 	
-	public static ClonableDefaultNode _createMockTree(int _currentDepth,int _maxDepth,NodePath _path)
+	public static DefaultTreeNode _createMockTree(int _currentDepth,int _maxDepth,NodePath _path)
 	{
-		ClonableDefaultNode parent = new ClonableDefaultNode();
-		Either<Error, ClonableDefaultNode> either = parent.getAttributes().put("KEY",ByteBuffer.wrap(_path.toString().getBytes()));
+		DefaultTreeNode parent = new DefaultTreeNode();
+		Either<Error, DefaultTreeNode> either = parent.getAttributes().put("KEY",ByteBuffer.wrap(_path.toString().getBytes()));
 		if(either.isA()){
 			return null;
 		}
@@ -26,7 +26,7 @@
 		
 		if(_currentDepth != _maxDepth){
 			for(int i = 0;i <= _currentDepth;i ++){
-				ClonableDefaultNode ch = _createMockTree(_currentDepth + 1,_maxDepth,_path.add(i));
+				DefaultTreeNode ch = _createMockTree(_currentDepth + 1,_maxDepth,_path.add(i));
 				either = parent.getChildren().addNewChildAt(i,ch);
 				if(either.isA()){
 					return null;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/TraverserTest.java	Fri Feb 08 12:32:37 2013 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/TraverserTest.java	Fri Feb 08 17:08:42 2013 +0900
@@ -9,14 +9,13 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TraversableNodeWrapper;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.ClonableDefaultNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
 import junit.framework.TestCase;
 
 public abstract class TraverserTest extends TestCase
@@ -26,9 +25,9 @@
 	public void testTraverse()
 	{
 		int maxHeight = 3;
-		ClonableDefaultNode root = createTree(0,0,maxHeight,new DefaultNodePath());
+		DefaultTreeNode root = createTree(0,0,maxHeight,new DefaultNodePath());
 		
-		TraversableNodeWrapper<ClonableDefaultNode> traversable = new TraversableNodeWrapper<ClonableDefaultNode>(root);
+		TraversableNodeWrapper<DefaultTreeNode> traversable = new TraversableNodeWrapper<DefaultTreeNode>(root);
 		Traverser traverser = instance();
 	
 		// generate all pattern.
@@ -37,13 +36,13 @@
 		
 		for(DefaultNodePath path : paths){
 			DefaultEvaluator evaluator = new DefaultEvaluator(path);
-			Either<Error,Traversal<TraversableNodeWrapper<ClonableDefaultNode>>> ret = traverser.traverse(traversable,evaluator);
+			Either<Error,Traversal<TraversableNodeWrapper<DefaultTreeNode>>> ret = traverser.traverse(traversable,evaluator);
 			if(ret.isA()){
 				Assert.fail();
 			}
 			
-			Traversal<TraversableNodeWrapper<ClonableDefaultNode>> traversal = ret.b();
-			TraversableNodeWrapper<ClonableDefaultNode> target = traversal.destination();
+			Traversal<TraversableNodeWrapper<DefaultTreeNode>> traversal = ret.b();
+			TraversableNodeWrapper<DefaultTreeNode> target = traversal.destination();
 			String expect = path.toString();
 			ByteBuffer value = target.getWrapped().getAttributes().get(key);
 			String actual = new String(value.array());
@@ -51,7 +50,7 @@
 			
 			List<DefaultNodePath> parts = path.inits();
 			
-			for(Direction<TraversableNodeWrapper<ClonableDefaultNode>> d : traversal){
+			for(Direction<TraversableNodeWrapper<DefaultTreeNode>> d : traversal){
 				DefaultNodePath part = parts.head();
 				parts = parts.tail();
 				value = d.getTarget().getWrapped().getAttributes().get(key);
@@ -79,12 +78,12 @@
 	
 	public static String key = "KEY";
 	public static ByteBuffer value = ByteBuffer.wrap(key.getBytes());
-	public static ClonableDefaultNode factory = new ClonableDefaultNode(new DefaultNode());
+	public static DefaultTreeNode factory = new DefaultTreeNode(new DefaultNode());
 	
-	public ClonableDefaultNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address)
+	public DefaultTreeNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address)
 	{
-		ClonableDefaultNode parent = factory.createNewNode();
-		Either<Error,ClonableDefaultNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes()));
+		DefaultTreeNode parent = factory.createNewNode();
+		Either<Error,DefaultTreeNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes()));
 		if(either.isA()){
 			Assert.fail();
 		}
@@ -95,7 +94,7 @@
 		}
 		
 		for(int i = 0;i < _curY + 1;i ++){
-			ClonableDefaultNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i));
+			DefaultTreeNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i));
 			either = parent.getChildren().addNewChildAt(i,ch);
 			if(either.isA()){
 				Assert.fail();