changeset 39:10359a815068

add alice.jungle.codesegment.remote
author one
date Tue, 09 Jul 2013 15:10:06 +0900
parents d8ee57a1c2c6
children 7e94de2d6bc0
files src/alice/jungle/codesegment/LogUpdateCodeSegment.java src/alice/jungle/remote/RemoteConfig.java src/jungle/test/bbs/App.java src/jungle/test/bbs/DistributeApp.java src/jungle/test/bbs/JungleBulletinBoard.java src/jungle/test/bbs/JungleManager.java src/jungle/test/bbs/NetworkJungleBulletinBoard.java src/jungle/test/codesegment/operation/JungleManager.java src/jungle/test/codesegment/operation/ShowAttribute.java src/jungle/test/codesegment/operation/StartJungleCodeSegment.java src/jungle/test/codesegment/operation/TestPutAttributeCodeSegment.java src/jungle/test/codesegment/persistence/TestJungle.java src/jungle/test/codesegment/remote/ClientCodeSegment.java src/jungle/test/codesegment/remote/ClientFirstSetKey.java src/jungle/test/codesegment/remote/HostCodeSegment.java src/jungle/test/codesegment/remote/HostFirstPut.java src/jungle/test/codesegment/remote/StartClientCodeSegment.java src/jungle/test/codesegment/remote/StartHostCodeSegment.java src/jungle/test/core/practice/LogReadCodeSegment.java src/jungle/test/core/practice/LogSendTest.java src/jungle/test/core/practice/PrintChildrenAttribute.java src/test/alice/jungle/codesegment/CopyAttrJungle2.java
diffstat 22 files changed, 450 insertions(+), 287 deletions(-) [+]
line wrap: on
line diff
--- a/src/alice/jungle/codesegment/LogUpdateCodeSegment.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/alice/jungle/codesegment/LogUpdateCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -6,6 +6,12 @@
 
 public class LogUpdateCodeSegment extends CodeSegment {
 	
+	public Receiver arg1 = ids.create(CommandType.TAKE);
+	
+	public LogUpdateCodeSegment() {
+		
+	}
+	
 	public void run() {
 		
 		
--- a/src/alice/jungle/remote/RemoteConfig.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/alice/jungle/remote/RemoteConfig.java	Tue Jul 09 15:10:06 2013 +0900
@@ -6,7 +6,7 @@
 	
 	public String hostname;
 	public int connectPort = 10000;
-	public String key;
+	public String key = "remote";
 	
 	public RemoteConfig(String[] args) {
 		super(args);
--- a/src/jungle/test/bbs/App.java	Mon Jul 08 20:25:58 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-package jungle.test.bbs;
-
-import javax.servlet.Servlet;
-
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.servlet.ServletHandler;
-import org.mortbay.jetty.servlet.ServletHolder;
-
-/**
- * Hello world!
- *
- */
-public class App 
-{
-    public static void main( String[] args ) throws Exception
-    {
-    	BulletinBoard cassaBBS = null;
-    	if(args.length == 0){
-    		cassaBBS = new JungleBulletinBoard();
-    	}else{
-    		cassaBBS = new CassandraBulletinBoard("test-cluster","localhost:9160","cassaBBS2");
-    	}
-    	
-    	
-    	String createBoardMessagePath = "/createBoardMessage";
-    	String createBoardPath = "/createBoard";
-    	String editMessagePath = "/editMessage";
-    	String showBoardMessagePath = "/showBoardMessage";
-    	
-    	Servlet createBoardMessage = new CreateBoardMessageServlet(cassaBBS);
-    	Servlet createBoard = new CreateBoardServlet(cassaBBS);
-    	Servlet editBoardMessage = new EditMessageServlet(cassaBBS);
-    	Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath);
-    	Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath);
-    	
-    	Server serv = new Server(8080);
-    	ServletHandler context = new ServletHandler();
-    	context.addServletWithMapping(new ServletHolder(createBoardMessage),createBoardMessagePath);
-    	context.addServletWithMapping(new ServletHolder(createBoard),createBoardPath);
-    	context.addServletWithMapping(new ServletHolder(editBoardMessage),editMessagePath);
-    	context.addServletWithMapping(new ServletHolder(index),"/");
-    	context.addServletWithMapping(new ServletHolder(board),showBoardMessagePath);
-    	serv.addHandler(context);
-    	serv.start();
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/bbs/DistributeApp.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,55 @@
+package jungle.test.bbs;
+
+import javax.servlet.Servlet;
+
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+
+import alice.daemon.AliceDaemon;
+import alice.datasegment.DataSegment;
+import alice.jungle.codesegment.LogUpdateCodeSegment;
+import alice.jungle.remote.RemoteConfig;
+
+/**
+ * Hello world!
+ *
+ */
+public class DistributeApp 
+{
+    public static void main( String[] args ) throws Exception
+    {
+    	BulletinBoard cassaBBS = null;
+   		cassaBBS = new NetworkJungleBulletinBoard();
+   		RemoteConfig conf = new RemoteConfig(args);
+   		new AliceDaemon(conf).listen();
+   		if(conf.hostname != null) {
+   			DataSegment.connect(conf.key, "", conf.hostname, conf.connectPort);
+   			LogUpdateCodeSegment cs = new LogUpdateCodeSegment();
+   			cs.arg1.setKey("remote", "log");
+   			
+   		}
+		
+
+    	String createBoardMessagePath = "/createBoardMessage";
+    	String createBoardPath = "/createBoard";
+    	String editMessagePath = "/editMessage";
+    	String showBoardMessagePath = "/showBoardMessage";
+    	
+    	Servlet createBoardMessage = new CreateBoardMessageServlet(cassaBBS);
+    	Servlet createBoard = new CreateBoardServlet(cassaBBS);
+    	Servlet editBoardMessage = new EditMessageServlet(cassaBBS);
+    	Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath);
+    	Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath);
+    	
+    	Server serv = new Server(8080);
+    	ServletHandler context = new ServletHandler();
+    	context.addServletWithMapping(new ServletHolder(createBoardMessage),createBoardMessagePath);
+    	context.addServletWithMapping(new ServletHolder(createBoard),createBoardPath);
+    	context.addServletWithMapping(new ServletHolder(editBoardMessage),editMessagePath);
+    	context.addServletWithMapping(new ServletHolder(index),"/");
+    	context.addServletWithMapping(new ServletHolder(board),showBoardMessagePath);
+    	serv.addHandler(context);
+    	serv.start();
+    }
+}
--- a/src/jungle/test/bbs/JungleBulletinBoard.java	Mon Jul 08 20:25:58 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-package jungle.test.bbs;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicInteger;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
-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.store.impl.DefaultNodePath;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
-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;
-
-public class JungleBulletinBoard implements BulletinBoard
-{
-	private final Jungle jungle;
-	
-	public JungleBulletinBoard()
-	{
-		jungle = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()));
-		jungle.createNewTree("boards");
-	}
-
-	public Iterable<String> getBoards()
-	{
-		JungleTree tree = jungle.getTreeByName("boards");
-		Node node = tree.getRootNode();
-		Children<Node> chs = node.getChildren();
-		
-		IterableConverter.Converter<String,Node> converter = new IterableConverter.Converter<String,Node>(){
-			public String conv(Node _b) {
-				ByteBuffer e = _b.getAttributes().get("name");
-				return new String(e.array());
-			}
-		};
-		
-		return new IterableConverter<String,Node>(chs,converter);
-	}
-
-	public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey)
-	{
-		if(null == jungle.createNewTree(_name)){
-			throw new IllegalStateException();
-		}
-		
-		JungleTree tree = jungle.getTreeByName("boards");
-		JungleTreeEditor editor = tree.getTreeEditor();
-		DefaultNodePath root = new DefaultNodePath();
-		Either<Error,JungleTreeEditor> either = editor.addNewChildAt(root,0);
-		if(either.isA()){
-			throw new IllegalStateException();
-		}
-		editor = either.b();
-		
-		either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes()));
-		if(either.isA()){
-			throw new IllegalStateException();
-		}
-		editor = either.b();
-		Either<Error,JungleTreeEditor> result = editor.success();
-		if(result.isA()){
-			throw new IllegalStateException();
-		}
-		
-		tree = jungle.getTreeByName(_name);
-		editor = tree.getTreeEditor();
-		either = editor.addNewChildAt(root,0);
-		if(either.isA()){
-			throw new IllegalStateException();
-		}
-		editor = either.b();
-		
-		NodeEditor e = new NodeEditor(){
-			public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
-				_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
-				_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b();
-				_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
-				return DefaultEither.newB(_e);
-			}
-		};
-		
-		either = editor.edit(root.add(0),e);
-		if(either.isA()){
-			throw new IllegalStateException();
-		}
-		editor = either.b();
-		editor.success();
-	}
-
-	public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey)
-	{
-		JungleTree tree = jungle.getTreeByName(_board);
-		if(tree == null){
-			throw new IllegalStateException();
-		}
-		
-		JungleTreeEditor editor;
-		do{
-			Node node = tree.getRootNode();
-			int size = node.getChildren().size();
-			DefaultNodePath path = new DefaultNodePath();
-		
-			editor = tree.getTreeEditor();
-			Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path,size);
-			if(either.isA()){
-				throw new IllegalStateException();
-			}
-			editor = either.b();
-		
-			NodeEditor e = new NodeEditor(){
-				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
-					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
-					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
-					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
-					return DefaultEither.newB(_e);
-				}
-			};
-		
-			path = path.add(size);
-			either = editor.edit(path,e);
-			if(either.isA()){
-				throw new IllegalStateException();
-			}
-			editor = either.b();
-		}while(editor.success().isA());
-	}
-
-	public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey)
-	{
-		JungleTreeEditor editor = null;
-		do{
-			DefaultNodePath path = new DefaultNodePath();
-			path = path.add(Integer.parseInt(_uuid));
-		
-			JungleTree tree = jungle.getTreeByName(_board);
-			editor = tree.getTreeEditor();
-			NodeEditor e = new NodeEditor(){
-				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
-					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
-					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
-					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
-				return DefaultEither.newB(_e);
-				}
-			};
-		
-			Either<Error,JungleTreeEditor> either = editor.edit(path,e);
-			if(either.isA()){
-				throw new IllegalStateException();
-			}
-			editor = either.b();
-		}while(editor.success().isA());
-	}
-
-	public Iterable<BoardMessage> getMessages(String _boardName)
-	{
-		JungleTree tree = jungle.getTreeByName(_boardName);
-		Node node = tree.getRootNode();
-		Children<Node> chs = node.getChildren();
-		
-		final AtomicInteger counter = new AtomicInteger(0);
-		IterableConverter.Converter<BoardMessage,Node> converter = new IterableConverter.Converter<BoardMessage,Node>(){
-			public BoardMessage conv(Node _b) {
-				String uuid = Integer.toString(counter.get());
-				String author = new String(_b.getAttributes().get("author").array());
-				String message = new String(_b.getAttributes().get("mes").array());
-				counter.incrementAndGet();
-				return new BoardMessageImpl(author,message,uuid);
-			}
-		};
-		
-		return new IterableConverter<BoardMessage,Node>(chs,converter);
-	}
-	
-	private static class BoardMessageImpl implements BoardMessage
-	{
-		private final String author;
-		private final String message;
-		private final String uuid;
-		
-		public BoardMessageImpl(String _author,String _message,String _uuid)
-		{
-			author = _author;
-			message = _message;
-			uuid = _uuid;
-		}
-
-		public String getAuthor()
-		{
-			return author;
-		}
-
-		public String getMessage()
-		{
-			return message;
-		}
-
-		public String getUUID()
-		{
-			return uuid;
-		}
-	}
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/bbs/JungleManager.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,70 @@
+package jungle.test.bbs;
+
+import java.nio.ByteBuffer;
+
+import alice.jungle.core.NetworkDefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+
+public class JungleManager {
+	static Jungle jungle = new NetworkDefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()));
+
+	public JungleManager() {
+	
+	}
+	
+	public Jungle getJungle() {
+		return jungle;
+	}
+	
+	public JungleTree createNewTree(String name) {
+		return jungle.createNewTree(name);		
+	}
+
+	
+	public Either<Error, JungleTreeEditor> edit(JungleTreeEditor _editor ,TreeOperationLog _log) {
+		JungleTreeEditor editor = _editor;
+		Either<Error, JungleTreeEditor> either = null;
+		for (TreeOperation op : _log) { 
+			either = _edit(editor, op);
+			if(either.isA()) {
+				return either;
+			}
+			editor = either.b();
+		}
+		return either;
+	}
+	
+	private Either<Error, JungleTreeEditor> _edit(JungleTreeEditor editor,
+			TreeOperation op) {
+		NodePath path = op.getNodePath();
+		NodeOperation nodeOp = op.getNodeOperation();
+		Command c = nodeOp.getCommand();
+		String key = "";
+		switch (c) {
+		case PUT_ATTRIBUTE:
+			key = nodeOp.getKey();
+			ByteBuffer value = nodeOp.getValue();
+			return editor.putAttribute(path, key, value);
+		case DELETE_ATTRIBUTE:
+			key = nodeOp.getKey();
+			return editor.deleteAttribute(path, key);
+		case APPEND_CHILD:
+			return editor.addNewChildAt(path, 0);
+		case DELETE_CHILD:
+			return editor.deleteChildAt(path, 0);
+		}
+		return null;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/bbs/NetworkJungleBulletinBoard.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,213 @@
+package jungle.test.bbs;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import alice.jungle.core.NetworkDefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+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.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
+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;
+
+public class NetworkJungleBulletinBoard implements BulletinBoard
+{
+	private JungleManager jvm;
+	private final Jungle jungle;
+	
+	public NetworkJungleBulletinBoard()
+	{
+		jvm = new JungleManager();
+		jungle = new NetworkDefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()));
+		jungle.createNewTree("boards");
+	}
+
+	public Iterable<String> getBoards()
+	{
+		JungleTree tree = jungle.getTreeByName("boards");
+		Node node = tree.getRootNode();
+		Children<Node> chs = node.getChildren();
+		
+		IterableConverter.Converter<String,Node> converter = new IterableConverter.Converter<String,Node>(){
+			public String conv(Node _b) {
+				ByteBuffer e = _b.getAttributes().get("name");
+				return new String(e.array());
+			}
+		};
+		
+		return new IterableConverter<String,Node>(chs,converter);
+	}
+
+	public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey)
+	{
+		if(null == jungle.createNewTree(_name)){
+			throw new IllegalStateException();
+		}
+		
+		JungleTree tree = jungle.getTreeByName("boards");
+		JungleTreeEditor editor = tree.getTreeEditor();
+		DefaultNodePath root = new DefaultNodePath();
+		Either<Error,JungleTreeEditor> either = editor.addNewChildAt(root,0);
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		
+		either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes()));
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		Either<Error,JungleTreeEditor> result = editor.success();
+		if(result.isA()){
+			throw new IllegalStateException();
+		}
+		
+		tree = jungle.getTreeByName(_name);
+		editor = tree.getTreeEditor();
+		either = editor.addNewChildAt(root,0);
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		
+		NodeEditor e = new NodeEditor(){
+			public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
+				_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
+				_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b();
+				_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
+				return DefaultEither.newB(_e);
+			}
+		};
+		
+		either = editor.edit(root.add(0),e);
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		editor.success();
+	}
+
+	public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey)
+	{
+		JungleTree tree = jungle.getTreeByName(_board);
+		if(tree == null){
+			throw new IllegalStateException();
+		}
+		
+		JungleTreeEditor editor;
+		do{
+			Node node = tree.getRootNode();
+			int size = node.getChildren().size();
+			DefaultNodePath path = new DefaultNodePath();
+		
+			editor = tree.getTreeEditor();
+			Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path,size);
+			if(either.isA()){
+				throw new IllegalStateException();
+			}
+			editor = either.b();
+		
+			NodeEditor e = new NodeEditor(){
+				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
+					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
+					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
+					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
+					return DefaultEither.newB(_e);
+				}
+			};
+		
+			path = path.add(size);
+			either = editor.edit(path,e);
+			if(either.isA()){
+				throw new IllegalStateException();
+			}
+			editor = either.b();
+		}while(editor.success().isA());
+	}
+
+	public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey)
+	{
+		JungleTreeEditor editor = null;
+		do{
+			DefaultNodePath path = new DefaultNodePath();
+			path = path.add(Integer.parseInt(_uuid));
+		
+			JungleTree tree = jungle.getTreeByName(_board);
+			editor = tree.getTreeEditor();
+			NodeEditor e = new NodeEditor(){
+				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
+					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
+					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
+					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
+				return DefaultEither.newB(_e);
+				}
+			};
+		
+			Either<Error,JungleTreeEditor> either = editor.edit(path,e);
+			if(either.isA()){
+				throw new IllegalStateException();
+			}
+			editor = either.b();
+		}while(editor.success().isA());
+	}
+
+	public Iterable<BoardMessage> getMessages(String _boardName)
+	{
+		JungleTree tree = jungle.getTreeByName(_boardName);
+		Node node = tree.getRootNode();
+		Children<Node> chs = node.getChildren();
+		
+		final AtomicInteger counter = new AtomicInteger(0);
+		IterableConverter.Converter<BoardMessage,Node> converter = new IterableConverter.Converter<BoardMessage,Node>(){
+			public BoardMessage conv(Node _b) {
+				String uuid = Integer.toString(counter.get());
+				String author = new String(_b.getAttributes().get("author").array());
+				String message = new String(_b.getAttributes().get("mes").array());
+				counter.incrementAndGet();
+				return new BoardMessageImpl(author,message,uuid);
+			}
+		};
+		
+		return new IterableConverter<BoardMessage,Node>(chs,converter);
+	}
+	
+	private static class BoardMessageImpl implements BoardMessage
+	{
+		private final String author;
+		private final String message;
+		private final String uuid;
+		
+		public BoardMessageImpl(String _author,String _message,String _uuid)
+		{
+			author = _author;
+			message = _message;
+			uuid = _uuid;
+		}
+
+		public String getAuthor()
+		{
+			return author;
+		}
+
+		public String getMessage()
+		{
+			return message;
+		}
+
+		public String getUUID()
+		{
+			return uuid;
+		}
+	}
+}
--- a/src/jungle/test/codesegment/operation/JungleManager.java	Mon Jul 08 20:25:58 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-package jungle.test.codesegment.operation;
-
-import alice.jungle.core.NetworkDefaultJungle;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
-
-public class JungleManager {
-	static Jungle jungle = new NetworkDefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()));
-
-	public JungleManager() {
-	
-	}
-	
-	public Jungle getJungle() {
-		return jungle;
-	}
-	
-	public JungleTree createNewTree(String name) {
-		return jungle.createNewTree(name);		
-	}
-
-	
-}
--- a/src/jungle/test/codesegment/operation/ShowAttribute.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/jungle/test/codesegment/operation/ShowAttribute.java	Tue Jul 09 15:10:06 2013 +0900
@@ -10,6 +10,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import jungle.test.bbs.JungleManager;
 import alice.codesegment.CodeSegment;
 import alice.datasegment.CommandType;
 import alice.datasegment.Receiver;
