changeset 175:e26462a38ce0

add push pop
author tatsuki
date Fri, 06 Mar 2015 10:44:50 +0900
parents f26535302c96
children 550f51183d8a
files .database.swp .gradle/1.10/taskArtifacts/cache.properties.lock .gradle/1.10/taskArtifacts/fileHashes.bin .gradle/1.10/taskArtifacts/fileSnapshots.bin .gradle/1.10/taskArtifacts/outputFileStates.bin .gradle/1.10/taskArtifacts/taskArtifacts.bin .gradle/1.9/taskArtifacts/cache.properties.lock .gradle/1.9/taskArtifacts/fileHashes.bin .gradle/1.9/taskArtifacts/fileSnapshots.bin .gradle/1.9/taskArtifacts/outputFileStates.bin .gradle/1.9/taskArtifacts/taskArtifacts.bin 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/JungleTree.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.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/DefaultTreeNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java src/test/java/DefaultJungleTreeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.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/tatsuki/jungle/index/IndexFormTest.java
diffstat 36 files changed, 509 insertions(+), 384 deletions(-) [+]
line wrap: on
line diff
Binary file .database.swp has changed
Binary file .gradle/1.10/taskArtifacts/cache.properties.lock has changed
Binary file .gradle/1.10/taskArtifacts/fileHashes.bin has changed
Binary file .gradle/1.10/taskArtifacts/fileSnapshots.bin has changed
Binary file .gradle/1.10/taskArtifacts/outputFileStates.bin has changed
Binary file .gradle/1.10/taskArtifacts/taskArtifacts.bin has changed
Binary file .gradle/1.9/taskArtifacts/cache.properties.lock has changed
Binary file .gradle/1.9/taskArtifacts/fileHashes.bin has changed
Binary file .gradle/1.9/taskArtifacts/fileSnapshots.bin has changed
Binary file .gradle/1.9/taskArtifacts/outputFileStates.bin has changed
Binary file .gradle/1.9/taskArtifacts/taskArtifacts.bin has changed
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java	Fri Mar 06 10:44:50 2015 +0900
@@ -3,6 +3,7 @@
 import java.util.Iterator;
 import java.util.concurrent.ConcurrentHashMap;
 
+import fj.Ord;
 import fj.data.List;
 import fj.data.TreeMap;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
@@ -20,7 +21,6 @@
 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;
-import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
 public class DefaultJungle implements Jungle
@@ -45,7 +45,7 @@
 		e1.success();
 	}
 	
-	public DefaultJungle(Journal journal,String uuid,TreeEditor editor)
+  public DefaultJungle(Journal journal,String uuid,TreeEditor editor)
 	{
 		this.journal = new NullJournal();
 		this.trees = new ConcurrentHashMap<String,JungleTree>();
@@ -80,8 +80,8 @@
 		};
 		
 		DefaultTreeNode root = new DefaultTreeNode();
-	  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList = new Index().getIndex();
-		 TreeMap<TreeNode, TreeNode> parentIndex = new ParentIndex().getParentIndex();
+	  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList = TreeMap.empty(Ord.stringOrd);
+		TreeMap<TreeNode, TreeNode> parentIndex = new ParentIndex().getParentIndex();
 		ChangeSet set = new DefaultChangeSet(root,null,list,uuid,name,0,indexList,parentIndex);
 		DefaultTreeContext tc = new DefaultTreeContext(root,set);
 		JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Fri Mar 06 10:44:50 2015 +0900
@@ -1,5 +1,6 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle;
 
+import fj.data.TreeMap;
 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.NodePath;
@@ -15,7 +16,6 @@
 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.GetOldTreeError;
-import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
@@ -57,7 +57,7 @@
   public InterfaceTraverser getTraverser(boolean useIndex) {
     AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation();
     IndexManager indexManager = new IndexManager(reservation);
-    Index index = getIndex();
+    TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = getIndex();
     ParentIndex parentIndex = getParentIndex();
     return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex);
   }
@@ -70,7 +70,7 @@
   }
 
   @Override
