changeset 4:5acde010c6db

add jungle browsing system
author tatsuki
date Tue, 28 Jun 2016 19:45:55 +0900
parents f3d30646c863
children 2b3542c5be34
files build.gradle src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/App.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/BoardMessage.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/BrowsingBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateBoardServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateChildServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/EditMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/GetAttributeImp.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/IterableConverter.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/JungleBrowsingBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/ShowBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/ShowBoardsServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/App.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/CassandraBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/HectorSample.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/ShowBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/DistributeApp.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/NetworkJungleBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/ShowMessageWithTimeStampServlet.java src/test/java/jp/ac/u_ryukyu/ie/cr/bbs/network/showMessageTest.java
diffstat 22 files changed, 803 insertions(+), 91 deletions(-) [+]
line wrap: on
line diff
--- a/build.gradle	Mon Jun 27 05:25:48 2016 +0900
+++ b/build.gradle	Tue Jun 28 19:45:55 2016 +0900
@@ -6,38 +6,39 @@
 version = '1.0'
 
 repositories {
-  mavenCentral()
+    mavenCentral()
     maven { url "http://eaio.com/maven2" }
-  maven { url "http://repo.maven.apache.org/maven2" }
+    maven { url "http://repo.maven.apache.org/maven2" }
 }
 
 dependencies {
-  compile "commons-collections:commons-collections:3.2.1"
+    compile fileTree(dir: 'lib', include: '*.jar')
+    compile "commons-collections:commons-collections:3.2.1"
     compile "org.apache.maven.surefire:surefire-junit4:2.13"
     compile "com.google.guava:guava:12.0"
-    compile group: 'org.eclipse.jetty', name: 'jetty-server', version:'9.1.1.v20140108'
-    compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version:'9.2.1.v20140609'
+    compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.1.1.v20140108'
+    compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.2.1.v20140609'
     testCompile group: 'junit', name: 'junit', version: '4.11'
     compile group: 'junit', name: 'junit', version: '4.11'
-    compile group: 'org.hectorclient', name: 'hector-core', version:'1.1-2'
-    compile(group: 'org.apache.cassandra', name: 'cassandra-all', version:'1.2.1') {
-      exclude(module: 'slf4j-log4j12')
+    compile group: 'org.hectorclient', name: 'hector-core', version: '1.1-2'
+    compile(group: 'org.apache.cassandra', name: 'cassandra-all', version: '1.2.1') {
+        exclude(module: 'slf4j-log4j12')
         exclude(module: 'log4j')
     }
 
-  jar {
-    manifest {
-      attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
+    jar {
+        manifest {
+            attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
+        }
+        from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
+        archiveName = 'jungle-core.jar'
     }
-    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
-    archiveName = 'jungle-core.jar'
-  }
 
-  uploadArchives {
-    repositories {
-      flatDir {
-        dirs '.'
-      }
+    uploadArchives {
+        repositories {
+            flatDir {
+                dirs '.'
+            }
+        }
     }
-  }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/App.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,54 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.thread.QueuedThreadPool;
+
+import javax.servlet.Servlet;
+
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args ) throws Exception
+    {
+			BrowsingBulletinBoard cassaBBS = new JungleBrowsingBulletinBoard();
+
+    	String createBoardMessagePath = "/createBoardMessage";
+    	String createBoardPath = "/createBoard";
+    	String editMessagePath = "/editMessage";
+    	String showBoardMessagePath = "/showBoardMessage";
+			String createChildPath = "/createChildMessage";
+
+    	Servlet createBoardMessage = new CreateBoardMessageServlet(cassaBBS);
+    	Servlet createBoard = new CreateBoardServlet(cassaBBS);
+			Servlet createChild = new CreateChildServlet(cassaBBS);
+    	Servlet editBoardMessage = new EditMessageServlet(cassaBBS);
+    	Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath);
+    	Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,createChildPath,editMessagePath,showBoardMessagePath);
+    	
+//    	Server serv = new Server(8080);
+    	Server serv = new Server();
+    	SelectChannelConnector connector = new SelectChannelConnector();
+    	connector.setPort(8080);
+    	connector.setThreadPool(new QueuedThreadPool(1000));
+    	serv.setConnectors(new Connector[] { connector });
+    	
+    	ServletHandler context = new ServletHandler();
+    	context.addServletWithMapping(new ServletHolder(createBoardMessage),createBoardMessagePath);
+			context.addServletWithMapping(new ServletHolder(createBoard),createBoardPath);
+			context.addServletWithMapping(new ServletHolder(createChild),createChildPath);
+    	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/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/BoardMessage.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,8 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+public interface BoardMessage
+{
+	public String getUUID();
+	public String getAuthor();
+	public String getMessage();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/BrowsingBulletinBoard.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,16 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
+import java.util.Iterator;
+
+public interface BrowsingBulletinBoard
+{
+	Iterable<String> getBoards();
+	void createBoards(String name);
+	void createBoardMessage(String bname, String key, String attribute, String pathStr);
+	void createChild(String bname,String nodeName, String pathStr);
+	void editMessage(String bname, String key, String attribute, String pathStr);
+	String sanitize(String str);
+  GetAttributeImp getAttribute(String bname, String nodePath);
+	Iterator<TreeNode> getChildren(String bname, String nodePath);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateBoardMessageServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,39 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+public class CreateBoardMessageServlet extends HttpServlet
+{
+	private final BrowsingBulletinBoard bbs;
+	private static final String PARAM_BOARD_NAME = "bname";
+	private static final String PARAM_NODE_ATTRIBUTE_KEY = "key";
+	private static final String PARAM_NODE_ATTRIBUTE= "attribute";
+	private static final String PARAM_NODE_PATH = "path";
+	
+	private static final long serialVersionUID = 1L;
+	
+	public CreateBoardMessageServlet(BrowsingBulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+	
+	@Override
+	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String boardName = _req.getParameter(PARAM_BOARD_NAME);
+		String key = _req.getParameter(PARAM_NODE_ATTRIBUTE_KEY);
+		String attribute = _req.getParameter(PARAM_NODE_ATTRIBUTE);
+		String path = _req.getParameter(PARAM_NODE_PATH);
+
+		try{
+			bbs.createBoardMessage(boardName,key,attribute,path);
+			PrintWriter pw = _res.getWriter();
+			pw.write("successfully written");
+		}catch(Exception _e){
+			_res.setStatus(500);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateBoardServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,32 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+public class CreateBoardServlet extends HttpServlet
+{
+	private final BrowsingBulletinBoard bbs;
+	private static final String PARAM_BOARD_NAME = "bname";
+	private static final long serialVersionUID = 1L;
+	
+	public CreateBoardServlet(BrowsingBulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+
+	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String boardName = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_NAME));
+		try{
+			bbs.createBoards(boardName);
+			PrintWriter pw = _res.getWriter();
+			pw.write("successfully written");
+		}catch(Exception _e){
+			_res.setStatus(500);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateChildServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,38 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+public class CreateChildServlet extends HttpServlet
+{
+	private final BrowsingBulletinBoard bbs;
+	private static final String PARAM_BOARD_NAME = "bname";
+	private static final String PARAM_NODE_PATH = "path";
+	private static final String PARAM_NODE_NAME = "nodeName";
+
+	private static final long serialVersionUID = 1L;
+	
+	public CreateChildServlet(BrowsingBulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+
+	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String boardName = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_NAME));
+		String path = _req.getParameter(PARAM_NODE_PATH);
+		String nodeName = _req.getParameter(PARAM_NODE_NAME);
+
+		try{
+			bbs.createChild(boardName,nodeName,path);
+			PrintWriter pw = _res.getWriter();
+			pw.write("successfully written");
+		}catch(Exception _e){
+			_res.setStatus(500);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/EditMessageServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,63 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+public class EditMessageServlet extends HttpServlet
+{
+	private final BrowsingBulletinBoard bbs;
+	private static final String PARAM_BOARD_NAME = "bname";
+	private static final String PARAM_NODE_ATTRIBUTE_KEY = "key";
+	private static final String PARAM_NODE_PATH = "path";
+	private static final String PARAM_NODE_ATTRIBUTE = "attribute";
+
+	private static final long serialVersionUID = 1L;
+	
+	public EditMessageServlet(BrowsingBulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+
+	public void doGet(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String bname = _req.getParameter(PARAM_BOARD_NAME);
+		String path = _req.getParameter(PARAM_NODE_PATH);
+		String key = _req.getParameter(PARAM_NODE_ATTRIBUTE_KEY);
+		System.out.println("write");
+		
+		try{
+			PrintWriter pw = _res.getWriter();
+			pw.write("<html><body><h1>edit message</h1>");
+			pw.write("<form method='POST'\n");
+			pw.write("<p>" +
+					"<input type='hidden' name='key' value='"+key+"'/>" +
+					"<input type='hidden' name='path' value='"+path+"'/>" +
+					"<input type='hidden' name='bname' value='"+bname+"'</p>\n");
+			pw.write("<p>attribute<br/> <input type='textarea' name='attribute'/> </p>\n");
+			pw.write("<p><input type='submit' value='submit'/></p>\n");
+			pw.write("</body></html>");
+			pw.flush();
+		}catch(Exception _e){
+			_res.setStatus(500);
+		}
+	}
+
+	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String bname = _req.getParameter(PARAM_BOARD_NAME);
+		String path = _req.getParameter(PARAM_NODE_PATH);
+		String key = _req.getParameter(PARAM_NODE_ATTRIBUTE_KEY);
+		String attribute = _req.getParameter(PARAM_NODE_ATTRIBUTE);
+
+		try{
+			bbs.editMessage(bname, key, attribute, path);
+			PrintWriter pw = _res.getWriter();
+			pw.write("successfully written");
+			pw.flush();
+		}catch(Exception _e){
+			_res.setStatus(500);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/GetAttributeImp.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,23 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
+
+import java.util.Iterator;
+
+public class GetAttributeImp {
+  private final TreeNode node;
+
+  public GetAttributeImp(TreeNode _node) {
+    node = _node;
+  }
+
+  public String getMessage(String key) {
+    return node.getAttributes().getString(key);
+  }
+  
+  public Iterator<String> getKeys() {
+    return node.getAttributes().getKeys();
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/IterableConverter.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,52 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import java.util.Iterator;
+
+public class IterableConverter<A,B> implements Iterable<A>
+{
+	private final Iterable<B> iterable;
+	private final Converter<A,B> converter;
+	
+	public IterableConverter(Iterable<B> _iterable,Converter<A,B> _converter)
+	{
+		iterable = _iterable;
+		converter = _converter;
+	}
+	
+	public Iterator<A> iterator()
+	{
+		return new IteratorConverter<A,B>(iterable.iterator(),converter);
+	}
+	
+	private static final class IteratorConverter<A,B> implements Iterator<A>
+	{
+		private final Iterator<B> iterator;
+		private final Converter<A,B> converter;
+		
+		public IteratorConverter(Iterator<B> _iterator,Converter<A,B> _converter)
+		{
+			iterator = _iterator;
+			converter = _converter;
+		}
+		
+		public boolean hasNext()
+		{
+			return iterator.hasNext();
+		}
+
+		public A next()
+		{
+			return converter.conv(iterator.next());
+		}
+
+		public void remove()
+		{
+			iterator.remove();
+		}
+	}
+
+	public static interface Converter<A,B>
+	{
+		public A conv(B _b);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/JungleBrowsingBulletinBoard.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,197 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+
+import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.core.Children;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.NulIterator;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
+
+import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+public class JungleBrowsingBulletinBoard implements
+        BrowsingBulletinBoard {
+    private final Jungle jungle;
+
+    public JungleBrowsingBulletinBoard() {
+        jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor(
+                new DefaultTraverser()));
+        jungle.createNewTree("boards");
+    }
+
+    public Iterable<String> getBoards() {
+        JungleTree tree = jungle.getTreeByName("boards");
+        TreeNode node = tree.getRootNode();
+        Children chs = node.getChildren();
+
+        IterableConverter.Converter<String, TreeNode> converter = new IterableConverter.Converter<String, TreeNode>() {
+            public String conv(TreeNode _b) {
+                ByteBuffer e = _b.getAttributes().get("name");
+                return new String(e.array());
+            }
+        };
+
+        return new IterableConverter<String, TreeNode>(chs, converter);
+    }
+
+    public void createBoards(final String _name) {
+        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.putAttribute(root, "NodeName", ByteBuffer.wrap("root".getBytes()));
+        if (either.isA()) {
+            throw new IllegalStateException();
+        }
+        editor = either.b();
+        editor.success();
+    }
+
+    public void createBoardMessage(final String boardName, final String key,
+                                   final String attribute, final String pathStr) {
+        if (key.equals("") | attribute.equals(""))
+            return ;
+        NodePath path = createNodePath(pathStr);
+        JungleTree tree = jungle.getTreeByName(boardName);
+        if (tree == null) {
+            throw new IllegalStateException();
+        }
+
+        JungleTreeEditor editor;
+        do {
+            editor = tree.getTreeEditor();
+            Either<Error, JungleTreeEditor> either = editor.putAttribute(path, key, ByteBuffer.wrap(attribute.getBytes()));
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+        } while (editor.success().isA());
+    }
+
+    @Override
+    public void createChild(String bname, String nodeName, String pathStr) {
+        NodePath path = createNodePath(pathStr);
+        JungleTree tree = jungle.getTreeByName(bname);
+        if (tree == null) {
+            throw new IllegalStateException();
+        }
+        Either<Error,TreeNode> getNodeEither = tree.getNodeOfPath(path);
+        if (getNodeEither.isA())
+            return ;
+        TreeNode currentNode = getNodeEither.b();
+        int childCount = currentNode.getChildren().size();
+
+        JungleTreeEditor editor;
+        do {
+            editor = tree.getTreeEditor();
+            Either<Error,JungleTreeEditor> either = editor.addNewChildAt(path, childCount);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+
+            either = editor.putAttribute(path.add(childCount),"NodeName",ByteBuffer.wrap(nodeName.getBytes()));
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+
+        } while (editor.success().isA());
+    }
+
+    public void editMessage(String bname, String key, final String attribute,
+                            final String pathStr) {
+        NodePath path = createNodePath(pathStr);
+
+        JungleTreeEditor editor = null;
+
+        do {
+            JungleTree tree = jungle.getTreeByName(bname);
+            editor = tree.getTreeEditor();
+
+            Either<Error, JungleTreeEditor> either = editor.putAttribute(path, key, ByteBuffer.wrap(attribute.getBytes()));
+
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+        } while (editor.success().isA());
+    }
+
+    public String sanitize(String str) {
+        if (str == null) {
+            return str;
+        }
+        str = str.replaceAll("&", "&amp;");
+        str = str.replaceAll("<", "&lt;");
+        str = str.replaceAll(">", "&gt;");
+        str = str.replaceAll("\"", "&quot;");
+        str = str.replaceAll("'", "&#39;");
+        return str;
+    }
+
+    public GetAttributeImp getAttribute(String _bname, String nodePath) {
+
+        DefaultNodePath path = createNodePath(nodePath);
+        JungleTree tree = jungle.getTreeByName(_bname);
+        Either<Error, TreeNode> either = tree.getNodeOfPath(path);
+        if (either.isA())
+            return new GetAttributeImp(new DefaultTreeNode());
+        TreeNode currentNode = either.b();
+        return new GetAttributeImp(currentNode);
+    }
+
+    @Override
+    public Iterator<TreeNode> getChildren(String bname, String nodePath) {
+        DefaultNodePath path = createNodePath(nodePath);
+        JungleTree tree = jungle.getTreeByName(bname);
+        Either<Error, TreeNode> either = tree.getNodeOfPath(path);
+        if (either.isA())
+            return new NulIterator<TreeNode>();
+        TreeNode currentNode = either.b();
+        TreeNodeChildren children = currentNode.getChildren();
+        return children.iterator();
+    }
+
+    private DefaultNodePath createNodePath(String nodePath) {
+        DefaultNodePath path = new DefaultNodePath();
+        String[] nums = nodePath.split(",");
+        for (String num : nums) {
+            if (num.equals("-1"))
+                continue;
+            path = path.add(Integer.parseInt(num));
+        }
+        return path;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/ShowBoardMessageServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,90 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.util.Iterator;
+
+public class ShowBoardMessageServlet extends HttpServlet {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    private final BrowsingBulletinBoard bbs;
+    private final String createBoardMessagePath;
+    private final String createChildPath;
+    private final String showBoardMessagePath;
+    private final String editMessagePath;
+    private static final String PARAM_BOARD_NAME = "bname";
+    private static final String PARAM_NODE_PATH = "path";
+
+    public ShowBoardMessageServlet(BrowsingBulletinBoard _bbs, String _createBoardMessagePath,String _createChildMessagePath ,String _editMessagePath, String _showBoardMessagePath) {
+        bbs = _bbs;
+        createBoardMessagePath = _createBoardMessagePath;
+        showBoardMessagePath = _showBoardMessagePath;
+        createChildPath = _createChildMessagePath;
+        editMessagePath = _editMessagePath;
+    }
+
+    public void doGet(HttpServletRequest _req, HttpServletResponse _res) {
+        String bname = _req.getParameter(PARAM_BOARD_NAME);
+        String path = _req.getParameter(PARAM_NODE_PATH);
+        try {
+            printBoard(bname, path, _res.getWriter());
+        } catch (Exception _e) {
+            _res.setStatus(500);
+        }
+
+    }
+
+    private void printBoard(String bname, String path, PrintWriter _pw) throws Exception {
+        _pw.write("<html><body>\n");
+        _pw.write("<h1> TreeName = " + bbs.sanitize(bname) + " <br>Node Path = " + path + "</h1>\n");
+
+
+        _pw.write("<p>add new Child</p>\n");
+        _pw.write("<form action='" + createChildPath + "' method='POST'\n");
+        _pw.write("<p><input type='hidden' name='bname' value='" + bname + "'/></p>\n");
+        _pw.write("<p>ChildName<br/> <input type='textarea' name='nodeName'/> </p>\n");
+        _pw.write("<p><input type='hidden' name='path' value='" + path + "'/></p>\n");
+        _pw.write("<p><input type='submit' value='submit'/></form></p>\n");
+
+        _pw.write("<p>Children</p>\n");
+        Iterator<TreeNode> children = bbs.getChildren(bname, path);
+        for (int childCount = 0;children.hasNext();childCount++) {
+            TreeNode child = children.next();
+            TreeNodeAttributes attribute = child.getAttributes();
+            String childName = attribute.getString("NodeName");
+            _pw.write("<p><a href='" + showBoardMessagePath + "?bname=" + bname + "&path=" + path + "," +childCount + "'>" +childName + "</a></p>");
+        }
+
+
+        _pw.write("<p>put attribute</p>\n");
+        _pw.write("<form action='" + createBoardMessagePath + "' method='POST'\n");
+        _pw.write("<p><input type='hidden' name='bname' value='" + bname + "'/></p>\n");
+        _pw.write("<p>Key<br/> <input type='textarea' name='key'/> </p>\n");
+        _pw.write("<p>attribute<br/> <input type='textarea' name='attribute'/> </p>\n");
+        _pw.write("<p><input type='hidden' name='path' value='" + path + "'/></p>\n");
+        _pw.write("<p><input type='submit' value='submit'/></form></p>\n");
+
+
+
+
+        _pw.write("<p>Attribute</p>\n");
+        GetAttributeImp attribute = bbs.getAttribute(bname, path);
+        Iterator<String> keys = attribute.getKeys();
+        for (;keys.hasNext();) {
+            String key = keys.next();
+            String mesage = attribute.getMessage(key);
+            _pw.write("<p><a href='"+editMessagePath+"?bname=" + bbs.sanitize(bname) + "&path=" + path  + "&key=" + key + "'>" + key + " = " + mesage +"</a></p>");
+        }
+
+        _pw.write("</body></html>");
+        _pw.flush();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/ShowBoardsServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,53 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+public class ShowBoardsServlet extends HttpServlet
+{
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private final BrowsingBulletinBoard bbs;
+	private final String createBoardPath;
+	private final String showBoardMessagePath;
+
+	public ShowBoardsServlet(BrowsingBulletinBoard _bbs, String _createBoardPath,String _showBoardMessagePath)
+	{
+		bbs = _bbs;
+		createBoardPath = _createBoardPath;
+		showBoardMessagePath = _showBoardMessagePath;
+	}
+	
+	public void doGet(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		try{
+			_res.setCharacterEncoding("UTF-8");
+			printBoard(_res.getWriter());
+		}catch(Exception _e){
+			_res.setStatus(500);
+		}
+		
+	}
+	
+	private void printBoard(PrintWriter _pw) throws Exception
+	{
+		_pw.write("<html><body>\n");
+		_pw.write("<h1>BBS</h1>\n");
+		_pw.write("<form action='"+createBoardPath+"' method='POST'\n");
+		_pw.write("<p>Create new board.</p>");
+		_pw.write("<p>BoardName : <input type='text' name='bname'/></p>\n");
+		_pw.write("<p><input type='submit' value='submit'/></p><hr/>\n");
+		
+		_pw.write("<h2>list of boards</h2>");
+		for(String board : bbs.getBoards()){
+			_pw.write("<p><a href='"+showBoardMessagePath+"?bname=" + bbs.sanitize(board) + "&path=-1" +"'>"+ bbs.sanitize(board) + "</a></p>");
+		}
+		
+		_pw.write("</body></html>");
+		_pw.flush();
+	}
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/App.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/App.java	Tue Jun 28 19:45:55 2016 +0900
@@ -45,7 +45,7 @@
 			System.out.println("Replication factor "+rep_factor);
        		cassaBBS = new CassandraBulletinBoard("test-cluster","localhost:9160","cassaBBS2", cLevel, rep_factor);
    		}
-    	
+
     	String createBoardMessagePath = "/createBoardMessage";
     	String createBoardPath = "/createBoard";
     	String editMessagePath = "/editMessage";
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/CassandraBulletinBoard.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/CassandraBulletinBoard.java	Tue Jun 28 19:45:55 2016 +0900
@@ -37,7 +37,7 @@
 	private static final String COLUMN_FAMILY_BOARD = "boards";
 	private final int REP_FACTOR;
 	
-	public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName, HConsistencyLevel cLevel,int rep_factor )
+	public CassandraBulletinBoard(String _clusterName, String _address, String _keyspaceName, HConsistencyLevel cLevel, int rep_factor )
 	{
 		address = _address;
 		clusterName = _clusterName;
@@ -51,7 +51,7 @@
 		initialize();
 	}
 	
-	public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName, HConsistencyLevel cLevel)
+	public CassandraBulletinBoard(String _clusterName, String _address, String _keyspaceName, HConsistencyLevel cLevel)
 	{
 		this(_clusterName, _address, _keyspaceName, cLevel, 1);		
 	}
@@ -62,7 +62,7 @@
 	{
 		if(cluster.describeKeyspace(keyspace) == null){
 			KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace,
-					SimpleStrategy.class.getName(),REP_FACTOR, Collections.<ColumnFamilyDefinition> emptyList());
+					SimpleStrategy.class.getName(),REP_FACTOR,Collections.<ColumnFamilyDefinition> emptyList());
 			cluster.addKeyspace(keyspaceDefinition,false);
 			ColumnFamilyDefinition columnFamilyDefinition = HFactory.createColumnFamilyDefinition(keyspace,COLUMN_FAMILY_BOARD,ComparatorType.UUIDTYPE);
 			columnFamilyDefinition.setColumnType(ColumnType.SUPER);
@@ -98,7 +98,7 @@
 	public void createBoardMessage(UUID _time,String _name,String _author,String _message,String _editKey)
 	{
 		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
-		ThriftSuperCfTemplate<String,UUID,String> template =
+		ThriftSuperCfTemplate<String,UUID,String> template = 
 				new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
 						UUIDSerializer.get(),StringSerializer.get());
 		
@@ -182,7 +182,7 @@
 	{
 		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
 		UUID time = UUID.fromString(_uuid);
-		ThriftSuperCfTemplate<String,UUID,String> template =
+		ThriftSuperCfTemplate<String,UUID,String> template = 
 				new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
 						UUIDSerializer.get(),StringSerializer.get());
 		
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/HectorSample.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/HectorSample.java	Tue Jun 28 19:45:55 2016 +0900
@@ -5,7 +5,8 @@
 import me.prettyprint.cassandra.service.template.SuperCfUpdater;
 import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate;
 import me.prettyprint.cassandra.utils.TimeUUIDUtils;
-import me.prettyprint.hector.api.*;
+import me.prettyprint.hector.api.Cluster;
+import me.prettyprint.hector.api.Keyspace;
 import me.prettyprint.hector.api.beans.*;
 import me.prettyprint.hector.api.factory.HFactory;
 import me.prettyprint.hector.api.query.QueryResult;
@@ -22,6 +23,11 @@
 		Cluster myCluster = HFactory.getOrCreateCluster("test-cluster","localhost:9160");
 
 		Keyspace ksp = HFactory.createKeyspace("cassaBBS",myCluster);
+		/*
+		ColumnFamilyDefinition newCF = HFactory.createColumnFamilyDefinition("DEMO","ccc",ComparatorType.UUIDTYPE);
+		newCF.setColumnType(ColumnType.SUPER);
+		myCluster.addColumnFamily(newCF);
+		*/
 
 		ThriftSuperCfTemplate<String,UUID,String> template =
 				new ThriftSuperCfTemplate<String,UUID,String>(ksp,"boards",StringSerializer.get(),
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java	Tue Jun 28 19:45:55 2016 +0900
@@ -9,12 +9,10 @@
 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath;
 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
-import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser;
-import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal;
 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
-import junit.framework.Assert;
 
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -73,7 +71,7 @@
 		editor = editor.putAttribute(root,"author", ByteBuffer.wrap(_author.getBytes())).b();
 		editor = editor.putAttribute(root,"key", ByteBuffer.wrap(_editKey.getBytes())).b();
 		either = editor.putAttribute(root,"mes", ByteBuffer.wrap(_initMessage.getBytes()));
-		
+
 		if (either.isA()) {
 			throw new IllegalStateException();
 		}
@@ -104,7 +102,7 @@
 			editor = editor.putAttribute(path.add(size),"author", ByteBuffer.wrap(_author.getBytes())).b();
 			editor = editor.putAttribute(path.add(size),"key", ByteBuffer.wrap(_editKey.getBytes())).b();
 			either = editor.putAttribute(path.add(size),"mes", ByteBuffer.wrap(_message.getBytes()));
-			
+
 			if (either.isA()) {
 				throw new IllegalStateException();
 			}
@@ -125,7 +123,7 @@
 			editor = editor.putAttribute(path,"author", ByteBuffer.wrap(_author.getBytes())).b();
 			editor = editor.putAttribute(path,"key", ByteBuffer.wrap(_editKey.getBytes())).b();
 			Either<Error, JungleTreeEditor> either = editor.putAttribute(path,"mes", ByteBuffer.wrap(_message.getBytes()));
-			
+
 			if (either.isA()) {
 				throw new IllegalStateException();
 			}
@@ -188,32 +186,27 @@
 		return str;
 	}
 
-  public GetAttributeImp getAttribute(String _bname, String _nodeNum, String revisionStr) {
-
-    DefaultNodePath path = new DefaultNodePath();
-    try {
-      for (int count = 0; _nodeNum.substring(count, count + 1) != null; count++) {
-        if (!_nodeNum.substring(count, count + 1).equals("/"))
-          path = path.add(Integer.parseInt(_nodeNum.substring(count, count + 1)));
-      }
-    } catch (Exception _e) {
-    }
-    JungleTree tree = jungle.getTreeByName(_bname);
-    System.out.println(tree.revision());
-    Long revision = Long.parseLong(revisionStr);
-    JungleTree oldTree = tree.getOldTree(revision).b();
-    System.out.println(oldTree.revision());
-    TreeNode node = oldTree.getRootNode();
-
-    DefaultTraverser traverser = new DefaultTraverser();
-    DefaultEvaluator evaluator = new DefaultEvaluator(path);
-    Either<Error, Traversal> ret = traverser.traverse(node, evaluator);
-    if (ret.isA()) {
-      Assert.fail();
+    public GetAttributeImp getAttribute(String _bname, String nodePath,String revisionStr) {
+        Long revision = Long.parseLong(revisionStr);
+        DefaultNodePath path = createNodePath(nodePath);
+        JungleTree tree = jungle.getTreeByName(_bname);
+        JungleTree oldTree = tree.getOldTree(revision).b();
+        Either<Error, TreeNode> either = tree.getNodeOfPath(path);
+        if (either.isA())
+            return new GetAttributeImp(new DefaultTreeNode());
+        TreeNode node = either.b();
+        return new GetAttributeImp(node);
     }
 
-    Traversal traversal = ret.b();
-    TreeNode target = traversal.destination();
-    return new GetAttributeImp(target);
-  }
+    private DefaultNodePath createNodePath(String nodePath) {
+        DefaultNodePath path = new DefaultNodePath();
+        try {
+            for (int count = 0; nodePath.substring(count, count + 1) != null; count++) {
+                if (!nodePath.substring(count, count + 1).equals("/"))
+                    path = path.add(Integer.parseInt(nodePath.substring(count, count + 1)));
+            }
+        } catch (Exception _e) {
+        }
+        return path;
+    }
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/ShowBoardMessageServlet.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/ShowBoardMessageServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -40,14 +40,14 @@
         _pw.write("<p>Author : <input type='text' name='author'/> <input type='hidden' name='bname' value='" + _bname + "'/> EditKey : <input type='text' name='key'/></p>\n");
         _pw.write("<p>Message<br/> <input type='textarea' name='msg'/> </p>\n");
         _pw.write("<p><input type='submit' value='submit'/></p>\n");
-        GetAttributeImp attribute = bbs.getAttribute(_bname, "[-1]", "1");
+        GetAttributeImp attribute = bbs.getAttribute(_bname, "[-1]", "-1");
         Iterator<String> keys = attribute.getKeys();
 
-        do  {
+        do {
             String key = keys.next();
             String mesage = attribute.getMessage(key);
             _pw.write("<p>" + key + " = " + mesage + "</p>\n");
-        }while(keys.hasNext());
+        } while (keys.hasNext());
 
         _pw.write("</body></html>");
         _pw.flush();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/DistributeApp.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/DistributeApp.java	Tue Jun 28 19:45:55 2016 +0900
@@ -9,8 +9,6 @@
         RemoteConfig conf = new RemoteConfig(args);
         System.out.println("test");
         if (conf.getManagerHostName() == null) {
-            // String localHostName ="localhost";
-            // HostMessage host = new HostMessage(localHostName, conf.localPort);
             StartBBSCodeSegment cs1 = new StartBBSCodeSegment(args, conf.bbsPort);
             cs1.ods.put("host", "node0");
         } else {
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/NetworkJungleBulletinBoard.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/NetworkJungleBulletinBoard.java	Tue Jun 28 19:45:55 2016 +0900
@@ -17,6 +17,7 @@
 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode;
 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog;
 import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode;
 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator;
 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal;
@@ -656,34 +657,28 @@
         return str;
     }
 
-    @Override
-    public GetAttributeImp getAttribute(String _bname, String _path, String revisionStr) {
-        DefaultNodePath path = new DefaultNodePath();
-        String[] nums = _path.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-
+    public GetAttributeImp getAttribute(String _bname, String nodePath,String revisionStr) {
+        Long revision = Long.parseLong(revisionStr);
+        DefaultNodePath path = createNodePath(nodePath);
         JungleTree tree = jungle.getTreeByName(_bname);
-        TreeNode node;
-        if (revisionStr.equals("-1")) {
-            node = tree.getRootNode();
-        } else {
-            Long revision = Long.parseLong(revisionStr);
-            JungleTree oldTree = tree.getOldTree(revision).b();
-            node = oldTree.getRootNode();
-        }
+        JungleTree oldTree = tree.getOldTree(revision).b();
+        Either<Error, TreeNode> either = tree.getNodeOfPath(path);
+        if (either.isA())
+            return new GetAttributeImp(new DefaultTreeNode());
+        TreeNode node = either.b();
+        return new GetAttributeImp(node);
+    }
 
-        DefaultTraverser traverser = new DefaultTraverser();
-        DefaultEvaluator evaluator = new DefaultEvaluator(path);
-        Either<Error, Traversal> ret = traverser.traverse(node, evaluator);
-        if (ret.isA()) {
-            Assert.fail();
+    private DefaultNodePath createNodePath(String nodePath) {
+        DefaultNodePath path = new DefaultNodePath();
+        try {
+            for (int count = 0; nodePath.substring(count, count + 1) != null; count++) {
+                if (!nodePath.substring(count, count + 1).equals("/"))
+                    path = path.add(Integer.parseInt(nodePath.substring(count, count + 1)));
+            }
+        } catch (Exception _e) {
         }
+        return path;
+    }
 
-        Traversal traversal = ret.b();
-        TreeNode target = traversal.destination();
-        return new GetAttributeImp(target);
-    }
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/ShowMessageWithTimeStampServlet.java	Mon Jun 27 05:25:48 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/ShowMessageWithTimeStampServlet.java	Tue Jun 28 19:45:55 2016 +0900
@@ -49,7 +49,7 @@
         _pw.write("<p>Message<br/> <input type='textarea' name='msg'/> </p>\n");
         _pw.write("<p><input type='submit' value='submit'/></p>\n");
 
-        GetAttributeImp attribute = bbs.getAttribute(_bname, "[-1]", "0");
+        GetAttributeImp attribute = bbs.getAttribute(_bname, "[-1]","1");
         Iterator<String> keys = attribute.getKeys();
 
         while (keys.hasNext()) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/bbs/network/showMessageTest.java	Tue Jun 28 19:45:55 2016 +0900
@@ -0,0 +1,54 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network;
+
+import jp.ac.u_ryukyu.ie.cr.bbs.network.codesegment.StartBBSCodeSegment;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.remote.RemoteConfig;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.Socket;
+
+
+public class showMessageTest {
+
+	public static void main(String args[]) throws Exception {
+		String host = "localhost";
+		int port = 8080;
+		String path = "/showBoardMessage?bname=" + args[0];
+		String url = "http://" + host + ":" + port + path;
+		String str;
+		System.out.println(url);
+		RemoteConfig conf = new RemoteConfig(args);
+		StartBBSCodeSegment cs1 = new StartBBSCodeSegment(args, conf.bbsPort);
+		cs1.ods.put("host", "node0");
+		BufferedReader input = new BufferedReader(new InputStreamReader(
+				System.in));
+		Thread.sleep(1000);
+
+		do{
+			try {
+				Socket socket = new Socket(host, port);
+				BufferedReader readSocket = new BufferedReader(
+						new InputStreamReader(socket.getInputStream()));
+				BufferedWriter writeSocket = new BufferedWriter(
+						new OutputStreamWriter(socket.getOutputStream()));
+
+				writeSocket.write("GET " + url + " HTTP/1.1\r\n");
+				writeSocket.write("Host: " + host + "\n");
+				writeSocket.write("\n");
+				writeSocket.flush();
+				while ((str = readSocket.readLine()) != null) {
+					System.out.println(str);
+				}
+				writeSocket.close();
+				readSocket.close();
+				socket.close();
+				System.out.println("please input  connection tree name  or quit");
+
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+		}while(input.readLine() != "quit");
+	}
+}