31
|
1 package alice.jungle.transaction;
|
30
|
2
|
|
3 import java.util.Iterator;
|
|
4
|
179
|
5 import fj.data.List;
|
|
6 import fj.data.TreeMap;
|
30
|
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
|
|
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
|
|
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
|
|
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
|
|
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.logger.TreeOperationLog;
|
|
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
|
|
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
|
|
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
|
|
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
|
|
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
|
|
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager;
|
|
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
|
|
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
|
|
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
|
|
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
|
|
23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
|
|
24
|
178
|
25 public class NetworkTransactionManager implements TransactionManager
|
30
|
26 {
|
|
27
|
178
|
28 private final AtomicReservableReference<TreeContext> repository;
|
|
29 private final TreeContext tip;
|
30
|
30 private final ChangeListWriter writer;
|
|
31 private final String uuid;
|
|
32 private final String treeName;
|
|
33
|
178
|
34 public NetworkTransactionManager(String _treeName, ChangeListWriter _writer,TreeContext _tip,
|
|
35 AtomicReservableReference<TreeContext> _repository,String _uuid)
|
30
|
36 {
|
|
37 repository = _repository;
|
|
38 tip = _tip;
|
|
39 writer = _writer;
|
|
40 uuid = _uuid;
|
|
41 treeName = _treeName;
|
|
42 }
|
|
43
|
|
44 @Override
|
179
|
45 public Either<Error, TransactionManager> commit(TreeNode _newRoot,final TreeOperationLog _log, TreeMap<String,TreeMap<String, List<TreeNode>>> index) {
|
30
|
46 ChangeSet cs = tip.getChangeSet();
|
|
47 long currentRevision = cs.revision();
|
|
48 long nextRevision = currentRevision + 1;
|
|
49
|
|
50 ChangeList list = new ChangeList() {
|
|
51 @Override
|
|
52 public Iterator<TreeOperation> iterator(){
|
|
53 return _log.iterator();
|
|
54 }
|
87
|
55 @Override
|
|
56 public String uuid() {
|
|
57 return uuid;
|
|
58 }
|
|
59 @Override
|
|
60 public String getTreeName() {
|
|
61 return treeName;
|
|
62 }
|
30
|
63 };
|
|
64
|
176
|
65 TreeNode root = _newRoot;
|
179
|
66 DefaultChangeSet newCs = new DefaultChangeSet(root, cs, list, uuid, treeName, nextRevision, null);
|
178
|
67 DefaultTreeContext newContext = new DefaultTreeContext(_newRoot,newCs);
|
30
|
68
|
|
69 @SuppressWarnings("rawtypes")
|
|
70 Reservation reservation = repository.makeReservation(tip, newContext);
|
|
71 if(reservation == null) {
|
|
72 return DefaultEither.newA((Error)new DefaultError());
|
|
73 }
|
|
74 Result r = writer.write(list);
|
34
|
75 if(r != Result.SUCCESS) {
|
|
76 return DefaultEither.newA((Error)new DefaultError());
|
|
77 }
|
|
78 reservation.confirm();
|
178
|
79 TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newContext, repository, uuid);
|
34
|
80 return DefaultEither.newB(txManager);
|
|
81 }
|
30
|
82
|
|
83 @Override
|
|
84 public long getRevision()
|
|
85 {
|
|
86 ChangeSet cs = tip.getChangeSet();
|
|
87 return cs.revision();
|
|
88 }
|
|
89
|
|
90 @Override
|
|
91 public String getUUID() {
|
|
92 return uuid;
|
|
93 }
|
|
94
|
|
95 }
|