view 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
line wrap: on
line source

package alice.jungle.transaction;

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.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.DefaultTreeContext;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager;
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.ParentIndex;

public class NetworkTransactionManager implements TransactionManager {
  private final AtomicReference<TreeContext> repository;
  private final TreeContext tip;
  private final ChangeListWriter writer;
  private final String uuid;
  private final String treeName;

  public NetworkTransactionManager(String _treeName, ChangeListWriter _writer, TreeContext _tip,
      AtomicReference<TreeContext> _repository, String _uuid) {
    repository = _repository;
    tip = _tip;
    writer = _writer;
    uuid = _uuid;
    treeName = _treeName;
  }

  @Override
  public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) {
    long currentRevision = tip.revision();
    long nextRevision = currentRevision + 1;

    ChangeList list = new ChangeList() {
      @Override
      public Iterator<TreeOperation> iterator() {
        return _log.iterator();
      }

      @Override
      public String uuid() {
        return uuid;
      }

      @Override
      public String getTreeName() {
        return treeName;
      }
    };

      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());


      if  (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) {
          TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newTreeContext, repository, uuid);
          return DefaultEither.newB(txManager);
      }

      return DefaultEither.newA((Error) new DefaultError());

  }

  @Override
  public long getRevision() {
    return tip.revision();
  }

  @Override
  public String getUUID() {
    return uuid;
  }

}