-  public Index getIndex() {
+  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
     TreeContext tc = repository.get();
     ChangeSet cs = tc.getChangeSet();
     return cs.getIndex();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java	Fri Mar 06 10:44:50 2015 +0900
@@ -2,12 +2,12 @@
 
 
 
+import fj.data.TreeMap;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
 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.tatsuki.jungle.store.index.Index;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
 public interface JungleTree
@@ -17,7 +17,7 @@
 	public TreeNode getRootNode();
   public long revision();
   public Either<Error, JungleTree> getOldTree(long revision);
-  public Index getIndex();
+  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex();
   public ParentIndex getParentIndex();
   public InterfaceTraverser getTraverser(boolean useIndex);
   public Either<Error, TreeNode> getNodeOfPath(NodePath path);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java	Fri Mar 06 10:44:50 2015 +0900
@@ -16,4 +16,5 @@
 	public Either<Error,JungleTreeEditor> deleteAttribute(NodePath path,String key);
 	public Either<Error,JungleTreeEditor> edit(NodePath path,NodeEditor editor);
 	public Either<Error,JungleTreeEditor> success();
+  public Either<Error, JungleTreeEditor> replaceNewRootNode();
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java	Fri Mar 06 10:44:50 2015 +0900
@@ -2,10 +2,10 @@
 
 
 
+import fj.data.TreeMap;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
-import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
 public interface ChangeSet
@@ -17,8 +17,7 @@
 	public String uuid();
 	public String getTreeName();
 	public long revision();
-	
-	public Index getIndex();
+	public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex();
 	public Iterable<TreeOperation> getOperations();
   public ParentIndex getParentIndex();
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java	Fri Mar 06 10:44:50 2015 +0900
@@ -5,5 +5,6 @@
 	APPEND_CHILD,
 	DELETE_CHILD,
 	PUT_ATTRIBUTE,
-	DELETE_ATTRIBUTE;
+	DELETE_ATTRIBUTE,
+	REPLACE_ROOT;
 }
\ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java	Fri Mar 06 10:44:50 2015 +0900
@@ -79,4 +79,5 @@
 		LoggingNode logNode = editor.wrap(newRoot,newWrap.getOperationLog());
 		return DefaultEither.newB(logNode);
 	}
+	
 }
\ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java	Fri Mar 06 10:44:50 2015 +0900
@@ -1,5 +1,8 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl;
 
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+
 
 public interface TreeNode{
 	public TreeNodeChildren getChildren();
@@ -8,4 +11,5 @@
 	
 	public TreeNode createNewNode();
 	
+	public Either<Error,TreeNode> appendRootNode();
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java	Fri Mar 06 10:44:50 2015 +0900
@@ -12,4 +12,5 @@
 	public Either<Error,TreeNode> addNewChildAt(int pos,TreeNode newChild);
 	public Either<Error,TreeNode> replaceNode(int pos,TreeNode replacement);
 	public List<TreeNode> getChildrenAsRawList();
+  public Either<Error,TreeNode> addExistTreeNodeToChildren(TreeNode node, int pos);
 }
\ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java	Fri Mar 06 10:44:50 2015 +0900
@@ -1,10 +1,19 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger;
 
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.ReplaceRootNodeOperation;
+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;
 
 
 public class LoggingNode
 {
+  
+  private final TreeNode wrap;
+  private final OperationLog log;
+  
 	public LoggingNode(TreeNode _wrap)
 	{
 		this(_wrap,new DefaultOperationLog());
@@ -16,9 +25,6 @@
 		log = _log;
 	}
 	
-	private final TreeNode wrap;
-	private final OperationLog log;
-	
 	public LoggingAttributes getAttributes()
 	{
 		return new LoggingAttributes(wrap,log);
@@ -35,9 +41,26 @@
 		return log;
 	}
 	
-	public TreeNode getWrap()
-	{
-		return wrap;
-	}
+
+  public Either<Error, LoggingNode> replaceNewRootNode() {
+   NodeOperation replaceRootNode = new ReplaceRootNodeOperation();
+   return edit(replaceRootNode);
+  }
 
+  public Either<Error, LoggingNode> edit(NodeOperation op){
+    Either<Error,TreeNode> either = op.invoke(wrap);
+    if(either.isA()){
+      return DefaultEither.newA(either.a());
+    }
+    
+    TreeNode newWrap = either.b();
+    OperationLog newLog = log.add(op);
+    LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog);
+    return DefaultEither.newB(newLoggingNode);
+  }
+  
+  public TreeNode getWrap()
+  {
+    return wrap;
+  }
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java	Fri Mar 06 10:44:50 2015 +0900
@@ -5,7 +5,6 @@
 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.operations.TreeOperation;
-import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
 public class DefaultChangeSet implements ChangeSet
@@ -76,8 +75,8 @@
 	}
 
 	@Override
-	public Index getIndex() {
-		return new Index(indexList);
+	public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
+		return indexList;
 	}
 
 
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java	Fri Mar 06 10:44:50 2015 +0900
@@ -2,10 +2,10 @@
 
 import java.nio.ByteBuffer;
 
-
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 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.DefaultNodePath;
 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;
@@ -15,6 +15,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.replaceRootNodeAt;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
@@ -73,6 +74,13 @@
 		return DefaultEither.newB(newEditor);
 	}
 	
+	 @Override
+	  public Either<Error,JungleTreeEditor> replaceNewRootNode()
+	  {
+	   replaceRootNodeAt appendChildAt = new replaceRootNodeAt();
+	    return _edit(new DefaultNodePath(),appendChildAt);
+	  }
+	
 	@Override
 	public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path, int _pos)
 	{
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Fri Mar 06 10:44:50 2015 +0900
@@ -3,6 +3,7 @@
 
 import java.util.Iterator;
 
+import fj.data.TreeMap;
 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;
@@ -16,7 +17,6 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
 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.tatsuki.jungle.store.index.Index;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
@@ -62,10 +62,9 @@
     IndexManager indexManager = new IndexManager(repository.getReservation());
     InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true);
     traverser.createIndex();
