0
|
1 package jp.ac.u_ryukyu.ie.cr.jungle.transaction;
|
|
2
|
|
3
|
|
4 import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter;
|
|
5 import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext;
|
|
6 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog;
|
|
7 import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation;
|
|
8 import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList;
|
|
9 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
|
|
10 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser;
|
|
11 import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
|
|
12 import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError;
|
|
13 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
|
|
14 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
|
|
15
|
|
16 import java.util.Iterator;
|
|
17 import java.util.concurrent.atomic.AtomicReference;
|
|
18
|
|
19 public class DefaultTransactionManager implements TransactionManager {
|
|
20 private final AtomicReference<TreeContext> repository;
|
|
21 private final TreeContext tip;
|
|
22 private final ChangeListWriter writer;
|
|
23 private final String uuid;
|
|
24
|
|
25 public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip,
|
|
26 AtomicReference<TreeContext> _repository, String _uuid) {
|
|
27 repository = _repository;
|
|
28 tip = _tip;
|
|
29 writer = _writer;
|
|
30 uuid = _uuid;
|
|
31 }
|
|
32
|
|
33 @Override
|
|
34 public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) {
|
|
35 long currentRevision = tip.revision();
|
|
36 long nextRevision = currentRevision + 1;
|
|
37
|
|
38 final String _treeName = tip.getTreeName();
|
|
39 ChangeList list = new ChangeList() {
|
|
40 @Override
|
|
41 public Iterator<TreeOperation> iterator() {
|
|
42 return _log.iterator();
|
|
43 }
|
|
44
|
|
45 @Override
|
|
46 public String getTreeName() {
|
|
47 return _treeName;
|
|
48 }
|
|
49
|
|
50 @Override
|
|
51 public TreeOperationLog getLog() {
|
|
52 return _log;
|
|
53 }
|
|
54
|
|
55 @Override
|
|
56 public String uuid() {
|
|
57 return uuid;
|
|
58 }
|
|
59
|
|
60 };
|
|
61
|
|
62 InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true);
|
|
63 traverser.createIndex();
|
|
64 TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,traverser);
|
|
65
|
|
66 if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) {
|
|
67 TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid);
|
|
68 return DefaultEither.newB(txManager);
|
|
69 }
|
|
70
|
|
71 return DefaultEither.newA((jp.ac.u_ryukyu.ie.cr.jungle.util.Error) new DefaultError());
|
|
72 }
|
|
73
|
|
74 @Override
|
|
75 public Either<Error, TransactionManager> flashCommit(TreeNode _newRoot, TreeOperationLog _log) {
|
|
76 return commit(_newRoot,_log);
|
|
77 }
|
|
78
|
|
79 @Override
|
|
80 public String getUUID() {
|
|
81 return uuid;
|
|
82 }
|
|
83
|
|
84 @Override
|
|
85 public long getRevision() {
|
|
86 return tip.revision();
|
|
87 }
|
|
88 }
|