comparison src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java @ 179:817febd9c69b

change transaction
author tatsuki
date Tue, 17 Mar 2015 11:19:04 +0900
parents a2598139df64
children 066d9c5758dc
comparison
equal deleted inserted replaced
178:169c501fe3a9 179:817febd9c69b
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; 1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle;
2 2
3 import fj.data.TreeMap; 3 import fj.data.TreeMap;
4 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; 4 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; 5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext;
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; 7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; 8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; 9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor;
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager; 10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager;
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; 11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; 12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; 13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; 14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.GetOldTreeError; 15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.GetOldTreeError;
19 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
20 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; 16 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
17
18 import java.util.concurrent.atomic.AtomicReference;
21 19
22 public class DefaultJungleTree implements JungleTree { 20 public class DefaultJungleTree implements JungleTree {
23 21
24 private final AtomicReservableReference<TreeContext> repository; 22 private final AtomicReference<TreeContext> repository;
25 private final String uuid; 23 private final String uuid;
26 private final ChangeListWriter writer; 24 private final ChangeListWriter writer;
27 private final TreeEditor treeEditor; 25 private final TreeEditor treeEditor;
28 26
29 public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { 27 public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) {
30 this.repository = new AtomicReservableReference<TreeContext>(tc); 28 this.repository = new AtomicReference<TreeContext>(tc);
31 this.uuid = uuid; 29 this.uuid = uuid;
32 this.writer = writer; 30 this.writer = writer;
33 this.treeEditor = editor; 31 this.treeEditor = editor;
34 } 32 }
35 33
36 @Override 34 @Override
37 public JungleTreeEditor getTreeEditor() { 35 public JungleTreeEditor getTreeEditor() {
38 TreeContext tc = repository.get(); 36 TreeContext tc = repository.get();
39 DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); 37 DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid);
40 TreeNode root = tc.getTreeNode(); 38 TreeNode root = tc.getRoot();
41 return new DefaultJungleTreeEditor(root, txManager, treeEditor); 39 return new DefaultJungleTreeEditor(root, txManager, treeEditor);
42 } 40 }
43 41
44 @Override 42 @Override
45 public JungleTreeEditor getLocalTreeEditor() { 43 public JungleTreeEditor getLocalTreeEditor() {
47 } 45 }
48 46
49 @Override 47 @Override
50 public TreeNode getRootNode() { 48 public TreeNode getRootNode() {
51 TreeContext tc = repository.get(); 49 TreeContext tc = repository.get();
52 ChangeSet cs = tc.getChangeSet(); 50 return tc.getRoot();
53 return cs.getRoot();
54 } 51 }
55 52
56 @Override 53 @Override
57 public InterfaceTraverser getTraverser(boolean useIndex) { 54 public InterfaceTraverser getTraverser(boolean useIndex) {
58 AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation();
59 IndexManager indexManager = new IndexManager(reservation);
60 TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = getIndex(); 55 TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = getIndex();
61 ParentIndex parentIndex = getParentIndex(); 56 ParentIndex parentIndex = getParentIndex();
62 return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex); 57 return new InterfaceTraverser(repository.get().getRoot(), index, parentIndex, useIndex);
63 } 58 }
64 59
65 @Override 60 @Override
66 public ParentIndex getParentIndex() { 61 public ParentIndex getParentIndex() {
67 TreeContext tc = repository.get(); 62 TreeContext tc = repository.get();
68 ChangeSet cs = tc.getChangeSet(); 63 return tc.getParentIndex();
69 return cs.getParentIndex();
70 } 64 }
71 65
72 @Override 66 @Override
73 public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() { 67 public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
74 TreeContext tc = repository.get(); 68 TreeContext tc = repository.get();
75 ChangeSet cs = tc.getChangeSet(); 69 return tc.getIndex();
76 return cs.getIndex();
77 } 70 }
78 71
79 @Override 72 @Override
80 public long revision() { 73 public long revision() {
81 TreeContext tc = repository.get(); 74 TreeContext tc = repository.get();
82 ChangeSet cs = tc.getChangeSet(); 75 return tc.revision();
83 return cs.revision();
84 } 76 }
85 77
86 @Override 78 @Override
87 public Either<Error, JungleTree> getOldTree(long revision) { 79 public Either<Error, JungleTree> getOldTree(long revision) {
88 TreeContext tc = repository.get(); 80 TreeContext tc = repository.get();
89 ChangeSet cs = tc.getChangeSet();
90 81
91 for (; cs.revision() != revision;) { 82 for (; tc.revision() != revision;) {
92 cs = cs.prev(); 83 tc = tc.prev();
93 if (cs == null) 84 if (tc == null)
94 return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); 85 return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND);
95 } 86 }
96 87
97 TreeNode root = cs.getRoot();
98 88
99 TreeContext oldTc = new DefaultTreeContext(root, cs);
100 String oldTreeUuid = uuid + revision; 89 String oldTreeUuid = uuid + revision;
101 JungleTree oldTree = new DefaultJungleTree(oldTc, oldTreeUuid, writer, treeEditor); 90 JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, treeEditor);
102 return DefaultEither.newB(oldTree); 91 return DefaultEither.newB(oldTree);
103 } 92 }
104 93
105 @Override 94 @Override
106 public Either<Error, TreeNode> getNodeOfPath(NodePath path) { 95 public Either<Error, TreeNode> getNodeOfPath(NodePath path) {
107 TreeNode node = repository.get().getTreeNode(); 96 TreeNode node = repository.get().getRoot();
108 for (int num : path) { 97 for (int num : path) {
109 if (num == -1) 98 if (num == -1)
110 continue; 99 continue;
111 Either<Error, TreeNode> either = node.getChildren().at(num); 100 Either<Error, TreeNode> either = node.getChildren().at(num);
112 if (either.isA()) 101 if (either.isA())