view src/treecms/proto/test/SimpleEditorTest2.java @ 30:8d733b98c5de

added Node API setLinkedNode,getLinkedNode for create link to other node. but not implemented yet.
author Shoshi TAMAKI
date Wed, 10 Nov 2010 00:36:51 +0900
parents 64359341c04a
children
line wrap: on
line source

package treecms.proto.test;

/**
 * SimpleEditorTest2
 * 
 * testMultiThread
 *  test concurrent monotonic-tree modification 
 */

import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

import org.junit.Test;

import treecms.proto.api.Node;
import treecms.proto.simple.SimpleEditor;
import treecms.proto.simple.SimpleNode;
import treecms.proto.util.PreOrderTreeWalker;

public class SimpleEditorTest2
{
	public static void main(String _args[])
	{
		new SimpleEditorTest2();
	}
	
	private AtomicReference<Node> m_contents;
	
	public SimpleEditorTest2()
	{
		Node root = new SimpleNode();
		root.setTitle("root");
		Node c1 = root.addChild(new SimpleNode());
		c1.setTitle("c1");
		Node c2 = root.addChild(new SimpleNode());
		c2.setTitle("c2");
		
		
		Node c11 = c1.addChild(new SimpleNode());
		c11.setTitle("c11");
		Node c12 = c1.addChild(new SimpleNode());
		c12.setTitle("c12");
		
		Node c121 = c12.addChild(new SimpleNode());
		c121.setTitle("c121");
		
		m_contents = new AtomicReference<Node>(root);
		
		testMultiThread();
	}
	
	@Test
	public void testMultiThread()
	{
		int threads = 10; //number of threads.
		final int modifyCount = 100;
		ExecutorService service = Executors.newFixedThreadPool(threads);
		
		for(int i = 0;i < threads;i ++){
			service.execute(new Runnable(){

				@Override
				public void run()
				{
					SimpleEditor editor = new SimpleEditor(m_contents);
					Random random = new Random();
					
					for(int i = 0;i < modifyCount;i ++){
						List<Node> nodeList = transform(new PreOrderTreeWalker(m_contents.get()));
						
						//get random target from nodelist
						Node target = nodeList.get(Math.abs(random.nextInt(nodeList.size())));
						
						//edit target
						editor.edit(target);
						
						//force commit.
						editor.commit(true);
					}
				}
				
				/*
				 * convert iterator to list
				 */
				public List<Node> transform(PreOrderTreeWalker _walker)
				{
					LinkedList<Node> nodeList = new LinkedList<Node>();
					for(Node node : _walker){
						nodeList.add(node);
					}
					return nodeList;
				}
			});
		}
		
		service.shutdown();
		
		try {
			service.awaitTermination(Long.MAX_VALUE,TimeUnit.DAYS);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		print(m_contents.get(),0);
	}
		
	private void print(Node _root,int _indent)
	{
		for(int i = 0;i < _indent;i ++){
			System.out.print("\t");
		}
		System.out.println(_root.getTitle()+"["+_root.getID()+"]");
		for(Node child : _root.getChildren()){
			print(child,_indent+1);
		}
	}
}