Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java @ 147:af67dd0b5ba2
add DefaultIndexEditor
author | one |
---|---|
date | Fri, 21 Nov 2014 12:46:36 +0900 |
parents | 371b6ddb78f2 |
children | a2c374a2686b feb2346ace19 |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; import fj.data.List; 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.TreeEditor; 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.store.operations.TreeOperation; 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.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 treeEditor; private final IndexTreeEditor indexTreeEditor; public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor, IndexTreeEditor indexTreeEditor) { this.repository = new AtomicReservableReference<TreeContext>(tc); this.uuid = uuid; this.writer = writer; this.treeEditor = editor; this.indexTreeEditor = indexTreeEditor; } @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<TreeNode>>>index = getIndex(); TreeMap<TreeNode, TreeNode> parentIndex = getParentIndex(); return new DefaultJungleTreeEditor(root, txManager, treeEditor, index,parentIndex); } @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<TreeNode>>> index = getIndex(); TreeMap<TreeNode, TreeNode> parentIndex = getParentIndex(); return new IndexJungleTreeEditor(root, txManager, indexTreeEditor, index, parentIndex); } @Override public TreeMap<TreeNode, TreeNode> getParentIndex() { TreeContext tc = repository.get(); ChangeSet cs = tc.getChangeSet(); return cs.getParentIndex(); } @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<TreeNode>>> index = getIndex(); if (index != null) return new InterfaceTraverser(getRootNode(), index, indexManager); return new InterfaceTraverser(getRootNode(), indexManager); } @Override public TreeMap<String, TreeMap<String, List<TreeNode>>> 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,treeEditor,indexTreeEditor); return DefaultEither.newB(oldTree); } }