view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java @ 38:cb9fabaedfd4

added tests and changed testing provider to junit47
author Shoshi TAMAKI
date Mon, 28 Jan 2013 18:52:52 +0900
parents 35e327577b58
children fb00d7b147c8
line wrap: on
line source

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

import java.nio.ByteBuffer;

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.store.NodePath;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.Logger;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser;
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;

public class DefaultJungleTreeEditor implements JungleTreeEditor<DefaultJungleTreeEditor>
{
	private final TransactionManager txManager;
	private final DefaultNode root;
	private final DefaultTreeEditor<LoggingNode<ClonableDefaultNode>> editor;
	private final Traverser traverser;

	public DefaultJungleTreeEditor(DefaultNode _root,TransactionManager _txManager,Traverser _traverser)
	{
		root = _root;
		txManager = _txManager;
		ClonableDefaultNode node = new ClonableDefaultNode(root);
		LoggingNode<ClonableDefaultNode> loggingNode = new LoggingNode<ClonableDefaultNode>(node);
		editor = new DefaultTreeEditor<LoggingNode<ClonableDefaultNode>>(loggingNode,_traverser);
		traverser = _traverser;
	}
	
	@Override
	public Either<Error,DefaultJungleTreeEditor> appendChild(NodePath _path, int _pos)
	{
		Either<Error,DefaultTreeEditor<LoggingNode<ClonableDefaultNode>>> either = editor.appendChild(_path,_pos);
		if(either.isA()){
			return DefaultEither.newA(either.a());
		}
		
		DefaultTreeEditor<LoggingNode<ClonableDefaultNode>> newTreeEditor = either.b();
		DefaultNode newRoot = newTreeEditor.getRootNode().getWrapper().getWrapped();
		
		return DefaultEither.newB(new DefaultJungleTreeEditor(newRoot,txManager,traverser));
	}

	@Override
	public Either<Error,DefaultJungleTreeEditor> deleteChild(NodePath _path, int _pos)
	{
		Either<Error,DefaultTreeEditor<LoggingNode<ClonableDefaultNode>>> either = editor.deleteChild(_path,_pos);
		if(either.isA()){
			return DefaultEither.newA(either.a());
		}
		
		DefaultTreeEditor<LoggingNode<ClonableDefaultNode>> newTreeEditor = either.b();
		DefaultNode newRoot = newTreeEditor.getRootNode().getWrapper().getWrapped();
		
		return DefaultEither.newB(new DefaultJungleTreeEditor(newRoot,txManager,traverser));
	}

	@Override
	public Either<Error,DefaultJungleTreeEditor> putAttribute(NodePath _path,String _key,ByteBuffer _value)
	{
		Either<Error,DefaultTreeEditor<LoggingNode<ClonableDefaultNode>>> either = editor.putAttribute(_path,_key,_value);
		if(either.isA()){
			return DefaultEither.newA(either.a());
		}
		
		DefaultTreeEditor<LoggingNode<ClonableDefaultNode>> newTreeEditor = either.b();
		DefaultNode newRoot = newTreeEditor.getRootNode().getWrapper().getWrapped();
		
		return DefaultEither.newB(new DefaultJungleTreeEditor(newRoot,txManager,traverser));
	}

	@Override
	public Either<Error,DefaultJungleTreeEditor> deleteAttribute(NodePath _path, String _key)
	{
		Either<Error,DefaultTreeEditor<LoggingNode<ClonableDefaultNode>>> either = editor.deleteAttribute(_path,_key);
		if(either.isA()){
			return DefaultEither.newA(either.a());
		}
		
		DefaultTreeEditor<LoggingNode<ClonableDefaultNode>> newTreeEditor = either.b();
		DefaultNode newRoot = newTreeEditor.getRootNode().getWrapper().getWrapped();
		
		return DefaultEither.newB(new DefaultJungleTreeEditor(newRoot,txManager,traverser));
	}

	@Override
	public Either<Error,DefaultJungleTreeEditor> edit(NodePath _path,NodeEditor _transformer)
	{
		Either<Error,DefaultTreeEditor<LoggingNode<ClonableDefaultNode>>> either = editor.edit(_path,_transformer);
		if(either.isA()){
			return DefaultEither.newA(either.a());
		}
		
		DefaultTreeEditor<LoggingNode<ClonableDefaultNode>> newTreeEditor = either.b();
		DefaultNode newRoot = newTreeEditor.getRootNode().getWrapper().getWrapped();
		
		return DefaultEither.newB(new DefaultJungleTreeEditor(newRoot,txManager,traverser));
	}

	@Override
	public Either<Error,JungleTree> success()
	{
		LoggingNode<ClonableDefaultNode> loggingNode = editor.getRootNode();
		Logger log = loggingNode.getLogger();
		DefaultNode newRoot = loggingNode.getWrapper().getWrapped();
		
		Either<Error,JungleTree> either = txManager.commit(newRoot,log);
		if(either.isA()){
			return DefaultEither.newA(either.a());
		}
		
		return DefaultEither.newB(either.b());
	}

}