Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java @ 41:ed6737db637a
added tests
author | Shoshi TAMAKI |
---|---|
date | Tue, 29 Jan 2013 23:42:54 +0900 |
parents | 35e327577b58 |
children | 0a3bff2d9c89 |
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.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.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>> { private final ClonableChildren<T> wrap; private final Logger log; public LoggingChildren(ClonableChildren<T> _wrap,Logger _log) { wrap = _wrap; log = _log; } @Override public int size() { return wrap.size(); } @Override public Iterator<LoggingNode<T>> iterator() { IterableConverter.Converter<LoggingNode<T>,T> converter = new IterableConverter.Converter<LoggingNode<T>,T>(){ @Override public LoggingNode<T> conv(T _b) { return new LoggingNode<T>(_b,log); } }; IterableConverter<LoggingNode<T>,T> iterable = new IterableConverter<LoggingNode<T>,T>(wrap,converter); return iterable.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); } @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)); } @Override public Either<Error,LoggingNode<T>> at(int _pos) { Either<Error,T> either = wrap.at(_pos); if(either.isA()){ return DefaultEither.newA(either.a()); } 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); } }