view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java @ 172:809f813d1083

minner change
author one
date Tue, 10 Feb 2015 11:28:39 +0900
parents 3cd075a445bf
children a2598139df64 e26462a38ce0
line wrap: on
line source

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


import java.util.Iterator;

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.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.Index;
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 TreeContext tip;
  private final ChangeListWriter writer;
  private final String uuid;

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

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

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

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

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

    };

    IndexManager indexManager = new IndexManager(repository.getReservation());
    InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true);
    traverser.createIndex();
    Index index = traverser.getIndex();
    ParentIndex parentIndex = traverser.getParentIndex();
    DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, _treeName, nextRevision, index.getIndex(),
        parentIndex.getParentIndex());
    DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs);

    @SuppressWarnings("rawtypes")
    Reservation reservation = repository.makeReservation(tip, newContext);
    if (reservation == null) {
      return DefaultEither.newA((Error) new DefaultError());
    }
    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());
  }

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

  @Override
  public long getRevision() {
    ChangeSet cs = tip.getChangeSet();
    return cs.revision();
  }
}