Mercurial > hg > Members > tatsuki > bench > jungle-core
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()) |