comparison src/jungle/test/transaction/NetworkTransactionManager.java @ 30:8593c2525aa7

add NeworkTransactionManager
author one
date Mon, 01 Jul 2013 20:31:29 +0900
parents
children
comparison
equal deleted inserted replaced
29:16ea4835f36e 30:8593c2525aa7
1 package jungle.test.transaction;
2
3 import java.util.Iterator;
4
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager;
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
23
24 public class NetworkTransactionManager<T extends TreeNode<T>> implements TransactionManager<T>
25 {
26
27 private final AtomicReservableReference<TreeContext<T>> repository;
28 private final TreeContext<T> tip;
29 private final ChangeListWriter writer;
30 private final String uuid;
31 private final String treeName;
32
33 public NetworkTransactionManager(ChangeListWriter _writer,TreeContext<T> _tip,
34 AtomicReservableReference<TreeContext<T>> _repository,String _uuid, String _treeName)
35 {
36 repository = _repository;
37 tip = _tip;
38 writer = _writer;
39 uuid = _uuid;
40 treeName = _treeName;
41 }
42
43 @Override
44 public Either<Error, TransactionManager<T>> commit(T _newRoot,final TreeOperationLog _log) {
45 ChangeSet cs = tip.getChangeSet();
46 long currentRevision = cs.revision();
47 long nextRevision = currentRevision + 1;
48
49 ChangeList list = new ChangeList() {
50 @Override
51 public Iterator<TreeOperation> iterator(){
52 return _log.iterator();
53 }
54 };
55
56 Node root = _newRoot.getAsNode();
57 DefaultChangeSet newCs = new DefaultChangeSet(root, cs, list, uuid, nextRevision);
58 DefaultTreeContext<T> newContext = new DefaultTreeContext<T>(_newRoot,newCs);
59
60 @SuppressWarnings("rawtypes")
61 Reservation reservation = repository.makeReservation(tip, newContext);
62 if(reservation == null) {
63 return DefaultEither.newA((Error)new DefaultError());
64 }
65 Result r = writer.write(list);
66 if(r == Result.SUCCESS){
67 reservation.confirm();
68 TransactionManager<T> txManager = new NetworkTransactionManager<T>(writer, newContext, repository, uuid, treeName);
69 return DefaultEither.newB(txManager);
70 }
71
72 return DefaultEither.newA((Error)new DefaultError());
73 }
74
75 @Override
76 public long getRevision()
77 {
78 ChangeSet cs = tip.getChangeSet();
79 return cs.revision();
80 }
81
82 @Override
83 public String getUUID() {
84 return uuid;
85 }
86
87 }