view src/main/java/alice/jungle/transaction/NetworkTransactionManager.java @ 191:5d0734fd859d

fix error
author tatsuki
date Thu, 15 Jan 2015 09:23:23 +0900
parents 4493dd7692ce
children 89c15aa2bc6d
line wrap: on
line source

package alice.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;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
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.transaction.TreeContext;
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 NetworkTransactionManager implements TransactionManager {

  private final AtomicReservableReference<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,
      AtomicReservableReference<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) {
    ChangeSet cs = tip.getChangeSet();
    long currentRevision = cs.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;
      }
    };

    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) {
      return DefaultEither.newA((Error) new DefaultError());
    }
    reservation.confirm();
    TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newContext, repository, uuid);
    return DefaultEither.newB(txManager);
  }

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

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

}