comparison src/main/java/alice/jungle/persistent/PersistentJungleTree.java @ 191:5d0734fd859d

fix error
author tatsuki
date Thu, 15 Jan 2015 09:23:23 +0900
parents 269bada9eedc
children 89c15aa2bc6d
comparison
equal deleted inserted replaced
190:269bada9eedc 191:5d0734fd859d
1 package alice.jungle.persistent; 1 package alice.jungle.persistent;
2 2
3 import fj.data.List; 3 import fj.data.List;
4 import fj.data.TreeMap; 4 import fj.data.TreeMap;
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungleTree;
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; 6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; 7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; 8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; 9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; 10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; 11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; 12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; 13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; 14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor;
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; 15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; 16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; 17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; 18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.GetOldTreeError;
22 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index;
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.ParentIndex;
18 25
19 public class PersistentJungleTree implements JungleTree { 26 public class PersistentJungleTree implements JungleTree {
20 private final AtomicReservableReference<TreeContext> repository; 27 private final AtomicReservableReference<TreeContext> repository;
21 private final String uuid; 28 private final String uuid;
22 private final String treeName; 29 private final String treeName;
52 @Override 59 @Override
53 public JungleTreeEditor getLocalTreeEditor() { 60 public JungleTreeEditor getLocalTreeEditor() {
54 return getTreeEditor(); 61 return getTreeEditor();
55 } 62 }
56 63
57 @Override 64 @Override
58 public InterfaceTraverser getTraverser() { 65 public long revision() {
59 TreeContext tc = repository.get(); 66 TreeContext tc = repository.get();
60 ChangeSet cs = tc.getChangeSet(); 67 ChangeSet cs = tc.getChangeSet();
61 return new InterfaceTraverser(getRootNode(), cs.getIndex(), getTreeEditor()); 68 return cs.revision();
62 } 69 }
63 70
64 @Override 71 @Override
65 public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() { 72 public Either<Error, JungleTree> getOldTree(long revision) {
66 // TODO Auto-generated method stub 73 TreeContext tc = repository.get();
67 return null; 74 ChangeSet cs = tc.getChangeSet();
68 }
69 75
70 @Override 76 for (; cs.revision() != revision;) {
71 public IndexJungleTreeEditor getIndexTreeEditor() { 77 cs = cs.prev();
72 // TODO Auto-generated method stub 78 if (cs == null)
73 return null; 79 return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND);
74 } 80 }
75 81
82 TreeNode root = cs.getRoot();
83
84 TreeContext oldTc = new DefaultTreeContext(root, cs);
85 String oldTreeUuid = uuid + revision;
86 JungleTree oldTree = new DefaultJungleTree(oldTc, oldTreeUuid, writer, editor);
87 return DefaultEither.newB(oldTree);
88 }
89
90 @Override
91 public ParentIndex getParentIndex() {
92 TreeContext tc = repository.get();
93 ChangeSet cs = tc.getChangeSet();
94 return cs.getParentIndex();
95 }
96
97 @Override
98 public Index getIndex() {
99 TreeContext tc = repository.get();
100 ChangeSet cs = tc.getChangeSet();
101 return cs.getIndex();
102 }
103
104 @Override
105 public InterfaceTraverser getTraverser(boolean useIndex) {
106 AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation();
107 IndexManager indexManager = new IndexManager(reservation);
108 Index index = getIndex();
109 ParentIndex parentIndex = getParentIndex();
110 return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex);
111 }
112
113 @Override
114 public Either<Error, TreeNode> getNodeOfPath(NodePath path) {
115 TreeNode node = repository.get().getTreeNode();
116 for (int num : path) {
117 if (num == -1)
118 continue;
119 Either<Error, TreeNode> either = node.getChildren().at(num);
120 if (either.isA())
121 return either;
122 node = either.b();
123 }
124 return DefaultEither.newB(node);
125 }
76 126
77 } 127 }