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

change TreeContext
author tatsuki
date Mon, 23 Mar 2015 16:18:47 +0900
parents 89c15aa2bc6d
children 82698be06c6c
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.DefaultJungleTree;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor;
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.Either;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.GetOldTreeError;
import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;

import java.util.concurrent.atomic.AtomicReference;

public class PersistentJungleTree implements JungleTree {
	private final AtomicReference<TreeContext> repository;
	private final String uuid;
	private final String treeName;
	private final ChangeListWriter writer;
	private final TreeEditor editor;

	public PersistentJungleTree(String _treeName, TreeContext _tc,String _uuid, ChangeListWriter _writer,TreeEditor _editor)
	{
		treeName = _treeName;
		repository = new AtomicReference<TreeContext>(_tc);
		uuid = _uuid;
		writer = _writer;
		editor = _editor;
	}

	@Override
	public JungleTreeEditor getTreeEditor()
	{
		TreeContext tc = repository.get();
		PersistentTransactionManager txManager = new PersistentTransactionManager(treeName, writer,tc,repository,uuid);
		TreeNode root = tc.getRoot();
		return new DefaultJungleTreeEditor(root,txManager,editor);
	}

	@Override
	public TreeNode getRootNode()
	{
		TreeContext tc = repository.get();
		return tc.getRoot();
	}

	@Override
	public JungleTreeEditor getLocalTreeEditor() {
		return getTreeEditor();
	}

  @Override
  public long revision() {
    TreeContext tc = repository.get();
    return tc.revision();
  }

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

        for (; tc.revision() != revision;) {
            tc = tc.prev();
            if (tc == null)
                return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND);
        }


        String oldTreeUuid = uuid + revision;
        JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, editor);
        return DefaultEither.newB(oldTree);
    }

  @Override
  public ParentIndex getParentIndex() {
    TreeContext tc = repository.get();
    return tc.getParentIndex();
  }

  @Override
  public TreeMap<String, TreeMap<String,List<TreeNode>>> getIndex() {
    TreeContext tc = repository.get();
    return tc.getIndex();
  }

  @Override
  public InterfaceTraverser getTraverser(boolean useIndex) {
    TreeMap<String, TreeMap<String, List<TreeNode>>> index = getIndex();
    ParentIndex parentIndex = getParentIndex();
    return new InterfaceTraverser(getRootNode(), index, parentIndex, useIndex);
  }

    @Override
    public Either<Error, TreeNode> getNodeOfPath(NodePath path) {
        TreeNode node = repository.get().getRoot();
        for (int num : path) {
            if (num == -1)
                continue;
            Either<Error, TreeNode> either = node.getChildren().at(num);
            if (either.isA())
                return either;
            node = either.b();
        }
        return DefaultEither.newB(node);
    }

}