view src/main/java/alice/jungle/persistent/PersistentTransactionManager.java @ 194:fd4064e110bd fjTreeMap

change TreeContext
author tatsuki
date Mon, 23 Mar 2015 16:18:47 +0900
parents 89c15aa2bc6d
children
line wrap: on
line source

package alice.jungle.persistent;


import fj.data.List;
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();
        PersistentTreeContext newContext = new PersistentTreeContext(_newRoot, tip, list, uuid, treeName, nextRevision, traverser);

        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;
    }


}