view src/main/java/jp/ac/u_ryukyu/ie/cr/jungleNetwork/transaction/NetworkDefaultJungleTree.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.transaction;


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.nodepath.DefaultNodePath;
import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath;
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.node.TreeNode;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNodeChildren;
import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.DefaultInterfaceTraverser;
import jp.ac.u_ryukyu.ie.cr.jungle.tree.DefaultJungleTree;
import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
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.Error;
import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.GetOldTreeError;

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

public class NetworkDefaultJungleTree implements JungleTree {
	private final AtomicReference<TreeContext> repository;
	private final String uuid;
	private final String treeName;
	private final ChangeListWriter writer;
	private final TreeEditor editor;
    private final int type = TreeType.DEFAULT;;
    private int bufferSize;

	public NetworkDefaultJungleTree(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 getJungleTreeEditor()
	{
		TreeContext tc = repository.get();
		NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid);
		TreeNode root = tc.getRoot();
		return new NetworkDefaultJungleTreeEditor(treeName,type, root,txManager,editor);
	}
	
	@Override
	public JungleTreeEditor getLocalJungleTreeEditor()
	{
		TreeContext tc = repository.get();
		NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid);
		TreeNode root = tc.getRoot();
		return NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName,type,root,txManager, editor);
	}
	
	@Override
	public TreeNode getRootNode()
	{
		TreeContext tc = repository.get();
		return tc.getRoot();
	}

  @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 Index getIndex() {
    TreeContext tc = repository.get();
    return tc.getIndex();
  }

  @Override
  public InterfaceTraverser getTraverser(boolean useIndex) {
    Index index = getIndex();
    ParentIndex parentIndex = getParentIndex();
    return new DefaultInterfaceTraverser(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);
  }

    @Override
    public void setBufferSize(int _bufferSize) {
        bufferSize = _bufferSize;
    }

    @Override
    public NodePath getNodePath(TreeNode node) {
        ParentIndex parentIndex = getParentIndex();
        DefaultNodePath path = new DefaultNodePath();
        Optional<TreeNode> parentOp = parentIndex.get(node);
        while(parentOp.isPresent()) {
            TreeNode parent = parentOp.get();
            TreeNodeChildren children = parent.getChildren();
            int num = 0;
            for (TreeNode child : children) {
                if (child == node)
                    break;
                num++;
            }
            path = path.add(num);
            node = parent;
            parentOp = parentIndex.get(node);
        }
        return path;
    }
}