view src/main/java/jp/ac/u_ryukyu/ie/cr/jungleNetwork/persistent/TransactionManager/PersistentTransactionManager.java @ 329:2a0cb1f0ba4e

rename Error package
author kono
date Sat, 08 Jul 2017 21:05:55 +0900
parents d6b81870216b
children
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.TransactionManager;


import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List;
import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter;
import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.InterfaceTraverser;
import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext;
import jp.ac.u_ryukyu.ie.cr.jungle.store.logger.DefaultTreeOperationLog;
import jp.ac.u_ryukyu.ie.cr.jungle.store.logger.TreeOperationLog;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.manager.TransactionManager;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.DefaultInterfaceTraverser;
import jp.ac.u_ryukyu.ie.cr.jungle.tree.TreeType;
import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.DefaultError;
import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.Error;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.PersistentChangeList;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.treeContext.PersistentTreeContext;

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;
    private final int bufferSize;

    public PersistentTransactionManager(String _treeName, ChangeListWriter _writer, TreeContext _tip, AtomicReference<TreeContext> _repository, String _uuid, int _bufferSize) {
        repository = _repository;
        tip = _tip;
        writer = _writer;
        uuid = _uuid;
        treeName = _treeName;
        bufferSize = _bufferSize;
    }

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

        PersistentChangeList list;
        if (_log.length() > bufferSize)
            list = new PersistentChangeList(uuid, treeName, TreeType.DEFAULT,new DefaultTreeOperationLog());
        else
            list = new PersistentChangeList(uuid, treeName,TreeType.DEFAULT, _log);

        InterfaceTraverser traverser = new DefaultInterfaceTraverser(_newRoot, false);
        traverser.createIndex();
        PersistentTreeContext newContext = new PersistentTreeContext(_newRoot, tip, list, uuid, treeName, nextRevision, traverser);

        if (repository.compareAndSet(newContext.prev(), newContext)) {
            if (_log.length() > bufferSize) {
                PersistentChangeList writeList = new PersistentChangeList(uuid, treeName,TreeType.DEFAULT, _log);
                writer.write(writeList);
            }
            TransactionManager txManager = new PersistentTransactionManager(treeName, writer, newContext, repository, uuid, bufferSize);
            return DefaultEither.newB(txManager);
        }

        return DefaultEither.newA((Error) new DefaultError());

    }

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

        PersistentChangeList list;
        list = new PersistentChangeList(uuid, treeName,TreeType.DEFAULT ,new DefaultTreeOperationLog());
        InterfaceTraverser traverser = new DefaultInterfaceTraverser(_newRoot, false);
        traverser.createIndex();
        PersistentTreeContext newContext = new PersistentTreeContext(_newRoot, tip, list, uuid, treeName, nextRevision, traverser);
        if (repository.compareAndSet(newContext.prev(), newContext)) {
            PersistentChangeList writeList = new PersistentChangeList(uuid, treeName,TreeType.DEFAULT, _log);
            writer.write(writeList);
            TransactionManager txManager = new PersistentTransactionManager(treeName, writer, newContext, repository, uuid, bufferSize);
            return DefaultEither.newB(txManager);
        }

        return DefaultEither.newA((Error) new DefaultError());

    }

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

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


}