Mercurial > hg > Members > nobuyasu > jungle-network
comparison src/main/java/alice/jungle/transaction/NetworkTransactionManager.java @ 193:89c15aa2bc6d
change transaction
author | tatsuki |
---|---|
date | Fri, 20 Mar 2015 16:18:42 +0900 |
parents | 5d0734fd859d |
children | fd4064e110bd |
comparison
equal
deleted
inserted
replaced
192:3202a2a427b1 | 193:89c15aa2bc6d |
---|---|
1 package alice.jungle.transaction; | 1 package alice.jungle.transaction; |
2 | 2 |
3 import java.util.Iterator; | 3 import java.util.Iterator; |
4 import java.util.concurrent.atomic.AtomicReference; | |
4 | 5 |
6 import fj.data.TreeMap; | |
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; | 7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; |
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; | 8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; |
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result; | 9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result; |
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; | 10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; |
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; | 11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; |
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; | 12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; |
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; | 13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; |
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; | |
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation; | |
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet; | |
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; | 14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; |
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; | 15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; |
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; | |
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; | 16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; |
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; | 17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; |
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; | 18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; |
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; | 19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; |
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; | 20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; |
23 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; | |
24 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; | |
25 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; | 21 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; |
26 | 22 |
27 public class NetworkTransactionManager implements TransactionManager { | 23 public class NetworkTransactionManager implements TransactionManager { |
28 | 24 private final AtomicReference<TreeContext> repository; |
29 private final AtomicReservableReference<TreeContext> repository; | |
30 private final TreeContext tip; | 25 private final TreeContext tip; |
31 private final ChangeListWriter writer; | 26 private final ChangeListWriter writer; |
32 private final String uuid; | 27 private final String uuid; |
33 private final String treeName; | 28 private final String treeName; |
34 | 29 |
35 public NetworkTransactionManager(String _treeName, ChangeListWriter _writer, TreeContext _tip, | 30 public NetworkTransactionManager(String _treeName, ChangeListWriter _writer, TreeContext _tip, |
36 AtomicReservableReference<TreeContext> _repository, String _uuid) { | 31 AtomicReference<TreeContext> _repository, String _uuid) { |
37 repository = _repository; | 32 repository = _repository; |
38 tip = _tip; | 33 tip = _tip; |
39 writer = _writer; | 34 writer = _writer; |
40 uuid = _uuid; | 35 uuid = _uuid; |
41 treeName = _treeName; | 36 treeName = _treeName; |
42 } | 37 } |
43 | 38 |
44 @Override | 39 @Override |
45 public Either<Error, TransactionManager> commit(TreeNode _newRoot, final TreeOperationLog _log) { | 40 public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) { |
46 ChangeSet cs = tip.getChangeSet(); | 41 long currentRevision = tip.revision(); |
47 long currentRevision = cs.revision(); | |
48 long nextRevision = currentRevision + 1; | 42 long nextRevision = currentRevision + 1; |
49 | 43 |
50 ChangeList list = new ChangeList() { | 44 ChangeList list = new ChangeList() { |
51 @Override | 45 @Override |
52 public Iterator<TreeOperation> iterator() { | 46 public Iterator<TreeOperation> iterator() { |
62 public String getTreeName() { | 56 public String getTreeName() { |
63 return treeName; | 57 return treeName; |
64 } | 58 } |
65 }; | 59 }; |
66 | 60 |
67 IndexManager indexManager = new IndexManager(repository.getReservation()); | 61 InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true); |
68 InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true); | 62 traverser.createIndex(); |
69 traverser.createIndex(); | 63 TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = traverser.getIndex(); |
70 Index index = traverser.getIndex(); | 64 ParentIndex parentIndex = traverser.getParentIndex(); |
71 ParentIndex parentIndex = traverser.getParentIndex(); | 65 TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, treeName, nextRevision,index,parentIndex.getParentIndex()); |
72 DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, treeName, nextRevision, index.getIndex(), parentIndex.getParentIndex()); | |
73 | 66 |
74 DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs); | |
75 | 67 |
76 @SuppressWarnings("rawtypes") | 68 if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) { |
77 Reservation reservation = repository.makeReservation(tip, newContext); | 69 TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newTreeContext, repository, uuid); |
78 if (reservation == null) { | 70 return DefaultEither.newB(txManager); |
71 } | |
72 | |
79 return DefaultEither.newA((Error) new DefaultError()); | 73 return DefaultEither.newA((Error) new DefaultError()); |
80 } | 74 |
81 Result r = writer.write(list); | |
82 if (r != Result.SUCCESS) { | |
83 return DefaultEither.newA((Error) new DefaultError()); | |
84 } | |
85 reservation.confirm(); | |
86 TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newContext, repository, uuid); | |
87 return DefaultEither.newB(txManager); | |
88 } | 75 } |
89 | 76 |
90 @Override | 77 @Override |
91 public long getRevision() { | 78 public long getRevision() { |
92 ChangeSet cs = tip.getChangeSet(); | 79 return tip.revision(); |
93 return cs.revision(); | |
94 } | 80 } |
95 | 81 |
96 @Override | 82 @Override |
97 public String getUUID() { | 83 public String getUUID() { |
98 return uuid; | 84 return uuid; |