changeset 176:550f51183d8a

Merge with a2598139df64efd6f649ba9a02f2b7d652bee8c1
author one
date Fri, 06 Mar 2015 10:59:34 +0900
parents e26462a38ce0 (diff) a2598139df64 (current diff)
children 75422f82e6b6
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/store/operations/ReplaceRootNodeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/replaceRootNodeAt.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/traverser/InterfaceTraverser.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/ReplaceRootNodeAt.java
diffstat 32 files changed, 411 insertions(+), 235 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java	Fri Mar 06 10:59:34 2015 +0900
@@ -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>();
@@ -81,7 +81,7 @@
 		
 		DefaultTreeNode root = new DefaultTreeNode();
 	  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList = TreeMap.empty(Ord.stringOrd);
-		 TreeMap<TreeNode, TreeNode> parentIndex = new ParentIndex().getParentIndex();
+		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/JungleTreeEditor.java	Mon Feb 16 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java	Fri Mar 06 10:59:34 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/Command.java	Mon Feb 16 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java	Fri Mar 06 10:59:34 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;
+  }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/ReplaceRootNodeOperation.java	Fri Mar 06 10:59:34 2015 +0900
@@ -0,0 +1,37 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations;
+
+import java.nio.ByteBuffer;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+
+public class ReplaceRootNodeOperation implements NodeOperation {
+
+  @Override
+  public Command getCommand() {
+    return Command.REPLACE_ROOT;
+  }
+
+  @Override
+  public Either<Error, TreeNode> invoke(TreeNode target) {
+    return  target.appendRootNode();
+  }
+
+  @Override
+  public int getPosition() {
+    return -1;
+  }
+
+  @Override
+  public String getKey() {
+    return null;
+  }
+
+  @Override
+  public ByteBuffer getValue() {
+    return null;
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/replaceRootNodeAt.java	Fri Mar 06 10:59:34 2015 +0900
@@ -0,0 +1,40 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+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.OperationLog;
+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 replaceRootNodeAt implements NodeEditor {
+
+  
+  public Either<Error, LoggingNode> _edit(LoggingNode _e) 
+  {
+    Either<Error,LoggingNode> either = _e.replaceNewRootNode();
+    if(either.isA()){
+      // error
+      return either;
+    }
+    return DefaultEither.newB(either.b());
+  }
+  
+  
+  @Override
+  public Either<Error, LoggingNode> edit(TreeNode _e) {
+    LoggingNode logNode = wrap(_e);
+    return _edit(logNode);
+  }
+
+  public LoggingNode wrap(TreeNode node) {
+    return new LoggingNode(node);
+  }
+
+ 
+  @Override
+  public LoggingNode wrap(TreeNode node, OperationLog op) {
+    return new LoggingNode(node, op);
+  }
+
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java	Mon Feb 16 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Fri Mar 06 10:59:34 2015 +0900
@@ -58,7 +58,6 @@
       }
 
     };
-System.out.println("transaction");
     IndexManager indexManager = new IndexManager(repository.getReservation());
     InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true);
     traverser.createIndex();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java	Mon Feb 16 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java	Fri Mar 06 10:59:34 2015 +0900
@@ -1,6 +1,5 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser;
 
-
 import java.util.Iterator;
 
 import fj.Ord;
@@ -28,8 +27,8 @@
     this(root, TreeMap.empty(Ord.stringOrd), new ParentIndex(), indexManager, indexFlag);
   }
 
-  public InterfaceTraverser(TreeNode root, TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> 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;
@@ -59,11 +58,10 @@
   }
 
   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();
   }
@@ -77,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を使って探索する
@@ -148,100 +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> get(String key, String value) {
-
-  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>();
-
-  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> find(final Query query, final String key, String searchValue) {
 
-     Iterator<TreeNode> nodeIterator = get(key, searchValue);
+    Iterator<TreeNode> nodeIterator = get(key, searchValue);
     if (nodeIterator.hasNext() && useIndex) {
       return nodeIterator;
     } else {
@@ -257,11 +227,13 @@
             TreeNode targetNode = itNode.next();
             String value = targetNode.getAttributes().getString(key);
             if (useIndex) {
-              if (value != null);
-//                index = index.set(key, value, targetNode);
+              if (value != null)
+                ;
+              // index = index.set(key, value, targetNode);
             }
-            if (parentUpdateFlag);
-      //        parentIndex = parentIndex.set(targetNode);
+            if (parentUpdateFlag)
+              ;
+            // parentIndex = parentIndex.set(targetNode);
             if (query.condition(targetNode))
               return targetNode;
           }
@@ -293,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) {
-//
-//          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> 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) {
+
+    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>();
+
+    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();
+      }
+
+    };
+  }
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java	Mon Feb 16 12:08:47 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/test/java/DefaultJungleTreeTest.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java	Fri Mar 06 10:59:34 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;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/ReplaceRootNodeAt.java	Fri Mar 06 10:59:34 2015 +0900
@@ -0,0 +1,39 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor;
+
+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.store.impl.DefaultTreeEditor;
+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;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class ReplaceRootNodeAt {
+
+  @Test
+  public void ReplaceRootNodeAtTest() {
+      System.out.println("start");
+    Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser()));
+    jungle.createNewTree("tree");
+    JungleTree tree = jungle.getTreeByName("tree");
+    JungleTreeEditor editor = tree.getTreeEditor();
+    
+    TreeNode oldRoot = tree.getRootNode();
+    Either<Error, JungleTreeEditor> either = editor.replaceNewRootNode();
+    Assert.assertTrue(either.isB());
+    JungleTreeEditor newTreeEditor = either.b();
+    Assert.assertTrue(newTreeEditor.success().isB());
+    TreeNode newRoot = tree.getRootNode();
+    Assert.assertFalse(oldRoot.equals(newRoot));
+    
+    Either<Error, TreeNode> childrenEither = newRoot.getChildren().at(0);
+    Assert.assertTrue(childrenEither.isB());
+    TreeNode newRootChildren = childrenEither.b();
+    Assert.assertEquals(oldRoot, newRootChildren);
+  }
+}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java	Mon Feb 16 12:08:47 2015 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java	Fri Mar 06 10:59:34 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 12:08:47 2015 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java	Fri Mar 06 10:59:34 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;