Mercurial > hg > Members > tatsuki > bench > jungle-core
diff src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java @ 142:ef183969bf31
add get oldTree
author | one |
---|---|
date | Thu, 13 Nov 2014 22:04:14 +0900 |
parents | 6e9a8d26e0cf |
children | afbe19c98f53 72f454eb04ec |
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Tue Nov 11 18:57:52 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Thu Nov 13 22:04:14 2014 +0900 @@ -1,12 +1,8 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; -import java.util.concurrent.atomic.AtomicReference; - -import org.omg.CORBA.TCKind; - import fj.data.List; +import fj.data.Option; 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.store.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; @@ -16,85 +12,109 @@ 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.DefaultTransactionManager; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; 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.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.shoshi.jungle.util.Pair; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; +public class DefaultJungleTree implements JungleTree { + private final AtomicReservableReference<TreeContext> repository; + private final String uuid; + private final ChangeListWriter writer; + private final TreeEditor editor; -public class DefaultJungleTree implements JungleTree -{ - private final AtomicReservableReference<TreeContext> repository; - private final String uuid; - private final ChangeListWriter writer; - private final TreeEditor editor; - - public DefaultJungleTree(TreeContext tc,String uuid,ChangeListWriter writer,TreeEditor editor) - { - this.repository = new AtomicReservableReference<TreeContext>(tc); - this.uuid = uuid; - this.writer = writer; - this.editor = editor; - } + public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { + this.repository = new AtomicReservableReference<TreeContext>(tc); + this.uuid = uuid; + this.writer = writer; + this.editor = editor; + } - @Override - public JungleTreeEditor getTreeEditor() - { - TreeContext tc = repository.get(); - DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tc,repository,uuid); - TreeNode root = tc.getTreeNode(); - TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); - return new DefaultJungleTreeEditor(root,txManager,editor,index); - } - - @Override - public IndexJungleTreeEditor getIndexTreeEditor() - { - TreeContext tc = repository.get(); - DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tc,repository,uuid); - TreeNode root = tc.getTreeNode(); - TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = getIndex(); - return new IndexJungleTreeEditor(root,txManager,editor,newIndex); - } - + @Override + public JungleTreeEditor getTreeEditor() { + TreeContext tc = repository.get(); + DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); + TreeNode root = tc.getTreeNode(); + TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); + return new DefaultJungleTreeEditor(root, txManager, editor, index); + } + + @Override + public IndexJungleTreeEditor getIndexTreeEditor() { + TreeContext tc = repository.get(); + DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); + TreeNode root = tc.getTreeNode(); + TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = getIndex(); + return new IndexJungleTreeEditor(root, txManager, editor, newIndex); + } + + @Override + public JungleTreeEditor getLocalTreeEditor() { + return getTreeEditor(); + } + + @Override + public TreeNode getRootNode() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getRoot(); + } - @Override - public JungleTreeEditor getLocalTreeEditor() - { - return getTreeEditor(); - } - - @Override - public TreeNode getRootNode() - { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getRoot(); - } + @Override + public InterfaceTraverser getTraverser() { + AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation(); + IndexManager indexManager = new IndexManager(reservation); + TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); + if (index != null) + return new InterfaceTraverser(getRootNode(), index, indexManager); + return new InterfaceTraverser(getRootNode(), indexManager); + } + + @Override + public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getIndex(); + } + + @Override + public Iterable<TreeOperation> getLog() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getOperations(); + } - @Override - public InterfaceTraverser getTraverser() { - AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation(); - IndexManager indexManager = new IndexManager(reservation); - TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); - if (index != null) - return new InterfaceTraverser(getRootNode(), index, indexManager); - return new InterfaceTraverser(getRootNode(),indexManager); - } - - @Override - public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getIndex(); - } - - @Override - public Iterable<TreeOperation> getLog() { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getOperations(); - } - + @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); + } + + }