view src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/manager/DefaultTransactionManager.java @ 320:e3e4ffd746cb

commit
author tatsuki
date Tue, 07 Feb 2017 21:34:21 +0900
parents 5c4f8a7b4468
children 2a0cb1f0ba4e
line wrap: on
line source

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


import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List;
import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList;
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.index.Index;
import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex;
import jp.ac.u_ryukyu.ie.cr.jungle.store.logger.TreeOperationLog;
import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.context.DefaultTreeContext;
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.Error.DefaultError;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error;

import java.util.Iterator;
import java.util.concurrent.atomic.AtomicReference;

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

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


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

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

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

            @Override
            public int getTreeType() {
                return TreeType.DEFAULT;
            }
            @Override
            public TreeOperationLog getLog() {
                return _log;
            }

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

        };

        Index index = tip.getIndex();
        ParentIndex parentIndex = tip.getParentIndex();
        InterfaceTraverser traverser = new DefaultInterfaceTraverser(newRoot, index, parentIndex, true);
        //traverser.updateIndex(editNodeList);
        traverser.createIndex();
        TreeContext newTreeContext = new DefaultTreeContext(newRoot, tip, list, uuid, _treeName, nextRevision, traverser);

        if (repository.compareAndSet(newTreeContext.prev(), newTreeContext)) {
            TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid);
            return DefaultEither.newB(txManager);
        }

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

    @Override
    public Either<Error, TransactionManager> flashCommit(TreeNode _newRoot, TreeOperationLog _log) {
        return null;//commit(_newRoot, _log);
    }

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

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