diff src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java @ 51:bc119c52d5cc

modified LoggingNode package
author Shoshi TAMAKI
date Fri, 08 Feb 2013 02:21:00 +0900
parents 0a3bff2d9c89
children 8c6ff361b68a
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java	Fri Feb 08 01:51:04 2013 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java	Fri Feb 08 02:21:00 2013 +0900
@@ -1,22 +1,22 @@
 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.store.impl.ClonableChildren;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableNode;
 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.operations.NodeOperation;
+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.IterableConverter;
 
-public class LoggingChildren<T extends ClonableNode<T>> implements ClonableChildren<LoggingNode<T>>
+public class LoggingChildren<T extends EditableNode<T>> implements EditableChildren<LoggingNode<T>>
 {
-	private final ClonableChildren<T> wrap;
-	private final DefaultOperationLog log;
+	private final T wrap;
+	private final OperationLog log;
 	
-	public LoggingChildren(ClonableChildren<T> _wrap,DefaultOperationLog _log)
+	public LoggingChildren(T _wrap,OperationLog _log)
 	{
 		wrap = _wrap;
 		log = _log;
@@ -25,12 +25,15 @@
 	@Override
 	public int size()
 	{
-		return wrap.size();
+		EditableChildren<T> children = wrap.getChildren();
+		return children.size();
 	}
 	
 	@Override
 	public Iterator<LoggingNode<T>> iterator()
 	{
+		EditableChildren<T> children = wrap.getChildren();
+		
 		IterableConverter.Converter<LoggingNode<T>,T> converter = new IterableConverter.Converter<LoggingNode<T>,T>(){
 			@Override
 			public LoggingNode<T> conv(T _b) {
@@ -38,70 +41,42 @@
 			}
 		};
 		
-		IterableConverter<LoggingNode<T>,T> iterable = new IterableConverter<LoggingNode<T>,T>(wrap,converter);
+		IterableConverter<LoggingNode<T>,T> iterable = new IterableConverter<LoggingNode<T>,T>(children,converter);
 		return iterable.iterator();
 	}
 	
+	public Either<Error,LoggingNode<T>> edit(NodeOperation _op)
+	{
+		Either<Error,T> either = _op.invoke(wrap);
+		if(either.isA()){
+			return DefaultEither.newA(either.a());
+		}
+		
+		T newWrap = either.b();
+		OperationLog newLog = log.add(_op);
+		LoggingNode<T> newLoggingNode = new LoggingNode<T>(newWrap,newLog);
+		return DefaultEither.newB(newLoggingNode);
+	}
+	
 	@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);
+		NodeOperation addNewChildAt = new AppendChildAtOperation(_pos);
+		return edit(addNewChildAt);
 	}
 
 	@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);
-	}
-
-	@Override
-	public Either<Error,LoggingNode<T>> replaceNode(int _pos,LoggingNode<T> _replacement)
-	{
-		T target = _replacement.getWrapper();
-		Either<Error,T> e = wrap.replaceNode(_pos,target);
-		if(e.isA()){
-			return DefaultEither.newA(e.a());
-		}
-			
-		T newWrap = e.b();
-		return DefaultEither.newB(new LoggingNode<T>(newWrap,log));
+		NodeOperation deleteChildAt = new DeleteChildAtOperation(_pos);
+		return edit(deleteChildAt);
 	}
 
 	@Override
 	public Either<Error,LoggingNode<T>> at(int _pos)
 	{
-		Either<Error,T> either = wrap.at(_pos);
+		EditableChildren<T> children = wrap.getChildren();
+		Either<Error,T> either = children.at(_pos);
 		if(either.isA()){
 			return DefaultEither.newA(either.a());
 		}
@@ -109,17 +84,4 @@
 		T newWrap = either.b();
 		return DefaultEither.newB(new LoggingNode<T>(newWrap,log));
 	}
-
-	@Override
-	public Either<Error, LoggingNode<T>> addNewChildAt(int _pos,LoggingNode<T> _newChild)
-	{
-		Either<Error,T> either = wrap.addNewChildAt(_pos,_newChild.getWrapper());
-		if(either.isA()){
-			return DefaultEither.newA(either.a());
-		}
-		
-		T newWrap = either.b();
-		LoggingNode<T> newLoggingNode = new LoggingNode<T>(newWrap,log);
-		return DefaultEither.newB(newLoggingNode);
-	}
 }