view src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.java @ 0:44465893e8b8

first Commit
author Kazuma
date Wed, 30 Nov 2016 01:47:55 +0900
parents
children
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.jungle.transaction;


import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter;
import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext;
import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog;
import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation;
import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList;
import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser;
import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;

import java.util.Iterator;
import java.util.concurrent.atomic.AtomicReference;

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

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

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

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

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

        @Override
        public TreeOperationLog getLog() {
            return _log;
        }

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

    };

    InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true);
    traverser.createIndex();
    TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,traverser);

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

    return DefaultEither.newA((jp.ac.u_ryukyu.ie.cr.jungle.util.Error) new DefaultError());
  }

    @Override
    public Either<Error, TransactionManager> flashCommit(TreeNode _newRoot, TreeOperationLog _log) {
        return commit(_newRoot,_log);
    }
    
  @Override
  public String getUUID() {
    return uuid;
  }

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