-    Index index = traverser.getIndex();
+    TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = traverser.getIndex();
     ParentIndex parentIndex = traverser.getParentIndex();
-    DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, _treeName, nextRevision, index.getIndex(),
-        parentIndex.getParentIndex());
+    DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, _treeName, nextRevision, index, parentIndex.getParentIndex());
     DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs);
 
     @SuppressWarnings("rawtypes")
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java	Fri Mar 06 10:44:50 2015 +0900
@@ -6,6 +6,9 @@
 import fj.data.List;
 import fj.data.TreeMap;
 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;
 
 public class DefaultTreeNode implements TreeNode
 {
@@ -49,5 +52,12 @@
 		return new DefaultTreeNode(children,attrs);
 	}
 
+  @Override
+  public Either<Error, TreeNode> appendRootNode() {
+    TreeNodeChildren newRootChildren = new DefaultTreeNodeChildren(NIL_LIST, NIL_MAP);
+    Either<Error, TreeNode> either = newRootChildren.addExistTreeNodeToChildren(this, 0);
+    return either;
+  }
+
 	
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java	Fri Mar 06 10:44:50 2015 +0900
@@ -130,4 +130,18 @@
 		
 		return DefaultEither.newB(newNode);
 	}
+
+  @Override
+  public Either<Error, TreeNode> addExistTreeNodeToChildren(TreeNode node, int pos) {
+
+    if(!boundaryCheck(pos) || pos < 0){
+      return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
+    }
+    
+    P2<List<TreeNode>,List<TreeNode>> split = children.splitAt(pos);
+    List<TreeNode> newChildren = split._1().snoc(node).append(split._2());
+    TreeNode newNode = new DefaultTreeNode(newChildren,attrs);
+    return DefaultEither.newB(newNode);
+  }
+
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java	Fri Mar 06 10:44:50 2015 +0900
@@ -21,10 +21,12 @@
 				List<TreeNode> list = List.nil();
 				return list.cons(_root).iterator();
 			}
+			
 			@Override
 			public int size(){
 				return 1;
 			}
