view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/ClonableDefaultChildren.java @ 41:ed6737db637a

added tests
author Shoshi TAMAKI
date Tue, 29 Jan 2013 23:42:54 +0900
parents 7d78bbf4a9cd
children
line wrap: on
line source

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

import java.nio.ByteBuffer;
import java.util.Iterator;
import fj.P2;
import fj.data.List;
import fj.data.TreeMap;

import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableChildren;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultAttributes;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultChildren;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError;
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 ClonableDefaultChildren implements ClonableChildren<ClonableDefaultNode>
{
	public static void main(String _args[])
	{
		List<Integer> list = List.range(0,5);
		P2<List<Integer>, List<Integer>> split = list.splitAt(0);
		System.out.println(split._1().length());
		System.out.println(split._2().length());
		
	}
	
	private final DefaultNode node;
	
	public ClonableDefaultChildren(DefaultNode _node)
	{
		node = _node;
	}
	
	private boolean boundaryCheck(int _pos)
	{
		int size = node.getChildren().size();
		if(size < _pos){
			return false;
		}
		
		return true;
	}

	@Override
	public Either<Error,ClonableDefaultNode> addNewChildAt(int _pos)
	{
		if(!boundaryCheck(_pos) || _pos < 0){
			return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
		}
		
		DefaultChildren children = node.getChildren();
		DefaultAttributes attrs = node.getAttributes();
		
		List<DefaultNode> raw = children.getChildrenAsRawList();
		
		P2<List<DefaultNode>,List<DefaultNode>> split = raw.splitAt(_pos);
		List<DefaultNode> newChildren = split._1().snoc(new DefaultNode()).append(split._2());
		DefaultNode newNode = new DefaultNode(newChildren,attrs.getAttributesAsRawMap());
		
		return DefaultEither.newB(new ClonableDefaultNode(newNode));
	}

	@Override
	public Either<Error,ClonableDefaultNode> deleteChildAt(int _pos)
	{
		if(!boundaryCheck(_pos) || _pos < 0 || size() == 0){
			return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
		}
		
		DefaultChildren chs = node.getChildren();
		List<DefaultNode> raw = chs.getChildrenAsRawList();
		
		P2<List<DefaultNode>,List<DefaultNode>> split = raw.splitAt(_pos);
		//List<DefaultNode> newChildren = split._1().init().append(split._2());
		List<DefaultNode> newChildren = split._1().append(split._2().tail());
		
		DefaultAttributes attrs = node.getAttributes();
		TreeMap<String, ByteBuffer> map = attrs.getAttributesAsRawMap();
		
		DefaultNode newNode = new DefaultNode(newChildren,map);
		
		return DefaultEither.newB(new ClonableDefaultNode(newNode));
	}

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

	@Override
	public Iterator<ClonableDefaultNode> iterator()
	{
		IterableConverter.Converter<ClonableDefaultNode,DefaultNode> converter = new IterableConverter.Converter<ClonableDefaultNode,DefaultNode>(){
			@Override
			public ClonableDefaultNode conv(DefaultNode _b)
			{
				return new ClonableDefaultNode(_b);
			}
		};
		
		List<DefaultNode> raw = node.getChildren().getChildrenAsRawList();
		return new IterableConverter<ClonableDefaultNode,DefaultNode>(raw,converter).iterator();
	}

	@Override
	public Either<Error,ClonableDefaultNode> replaceNode(int _pos,ClonableDefaultNode _replacement)
	{
		int size = node.getChildren().size();
		if(!(0 <= _pos && _pos < size)){
			return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
		}
		DefaultNode replacement = _replacement.getWrapped();
		
		List<DefaultNode> rawList = node.getChildren().getChildrenAsRawList();
		P2<List<DefaultNode>,List<DefaultNode>> split = rawList.splitAt(_pos + 1);
		List<DefaultNode> init = split._1().init();
		List<DefaultNode> newInit = init.snoc(replacement);
		List<DefaultNode> newList = newInit.append(split._2());
		TreeMap<String, ByteBuffer> rawMap = node.getAttributes().getAttributesAsRawMap();
		
		return DefaultEither.newB(new ClonableDefaultNode(new DefaultNode(newList,rawMap)));
	}

	@Override
	public Either<Error,ClonableDefaultNode> at(int _pos)
	{
		List<DefaultNode> rawList = node.getChildren().getChildrenAsRawList();
		DefaultNode ch = rawList.index(_pos);
		if(ch == null){
			return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
		}
		
		return DefaultEither.newB(new ClonableDefaultNode(ch));
	}

	@Override
	public Either<Error, ClonableDefaultNode> addNewChildAt(int _pos,ClonableDefaultNode _newChild)
	{
		if(!boundaryCheck(_pos) || _pos < 0){
			return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
		}
		DefaultNode newChild = _newChild.getWrapped();
		
		List<DefaultNode> raw = node.getChildren().getChildrenAsRawList();
		TreeMap<String, ByteBuffer> rawMap = node.getAttributes().getAttributesAsRawMap();
		
		P2<List<DefaultNode>,List<DefaultNode>> split = raw.splitAt(_pos);
		List<DefaultNode> newChildren = split._1().snoc(newChild).append(split._2());
		DefaultNode newNode = new DefaultNode(newChildren,rawMap);
		
		return DefaultEither.newB(new ClonableDefaultNode(newNode));
	}
}