view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java @ 163:7be56a1be5d9

modification index
author one
date Mon, 08 Dec 2014 10:49:53 +0900
parents 38068be4fa4c
children 6615db346bf5
line wrap: on
line source

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

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
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);
    long t1 = System.currentTimeMillis();
    traverser.createIndex();
    long t2 = System.currentTimeMillis();
    System.out.println("createIndexTime = " + (t2 - t1));
    File file = new File("./time/createParentIndexFunctionalJava");
    try {
        PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file,true)));
        pw.println(t2 - t1);
        pw.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    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();
  }
}