Mercurial > hg > Members > nobuyasu > jungle-network
view src/main/java/alice/jungle/transaction/NetworkDefaultJungleTree.java @ 193:89c15aa2bc6d
change transaction
author | tatsuki |
---|---|
date | Fri, 20 Mar 2015 16:18:42 +0900 |
parents | 5d0734fd859d |
children | fd4064e110bd |
line wrap: on
line source
package alice.jungle.transaction; 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; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; 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.DefaultTreeContext; 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.ParentIndex; import java.util.concurrent.atomic.AtomicReference; public class NetworkDefaultJungleTree implements JungleTree { private final AtomicReference<TreeContext> repository; private final String uuid; private final String treeName; private final ChangeListWriter writer; private final TreeEditor editor; public NetworkDefaultJungleTree(String _treeName, TreeContext _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor) { treeName = _treeName; repository = new AtomicReference<TreeContext>(_tc); uuid = _uuid; writer = _writer; editor = _editor; } @Override public JungleTreeEditor getTreeEditor() { TreeContext tc = repository.get(); NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); TreeNode root = tc.getRoot(); return new NetworkDefaultJungleTreeEditor(treeName, root,txManager,editor); } @Override public JungleTreeEditor getLocalTreeEditor() { TreeContext tc = repository.get(); NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); TreeNode root = tc.getRoot(); return NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName,root,txManager, editor); } @Override public TreeNode getRootNode() { TreeContext tc = repository.get(); return tc.getRoot(); } @Override public long revision() { TreeContext tc = repository.get(); return tc.revision(); } @Override public Either<Error, JungleTree> getOldTree(long revision) { TreeContext tc = repository.get(); for (; tc.revision() != revision;) { tc = tc.prev(); if (tc == null) return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); } String oldTreeUuid = uuid + revision; JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, editor); return DefaultEither.newB(oldTree); } @Override public ParentIndex getParentIndex() { TreeContext tc = repository.get(); return tc.getParentIndex(); } @Override public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() { TreeContext tc = repository.get(); return tc.getIndex(); } @Override public InterfaceTraverser getTraverser(boolean useIndex) { TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = getIndex(); ParentIndex parentIndex = getParentIndex(); return new InterfaceTraverser(getRootNode(), index, parentIndex, useIndex); } @Override public Either<Error, TreeNode> getNodeOfPath(NodePath path) { TreeNode node = repository.get().getRoot(); 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); } }