+			
 			@Override
 			public Either<Error,TreeNode> at(int _pos){
 				if(_pos != 0){
@@ -38,6 +40,7 @@
 		Children chs = wrapper;
 		
 		Either<Error,List<Direction<TreeNode>>> ret = _traverse(chs,_evaluator,-1);
+		
 		if(ret.isA()){
 			return DefaultEither.newA(ret.a());
 		}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java	Fri Mar 06 10:44:50 2015 +0900
@@ -1,12 +1,15 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser;
 
+import java.util.Iterator;
 
-import java.util.Iterator;
-import fj.data.List;
+import fj.Ord;
+import fj.P2;
+import fj.data.Option;
+import fj.data.TreeMap;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query;
-import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexCreater;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
@@ -14,18 +17,18 @@
 public class InterfaceTraverser {
 
   TreeNode node;
-  Index index;
+  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index;
   ParentIndex parentIndex;
   boolean parentUpdateFlag;
   IndexManager indexManager;
   boolean useIndex;
 
   public InterfaceTraverser(TreeNode root, IndexManager indexManager, boolean indexFlag) {
-    this(root, new Index(), new ParentIndex(), indexManager, indexFlag);
+    this(root, TreeMap.empty(Ord.stringOrd), new ParentIndex(), indexManager, indexFlag);
   }
 
-  public InterfaceTraverser(TreeNode root, Index index, ParentIndex parentIndex, IndexManager indexManager,
-      boolean useIndex) {
+  public InterfaceTraverser(TreeNode root, TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index,
+      ParentIndex parentIndex, IndexManager indexManager, boolean useIndex) {
     this.node = root;
     this.index = index;
     this.indexManager = indexManager;
@@ -37,7 +40,7 @@
     this.useIndex = useIndex;
   }
 
-  public Index getIndex() {
+  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
     return index;
   }
 
@@ -50,16 +53,15 @@
     return parentIndex;
   }
 
-  public void setIndex(Index index) {
+  public void setIndex(TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index) {
     this.index = index;
   }
 
   public void createIndex() {
-
-    long t1 = System.currentTimeMillis();
+    // long t1 = System.currentTimeMillis();
     IndexCreater creater = new IndexCreater(node);
-    long t2 = System.currentTimeMillis();
-    System.out.println("createIndex time = " + (t2 - t1));
+    // long t2 = System.currentTimeMillis();
+    // System.out.println("createIndex time = " + (t2 - t1));
     index = creater.getIndex();
     parentIndex = creater.getParentIndex();
   }
@@ -73,67 +75,68 @@
    * @param searchValue
    * @return
    */
-  public Iterator<TreeNode> findInSubTree(final Query query, TreeNode subTree, String key, String searchValue) {
-    /*
-     * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
-     * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
-     */
-    Iterator<TreeNode> nodeIterator = index.get(key, searchValue);
-    if (nodeIterator.hasNext() && useIndex) {
-
-      // ここでNode以下にあるか調べる
-      List<TreeNode> filteredList = List.nil();
-
-      for (;nodeIterator.hasNext();) {
-        TreeNode targetNode = nodeIterator.next();
-        TreeNode parent = targetNode;
-        while (parent != null) {
-          parent = parentIndex.get(parent);
-          if (parent.equals(subTree))
-            filteredList = filteredList.cons(targetNode);
-        }
-      }
-
-      return filteredList.iterator();
-
-    } else {
-      final PathNodeIterator itNode = new PathNodeIterator(subTree);
-      return new Iterator<TreeNode>() {
-
-        private TreeNode matchNode = nextmatch(itNode);
-
-        private TreeNode nextmatch(PathNodeIterator itNode) {
-
-          for (; itNode.hasNext();) {
-            TreeNode targetNode = itNode.next();
-            if (query.condition(targetNode))
-              return targetNode;
-          }
-          return null;
-        }
-
-        @Override
-        public boolean hasNext() {
-          if (matchNode == null) {
-            return false;
-          }
-          return true;
-        }
-
-        @Override
-        public TreeNode next() {
-          TreeNode currentNode = matchNode;
-          matchNode = nextmatch(itNode);
-          return currentNode;
-        }
-
-        @Override
-        public void remove() {
-        }
-
-      };
-    }
-  }
+  // public Iterator<TreeNode> findInSubTree(final Query query, TreeNode
+  // subTree, String key, String searchValue) {
+  // /*
+  // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
+  // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
+  // */
+  // Iterator<TreeNode> nodeIterator = index.get(key, searchValue);
+  // if (nodeIterator.hasNext() && useIndex) {
+  //
+  // // ここでNode以下にあるか調べる
+  // List<TreeNode> filteredList = List.nil();
+  //
+  // for (;nodeIterator.hasNext();) {
+  // TreeNode targetNode = nodeIterator.next();
+  // TreeNode parent = targetNode;
+  // while (parent != null) {
+  // parent = parentIndex.get(parent);
+  // if (parent.equals(subTree))
+  // filteredList = filteredList.cons(targetNode);
+  // }
+  // }
+  //
+  // return filteredList.iterator();
+  //
+  // } else {
+  // final PathNodeIterator itNode = new PathNodeIterator(subTree);
+  // return new Iterator<TreeNode>() {
+  //
+  // private TreeNode matchNode = nextmatch(itNode);
+  //
+  // private TreeNode nextmatch(PathNodeIterator itNode) {
+  //
+  // for (; itNode.hasNext();) {
+  // TreeNode targetNode = itNode.next();
+  // if (query.condition(targetNode))
+  // return targetNode;
+  // }
+  // return null;
+  // }
+  //
+  // @Override
+  // public boolean hasNext() {
+  // if (matchNode == null) {
+  // return false;
+  // }
+  // return true;
+  // }
+  //
+  // @Override
+  // public TreeNode next() {
+  // TreeNode currentNode = matchNode;
+  // matchNode = nextmatch(itNode);
+  // return currentNode;
+  // }
+  //
+  // @Override
+  // public void remove() {
+  // }
+  //
+  // };
+  // }
+  // }
 
   /**
    * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する
@@ -144,70 +147,71 @@
    * @param searchValue
    * @return
    */
-  public Iterator<TreeNode> findInSubTreeAllValue(final Query query, TreeNode subTree, String key) {
-    /*
-     * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得
-     * そのKeyを保有するNodeとNodeのPathを取得する
-     * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
-     * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
-     */
-    Iterator<TreeNode> NodeIterator = index.getAll(key);
-    if (NodeIterator != null && useIndex) {
-      List<TreeNode> filteredList = List.nil();
-      for (; NodeIterator.hasNext();) {
-        TreeNode targetNode = NodeIterator.next();
-        TreeNode parent = targetNode;
-        while (parent != null) {
-          parent = parentIndex.get(parent);
-          if (parent.equals(subTree))
-            filteredList = filteredList.cons(targetNode);
-        }
-      }
-      return filteredList.iterator();
-
-    } else {
-
-      final PathNodeIterator itNode = new PathNodeIterator(subTree);
-      return new Iterator<TreeNode>() {
-
-        private TreeNode matchPair = nextmatch(itNode);
-
-        private TreeNode nextmatch(PathNodeIterator itNode) {
-
-          for (; itNode.hasNext();) {
-            TreeNode targetNode = itNode.next();
-            if (query.condition(targetNode))
-              return targetNode;
-          }
-          return null;
-        }
-
-        @Override
-        public boolean hasNext() {
-          if (matchPair == null) {
-            return false;
-          }
-          return true;
-        }
-
-        @Override
-        public TreeNode next() {
-          TreeNode currentNode = matchPair;
-          matchPair = nextmatch(itNode);
-          return currentNode;
-        }
-
-        @Override
-        public void remove() {
-        }
-
-      };
-    }
-  }
+  // public Iterator<TreeNode> findInSubTreeAllValue(final Query query, TreeNode
+  // subTree, String key) {
+  // /*
+  // * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得
+  // * そのKeyを保有するNodeとNodeのPathを取得する
+  // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
+  // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
+  // */
+  // Iterator<TreeNode> NodeIterator = index.getAll(key);
+  // if (NodeIterator != null && useIndex) {
+  // List<TreeNode> filteredList = List.nil();
+  // for (; NodeIterator.hasNext();) {
+  // TreeNode targetNode = NodeIterator.next();
+  // TreeNode parent = targetNode;
+  // while (parent != null) {
+  // parent = parentIndex.get(parent);
+  // if (parent.equals(subTree))
+  // filteredList = filteredList.cons(targetNode);
+  // }
+  // }
+  // return filteredList.iterator();
+  //
+  // } else {
+  //
+  // final PathNodeIterator itNode = new PathNodeIterator(subTree);
+  // return new Iterator<TreeNode>() {
+  //
+  // private TreeNode matchPair = nextmatch(itNode);
+  //
+  // private TreeNode nextmatch(PathNodeIterator itNode) {
+  //
+  // for (; itNode.hasNext();) {
+  // TreeNode targetNode = itNode.next();
+  // if (query.condition(targetNode))
+  // return targetNode;
+  // }
+  // return null;
+  // }
+  //
+  // @Override
+  // public boolean hasNext() {
+  // if (matchPair == null) {
+  // return false;
+  // }
+  // return true;
+  // }
+  //
+  // @Override
+  // public TreeNode next() {
+  // TreeNode currentNode = matchPair;
+  // matchPair = nextmatch(itNode);
+  // return currentNode;
+  // }
+  //
+  // @Override
+  // public void remove() {
+  // }
+  //
+  // };
+  // }
+  // }
 
   public Iterator<TreeNode> find(final Query query, final String key, String searchValue) {
 
-     Iterator<TreeNode> nodeIterator = index.get(key, searchValue);
+    Iterator<TreeNode> nodeIterator = get(key, searchValue);
     if (nodeIterator.hasNext() && useIndex) {
       return nodeIterator;
     } else {
@@ -224,10 +228,12 @@
             String value = targetNode.getAttributes().getString(key);
             if (useIndex) {
               if (value != null)
-                index = index.set(key, value, targetNode);
+                ;
+              // index = index.set(key, value, targetNode);
             }
-            if (parentUpdateFlag);
-      //        parentIndex = parentIndex.set(targetNode);
+            if (parentUpdateFlag)
+              ;
+            // parentIndex = parentIndex.set(targetNode);
             if (query.condition(targetNode))
               return targetNode;
           }
@@ -259,59 +265,87 @@
     }
   }
 
-  public Iterator<TreeNode> findAll(final Query query, final String key) {
-
-    Iterator<TreeNode> nodeList = index.getAll(key);
-    if (nodeList != null && useIndex) {
-
-      return nodeList;
-
-    } else {
-
-      final PathNodeIterator itNode = new PathNodeIterator(node);
-      return new Iterator<TreeNode>() {
-
-        private TreeNode matchNode = nextmatch(itNode);
-
-        private TreeNode nextmatch(PathNodeIterator itNode) {
+  // public Iterator<TreeNode> findAll(final Query query, final String key) {
+  //
+  // Iterator<TreeNode> nodeList = index.getAll(key);
+  // if (nodeList != null && useIndex) {
+  //
+  // return nodeList;
+  //
+  // } else {
+  //
+  // final PathNodeIterator itNode = new PathNodeIterator(node);
+  // return new Iterator<TreeNode>() {
+  //
+  // private TreeNode matchNode = nextmatch(itNode);
+  //
+  // private TreeNode nextmatch(PathNodeIterator itNode) {
+  //
+  // for (; itNode.hasNext();) {
+  // TreeNode targetNode = itNode.next();
+  // String value = targetNode.getAttributes().getString(key);
+  // if (useIndex) {
+  // if (value != null)
+  // index = index.set(key, value, targetNode);
+  // }
+  // if (parentUpdateFlag);
+  // // parentIndex = parentIndex.set(targetNode);
+  // if (query.condition(targetNode))
+  // return targetNode;
+  // }
+  // if (useIndex || parentUpdateFlag)
+  // commit();
+  // return null;
+  // }
+  //
+  // @Override
+  // public boolean hasNext() {
+  // if (matchNode == null) {
+  // return false;
+  // }
+  // return true;
+  // }
+  //
+  // @Override
+  // public TreeNode next() {
+  // TreeNode currentPair = matchNode;
+  // matchNode = nextmatch(itNode);
+  // return currentPair;
+  // }
+  //
+  // @Override
+  // public void remove() {
+  // }
+  //
+  // };
+  // }
+  // }
+  
+  public Iterator<TreeNode> get(String key, String value) {
 
-          for (; itNode.hasNext();) {
-            TreeNode targetNode = itNode.next();
-            String value = targetNode.getAttributes().getString(key);
-            if (useIndex) {
-              if (value != null)
-                index = index.set(key, value, targetNode);
-            }
-            if (parentUpdateFlag);
-     //         parentIndex = parentIndex.set(targetNode);
-            if (query.condition(targetNode))
-              return targetNode;
-          }
-          if (useIndex || parentUpdateFlag)
-            commit();
-          return null;
-        }
+    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = index.get(key);
+    if (indexOp.isNone())
+      return new NulIterator<TreeNode>();
+
+    TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
+    Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value);
+
+    if (nodeMapOp.isNone())
+      return new NulIterator<TreeNode>();
 
-        @Override
-        public boolean hasNext() {
-          if (matchNode == null) {
-            return false;
-          }
-          return true;
-        }
+    Iterator<P2<TreeNode, TreeNode>> mapIterator = nodeMapOp.some().iterator();
+    return new Iterator<TreeNode>() {
 
-        @Override
-        public TreeNode next() {
-          TreeNode currentPair = matchNode;
-          matchNode = nextmatch(itNode);
-          return currentPair;
-        }
+      @Override
+      public boolean hasNext() {
+        return mapIterator.hasNext();
+      }
 
-        @Override
-        public void remove() {
-        }
+      @Override
+      public TreeNode next() {
+        return mapIterator.next()._1();
+      }
 
-      };
-    }
+    };
   }
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java	Fri Mar 06 10:44:50 2015 +0900
@@ -1,155 +1,155 @@
-package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index;
-
-import java.util.Iterator;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd;
-import fj.Ord;
-import fj.P2;
-import fj.data.Option;
-import fj.data.TreeMap;
-
-public class Index {
-
-  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList;
-
-  public Index() {
-   indexList = TreeMap.empty(Ord.stringOrd);    
-  }
-
-  public Index(TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList) {
-    this.indexList = indexList;
-  }
-
-  public Index set(String key, String value, TreeNode node) {
-    
-    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
-    if (indexOp.isNone()) {
-      TreeMap<String, TreeMap<TreeNode, TreeNode>> index = TreeMap.empty(Ord.stringOrd);
-      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
-      nodeMap = nodeMap.set(node, node);
-      TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, nodeMap);
-      indexList = indexList.set(key, newIndex);
-      return this;
-    }
-
-    TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
-    Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value);
-
-    TreeMap<TreeNode, TreeNode> newNodeMap;
-    if (nodeMapOp.isSome()) {
-      TreeMap<TreeNode, TreeNode> nodeMap = nodeMapOp.some();
-      newNodeMap = nodeMap.set(node, node);
-    } else {
-      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
-      newNodeMap = nodeMap.set(node, node);
-    }
-    TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, newNodeMap);
-    indexList = indexList.set(key, newIndex);
-
-    return this;
-  }
-
-  // public Index delete(String key, String value, TreeNode node) {
-  // Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key);
-  // if (indexOp.isNone())
-  // return this;
-  //
-  // TreeMap<String, List<TreeNode>> index = indexOp.some();
-  // TreeMap<String, List<TreeNode>> newIndex = index;
-  // Option<List<TreeNode>> nodeListOp = index.get(value);
-  // if (nodeListOp.isSome()) {
-  // List<TreeNode> nodeList = nodeListOp.some();
-  // List<TreeNode> newNodeList = List.nil();
-  // for (TreeNode indexingNode : nodeList) {
-  // if (indexingNode.equals(node))
-  // newNodeList = newNodeList.cons(indexingNode);
-  // }
-  //
-  // newIndex = index.set(value, newNodeList);
-  // } else {
-  // return this;
-  // }
-  // TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList =
-  // indexList.set(key, newIndex);
-  // return new Index(newIndexList);
-  // }
-
-  public Iterator<TreeNode> get(String key, String value) {
-
-    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
-    if (indexOp.isNone())
-      return new NulIterator<TreeNode>();
-
-    TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
-    Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value);
-
-    if (nodeMapOp.isNone())
-      return new NulIterator<TreeNode>();
-
-    Iterator<P2<TreeNode, TreeNode>> mapIterator = nodeMapOp.some().iterator();
-    return new Iterator<TreeNode>() {
-
-      @Override
-      public boolean hasNext() {
-        return mapIterator.hasNext();
-      }
-
-      @Override
-      public TreeNode next() {
-        return mapIterator.next()._1();
-      }
-
-    };
-  }
-
-  public Iterator<TreeNode> getAll(String key) {
-
-    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
-    if (indexOp.isNone())
-      return null;
-
-    final TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
-    if (!index.isEmpty())
-      return new NulIterator<TreeNode>();
-
-    return new Iterator<TreeNode>() {
-
-      Iterator<P2<String, TreeMap<TreeNode, TreeNode>>> treeMapIterator = index.iterator();
-      Iterator<P2<TreeNode, TreeNode>> nodeIterator = new NulIterator<P2<TreeNode, TreeNode>>();
-      TreeNode node;
-
-      @Override
-      public boolean hasNext() {
-
-        if (nodeIterator.hasNext()) {
-          node = nodeIterator.next()._1();
-          return true;
-        }
-
-        for (; treeMapIterator.hasNext();) {
-          TreeMap<TreeNode, TreeNode> nodeMap = treeMapIterator.next()._2();
-          nodeIterator = nodeMap.iterator();
-          if (nodeIterator.hasNext()) {
-            node = nodeIterator.next()._1();
-            return true;
-          }
-        }
-        return false;
-      }
-
-      @Override
-      public TreeNode next() {
-        return node;
-      }
-
-    };
-
-  }
-
-  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
-    return indexList;
-  }
-
-}
+//package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index;
+//
+//import java.util.Iterator;
+//
+//import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator;
+//import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+//import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd;
+//import fj.Ord;
+//import fj.P2;
+//import fj.data.Option;
+//import fj.data.TreeMap;
+//
+//public class Index {
+//
+//  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList;
+//
+//  public Index() {
+//   indexList = TreeMap.empty(Ord.stringOrd);    
+//  }
+//
+//  public Index(TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList) {
+//    this.indexList = indexList;
+//  }
+//
+//  public Index set(String key, String value, TreeNode node) {
+//    
+//    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
+//    if (indexOp.isNone()) {
+//      TreeMap<String, TreeMap<TreeNode, TreeNode>> index = TreeMap.empty(Ord.stringOrd);
+//      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
+//      nodeMap = nodeMap.set(node, node);
+//      TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, nodeMap);
+//      indexList = indexList.set(key, newIndex);
+//      return this;
+//    }
+//
+//    TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
+//    Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value);
+//
+//    TreeMap<TreeNode, TreeNode> newNodeMap;
+//    if (nodeMapOp.isSome()) {
+//      TreeMap<TreeNode, TreeNode> nodeMap = nodeMapOp.some();
+//      newNodeMap = nodeMap.set(node, node);
+//    } else {
+//      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
+//      newNodeMap = nodeMap.set(node, node);
+//    }
+//    TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, newNodeMap);
+//    indexList = indexList.set(key, newIndex);
+//
+//    return this;
+//  }
+//
+//  // public Index delete(String key, String value, TreeNode node) {
+//  // Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key);
+//  // if (indexOp.isNone())
+//  // return this;
+//  //
+//  // TreeMap<String, List<TreeNode>> index = indexOp.some();
+//  // TreeMap<String, List<TreeNode>> newIndex = index;
+//  // Option<List<TreeNode>> nodeListOp = index.get(value);
+//  // if (nodeListOp.isSome()) {
+//  // List<TreeNode> nodeList = nodeListOp.some();
+//  // List<TreeNode> newNodeList = List.nil();
+//  // for (TreeNode indexingNode : nodeList) {
+//  // if (indexingNode.equals(node))
+//  // newNodeList = newNodeList.cons(indexingNode);
+//  // }
+//  //
+//  // newIndex = index.set(value, newNodeList);
+//  // } else {
+//  // return this;
+//  // }
+//  // TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList =
+//  // indexList.set(key, newIndex);
+//  // return new Index(newIndexList);
+//  // }
+//
+//  public Iterator<TreeNode> get(String key, String value) {
+//
+//    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
+//    if (indexOp.isNone())
+//      return new NulIterator<TreeNode>();
+//
+//    TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
+//    Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value);
+//
+//    if (nodeMapOp.isNone())
+//      return new NulIterator<TreeNode>();
+//
+//    Iterator<P2<TreeNode, TreeNode>> mapIterator = nodeMapOp.some().iterator();
+//    return new Iterator<TreeNode>() {
+//
+//      @Override
+//      public boolean hasNext() {
+//        return mapIterator.hasNext();
+//      }
+//
+//      @Override
+//      public TreeNode next() {
+//        return mapIterator.next()._1();
+//      }
+//
+//    };
+//  }
+//
+//  public Iterator<TreeNode> getAll(String key) {
+//
+//    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
+//    if (indexOp.isNone())
+//      return null;
+//
+//    final TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
+//    if (!index.isEmpty())
+//      return new NulIterator<TreeNode>();
+//
+//    return new Iterator<TreeNode>() {
+//
+//      Iterator<P2<String, TreeMap<TreeNode, TreeNode>>> treeMapIterator = index.iterator();
+//      Iterator<P2<TreeNode, TreeNode>> nodeIterator = new NulIterator<P2<TreeNode, TreeNode>>();
+//      TreeNode node;
+//
+//      @Override
+//      public boolean hasNext() {
+//
+//        if (nodeIterator.hasNext()) {
+//          node = nodeIterator.next()._1();
+//          return true;
+//        }
+//
+//        for (; treeMapIterator.hasNext();) {
+//          TreeMap<TreeNode, TreeNode> nodeMap = treeMapIterator.next()._2();
+//          nodeIterator = nodeMap.iterator();
+//          if (nodeIterator.hasNext()) {
+//            node = nodeIterator.next()._1();
+//            return true;
+//          }
+//        }
+//        return false;
+//      }
+//
+//      @Override
+//      public TreeNode next() {
+//        return node;
+//      }
+//
+//    };
+//
+//  }
+//
+//  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
+//    return indexList;
+//  }
+//
+//}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java	Fri Mar 06 10:44:50 2015 +0900
@@ -2,9 +2,13 @@
 
 import java.util.Stack;
 
