changeset 12:c8e31aaac297

added TestMultiThread1 , seems like java.util.UUID is not thread-safe
author shoshi
date Sun, 29 Aug 2010 00:11:08 +0900
parents bb802051dab3
children 3bccd745f2e2
files src/treecms/proto/edit/EditableNodeAPI.java src/treecms/proto/edit/EditableNodeAPITreeBuilder.java src/treecms/proto/test/Test2.java src/treecms/proto/test/TestMultiThread1.java src/treecms/proto/test/UUIDTest.java
diffstat 5 files changed, 194 insertions(+), 145 deletions(-) [+]
line wrap: on
line diff
--- a/src/treecms/proto/edit/EditableNodeAPI.java	Sat Aug 28 20:39:41 2010 +0900
+++ b/src/treecms/proto/edit/EditableNodeAPI.java	Sun Aug 29 00:11:08 2010 +0900
@@ -8,144 +8,70 @@
 
 public class EditableNodeAPI implements NodeAPI
 {
-	private boolean m_flagChanged;
-	
-	private String m_class;
-	private String m_title;
-	
-	private NodeAPI m_orig;
-	
-	private LinkedList<NodeAPI> m_children;
-	
-	public EditableNodeAPI(NodeAPI _orig)
-	{
-		m_orig = _orig;
-		if(m_orig != null){
-			m_flagChanged = false;
-		}else{
-			m_flagChanged = true;
-		}
-		
-		m_children = new LinkedList<NodeAPI>();
-		m_class = "";
-		m_title = "";
-	}
-	
-	void _resetFlag()
-	{
-		m_flagChanged = false;
-	}
-	
-	public synchronized boolean setandgetChanged(boolean _flag) 
-	{
-		m_flagChanged = m_flagChanged | _flag;
-		return m_flagChanged;
-	}
-	
-	public void setOriginal(NodeAPI _orig)
-	{
-		m_orig = _orig;
-	}
-	
-	public NodeAPI getOriginal()
-	{
-		return m_orig;
-	}
-	
+
 	@Override
-	public List<NodeAPI> getChildList()
-	{
+	public Iterator<NodeAPI> iterator() {
 		// TODO Auto-generated method stub
-		if(setandgetChanged(false)){
-			return this.m_children;
-		}
-		return this.m_orig.getChildList();
+		return null;
 	}
 
 	@Override
-	public boolean isChild(NodeAPI _child)
-	{
+	public List<NodeAPI> getChildList() {
 		// TODO Auto-generated method stub
-		if(setandgetChanged(false)){
-			return m_children.contains(_child);
-		}
-		return m_orig.getChildList().contains(_child);
+		return null;
+	}
+
+	@Override
+	public boolean isChild(NodeAPI _child) {
+		// TODO Auto-generated method stub
+		return false;
 	}
 
 	@Override
 	public void addChild(NodeAPI _child) {
 		// TODO Auto-generated method stub
-		if(m_children.add(_child)){
-			setandgetChanged(true);
-		}
+		
 	}
 
 	@Override
 	public void removeChild(NodeAPI _child) {
 		// TODO Auto-generated method stub
-		if(m_children.remove(_child)){
-			setandgetChanged(true);
-		}
+		
 	}
-	
+
 	@Override
 	public void up(NodeAPI _child) {
 		// TODO Auto-generated method stub
-		int curPos = m_children.indexOf(_child);
-		if(curPos - 1 > 0){
-			m_children.add(curPos - 1,m_children.remove(curPos));
-			setandgetChanged(true);
-		}
+		
 	}
 
 	@Override
 	public void down(NodeAPI _child) {
 		// TODO Auto-generated method stub
-		int curPos = m_children.indexOf(_child);
-		if(curPos + 1 < m_children.size()){
-			m_children.add(curPos + 1,m_children.remove(curPos));
-			m_flagChanged = true;
-		}
+		
 	}
 
 	@Override
 	public void setClassName(String _class) {
 		// TODO Auto-generated method stub
-		this.m_class = _class;
-		setandgetChanged(true);
+		
 	}
 
 	@Override
 	public void setTitle(String _title) {
 		// TODO Auto-generated method stub
-		this.m_title = _title;
-		setandgetChanged(true);
+		
 	}
 
 	@Override
 	public String getClassName() {
 		// TODO Auto-generated method stub
-		if(setandgetChanged(false)){
-			return this.m_class;
-		}
-		return m_orig.getClassName();
+		return null;
 	}
 
 	@Override
 	public String getTitle() {
 		// TODO Auto-generated method stub
-		if(setandgetChanged(false)){
-			return this.m_title;
-		}
-		return m_orig.getClassName();
+		return null;
 	}
-
-	@Override
-	public Iterator<NodeAPI> iterator() {
-		// TODO Auto-generated method stub
-		if(setandgetChanged(false)){
-			return m_children.iterator();
-		}
-		return m_orig.iterator();
-	}
-}
+}
\ No newline at end of file
--- a/src/treecms/proto/edit/EditableNodeAPITreeBuilder.java	Sat Aug 28 20:39:41 2010 +0900
+++ b/src/treecms/proto/edit/EditableNodeAPITreeBuilder.java	Sun Aug 29 00:11:08 2010 +0900
@@ -8,60 +8,24 @@
 
 public class EditableNodeAPITreeBuilder implements NodeAPITreeBuilder
 {
-	private NodeAPI m_root;
-	private NodeAPI m_clone;
-	
-	public EditableNodeAPITreeBuilder(NodeAPI _root)
-	{
-		m_root = _root;
-		m_clone = clone(_root);
-	}
-	
-	private NodeAPI clone(NodeAPI _orig)
-	{
-		EditableNodeAPI clone = new EditableNodeAPI(_orig);
-		
-		List<NodeAPI> children = _orig.getChildList();
-		for(NodeAPI child : children){
-			//System.out.println(child.getTitle());
-			clone.addChild(clone(child));
-		}
-		
-		clone._resetFlag();
-		return clone;
-	}
+	private NodeAPITreeBuilder m_builder;
 	
-	public void discard()
-	{
-		//discard changes.
-		m_clone = clone(m_root);
-	}
-	
-	public void commit()
-	{
-		//commit changes
-	}
-	
-	public void push()
+	public EditableNodeAPITreeBuilder(NodeAPITreeBuilder _builder)
 	{
-		//push changes
-	}
-	
-	public String generateUUID()
-	{
-		return UUID.randomUUID().toString();
-	}
-	
-	@Override
-	public NodeAPI getContents() {
-		// TODO Auto-generated method stub
-		return this.m_clone;
+		m_builder = _builder;
 	}
 
 	@Override
-	public NodeAPI createNode() {
+	public NodeAPI getContents()
+	{
 		// TODO Auto-generated method stub
-		return new EditableNodeAPI(null);
+		return null;
 	}
 
+	@Override
+	public NodeAPI createNode()
+	{
+		// TODO Auto-generated method stub
+		return null;
+	}
 }
--- a/src/treecms/proto/test/Test2.java	Sat Aug 28 20:39:41 2010 +0900
+++ b/src/treecms/proto/test/Test2.java	Sun Aug 29 00:11:08 2010 +0900
@@ -4,10 +4,10 @@
 
 import treecms.proto.api.*;
 import treecms.proto.simple.*;
-import treecms.proto.edit.*;
+import treecms.proto.edit.type1.*;
 
 /*
- * treecms.proto.edit Test
+ * treecms.proto.edit.type2 Test
  */
 
 public class Test2
@@ -56,6 +56,7 @@
 		Iterator<NodeAPI> itr = walker.iterator();
 		while(itr.hasNext()){
 			NodeAPI node = itr.next();
+			node.setTitle(node.getTitle()+":edit");
 			System.out.println(node.getTitle());
 		}
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/test/TestMultiThread1.java	Sun Aug 29 00:11:08 2010 +0900
@@ -0,0 +1,118 @@
+package treecms.proto.test;
+
+import java.util.Iterator;
+import java.util.Random;
+
+import treecms.proto.api.NodeAPI;
+import treecms.proto.api.NodeAPITreeBuilder;
+import treecms.proto.edit.type1.*;
+import treecms.proto.simple.SimpleNodeAPITreeBuilder;
+
+public class TestMultiThread1
+{
+	public static void main(String _arg[]) throws Exception
+	{
+		new TestMultiThread1();
+	}
+	
+	public TestMultiThread1() throws Exception
+	{
+		NodeAPITreeBuilder builder = new SimpleNodeAPITreeBuilder();
+		NodeAPI root = builder.getContents();
+		root.setTitle("t");
+		
+		NodeAPI child1 = builder.createNode();
+		child1.setTitle("1");
+		NodeAPI child2 = builder.createNode();
+		child2.setTitle("2");
+		
+		root.addChild(child1);
+		root.addChild(child2);
+		
+		NodeAPI child11 = builder.createNode(); 
+		child11.setTitle("11");
+		NodeAPI child12 = builder.createNode();
+		child12.setTitle("12");
+		NodeAPI child13 = builder.createNode();
+		child13.setTitle("13");
+		
+		child1.addChild(child11);
+		child1.addChild(child12);
+		child1.addChild(child13);
+		
+		NodeAPI child21 = builder.createNode();
+		child21.setTitle("21");
+		
+		child2.addChild(child21);
+		
+		NodeAPI child211 = builder.createNode();
+		child211.setTitle("211");
+		NodeAPI child212 = builder.createNode();
+		child212.setTitle("212");
+		
+		child21.addChild(child211);
+		child21.addChild(child212);
+		
+		Thread th1 = new RenderingWorkerThread(root);
+		Thread th2 = new EditingWorkerThread(root);
+		Thread th3 = new EditingWorkerThread(root);
+		
+		th1.start();
+		th2.start();
+		th3.start();
+		
+		th1.join();
+		th2.join();
+		th3.join();
+	}
+	
+	class RenderingWorkerThread extends Thread
+	{
+		private NodeAPI m_root;
+		
+		public RenderingWorkerThread(NodeAPI _node)
+		{
+			m_root = _node;
+		}
+			
+		public void run()
+		{
+			PreOrderTreeWalker walker = new PreOrderTreeWalker(m_root);
+			for(int i = 0;i < 3;i ++){
+				String result = "";
+				Iterator<NodeAPI> itr = walker.iterator();
+				while(itr.hasNext()){
+					NodeAPI node = itr.next();
+					result += (node.getTitle() + " ");
+				}
+				System.out.println(result);
+			}
+		}
+	}
+	
+	class EditingWorkerThread extends Thread
+	{
+		private NodeAPI m_root;
+		
+		public EditingWorkerThread(NodeAPI _node)
+		{
+			m_root = _node;
+		}
+		public void run()
+		{
+			NodeAPITreeBuilder builder = new EditableNodeAPITreeBuilder(m_root);
+			PreOrderTreeWalker walker = new PreOrderTreeWalker(builder.getContents());
+			for(int i = 0;i < 3;i ++){
+				String result = "";
+				Iterator<NodeAPI> itr = walker.iterator();
+				while(itr.hasNext()){
+					NodeAPI node = itr.next();
+					if((new Random()).nextBoolean()){
+						node.setTitle("edit");
+					}
+				}
+			}
+			//
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/test/UUIDTest.java	Sun Aug 29 00:11:08 2010 +0900
@@ -0,0 +1,40 @@
+package treecms.proto.test;
+
+import java.util.*;
+
+public class UUIDTest extends Thread
+{
+	public static void main(String _args[])
+	{
+		Thread th1 = new UUIDTest();
+		Thread th2 = new UUIDTest();
+		Thread th3 = new UUIDTest();
+		Thread th4 = new UUIDTest();
+		
+		th1.start();
+		th2.start();
+		th3.start();
+		th4.start();
+		
+		try {
+			th1.join();
+			th2.join();
+			th3.join();
+			th4.join();
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	public void run()
+	{
+		for(int i = 0;i < 3;i ++){
+			try{
+				System.out.println(UUID.randomUUID().toString());
+			}catch(Exception _err){
+				_err.printStackTrace();
+			}
+		}
+	}
+}