view src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/tree/DifferenceListJungleTree.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.jungle.tree;


import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter;
import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.DifferenceJungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.treeEditor.TreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.manager.DifferenceTransactionManager;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.manager.TransactionManager;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.Differencial.DifferencialTreeNode;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
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.Error;
import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.GetOldTreeError;

import java.util.concurrent.atomic.AtomicReference;

public class DifferenceListJungleTree extends DefaultJungleTree {
    public DifferenceListJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) {
        super(tc, uuid, writer, editor);
    }

    @Override
    public JungleTreeEditor getJungleTreeEditor() {
        AtomicReference<TreeContext> repository = super.getRepository();
        TreeContext tc = repository.get();
        ChangeListWriter writer = super.getWriter();
        String uuid = super.getUuid();
        TreeEditor treeEditor = super.getTreeEditor();
        TransactionManager txManager = new DifferenceTransactionManager(writer, tc, repository, uuid);
        TreeNode subTreeRoot = new DifferencialTreeNode();
        return new DifferenceJungleTreeEditor(subTreeRoot, txManager, treeEditor);
    }

    @Override
    public Either<Error, JungleTree> getOldTree(long revision) {
        AtomicReference<TreeContext> repository = super.getRepository();
        TreeContext tc = repository.get();

        for (; tc.revision() != revision; ) {
            tc = tc.prev();
            if (tc == null)
                return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND);
        }
        String uuid = super.getUuid();
        String oldTreeUuid = uuid + revision;
        ChangeListWriter writer = super.getWriter();
        TreeEditor treeEditor = super.getTreeEditor();
        JungleTree oldTree = new DifferenceListJungleTree(tc, oldTreeUuid, writer, treeEditor);
        return DefaultEither.newB(oldTree);
    }

    //test用 method キャストして使ってね
    public TreeNode getEndNode() {
        AtomicReference<TreeContext> repository = super.getRepository();
        TreeContext tc = repository.get();
        return tc.getEndNode();
    }
}