+import fj.Ord;
 import fj.data.List;
+import fj.data.Option;
+import fj.data.TreeMap;
 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.TreeMapOrd;
 
 public class IndexCreater {
 
@@ -15,7 +19,7 @@
   private Stack<TreeNode> nodeStack = new Stack<TreeNode>();
   private Stack<Integer> searchStack = new Stack<Integer>();
   ParentIndex parentIndex = new ParentIndex();
-  Index index = new Index();
+  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList = TreeMap.empty(Ord.stringOrd);
 
   public IndexCreater(TreeNode rootNode) {
     this.root = rootNode;
@@ -26,7 +30,7 @@
       for (String key : keys) {
         String value = targetNode.getAttributes().getString(key);
         if (value != null)
-          index = index.set(key, value, targetNode);
+          indexList = set(key, value, targetNode);
       }
       if (node.getChildren().size() > 0) {
         nodeStack.push(node);
@@ -39,7 +43,7 @@
       } else if (node == root) {
         node = null; // no more node
         children = null;
-        return ;
+        return;
       } else if (children != null && children.size() > childNumber) {
         childNumber = searchStack.pop();
         TreeNode parent = nodeStack.pop();
@@ -55,7 +59,7 @@
           if (node == root) {
             node = null; // no more node
             children = null;
-            return ;
+            return;
           }
           node = nodeStack.pop();
           children = node.getChildren();
@@ -72,8 +76,37 @@
     }
   }
 
-  public Index getIndex() {
-    return index;
+  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> set(String key, String value, TreeNode node) {
+
+    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
+    if (indexOp.isNone()) {
+      TreeMap<String, TreeMap<TreeNode, TreeNode>> index = TreeMap.empty(Ord.stringOrd);
+      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
+      nodeMap = nodeMap.set(node, node);
+      TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, nodeMap);
+      indexList = indexList.set(key, newIndex);
+      return indexList;
+    }
+
+    TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
+    Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value);
+
+    TreeMap<TreeNode, TreeNode> newNodeMap;
+    if (nodeMapOp.isSome()) {
+      TreeMap<TreeNode, TreeNode> nodeMap = nodeMapOp.some();
+      newNodeMap = nodeMap.set(node, node);
+    } else {
+      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
+      newNodeMap = nodeMap.set(node, node);
+    }
+    TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, newNodeMap);
+    indexList = indexList.set(key, newIndex);
+
+    return indexList;
+  }
+
+  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
+    return indexList;
   }
 
   public ParentIndex getParentIndex() {
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java	Fri Mar 06 10:44:50 2015 +0900
@@ -2,6 +2,7 @@
 
 
 
+import fj.data.TreeMap;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
@@ -18,7 +19,7 @@
 		this.reservation = reservation;
 	}
 	
