Mercurial > hg > Members > tatsuki > bench > jungle-core
comparison 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 |
comparison
equal
deleted
inserted
replaced
141:3071b1a471fd | 142:ef183969bf31 |
---|---|
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; | 1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; |
2 | 2 |
3 import java.util.concurrent.atomic.AtomicReference; | |
4 | |
5 import org.omg.CORBA.TCKind; | |
6 | |
7 import fj.data.List; | 3 import fj.data.List; |
4 import fj.data.Option; | |
8 import fj.data.TreeMap; | 5 import fj.data.TreeMap; |
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; | |
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; | 6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; |
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; | 7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; |
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; | 8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; |
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; | 9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; |
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; | 10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; |
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; | 11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; |
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; | 12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; |
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; | 13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; |
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager; | 14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager; |
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; | |
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; | 16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; |
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; | 17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; |
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; | 18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; |
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; | |
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; | |
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; | |
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.GetOldTreeError; | |
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; | 23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; |
23 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; | 24 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; |
24 | 25 |
26 public class DefaultJungleTree implements JungleTree { | |
27 private final AtomicReservableReference<TreeContext> repository; | |
28 private final String uuid; | |
29 private final ChangeListWriter writer; | |
30 private final TreeEditor editor; | |
25 | 31 |
26 public class DefaultJungleTree implements JungleTree | 32 public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { |
27 { | 33 this.repository = new AtomicReservableReference<TreeContext>(tc); |
28 private final AtomicReservableReference<TreeContext> repository; | 34 this.uuid = uuid; |
29 private final String uuid; | 35 this.writer = writer; |
30 private final ChangeListWriter writer; | 36 this.editor = editor; |
31 private final TreeEditor editor; | 37 } |
32 | |
33 public DefaultJungleTree(TreeContext tc,String uuid,ChangeListWriter writer,TreeEditor editor) | |
34 { | |
35 this.repository = new AtomicReservableReference<TreeContext>(tc); | |
36 this.uuid = uuid; | |
37 this.writer = writer; | |
38 this.editor = editor; | |
39 } | |
40 | 38 |
41 @Override | 39 @Override |
42 public JungleTreeEditor getTreeEditor() | 40 public JungleTreeEditor getTreeEditor() { |
43 { | 41 TreeContext tc = repository.get(); |
44 TreeContext tc = repository.get(); | 42 DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); |
45 DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tc,repository,uuid); | 43 TreeNode root = tc.getTreeNode(); |
46 TreeNode root = tc.getTreeNode(); | 44 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); |
47 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); | 45 return new DefaultJungleTreeEditor(root, txManager, editor, index); |
48 return new DefaultJungleTreeEditor(root,txManager,editor,index); | 46 } |
49 } | |
50 | |
51 @Override | |
52 public IndexJungleTreeEditor getIndexTreeEditor() | |
53 { | |
54 TreeContext tc = repository.get(); | |
55 DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tc,repository,uuid); | |
56 TreeNode root = tc.getTreeNode(); | |
57 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = getIndex(); | |
58 return new IndexJungleTreeEditor(root,txManager,editor,newIndex); | |
59 } | |
60 | |
61 | 47 |
62 @Override | 48 @Override |
63 public JungleTreeEditor getLocalTreeEditor() | 49 public IndexJungleTreeEditor getIndexTreeEditor() { |
64 { | 50 TreeContext tc = repository.get(); |
65 return getTreeEditor(); | 51 DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); |
66 } | 52 TreeNode root = tc.getTreeNode(); |
67 | 53 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = getIndex(); |
68 @Override | 54 return new IndexJungleTreeEditor(root, txManager, editor, newIndex); |
69 public TreeNode getRootNode() | 55 } |
70 { | |
71 TreeContext tc = repository.get(); | |
72 ChangeSet cs = tc.getChangeSet(); | |
73 return cs.getRoot(); | |
74 } | |
75 | 56 |
76 @Override | 57 @Override |
77 public InterfaceTraverser getTraverser() { | 58 public JungleTreeEditor getLocalTreeEditor() { |
78 AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation(); | 59 return getTreeEditor(); |
79 IndexManager indexManager = new IndexManager(reservation); | 60 } |
80 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); | 61 |
81 if (index != null) | 62 @Override |
82 return new InterfaceTraverser(getRootNode(), index, indexManager); | 63 public TreeNode getRootNode() { |
83 return new InterfaceTraverser(getRootNode(),indexManager); | 64 TreeContext tc = repository.get(); |
84 } | 65 ChangeSet cs = tc.getChangeSet(); |
85 | 66 return cs.getRoot(); |
86 @Override | 67 } |
87 public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() { | 68 |
88 TreeContext tc = repository.get(); | 69 @Override |
89 ChangeSet cs = tc.getChangeSet(); | 70 public InterfaceTraverser getTraverser() { |
90 return cs.getIndex(); | 71 AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation(); |
91 } | 72 IndexManager indexManager = new IndexManager(reservation); |
92 | 73 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex(); |
93 @Override | 74 if (index != null) |
94 public Iterable<TreeOperation> getLog() { | 75 return new InterfaceTraverser(getRootNode(), index, indexManager); |
95 TreeContext tc = repository.get(); | 76 return new InterfaceTraverser(getRootNode(), indexManager); |
96 ChangeSet cs = tc.getChangeSet(); | 77 } |
97 return cs.getOperations(); | 78 |
98 } | 79 @Override |
99 | 80 public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() { |
81 TreeContext tc = repository.get(); | |
82 ChangeSet cs = tc.getChangeSet(); | |
83 return cs.getIndex(); | |
84 } | |
85 | |
86 @Override | |
87 public Iterable<TreeOperation> getLog() { | |
88 TreeContext tc = repository.get(); | |
89 ChangeSet cs = tc.getChangeSet(); | |
90 return cs.getOperations(); | |
91 } | |
92 | |
93 @Override | |
94 public long revision() { | |
95 TreeContext tc = repository.get(); | |
96 ChangeSet cs = tc.getChangeSet(); | |
97 return cs.revision(); | |
98 } | |
99 | |
100 @Override | |
101 public Either<Error, JungleTree> getOldTree(long revision) { | |
102 TreeContext tc = repository.get(); | |
103 ChangeSet cs = tc.getChangeSet(); | |
104 | |
105 for (;cs.revision() != revision;) { | |
106 cs = cs.prev(); | |
107 if (cs == null) | |
108 return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); | |
109 } | |
110 | |
111 TreeNode root = cs.getRoot(); | |
112 | |
113 TreeContext oldTc = new DefaultTreeContext(root, cs); | |
114 String oldTreeUuid = uuid + revision; | |
115 JungleTree oldTree = new DefaultJungleTree(oldTc,oldTreeUuid,writer,editor); | |
116 return DefaultEither.newB(oldTree); | |
117 } | |
118 | |
119 | |
100 } | 120 } |