--- a/src/jungle/test/codesegment/operation/StartJungleCodeSegment.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/jungle/test/codesegment/operation/StartJungleCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -8,6 +8,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation;
+import jungle.test.bbs.JungleManager;
 import alice.codesegment.CodeSegment;
 import alice.jungle.datasegment.store.operations.DefaultTreeOperationContainer;
 
--- a/src/jungle/test/codesegment/operation/TestPutAttributeCodeSegment.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/jungle/test/codesegment/operation/TestPutAttributeCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -17,6 +17,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import jungle.test.bbs.JungleManager;
 
 import org.msgpack.type.Value;
 
--- a/src/jungle/test/codesegment/persistence/TestJungle.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/jungle/test/codesegment/persistence/TestJungle.java	Tue Jul 09 15:10:06 2013 +0900
@@ -4,7 +4,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
-import jungle.test.codesegment.operation.JungleManager;
+import jungle.test.bbs.JungleManager;
 import jungle.test.codesegment.operation.TestPutAttributeCodeSegment;
 
 public class TestJungle {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/codesegment/remote/ClientCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,21 @@
+package jungle.test.codesegment.remote;
+
+import alice.codesegment.CodeSegment;
+import alice.datasegment.CommandType;
+import alice.datasegment.Receiver;
+
+public class ClientCodeSegment extends CodeSegment {
+	
+	Receiver arg1 = ids.create(CommandType.TAKE);
+	
+	public void run() {
+		System.out.println("--ClientCodeSegment--");
+		int num = arg1.asInteger();
+		System.out.println("num : "+num);
+		num++;
+		ods.put("remote", "num", num);
+		System.exit(0);
+//		ods.put("remote", "num", num);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/codesegment/remote/ClientFirstSetKey.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,12 @@
+package jungle.test.codesegment.remote;
+
+import alice.codesegment.CodeSegment;
+
+public class ClientFirstSetKey extends CodeSegment {
+	
+	public void run() {
+		System.out.println("--ClientFirstSetKey--");
+		ClientCodeSegment cs = new ClientCodeSegment();
+		cs.arg1.setKey("remote","num");
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/codesegment/remote/HostCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,23 @@
+package jungle.test.codesegment.remote;
+
+import alice.codesegment.CodeSegment;
+import alice.datasegment.CommandType;
+import alice.datasegment.Receiver;
+
+public class HostCodeSegment extends CodeSegment {
+	
+	Receiver arg1 = ids.create(CommandType.TAKE);
+	
+	public void run() {
+		System.out.println("--HostCodeSegment--");
+		int num = arg1.asInteger();
+		System.out.println("num : "+ num);
+		num++;
+		ods.put("local", "num", num);
+		System.exit(0);
+/*
+		HostCodeSegment cs = new HostCodeSegment();
+		cs.arg1.setKey("local","num");
+*/
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/codesegment/remote/HostFirstPut.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,13 @@
+package jungle.test.codesegment.remote;
+
+import alice.codesegment.CodeSegment;
+
+public class HostFirstPut extends CodeSegment {
+	
+	public void run() {
+		System.out.println("--HostFirstPut--");
+		ods.put("local", "num", 0);
+		HostCodeSegment cs = new HostCodeSegment();
+		cs.arg1.setKey("local", "num", 1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/codesegment/remote/StartClientCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,14 @@
+package jungle.test.codesegment.remote;
+
+import alice.datasegment.DataSegment;
+import alice.test.codesegment.remote.TestRemoteConfig;
+
+public class StartClientCodeSegment { 
+	
+	static public void main(String[] args) {
+		System.out.println("--StartClientCodeSegment--");
+		TestRemoteConfig conf = new TestRemoteConfig(args);
+		DataSegment.connect("remote", "", conf.hostname, conf.connectPort);
+		new ClientFirstSetKey().execute();
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/codesegment/remote/StartHostCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -0,0 +1,14 @@
+package jungle.test.codesegment.remote;
+
+import alice.daemon.AliceDaemon;
+import alice.jungle.remote.RemoteConfig;
+
+public class StartHostCodeSegment {
+	
+	static public void main(String[] args) {
+		System.out.println("--StartHostCodeSegment--");
+		RemoteConfig conf = new RemoteConfig(args);
+		new AliceDaemon(conf).listen();
+		new HostFirstPut().execute();
+	}
+}
--- a/src/jungle/test/core/practice/LogReadCodeSegment.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/jungle/test/core/practice/LogReadCodeSegment.java	Tue Jul 09 15:10:06 2013 +0900
@@ -14,7 +14,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
-import jungle.test.codesegment.operation.JungleManager;
+import jungle.test.bbs.JungleManager;
 import alice.codesegment.CodeSegment;
 import alice.datasegment.CommandType;
 import alice.datasegment.Receiver;
--- a/src/jungle/test/core/practice/LogSendTest.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/jungle/test/core/practice/LogSendTest.java	Tue Jul 09 15:10:06 2013 +0900
@@ -12,7 +12,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
-import jungle.test.codesegment.operation.JungleManager;
+import jungle.test.bbs.JungleManager;
 
 public class LogSendTest {
 	
--- a/src/jungle/test/core/practice/PrintChildrenAttribute.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/jungle/test/core/practice/PrintChildrenAttribute.java	Tue Jul 09 15:10:06 2013 +0900
@@ -6,7 +6,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
-import jungle.test.codesegment.operation.JungleManager;
+import jungle.test.bbs.JungleManager;
 import alice.codesegment.CodeSegment;
 import alice.datasegment.CommandType;
 import alice.datasegment.Receiver;
--- a/src/test/alice/jungle/codesegment/CopyAttrJungle2.java	Mon Jul 08 20:25:58 2013 +0900
+++ b/src/test/alice/jungle/codesegment/CopyAttrJungle2.java	Tue Jul 09 15:10:06 2013 +0900
@@ -8,7 +8,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
-import jungle.test.codesegment.operation.JungleManager;
+import jungle.test.bbs.JungleManager;
 import jungle.test.core.practice.PrintChildrenAttribute;
 import alice.codesegment.CodeSegment;
 import alice.datasegment.CommandType;