Mercurial > hg > Members > nobuyasu > jungle-network
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 } |