view src/treecms/proto/simple/SimpleNode.java @ 33:c0a0fa870e6e

commit again
author shoshi
date Fri, 19 Nov 2010 15:31:42 +0900
parents 02ef906d0341
children 9663c816e370
line wrap: on
line source

package treecms.proto.simple;

import java.util.Iterator;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.LinkedList;
import treecms.proto.api.Node;
import treecms.proto.api.NodeID;
import treecms.proto.id.IncrementalNodeID;

public class SimpleNode implements Node
{
	private CopyOnWriteArrayList<Node> m_children;
	
	private NodeID m_id;
	private String m_title,m_class;
	
	public SimpleNode()
	{
		this(new IncrementalNodeID());
	}
	
	private SimpleNode(NodeID _id)
	{
		m_children = new CopyOnWriteArrayList<Node>();
		
		m_id = _id;
		m_title = "";
		m_class = "";
	}
	
	@Override
	public List<Node> getChildren()
	{
		// return unmodifiable list<node>
		return Collections.unmodifiableList(m_children);
	}

	@Override
	public boolean isChild(Node _child)
	{
		return m_children.contains(_child);
	}

	@Override
	public Node addChild(Node _child)
	{
		if(m_children.addIfAbsent(_child)){
			return _child;
		}
		return null;
	}

	@Override
	public boolean removeChild(Node _child)
	{
		return m_children.remove(_child);
	}

	@Override
	public Iterator<Node> iterator()
	{
		// return unmodifiable iterator
		return m_children.iterator();
	}
	
	@Override
	public NodeID getID()
	{
		return this.m_id;
	}

	@Override
	public void addChildren(List<Node> _children)
	{
		this.m_children.addAllAbsent(_children);
	}


	@Override
	public Node cloneNode()
	{
		SimpleNode clone = new SimpleNode(m_id.update());
		clone.setTitle(getTitle());
		clone.setClassName(getClassName());
		clone.addChildren(m_children);
		return clone;
	}

	@Override
	public String getTitle()
	{
		return m_title;
	}

	@Override
	public void setTitle(String _title)
	{
		m_title = _title;
	}

	@Override
	public String getClassName()
	{
		return m_class;
	}

	@Override
	public void setClassName(String _class)
	{
		m_class = _class;
	}

	@Override
	public void down(Node _child)
	{
		LinkedList<Node> children = new LinkedList<Node>();
		
		//copy and build new list
		Iterator<Node> itr = iterator();
		while(itr.hasNext()){
			Node next = itr.next();
			if(next == _child && itr.hasNext()){
				Node target = itr.next();
				children.add(target);
			}
			children.add(next);
		}
		
		m_children = new CopyOnWriteArrayList<Node>(children);
	}

	@Override
	public void replace(Node _target, Node _newChild)
	{
		Node target = _target;
		LinkedList<Node> children = new LinkedList<Node>();
		
		for(Node child : m_children){
			if(child == target){
				children.add(_newChild);
				target = _newChild;
				continue;
			}
			children.add(child);
		}
		
		m_children = new CopyOnWriteArrayList<Node>(children);
	}

	@Override
	public void up(Node _child)
	{
		LinkedList<Node> children = new LinkedList<Node>();
		
		//copy and build new list
		Iterator<Node> itr = iterator();
		while(itr.hasNext()){
			Node next = itr.next();
			if(next == _child && !children.isEmpty()){
				Node target = children.removeLast();
				children.add(next);
				children.add(target);
				continue;
			}
			children.add(next);
		}
		
		m_children = new CopyOnWriteArrayList<Node>(children);
	}
	
	public String toString()
	{
		return getTitle()+"["+getID().toString()+"]";
	}

	@Override
	public void clearChildren()
	{
		m_children.clear();
	}
}