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 }