# HG changeset patch # User one # Date 1421084082 -32400 # Node ID 624a7e6a3f753852a573cde1240a4b882461d170 # Parent 383b08d1711c316d5a8261f9f9960f4cb8a46dd7 add GetNodeOfPath diff -r 383b08d1711c -r 624a7e6a3f75 build.gradle --- a/build.gradle Fri Dec 26 03:58:47 2014 +0900 +++ b/build.gradle Tue Jan 13 02:34:42 2015 +0900 @@ -14,7 +14,6 @@ compile "commons-collections:commons-collections:3.2.1" compile "org.apache.maven.surefire:surefire-junit4:2.13" compile "com.google.guava:guava:12.0" - compile "org.functionaljava:functionaljava:4.2-beta-1" testCompile "junit:junit:4.7" } diff -r 383b08d1711c -r 624a7e6a3f75 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Fri Dec 26 03:58:47 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Tue Jan 13 02:34:42 2015 +0900 @@ -2,6 +2,7 @@ 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; 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; @@ -19,7 +20,7 @@ import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class DefaultJungleTree implements JungleTree { - + private final AtomicReservableReference repository; private final String uuid; private final ChangeListWriter writer; @@ -40,7 +41,6 @@ return new DefaultJungleTreeEditor(root, txManager, treeEditor); } - @Override public JungleTreeEditor getLocalTreeEditor() { return getTreeEditor(); @@ -59,7 +59,7 @@ IndexManager indexManager = new IndexManager(reservation); Index index = getIndex(); ParentIndex parentIndex = getParentIndex(); - return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager,useIndex); + return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex); } @Override @@ -76,7 +76,6 @@ return cs.getIndex(); } - @Override public long revision() { TreeContext tc = repository.get(); @@ -89,7 +88,7 @@ TreeContext tc = repository.get(); ChangeSet cs = tc.getChangeSet(); - for (;cs.revision() != revision;) { + for (; cs.revision() != revision;) { cs = cs.prev(); if (cs == null) return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); @@ -103,5 +102,18 @@ return DefaultEither.newB(oldTree); } + @Override + public Either getNodeOfPath(NodePath path) { + TreeNode node = repository.get().getTreeNode(); + for (int num : path) { + if (num == -1) + continue; + Either either = node.getChildren().at(num); + if (either.isA()) + return either; + node = either.b(); + } + return DefaultEither.newB(node); + } } diff -r 383b08d1711c -r 624a7e6a3f75 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Fri Dec 26 03:58:47 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Tue Jan 13 02:34:42 2015 +0900 @@ -2,6 +2,7 @@ +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; @@ -19,4 +20,5 @@ public Index getIndex(); public ParentIndex getParentIndex(); public InterfaceTraverser getTraverser(boolean useIndex); + public Either getNodeOfPath(NodePath path); } diff -r 383b08d1711c -r 624a7e6a3f75 src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetNodeOfPathTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetNodeOfPathTest.java Tue Jan 13 02:34:42 2015 +0900 @@ -0,0 +1,51 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +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.DefaultNodePath; +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.traverser.InterfaceTraverser; +import junit.framework.Assert; + +import org.junit.Test; + +import com.sun.corba.se.impl.orbutil.graph.Node; +import com.sun.org.apache.bcel.internal.generic.RETURN; + +public class GetNodeOfPathTest { + + @Test + public void getNodeOfPathTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap("tatsuki".getBytes())).b(); + editor.success(); + + InterfaceTraverser traverser = tree.getTraverser(true); + Iterator nodeIterator = traverser.find((TreeNode node) -> { + String str = node.getAttributes().getString("KEY"); + if (str == null) + return false; + if (str.equals("tatsuki")) + return true; + return false; + }, "KEY", "tatsuki"); + TreeNode node = tree.getNodeOfPath(path).b(); + Assert.assertTrue(nodeIterator.hasNext()); + Assert.assertEquals(node, nodeIterator.next()); + } +}