-	public void commit(Index index, ParentIndex parentIndex){
+	public void commit(TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index, ParentIndex parentIndex){
 		TreeContext tc = reservation.get();
 		ChangeSet cs = tc.getChangeSet();
 		TreeNode root = cs.getRoot();
@@ -27,8 +28,7 @@
 		String uuid = cs.uuid();
 		String treeName = cs.getTreeName();
 		long revision = cs.revision();
-		index.get("KER", "value");
-		DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index.getIndex(), parentIndex.getParentIndex());
+		DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index, parentIndex.getParentIndex());
 		DefaultTreeContext newTs = new DefaultTreeContext(root, newCs);
 		reservation.set(newTs);
 	}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java	Fri Mar 06 10:44:50 2015 +0900
@@ -5,7 +5,6 @@
 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.TreeMapOrd;
-import fj.Ord;
 import fj.data.Option;
 import fj.data.TreeMap;
 
--- a/src/test/java/DefaultJungleTreeTest.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/test/java/DefaultJungleTreeTest.java	Fri Mar 06 10:44:50 2015 +0900
@@ -6,7 +6,6 @@
 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.store.impl.IndexTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java	Fri Mar 06 10:44:50 2015 +0900
@@ -11,7 +11,6 @@
 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.store.impl.IndexTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java	Fri Mar 06 10:44:50 2015 +0900
@@ -10,7 +10,6 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNodeAttribute;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java	Fri Mar 06 10:44:50 2015 +0900
@@ -5,7 +5,6 @@
 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.store.impl.TreeNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeAttributes;
 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;