diff src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java @ 179:817febd9c69b

change transaction
author tatsuki
date Tue, 17 Mar 2015 11:19:04 +0900
parents 550f51183d8a
children 7282ee629af3 67d4c68578cf
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Sun Mar 15 20:52:15 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Tue Mar 17 11:19:04 2015 +0900
@@ -2,32 +2,30 @@
 
 
 import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
 
 import fj.data.TreeMap;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
-import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
 public class DefaultTransactionManager implements TransactionManager {
-  private final AtomicReservableReference<TreeContext> repository;
+  private final AtomicReference<TreeContext> repository;
   private final TreeContext tip;
   private final ChangeListWriter writer;
   private final String uuid;
 
   public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip,
-      AtomicReservableReference<TreeContext> _repository, String _uuid) {
+      AtomicReference<TreeContext> _repository, String _uuid) {
     repository = _repository;
     tip = _tip;
     writer = _writer;
@@ -35,12 +33,11 @@
   }
 
   @Override
-  public Either<Error, TransactionManager> commit(TreeNode _newRoot, final TreeOperationLog _log) {
-    ChangeSet cs = tip.getChangeSet();
-    long currentRevision = cs.revision();
+  public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) {
+    long currentRevision = tip.revision();
     long nextRevision = currentRevision + 1;
 
-    final String _treeName = cs.getTreeName();
+    final String _treeName = tip.getTreeName();
     ChangeList list = new ChangeList() {
       @Override
       public Iterator<TreeOperation> iterator() {
@@ -58,26 +55,19 @@
       }
 
     };
-    IndexManager indexManager = new IndexManager(repository.getReservation());
-    InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true);
-    traverser.createIndex();
-    TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = traverser.getIndex();
-    ParentIndex parentIndex = traverser.getParentIndex();
-    DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, _treeName, nextRevision, index, parentIndex.getParentIndex());
-    DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs);
+    System.out.println("transaction");
+      InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true);
+      traverser.createIndex();
+      TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = traverser.getIndex();
+      ParentIndex parentIndex = traverser.getParentIndex();
+      TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,index,parentIndex.getParentIndex());
 
-    @SuppressWarnings("rawtypes")
-    Reservation reservation = repository.makeReservation(tip, newContext);
-    if (reservation == null) {
-      return DefaultEither.newA((Error) new DefaultError());
+    if  (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) {
+        TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid);
+        return DefaultEither.newB(txManager);
     }
-    Result r = writer.write(list);
-    if (r == Result.SUCCESS) {
-      reservation.confirm();
-      TransactionManager txManager = new DefaultTransactionManager(writer, newContext, repository, uuid);
-      return DefaultEither.newB(txManager);
-    }
-    return DefaultEither.newA((Error) new DefaultError());
+
+      return DefaultEither.newA((Error) new DefaultError());
   }
 
   @Override
@@ -87,7 +77,6 @@
 
   @Override
   public long getRevision() {
-    ChangeSet cs = tip.getChangeSet();
-    return cs.revision();
+    return tip.revision();
   }
 }