view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java @ 31:418088ca2b30

added Generics parameters to EditableNode framework
author Shoshi TAMAKI
date Wed, 16 Jan 2013 03:23:57 +0900
parents 5f4172d6fb8b
children cf958638a471
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<T extends EditableNode<T>>
	implements EditableChildren<LoggingNode<T>>
{
	private final EditableChildren<T> wrap;
	private final Logger log;
	
	public LoggingChildren(EditableChildren<T> _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,LoggingNode<T>> addNewChildAt(final int _pos)
	{
		Either<Error,T> either = wrap.addNewChildAt(_pos);
		if(either.isA()){
			return DefaultEither.newA(either.a());
		}
		
		Operation opAddChild = new AppendChildAtOperation(){
			@Override
			public int position(){
				return _pos;
			}
		};
		
		Logger newLog = log.add(opAddChild);
		T newWrap = either.b();
		LoggingNode<T> newLoggingNode = new LoggingNode<T>(newWrap,newLog);
		
		return DefaultEither.newB(newLoggingNode);
	}

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