Mercurial > hg > Members > nobuyasu > jungle-network
diff src/main/java/alice/jungle/persistent/PersistentJungleTree.java @ 191:5d0734fd859d
fix error
author | tatsuki |
---|---|
date | Thu, 15 Jan 2015 09:23:23 +0900 |
parents | 269bada9eedc |
children | 89c15aa2bc6d |
line wrap: on
line diff
--- a/src/main/java/alice/jungle/persistent/PersistentJungleTree.java Fri Oct 17 15:16:56 2014 +0900 +++ b/src/main/java/alice/jungle/persistent/PersistentJungleTree.java Thu Jan 15 09:23:23 2015 +0900 @@ -2,6 +2,7 @@ import fj.data.List; import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungleTree; 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.persistent.ChangeListWriter; @@ -11,10 +12,16 @@ 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.DefaultJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; +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.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; public class PersistentJungleTree implements JungleTree { private final AtomicReservableReference<TreeContext> repository; @@ -54,24 +61,67 @@ return getTreeEditor(); } - @Override - public InterfaceTraverser getTraverser() { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return new InterfaceTraverser(getRootNode(), cs.getIndex(), getTreeEditor()); - } + @Override + public long revision() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.revision(); + } + + @Override + public Either<Error, JungleTree> getOldTree(long revision) { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + + for (; cs.revision() != revision;) { + cs = cs.prev(); + if (cs == null) + return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); + } + + TreeNode root = cs.getRoot(); + + TreeContext oldTc = new DefaultTreeContext(root, cs); + String oldTreeUuid = uuid + revision; + JungleTree oldTree = new DefaultJungleTree(oldTc, oldTreeUuid, writer, editor); + return DefaultEither.newB(oldTree); + } - @Override - public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() { - // TODO Auto-generated method stub - return null; - } + @Override + public ParentIndex getParentIndex() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getParentIndex(); + } + + @Override + public Index getIndex() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getIndex(); + } - @Override - public IndexJungleTreeEditor getIndexTreeEditor() { - // TODO Auto-generated method stub - return null; - } + @Override + public InterfaceTraverser getTraverser(boolean useIndex) { + AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation(); + IndexManager indexManager = new IndexManager(reservation); + Index index = getIndex(); + ParentIndex parentIndex = getParentIndex(); + return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex); + } + @Override + public Either<Error, TreeNode> getNodeOfPath(NodePath path) { + TreeNode node = repository.get().getTreeNode(); + for (int num : path) { + if (num == -1) + continue; + Either<Error, TreeNode> either = node.getChildren().at(num); + if (either.isA()) + return either; + node = either.b(); + } + return DefaultEither.newB(node); + } }