view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java @ 48:962cf4e208a1

mark
author Shoshi TAMAKI
date Fri, 08 Feb 2013 00:32:38 +0900
parents fb00d7b147c8
children 650fe2a0dccc
line wrap: on
line source

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

import java.util.Iterator;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
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;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter.Converter;

public class DefaultJungleTree implements JungleTree
{
	private final AtomicReservableReference<DefaultChangeSet> repository;
	private final String uuid;
	private final ChangeListWriter writer;
	
	public DefaultJungleTree(DefaultChangeSet _set,String _uuid,ChangeListWriter _writer)
	{
		repository = new AtomicReservableReference<DefaultChangeSet>(_set);
		uuid = _uuid;
		writer = _writer;
	}

	@Override
	public DefaultJungleTreeEditor getTreeEditor()
	{
		DefaultChangeSet tip = repository.get();
		DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tip,repository,uuid);
		DefaultNode root = tip.getRoot();
		return new DefaultJungleTreeEditor(root,txManager,new DefaultTraverser());
	}

	@Override
	public Node getRootNode()
	{
		ChangeSet set = repository.get();
		return set.getRoot();
	}
	
	public static class NodeWrapper<T extends Parent<T> & AttributesContainer> implements Node
	{
		private final T wrap;
		
		public NodeWrapper(T _wrap)
		{
			wrap = _wrap;
		}

		@Override
		public Attributes getAttributes()
		{
			return wrap.getAttributes();
		}

		@Override
		public Children<Node> getChildren()
		{
			Children<T> children = wrap.getChildren();
			return new ChildrenWrapper<T>(children);
		}
		
		public static class ChildrenWrapper<T extends Parent<T> & AttributesContainer> implements Children<Node>
		{
			private Children<T> wrap;
			
			public ChildrenWrapper(Children<T> _wrap)
			{
				wrap = _wrap;
			}

			@Override
			public Iterator<Node> iterator()
			{
				Converter<Node,T> converter = new IterableConverter.Converter<Node,T>(){
					@Override
					public Node conv(T _b){
						return new NodeWrapper<T>(_b);
					}
				};
				
				IterableConverter<Node,T> iterable = new IterableConverter<Node,T>(wrap,converter);
				return iterable.iterator();
			}

			@Override
			public Either<Error,Node> at(int _pos)
			{
				Either<Error,T> either = wrap.at(_pos);
				if(either.isA()){
					return DefaultEither.newA(either.a());
				}
				T node = either.b();
				Node wrapper = new NodeWrapper<T>(node);
				return DefaultEither.newB(wrapper);
			}

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