view src/main/java/alice/jungle/persistent/PersistentTransactionManager.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.persistent;


import fj.data.TreeMap;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
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.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;

import java.util.concurrent.atomic.AtomicReference;

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

	public PersistentTransactionManager(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;

    PersistentChangeList list = new PersistentChangeList(uuid, treeName, _log);
    InterfaceTraverser traverser = new InterfaceTraverser(_newRoot,false);
    traverser.createIndex();
    TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = traverser.getIndex();
    ParentIndex parentIndex = traverser.getParentIndex();
	PersistentTreeContext newContext = new PersistentTreeContext(_newRoot, tip, list, uuid, treeName, nextRevision, index, parentIndex.getParentIndex());

        if  (repository.compareAndSet(newContext.prev(),newContext)) {
            TransactionManager txManager = new PersistentTransactionManager(treeName, writer, newContext, 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;
	}
	
	
	
}