view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java @ 25:1b448f9249ee

mark
author Shoshi TAMAKI
date Sun, 13 Jan 2013 20:52:19 +0900
parents 3ef2a66a8c5d
children 075d6418e359
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger;

import java.util.Iterator;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
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.IterableWrapper;

public class LoggingChildren implements EditableChildren
{
	private final EditableChildren wrap;
	private final Logger log;
	
	public LoggingChildren(EditableChildren _wrap,Logger _log)
	{
		wrap = _wrap;
		log = _log;
	}

	@Override
	public int size()
	{
		return wrap.size();
	}

	@Override
	public Iterator<Node> iterator()
	{
		IterableWrapper<Node> wrapper = new IterableWrapper<Node>(this);
		return wrapper.iterator();
	}

	@Override
	public Either<Error,EditableNode> addNewChildAt(final int _pos)
	{
		Either<Error,EditableNode> either = wrap.addNewChildAt(_pos);
		if(either.isA()){
			return either;
		}
		
		Operation opAddChild = new AppendChildAtOperation(){
			@Override
			public int position(){
				return _pos;
			}
		};
		
		Logger newLog = log.add(opAddChild);
		EditableNode newWrap = either.b();
		EditableNode newLoggingNode = new LoggingNode(newWrap,newLog);
		
		return DefaultEither.newB(newLoggingNode);
	}

	@Override
	public Either<Error,EditableNode> deleteChildAt(final int _pos)
	{
		Either<Error,EditableNode> either = wrap.deleteChildAt(_pos);
		if(either.isA()){
			return either;
		}
		
		Operation opDeleteChild = new DeleteChildAtOperation(){
			@Override
			public int position(){
				return _pos;
			}
		};
		
		Logger newLog = log.add(opDeleteChild);
		EditableNode newLoggingNode = new LoggingNode(either.b(),newLog);
		
		return DefaultEither.newB(newLoggingNode);
	}
}