changeset 8:766f7668521f

commit
author tatsuki
date Thu, 02 Feb 2017 23:05:59 +0900
parents 6c584862fe93
children 2890ae6b1aef
files 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/FindNodeservlet.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/BoardMessage.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/BulletinBoard.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/CreateBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/CreateBoardServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/EditMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/EditMessageUseGetServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/GetAttributeImp.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/IterableConverter.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/local/ShowBoardsServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/App.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/BoardMessage.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/BulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/CassandraBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/CreateBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/CreateBoardServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/EditMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/EditMessageUseGetServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/FindNodeServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/GetAttributeImp.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/HectorSample.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/IterableConverter.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/JungleBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/ShowBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/ShowBoardsServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/App.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/BoardMessage.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/BrowsingBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/CreateBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/CreateBoardServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/CreateChildServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/EditMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/GetAttributeImp.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/IterableConverter.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/JungleBrowsingBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/ShowBoardMessageServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/ShowBoardsServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/BoardRenewTime.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/BulletinBoardJungleManager.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/NetworkBulletinBoard.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/RequestNumCheckServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/ShowMessageWithTimeStampServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/BoardRenewTime.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/BulletinBoardJungleManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/DistributeApp.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/NetworkBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/NetworkJungleBulletinBoard.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/RequestNumCheckServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/ShowMessageWithTimeStampServlet.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/codesegment/LogUpdateCodeSegment.java src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/codesegment/StartBBSCodeSegment.java
diffstat 70 files changed, 2754 insertions(+), 2692 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/App.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-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.store.impl.DefaultTreeEditor;
-import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-
-import javax.servlet.Servlet;
-
-
-/**
- * Hello world!
- */
-public class App {
-
-
-    public static void main(String[] args) throws Exception {
-        System.out.println("main");
-        Jungle jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor(
-                new DefaultTraverser()));
-        new App().startBBS(args, jungle);
-    }
-
-
-    public void startBBS(String[] args, Jungle jungle) throws Exception {
-        BrowsingBulletinBoard cassaBBS = new JungleBrowsingBulletinBoard(jungle);
-        String createBoardMessagePath = "/createBoardMessage";
-        String createBoardPath = "/createBoard";
-        String editMessagePath = "/editMessage";
-        String showBoardMessagePath = "/showBoardMessage";
-        String createChildPath = "/createChildMessage";
-        String findNodeMessagePath = "/findNode";
-        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, findNodeMessagePath);
-        Servlet find = new FindNodeServlet(cassaBBS, showBoardMessagePath);
-        Servlet board = new ShowBoardMessageServlet(cassaBBS, createBoardMessagePath, createChildPath, editMessagePath, showBoardMessagePath);
-        Server serv = new Server(8000);
-        ServletHandler context = new ServletHandler();
-        context.addServletWithMapping(new ServletHolder(find), findNodeMessagePath);
-        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.setHandler(context);
-        serv.start();
-    }
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/BoardMessage.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
-
-public interface BoardMessage
-{
-	public String getUUID();
-	public String getAuthor();
-	public String getMessage();
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/BrowsingBulletinBoard.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-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);
-	Iterator<TreeNode> findNode(String bname, String key, String value);
-	String getNodePath(String bname, TreeNode node);
-	boolean childMove(String bname, String path, String childNum, String move);
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateBoardMessageServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-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);
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateBoardServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-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);
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/CreateChildServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-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{
-			PrintWriter pw = _res.getWriter();
-			if (!nodeName.equals("")) {
-				bbs.createChild(boardName, nodeName, path);
-				pw.write("successfully written");
-			} else {
-				pw.write("faild");
-			}
-		}catch(Exception _e){
-			_res.setStatus(500);
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/EditMessageServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-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);
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/FindNodeservlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.browsing;
-
-import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
-
-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 FindNodeServlet extends HttpServlet
-{
-    private final BrowsingBulletinBoard bbs;
-    private final String showBoardMessagePath ;
-    private static final String PARAM_BOARD_NAME = "bname";
-
-    private static final long serialVersionUID = 1L;
-
-    public FindNodeServlet(BrowsingBulletinBoard _bbs, String _showBoardMessagePath)
-    {
-        showBoardMessagePath = _showBoardMessagePath;
-        bbs = _bbs;
-    }
-
-    public void doGet(HttpServletRequest _req,HttpServletResponse _res)
-    {
-        String bname = _req.getParameter(PARAM_BOARD_NAME);
-        System.out.println("write");
-
-        try{
-            PrintWriter pw = _res.getWriter();
-            pw.write("<html><body><h1>find Node</h1>");
-            pw.write("<form 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>value<br/> <input type='textarea' name='value'/> </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("bname");
-        String key = _req.getParameter("key");
-        String value = _req.getParameter("value");
-
-        try{
-            Iterator<TreeNode> iterator = bbs.findNode(bname, key, value);
-            PrintWriter pw = _res.getWriter();
-            pw.write("<p>result</p>\n");
-            while (iterator.hasNext()) {
-                TreeNode node = iterator.next();
-                String childName = node.getAttributes().getString("NodeName");
-                String path = bbs.getNodePath(bname, node).replace("<","").replace(">","");
-                pw.write("<p><a href='" + showBoardMessagePath + "?bname=" + bname + "&path=" + path  + "'>" +childName + " : path = <" + path + "></a></p>");
-            }
-            pw.flush();
-        }catch(Exception _e){
-            _res.setStatus(500);
-        }
-    }
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/GetAttributeImp.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-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();
-  }
-
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/IterableConverter.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-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);
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/JungleBrowsingBulletinBoard.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-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.traverser.InterfaceTraverser;
-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 JungleBrowsingBulletinBoard(Jungle jungle) {
-        if (jungle.getTreeByName("boards") == null)
-            jungle.createNewTree("boards");
-        this.jungle = jungle;
-    }
-
-    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) {
-        createBoards(_name, new DefaultTreeNode());
-    }
-        public void createBoards(final String _name, TreeNode rootNode) {
-        if (null == jungle.createNewTree(_name, rootNode)) {
-            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();
-    }
-
-    @Override
-    public Iterator<TreeNode> findNode(String bname, String key, String value) {
-        JungleTree tree = jungle.getTreeByName(bname);
-        InterfaceTraverser traverser = tree.getTraverser(true);
-        return traverser.find((TreeNode node) -> {
-            return true;
-        },key,value);
-    }
-
-    @Override
-    public String getNodePath(String bname, TreeNode node) {
-        JungleTree tree = jungle.getTreeByName(bname);
-        NodePath path = tree.getNodePath(node);
-        return path.toString();
-    }
-
-    @Override
-    public boolean childMove(String bname, String pathString, String childNumString, String move) {
-        int childNum = Integer.parseInt(childNumString);
-        JungleTree tree = jungle.getTreeByName(bname);
-        DefaultNodePath path = createNodePath(pathString);
-        JungleTreeEditor editor = tree.getTreeEditor();
-        editor = editor.moveChild(path,childNum,move).b();
-        return editor.success().isB();
-    }
-
-    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;
-    }
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/ShowBoardMessageServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-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";
-    private static final String PARAM_CHILDNUM = "childNum";
-    private static final String MOVE = "move";
-
-    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);
-        String childNum = _req.getParameter(PARAM_CHILDNUM);
-        boolean moveSuccess = true;
-        if (childNum != null) {
-            String move = _req.getParameter(MOVE);
-            moveSuccess = bbs.childMove(bname, path, childNum, move);
-        }
-        try {
-            if (moveSuccess)
-                printBoard(bname, path, _res.getWriter());
-            else {
-                PrintWriter pw =  _res.getWriter();
-                pw.write("</body></html>");
-                pw.flush();
-            }
-        } 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>" + " " +
-                    "<a href='" + showBoardMessagePath + "?bname=" + bname + "&path=" + path + "&move=" + "up" + "&childNum=" + childCount + "'>" + "&#9650;" + "</a>" + " " +
-                    "<a href='" + showBoardMessagePath + "?bname=" + bname + "&path=" + path + "&move=" + "down" + "&childNum=" + childCount + "'>" + "&#9660;" + "</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();
-    }
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/ShowBoardsServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-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;
-	private final String findNodePath;
-	public ShowBoardsServlet(BrowsingBulletinBoard _bbs, String _createBoardPath,String _showBoardMessagePath, String _findNodePath)
-	{
-		bbs = _bbs;
-		findNodePath = _findNodePath;
-		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'/></form></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>  " +
-					"<a href='"+findNodePath+"?bname=" + bbs.sanitize(board) +"'>"+ "find</a>"
-					+ "</p>");
-		}
-		
-		_pw.write("</body></html>");
-		_pw.flush();
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/App.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-import me.prettyprint.hector.api.HConsistencyLevel;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-
-import javax.servlet.Servlet;
-
-
-/**
- * Hello world!
- *
- */
-public class App 
-{
-    public static void main( String[] args ) throws Exception
-    {
-    	BulletinBoard cassaBBS = null;
-    	if(args.length == 0){
-    		cassaBBS = new JungleBulletinBoard();
-    	}else{
-    		HConsistencyLevel cLevel = HConsistencyLevel.QUORUM;
-    		int rep_factor = 1;
-    		int i=0;
-    		while(i<args.length) {
-    			if(args[i].equals("-all")) {
-    				cLevel = HConsistencyLevel.ALL;
-    			}else if(args[i].equals("-one")){
-    				cLevel = HConsistencyLevel.ONE;
-    			}else if(args[i].equals("-quorum")){
-    				cLevel = HConsistencyLevel.QUORUM;
-    			}else if(args[i].equals("-any")){
-    				cLevel = HConsistencyLevel.ANY;
-    			}else if(args[i].equals("-rep")){
-    				i++;
-    				rep_factor = Integer.parseInt(args[i]);
-    			}
-    			i++;
-    		}
-			System.out.println("ConsistencyLevel "+cLevel.toString());
-			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";
-    	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);
-//    	Server serv = new Server();
-    	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);
-    	/* 
-    	 * For write benchmark 
-    	 */
-    	String editMessageUseGetPath = "/editMessageUseGet";
-    	Servlet editMessageUseGet = new EditMessageUseGetServlet(cassaBBS);
-    	context.addServletWithMapping(new ServletHolder(editMessageUseGet), editMessageUseGetPath);
-    	
-    	serv.setHandler(context);
-    	serv.start();
-    }
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/BoardMessage.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-public interface BoardMessage
-{
-	public String getUUID();
-	public String getAuthor();
-	public String getMessage();
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/BulletinBoard.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-public interface BulletinBoard
-{
-	public Iterable<String> getBoards();
-	public void createBoards(String _name, String _author, String _initMessage, String _editKey);
-	public void createBoardMessage(String _board, String _author, String _message, String _editKey);
-	public void editMessage(String _board, String _uuid, String _author, String _message, String _editKey);
-	public String sanitize(String str);
-  GetAttributeImp getAttribute(String _bname, String _nodeNum, String revisionStr);
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/CassandraBulletinBoard.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,219 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-import me.prettyprint.cassandra.model.ConfigurableConsistencyLevel;
-import me.prettyprint.cassandra.serializers.StringSerializer;
-import me.prettyprint.cassandra.serializers.UUIDSerializer;
-import me.prettyprint.cassandra.service.template.SuperCfResult;
-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.Cluster;
-import me.prettyprint.hector.api.HConsistencyLevel;
-import me.prettyprint.hector.api.Keyspace;
-import me.prettyprint.hector.api.beans.HSuperColumn;
-import me.prettyprint.hector.api.beans.OrderedSuperRows;
-import me.prettyprint.hector.api.beans.SuperRow;
-import me.prettyprint.hector.api.beans.SuperSlice;
-import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition;
-import me.prettyprint.hector.api.ddl.ColumnType;
-import me.prettyprint.hector.api.ddl.ComparatorType;
-import me.prettyprint.hector.api.ddl.KeyspaceDefinition;
-import me.prettyprint.hector.api.factory.HFactory;
-import me.prettyprint.hector.api.query.QueryResult;
-import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
-import me.prettyprint.hector.api.query.SuperSliceQuery;
-import org.apache.cassandra.locator.SimpleStrategy;
-
-import java.util.*;
-
-public class CassandraBulletinBoard implements BulletinBoard
-{
-	private final String address;
-	private final String clusterName;
-	private final Cluster cluster;
-	private final String keyspace;
-	private final ConfigurableConsistencyLevel configurableConsistencyLevel = new ConfigurableConsistencyLevel(); 
-	
-	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 )
-	{
-		address = _address;
-		clusterName = _clusterName;
-		keyspace = _keyspaceName;
-		cluster = HFactory.getOrCreateCluster(clusterName,address);
-		Map<String, HConsistencyLevel> clmap = new HashMap<String, HConsistencyLevel>();
-		clmap.put(COLUMN_FAMILY_BOARD, cLevel);
-		configurableConsistencyLevel.setReadCfConsistencyLevels(clmap);
-		configurableConsistencyLevel.setWriteCfConsistencyLevels(clmap);
-		REP_FACTOR = rep_factor;
-		initialize();
-	}
-	
-	public CassandraBulletinBoard(String _clusterName, String _address, String _keyspaceName, HConsistencyLevel cLevel)
-	{
-		this(_clusterName, _address, _keyspaceName, cLevel, 1);		
-	}
-	
-	
-	
-	private void initialize()
-	{
-		if(cluster.describeKeyspace(keyspace) == null){
-			KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace,
-					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);
-			cluster.addColumnFamily(columnFamilyDefinition);
-		}
-	}
-	
-	public Iterable<String> getBoards()
-	{
-		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
-		RangeSuperSlicesQuery<String,UUID,String,String> query = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(),
-				UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get());
-		query.setColumnFamily(COLUMN_FAMILY_BOARD).setKeys(null,null).setRange(null,null,false,0);
-		
-		QueryResult<OrderedSuperRows<String,UUID,String,String>> result = query.execute();
-		OrderedSuperRows<String,UUID,String,String> rows = result.get();
-		List<SuperRow<String,UUID,String,String>> list = rows.getList();
-		
-		IterableConverter.Converter<String,SuperRow<String,UUID,String,String>> converter
-			= new IterableConverter.Converter<String, SuperRow<String,UUID,String,String>>(){
-				public String conv(SuperRow<String, UUID, String, String> _b) {
-					return _b.getKey();
-				}
-			};
-		
-		return new IterableConverter<String,SuperRow<String,UUID,String,String>>(list,converter);
-	}
-	
-	private static final String COLUMN_MESSAGE_AUTHOR = "author";
-	private static final String COLUMN_MESSAGE_BODY = "message";
-	private static final String COLUMN_MESSAGE_EDIT_KEY = "edit";
-
-	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 = 
-				new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
-						UUIDSerializer.get(),StringSerializer.get());
-		
-		SuperCfUpdater<String,UUID,String> updater = template.createUpdater(_name,_time);
-		updater.setString(COLUMN_MESSAGE_AUTHOR,_author);
-		updater.setString(COLUMN_MESSAGE_BODY,_message);
-		updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey);
-		
-		template.update(updater);
-	}
-	
-	public void createBoards(String _name,String _author,String _initMessage,String _editKey)
-	{
-		UUID time = TimeUUIDUtils.getTimeUUID(0);
-		createBoardMessage(time,_name,_author,_initMessage,_editKey);
-	}
-
-	public Iterable<BoardMessage> getMessages(String _boardName)
-	{
-		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
-		SuperSliceQuery<String, UUID, String, String> query = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get());
-		
-		UUID start = TimeUUIDUtils.getTimeUUID(0);
-		query.setKey(_boardName).setColumnFamily(COLUMN_FAMILY_BOARD).setRange(start,null,false,100);
-		
-		QueryResult<SuperSlice<UUID, String, String>> result = query.execute();
-		SuperSlice<UUID,String,String> ss = result.get();
-		List<HSuperColumn<UUID,String,String>> list = ss.getSuperColumns();
-		
-		IterableConverter.Converter<BoardMessage,HSuperColumn<UUID,String,String>> converter =
-				new IterableConverter.Converter<BoardMessage,HSuperColumn<UUID,String,String>>(){
-					public BoardMessage conv(HSuperColumn<UUID, String, String> _b){
-						UUID uuid = _b.getName();
-						String author = _b.getSubColumnByName(COLUMN_MESSAGE_AUTHOR).getValue();
-						String message = _b.getSubColumnByName(COLUMN_MESSAGE_BODY).getValue();
-						BoardMessageImpl bm = new BoardMessageImpl(author,message,uuid.toString());
-						return bm;
-					}
-				};
-		
-		
-		return new IterableConverter<BoardMessage,HSuperColumn<UUID,String,String>>(list,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;
-		}
-	}
-
-	public void createBoardMessage(String _board, String _author, String _message,String _editKey)
-	{
-		UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
-		createBoardMessage(time,_board,_author,_message,_editKey);
-	}
-
-	public void editMessage(String _board,String _uuid,String _author,String _message,String _editKey)
-	{
-		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
-		UUID time = UUID.fromString(_uuid);
-		ThriftSuperCfTemplate<String,UUID,String> template = 
-				new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
-						UUIDSerializer.get(),StringSerializer.get());
-		
-		SuperCfResult<String,UUID,String> result = template.querySuperColumn(_board,time);
-		String editKey = result.getString(COLUMN_MESSAGE_EDIT_KEY);
-		if(!editKey.equals(editKey)){
-			return;
-		}
-		
-		SuperCfUpdater<String, UUID, String> updater = template.createUpdater(_board,time);
-		updater.setString(COLUMN_MESSAGE_AUTHOR,_author);
-		updater.setString(COLUMN_MESSAGE_BODY,_message);
-		updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey);
-		
-		template.update(updater);
-	}
-	
-	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 _nodeNum, String revisionStr) {
-    return null; // 未実装 使うときに実装する
-  }
-
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/CreateBoardMessageServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-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 BulletinBoard bbs;
-	private static final String PARAM_BOARD_NAME = "bname";
-	private static final String PARAM_BOARD_AUTHOR = "author";
-	private static final String PARAM_BOARD_MESSAGE= "msg";
-	private static final String PARAM_BOARD_EDITKEY = "key";
-	
-	private static final long serialVersionUID = 1L;
-	
-	public CreateBoardMessageServlet(BulletinBoard _bbs)
-	{
-		bbs = _bbs;
-	}
-	
-	@Override
-	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
-	{
-		String boardName = _req.getParameter(PARAM_BOARD_NAME);
-		String author = _req.getParameter(PARAM_BOARD_AUTHOR);
-		String msg = _req.getParameter(PARAM_BOARD_MESSAGE);
-		String key = _req.getParameter(PARAM_BOARD_EDITKEY);
-		
-		try{
-			bbs.createBoardMessage(boardName,author,msg,key);
-			PrintWriter pw = _res.getWriter();
-			pw.write("successfully written");
-		}catch(Exception _e){
-			_res.setStatus(500);
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/CreateBoardServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-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 BulletinBoard bbs;
-	private static final String PARAM_BOARD_NAME = "bname";
-	private static final String PARAM_BOARD_AUTHOR = "author";
-	private static final String PARAM_BOARD_INITMESSAGE= "msg";
-	private static final String PARAM_BOARD_EDITKEY = "key";
-	
-	private static final long serialVersionUID = 1L;
-	
-	public CreateBoardServlet(BulletinBoard _bbs)
-	{
-		bbs = _bbs;
-	}
-
-	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
-	{
-		String boardName = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_NAME));
-		String author = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_AUTHOR));
-		String msg = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_INITMESSAGE));
-		String key = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_EDITKEY));
-		
-		try{
-			bbs.createBoards(boardName,author,msg,key);
-			PrintWriter pw = _res.getWriter();
-			pw.write("successfully written");
-		}catch(Exception _e){
-			_res.setStatus(500);
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/EditMessageServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-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 BulletinBoard bbs;
-	private static final String PARAM_BOARD_NAME = "bname";
-	private static final String PARAM_BOARD_MSGID = "uuid";
-	private static final String PARAM_BOARD_AUTHOR = "author";
-	private static final String PARAM_BOARD_MESSAGE= "msg";
-	private static final String PARAM_BOARD_EDITKEY = "key";
-	
-	private static final long serialVersionUID = 1L;
-	
-	public EditMessageServlet(BulletinBoard _bbs)
-	{
-		bbs = _bbs;
-	}
-	
-	public void doGet(HttpServletRequest _req,HttpServletResponse _res)
-	{
-		String bname = _req.getParameter(PARAM_BOARD_NAME);
-		String uuid = _req.getParameter(PARAM_BOARD_MSGID);
-		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>Author : <input type='text' name='author'/>" +
-					"<input type='hidden' name='key' value='"+uuid+"'/>" +
-					"<input type='hidden' name='bname' value='"+bname+"'</p>\n");
-			pw.write("<p>Message<br/> <input type='textarea' name='msg'/> </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 boardName = _req.getParameter(PARAM_BOARD_NAME);
-		String author = _req.getParameter(PARAM_BOARD_AUTHOR);
-		String msg = _req.getParameter(PARAM_BOARD_MESSAGE);
-		String key = _req.getParameter(PARAM_BOARD_EDITKEY);
-		String uuid = _req.getParameter(PARAM_BOARD_MSGID);
-		
-		try{
-			bbs.editMessage(boardName, uuid, author, msg, key);
-			PrintWriter pw = _res.getWriter();
-			pw.write("successfully written");
-			pw.flush();
-		}catch(Exception _e){
-			_res.setStatus(500);
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/EditMessageUseGetServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.PrintWriter;
-
-public class EditMessageUseGetServlet extends HttpServlet{
-		private final BulletinBoard bbs;
-		private static final String PARAM_BOARD_NAME = "bname";
-		private static final String PARAM_BOARD_MSGID = "uuid";
-		private static final String PARAM_BOARD_AUTHOR = "author";
-		private static final String PARAM_BOARD_MESSAGE= "msg";
-		private static final String PARAM_BOARD_EDITKEY = "key";
-		
-		private static final long serialVersionUID = 1L;
-		
-		public EditMessageUseGetServlet(BulletinBoard _bbs)
-		{
-			bbs = _bbs;
-		}
-		
-		public void doGet(HttpServletRequest _req,HttpServletResponse _res)
-		{
-			String boardName = _req.getParameter(PARAM_BOARD_NAME);
-			String author = _req.getParameter(PARAM_BOARD_AUTHOR);
-			String msg = _req.getParameter(PARAM_BOARD_MESSAGE);
-			String key = _req.getParameter(PARAM_BOARD_EDITKEY);
-			String uuid = _req.getParameter(PARAM_BOARD_MSGID);
-			
-			try{
-				bbs.editMessage(boardName, uuid, author, msg, key);
-				PrintWriter pw = _res.getWriter();
-				pw.write("successfully written");
-				pw.flush();
-			}catch(Exception _e){
-				_res.setStatus(500);
-			}
-		}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/GetAttributeImp.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-
-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();
-  }
-
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/HectorSample.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-import me.prettyprint.cassandra.serializers.StringSerializer;
-import me.prettyprint.cassandra.serializers.UUIDSerializer;
-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.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;
-import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
-import me.prettyprint.hector.api.query.SuperSliceQuery;
-
-import java.util.List;
-import java.util.UUID;
-
-public class HectorSample
-{
-	public static void main(String _args[])
-	{
-		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(),
-						UUIDSerializer.get(),StringSerializer.get());
-		UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
-		SuperCfUpdater<String,UUID,String> updater = template.createUpdater("board1",TimeUUIDUtils.getTimeUUID(0));
-		updater.setString("name","peter");
-		updater.setString("message",time.toString());
-
-		template.update(updater);
-
-		UUID start = TimeUUIDUtils.getTimeUUID(0);
-
-		SuperSliceQuery<String, UUID, String, String> sq = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get());
-		sq.setKey("board1").setColumnFamily("ccc").setRange(start,null,false,100);
-
-		QueryResult<SuperSlice<UUID,String,String>> results = sq.execute();
-
-		SuperSlice<UUID,String,String> ss = results.get();
-		List<HSuperColumn<UUID,String,String>> list = ss.getSuperColumns();
-		for(HSuperColumn<UUID,String,String> sc : list){
-			HColumn<String,String> sub = sc.getSubColumnByName("name");
-			System.out.println(sub.getValue());
-			sub = sc.getSubColumnByName("message");
-			System.out.println(sub.getValue());
-		}
-
-		RangeSuperSlicesQuery<String,UUID,String,String> rsq = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(),
-				UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get());
-		rsq.setKeys(null,null).setRange(null,null,false,0).setColumnFamily("ccc");
-
-		QueryResult<OrderedSuperRows<String,UUID,String,String>> rsqResult = rsq.execute();
-		OrderedSuperRows<String, UUID, String, String> rows = rsqResult.get();
-		for(SuperRow<String, UUID, String, String>  row : rows.getList()){
-			System.out.println(row.getKey());
-		}
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/IterableConverter.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-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);
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-
-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.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.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.concurrent.atomic.AtomicInteger;
-
-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");
-		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, 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();
-		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();
-		}
-		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 {
-			TreeNode 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();
-			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();
-			}
-			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();
-
-			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();
-			}
-			editor = either.b();
-		}while (editor.success().isA());
-	}
-
-	public Iterable<BoardMessage> getMessages(String _boardName) {
-		JungleTree tree = jungle.getTreeByName(_boardName);
-		TreeNode node = tree.getRootNode();
-		Children chs = node.getChildren();
-
-		final AtomicInteger counter = new AtomicInteger(0);
-		IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() {
-			public BoardMessage conv(TreeNode _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, TreeNode>(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;
-		}
-	}
-
-	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,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);
-    }
-
-    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	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-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 BulletinBoard bbs;
-    private final String createBoardMessagePath;
-
-    private static final String PARAM_BOARD_NAME = "bname";
-
-    public ShowBoardMessageServlet(BulletinBoard _bbs, String _createBoardMessagePath, String _editMessagePath) {
-        bbs = _bbs;
-        createBoardMessagePath = _createBoardMessagePath;
-    }
-
-    public void doGet(HttpServletRequest _req, HttpServletResponse _res) {
-        String bname = _req.getParameter(PARAM_BOARD_NAME);
-
-        try {
-            printBoard(bname, _res.getWriter());
-        } catch (Exception _e) {
-            _res.setStatus(500);
-        }
-
-    }
-
-    private void printBoard(String _bname, PrintWriter _pw) throws Exception {
-        _pw.write("<html><body>\n");
-        _pw.write("<h1>" + bbs.sanitize(_bname) + "</h1>\n");
-
-        _pw.write("<form action='" + createBoardMessagePath + "' method='POST'\n");
-        _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");
-        Iterator<String> keys = attribute.getKeys();
-
-        do {
-            String key = keys.next();
-            String mesage = attribute.getMessage(key);
-            _pw.write("<p>" + key + " = " + mesage + "</p>\n");
-        } while (keys.hasNext());
-
-        _pw.write("</body></html>");
-        _pw.flush();
-    }
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/ShowBoardsServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.local;
-
-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 BulletinBoard bbs;
-	private final String createBoardPath;
-	private final String showBoardMessagePath;
-
-	public ShowBoardsServlet(BulletinBoard _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>Author : <input type='text' name='author'/> 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><hr/>\n");
-		
-		_pw.write("<h2>list of boards</h2>");
-		for(String board : bbs.getBoards()){
-			_pw.write("<p><a href='"+showBoardMessagePath+"?bname=" + bbs.sanitize(board) + "'>"+ bbs.sanitize(board) + "</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/local/bbs/App.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,75 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+import me.prettyprint.hector.api.HConsistencyLevel;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.ServletHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+import javax.servlet.Servlet;
+
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args ) throws Exception
+    {
+    	BulletinBoard cassaBBS = null;
+    	if(args.length == 0){
+    		cassaBBS = new JungleBulletinBoard();
+    	}else{
+    		HConsistencyLevel cLevel = HConsistencyLevel.QUORUM;
+    		int rep_factor = 1;
+    		int i=0;
+    		while(i<args.length) {
+    			if(args[i].equals("-all")) {
+    				cLevel = HConsistencyLevel.ALL;
+    			}else if(args[i].equals("-one")){
+    				cLevel = HConsistencyLevel.ONE;
+    			}else if(args[i].equals("-quorum")){
+    				cLevel = HConsistencyLevel.QUORUM;
+    			}else if(args[i].equals("-any")){
+    				cLevel = HConsistencyLevel.ANY;
+    			}else if(args[i].equals("-rep")){
+    				i++;
+    				rep_factor = Integer.parseInt(args[i]);
+    			}
+    			i++;
+    		}
+			System.out.println("ConsistencyLevel "+cLevel.toString());
+			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";
+    	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);
+//    	Server serv = new Server();
+    	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);
+    	/* 
+    	 * For write benchmark 
+    	 */
+    	String editMessageUseGetPath = "/editMessageUseGet";
+    	Servlet editMessageUseGet = new EditMessageUseGetServlet(cassaBBS);
+    	context.addServletWithMapping(new ServletHolder(editMessageUseGet), editMessageUseGetPath);
+    	
+    	serv.setHandler(context);
+    	serv.start();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/BoardMessage.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,8 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+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/local/bbs/BulletinBoard.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,11 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+public interface BulletinBoard
+{
+	public Iterable<String> getBoards();
+	public void createBoards(String _name, String _author, String _initMessage, String _editKey);
+	public void createBoardMessage(String _board, String _author, String _message, String _editKey);
+	public void editMessage(String _board, String _uuid, String _author, String _message, String _editKey);
+	public String sanitize(String str);
+  GetAttributeImp getAttribute(String _bname, String _nodeNum, String revisionStr);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/CassandraBulletinBoard.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,219 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+import me.prettyprint.cassandra.model.ConfigurableConsistencyLevel;
+import me.prettyprint.cassandra.serializers.StringSerializer;
+import me.prettyprint.cassandra.serializers.UUIDSerializer;
+import me.prettyprint.cassandra.service.template.SuperCfResult;
+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.Cluster;
+import me.prettyprint.hector.api.HConsistencyLevel;
+import me.prettyprint.hector.api.Keyspace;
+import me.prettyprint.hector.api.beans.HSuperColumn;
+import me.prettyprint.hector.api.beans.OrderedSuperRows;
+import me.prettyprint.hector.api.beans.SuperRow;
+import me.prettyprint.hector.api.beans.SuperSlice;
+import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition;
+import me.prettyprint.hector.api.ddl.ColumnType;
+import me.prettyprint.hector.api.ddl.ComparatorType;
+import me.prettyprint.hector.api.ddl.KeyspaceDefinition;
+import me.prettyprint.hector.api.factory.HFactory;
+import me.prettyprint.hector.api.query.QueryResult;
+import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
+import me.prettyprint.hector.api.query.SuperSliceQuery;
+import org.apache.cassandra.locator.SimpleStrategy;
+
+import java.util.*;
+
+public class CassandraBulletinBoard implements BulletinBoard
+{
+	private final String address;
+	private final String clusterName;
+	private final Cluster cluster;
+	private final String keyspace;
+	private final ConfigurableConsistencyLevel configurableConsistencyLevel = new ConfigurableConsistencyLevel(); 
+	
+	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 )
+	{
+		address = _address;
+		clusterName = _clusterName;
+		keyspace = _keyspaceName;
+		cluster = HFactory.getOrCreateCluster(clusterName,address);
+		Map<String, HConsistencyLevel> clmap = new HashMap<String, HConsistencyLevel>();
+		clmap.put(COLUMN_FAMILY_BOARD, cLevel);
+		configurableConsistencyLevel.setReadCfConsistencyLevels(clmap);
+		configurableConsistencyLevel.setWriteCfConsistencyLevels(clmap);
+		REP_FACTOR = rep_factor;
+		initialize();
+	}
+	
+	public CassandraBulletinBoard(String _clusterName, String _address, String _keyspaceName, HConsistencyLevel cLevel)
+	{
+		this(_clusterName, _address, _keyspaceName, cLevel, 1);		
+	}
+	
+	
+	
+	private void initialize()
+	{
+		if(cluster.describeKeyspace(keyspace) == null){
+			KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace,
+					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);
+			cluster.addColumnFamily(columnFamilyDefinition);
+		}
+	}
+	
+	public Iterable<String> getBoards()
+	{
+		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
+		RangeSuperSlicesQuery<String,UUID,String,String> query = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(),
+				UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get());
+		query.setColumnFamily(COLUMN_FAMILY_BOARD).setKeys(null,null).setRange(null,null,false,0);
+		
+		QueryResult<OrderedSuperRows<String,UUID,String,String>> result = query.execute();
+		OrderedSuperRows<String,UUID,String,String> rows = result.get();
+		List<SuperRow<String,UUID,String,String>> list = rows.getList();
+		
+		IterableConverter.Converter<String,SuperRow<String,UUID,String,String>> converter
+			= new IterableConverter.Converter<String, SuperRow<String,UUID,String,String>>(){
+				public String conv(SuperRow<String, UUID, String, String> _b) {
+					return _b.getKey();
+				}
+			};
+		
+		return new IterableConverter<String,SuperRow<String,UUID,String,String>>(list,converter);
+	}
+	
+	private static final String COLUMN_MESSAGE_AUTHOR = "author";
+	private static final String COLUMN_MESSAGE_BODY = "message";
+	private static final String COLUMN_MESSAGE_EDIT_KEY = "edit";
+
+	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 = 
+				new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
+						UUIDSerializer.get(),StringSerializer.get());
+		
+		SuperCfUpdater<String,UUID,String> updater = template.createUpdater(_name,_time);
+		updater.setString(COLUMN_MESSAGE_AUTHOR,_author);
+		updater.setString(COLUMN_MESSAGE_BODY,_message);
+		updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey);
+		
+		template.update(updater);
+	}
+	
+	public void createBoards(String _name,String _author,String _initMessage,String _editKey)
+	{
+		UUID time = TimeUUIDUtils.getTimeUUID(0);
+		createBoardMessage(time,_name,_author,_initMessage,_editKey);
+	}
+
+	public Iterable<BoardMessage> getMessages(String _boardName)
+	{
+		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
+		SuperSliceQuery<String, UUID, String, String> query = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get());
+		
+		UUID start = TimeUUIDUtils.getTimeUUID(0);
+		query.setKey(_boardName).setColumnFamily(COLUMN_FAMILY_BOARD).setRange(start,null,false,100);
+		
+		QueryResult<SuperSlice<UUID, String, String>> result = query.execute();
+		SuperSlice<UUID,String,String> ss = result.get();
+		List<HSuperColumn<UUID,String,String>> list = ss.getSuperColumns();
+		
+		IterableConverter.Converter<BoardMessage,HSuperColumn<UUID,String,String>> converter =
+				new IterableConverter.Converter<BoardMessage,HSuperColumn<UUID,String,String>>(){
+					public BoardMessage conv(HSuperColumn<UUID, String, String> _b){
+						UUID uuid = _b.getName();
+						String author = _b.getSubColumnByName(COLUMN_MESSAGE_AUTHOR).getValue();
+						String message = _b.getSubColumnByName(COLUMN_MESSAGE_BODY).getValue();
+						BoardMessageImpl bm = new BoardMessageImpl(author,message,uuid.toString());
+						return bm;
+					}
+				};
+		
+		
+		return new IterableConverter<BoardMessage,HSuperColumn<UUID,String,String>>(list,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;
+		}
+	}
+
+	public void createBoardMessage(String _board, String _author, String _message,String _editKey)
+	{
+		UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
+		createBoardMessage(time,_board,_author,_message,_editKey);
+	}
+
+	public void editMessage(String _board,String _uuid,String _author,String _message,String _editKey)
+	{
+		Keyspace ksp = HFactory.createKeyspace(keyspace, cluster, configurableConsistencyLevel);
+		UUID time = UUID.fromString(_uuid);
+		ThriftSuperCfTemplate<String,UUID,String> template = 
+				new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
+						UUIDSerializer.get(),StringSerializer.get());
+		
+		SuperCfResult<String,UUID,String> result = template.querySuperColumn(_board,time);
+		String editKey = result.getString(COLUMN_MESSAGE_EDIT_KEY);
+		if(!editKey.equals(editKey)){
+			return;
+		}
+		
+		SuperCfUpdater<String, UUID, String> updater = template.createUpdater(_board,time);
+		updater.setString(COLUMN_MESSAGE_AUTHOR,_author);
+		updater.setString(COLUMN_MESSAGE_BODY,_message);
+		updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey);
+		
+		template.update(updater);
+	}
+	
+	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 _nodeNum, String revisionStr) {
+    return null; // 未実装 使うときに実装する
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/CreateBoardMessageServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,39 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+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 BulletinBoard bbs;
+	private static final String PARAM_BOARD_NAME = "bname";
+	private static final String PARAM_BOARD_AUTHOR = "author";
+	private static final String PARAM_BOARD_MESSAGE= "msg";
+	private static final String PARAM_BOARD_EDITKEY = "key";
+	
+	private static final long serialVersionUID = 1L;
+	
+	public CreateBoardMessageServlet(BulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+	
+	@Override
+	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String boardName = _req.getParameter(PARAM_BOARD_NAME);
+		String author = _req.getParameter(PARAM_BOARD_AUTHOR);
+		String msg = _req.getParameter(PARAM_BOARD_MESSAGE);
+		String key = _req.getParameter(PARAM_BOARD_EDITKEY);
+		
+		try{
+			bbs.createBoardMessage(boardName,author,msg,key);
+			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/local/bbs/CreateBoardServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,40 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+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 BulletinBoard bbs;
+	private static final String PARAM_BOARD_NAME = "bname";
+	private static final String PARAM_BOARD_AUTHOR = "author";
+	private static final String PARAM_BOARD_INITMESSAGE= "msg";
+	private static final String PARAM_BOARD_EDITKEY = "key";
+	
+	private static final long serialVersionUID = 1L;
+	
+	public CreateBoardServlet(BulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+
+	public void doPost(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String boardName = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_NAME));
+		String author = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_AUTHOR));
+		String msg = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_INITMESSAGE));
+		String key = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_EDITKEY));
+		
+		try{
+			bbs.createBoards(boardName,author,msg,key);
+			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/local/bbs/EditMessageServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,63 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+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 BulletinBoard bbs;
+	private static final String PARAM_BOARD_NAME = "bname";
+	private static final String PARAM_BOARD_MSGID = "uuid";
+	private static final String PARAM_BOARD_AUTHOR = "author";
+	private static final String PARAM_BOARD_MESSAGE= "msg";
+	private static final String PARAM_BOARD_EDITKEY = "key";
+	
+	private static final long serialVersionUID = 1L;
+	
+	public EditMessageServlet(BulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+	
+	public void doGet(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		String bname = _req.getParameter(PARAM_BOARD_NAME);
+		String uuid = _req.getParameter(PARAM_BOARD_MSGID);
+		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>Author : <input type='text' name='author'/>" +
+					"<input type='hidden' name='key' value='"+uuid+"'/>" +
+					"<input type='hidden' name='bname' value='"+bname+"'</p>\n");
+			pw.write("<p>Message<br/> <input type='textarea' name='msg'/> </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 boardName = _req.getParameter(PARAM_BOARD_NAME);
+		String author = _req.getParameter(PARAM_BOARD_AUTHOR);
+		String msg = _req.getParameter(PARAM_BOARD_MESSAGE);
+		String key = _req.getParameter(PARAM_BOARD_EDITKEY);
+		String uuid = _req.getParameter(PARAM_BOARD_MSGID);
+		
+		try{
+			bbs.editMessage(boardName, uuid, author, msg, key);
+			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/local/bbs/EditMessageUseGetServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,40 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+public class EditMessageUseGetServlet extends HttpServlet{
+		private final BulletinBoard bbs;
+		private static final String PARAM_BOARD_NAME = "bname";
+		private static final String PARAM_BOARD_MSGID = "uuid";
+		private static final String PARAM_BOARD_AUTHOR = "author";
+		private static final String PARAM_BOARD_MESSAGE= "msg";
+		private static final String PARAM_BOARD_EDITKEY = "key";
+		
+		private static final long serialVersionUID = 1L;
+		
+		public EditMessageUseGetServlet(BulletinBoard _bbs)
+		{
+			bbs = _bbs;
+		}
+		
+		public void doGet(HttpServletRequest _req,HttpServletResponse _res)
+		{
+			String boardName = _req.getParameter(PARAM_BOARD_NAME);
+			String author = _req.getParameter(PARAM_BOARD_AUTHOR);
+			String msg = _req.getParameter(PARAM_BOARD_MESSAGE);
+			String key = _req.getParameter(PARAM_BOARD_EDITKEY);
+			String uuid = _req.getParameter(PARAM_BOARD_MSGID);
+			
+			try{
+				bbs.editMessage(boardName, uuid, author, msg, key);
+				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/local/bbs/FindNodeServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,69 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+
+import jp.ac.u_ryukyu.ie.cr.bbs.local.browsing.BrowsingBulletinBoard;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
+
+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 FindNodeServlet extends HttpServlet
+{
+    private final BrowsingBulletinBoard bbs;
+    private final String showBoardMessagePath ;
+    private static final String PARAM_BOARD_NAME = "bname";
+
+    private static final long serialVersionUID = 1L;
+
+    public FindNodeServlet(BrowsingBulletinBoard _bbs, String _showBoardMessagePath)
+    {
+        showBoardMessagePath = _showBoardMessagePath;
+        bbs = _bbs;
+    }
+
+    public void doGet(HttpServletRequest _req, HttpServletResponse _res)
+    {
+        String bname = _req.getParameter(PARAM_BOARD_NAME);
+        System.out.println("write");
+
+        try{
+            PrintWriter pw = _res.getWriter();
+            pw.write("<html><body><h1>find Node</h1>");
+            pw.write("<form 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>value<br/> <input type='textarea' name='value'/> </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("bname");
+        String key = _req.getParameter("key");
+        String value = _req.getParameter("value");
+
+        try{
+            Iterator<TreeNode> iterator = bbs.findNode(bname, key, value);
+            PrintWriter pw = _res.getWriter();
+            pw.write("<p>result</p>\n");
+            while (iterator.hasNext()) {
+                TreeNode node = iterator.next();
+                String childName = node.getAttributes().getString("NodeName");
+                String path = bbs.getNodePath(bname, node).replace("<","").replace(">","");
+                pw.write("<p><a href='" + showBoardMessagePath + "?bname=" + bname + "&path=" + path  + "'>" +childName + " : path = <" + path + "></a></p>");
+            }
+            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/local/bbs/GetAttributeImp.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,23 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.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/local/bbs/HectorSample.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,68 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+import me.prettyprint.cassandra.serializers.StringSerializer;
+import me.prettyprint.cassandra.serializers.UUIDSerializer;
+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.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;
+import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
+import me.prettyprint.hector.api.query.SuperSliceQuery;
+
+import java.util.List;
+import java.util.UUID;
+
+public class HectorSample
+{
+	public static void main(String _args[])
+	{
+		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(),
+						UUIDSerializer.get(),StringSerializer.get());
+		UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
+		SuperCfUpdater<String,UUID,String> updater = template.createUpdater("board1",TimeUUIDUtils.getTimeUUID(0));
+		updater.setString("name","peter");
+		updater.setString("message",time.toString());
+
+		template.update(updater);
+
+		UUID start = TimeUUIDUtils.getTimeUUID(0);
+
+		SuperSliceQuery<String, UUID, String, String> sq = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get());
+		sq.setKey("board1").setColumnFamily("ccc").setRange(start,null,false,100);
+
+		QueryResult<SuperSlice<UUID,String,String>> results = sq.execute();
+
+		SuperSlice<UUID,String,String> ss = results.get();
+		List<HSuperColumn<UUID,String,String>> list = ss.getSuperColumns();
+		for(HSuperColumn<UUID,String,String> sc : list){
+			HColumn<String,String> sub = sc.getSubColumnByName("name");
+			System.out.println(sub.getValue());
+			sub = sc.getSubColumnByName("message");
+			System.out.println(sub.getValue());
+		}
+
+		RangeSuperSlicesQuery<String,UUID,String,String> rsq = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(),
+				UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get());
+		rsq.setKeys(null,null).setRange(null,null,false,0).setColumnFamily("ccc");
+
+		QueryResult<OrderedSuperRows<String,UUID,String,String>> rsqResult = rsq.execute();
+		OrderedSuperRows<String, UUID, String, String> rows = rsqResult.get();
+		for(SuperRow<String, UUID, String, String>  row : rows.getList()){
+			System.out.println(row.getKey());
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/bbs/IterableConverter.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,52 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+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/local/bbs/JungleBulletinBoard.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,208 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+
+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.core.Children;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.Default.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class JungleBulletinBoard implements
+		BulletinBoard {
+	private final Jungle jungle;
+
+	public JungleBulletinBoard() {
+		jungle = new DefaultJungle(null, "hoge");
+		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, 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.getJungleTreeEditor();
+		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.getJungleTreeEditor();
+		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();
+		}
+		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 {
+			TreeNode node = tree.getRootNode();
+			int size = node.getChildren().size();
+			DefaultNodePath path = new DefaultNodePath();
+
+			editor = tree.getJungleTreeEditor();
+			Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path,
+					size);
+			if (either.isA()) {
+				throw new IllegalStateException();
+			}
+			editor = either.b();
+			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();
+			}
+			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.getJungleTreeEditor();
+
+			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();
+			}
+			editor = either.b();
+		}while (editor.success().isA());
+	}
+
+	public Iterable<BoardMessage> getMessages(String _boardName) {
+		JungleTree tree = jungle.getTreeByName(_boardName);
+		TreeNode node = tree.getRootNode();
+		Children chs = node.getChildren();
+
+		final AtomicInteger counter = new AtomicInteger(0);
+		IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() {
+			public BoardMessage conv(TreeNode _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, TreeNode>(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;
+		}
+	}
+
+	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,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);
+    }
+
+    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/local/bbs/ShowBoardMessageServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,56 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+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 BulletinBoard bbs;
+    private final String createBoardMessagePath;
+
+    private static final String PARAM_BOARD_NAME = "bname";
+
+    public ShowBoardMessageServlet(BulletinBoard _bbs, String _createBoardMessagePath, String _editMessagePath) {
+        bbs = _bbs;
+        createBoardMessagePath = _createBoardMessagePath;
+    }
+
+    public void doGet(HttpServletRequest _req, HttpServletResponse _res) {
+        String bname = _req.getParameter(PARAM_BOARD_NAME);
+
+        try {
+            printBoard(bname, _res.getWriter());
+        } catch (Exception _e) {
+            _res.setStatus(500);
+        }
+
+    }
+
+    private void printBoard(String _bname, PrintWriter _pw) throws Exception {
+        _pw.write("<html><body>\n");
+        _pw.write("<h1>" + bbs.sanitize(_bname) + "</h1>\n");
+
+        _pw.write("<form action='" + createBoardMessagePath + "' method='POST'\n");
+        _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,0", "-1");
+
+        Iterator<String> keys = attribute.getKeys();
+
+        do {
+            String key = keys.next();
+            String mesage = attribute.getMessage(key);
+            _pw.write("<p>" + key + " = " + mesage + "</p>\n");
+        } while (keys.hasNext());
+
+        _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/local/bbs/ShowBoardsServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,55 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.bbs;
+
+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 BulletinBoard bbs;
+	private final String createBoardPath;
+	private final String showBoardMessagePath;
+
+	public ShowBoardsServlet(BulletinBoard _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>Author : <input type='text' name='author'/> 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><hr/>\n");
+		
+		_pw.write("<h2>list of boards</h2>");
+		for(String board : bbs.getBoards()){
+			_pw.write("<p><a href='"+showBoardMessagePath+"?bname=" + bbs.sanitize(board) + "'>"+ bbs.sanitize(board) + "</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/local/browsing/App.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,52 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.browsing;
+
+import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.ServletHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+import javax.servlet.Servlet;
+
+
+/**
+ * Hello world!
+ */
+public class App {
+
+
+    public static void main(String[] args) throws Exception {
+        System.out.println("main");
+        Jungle jungle = new DefaultJungle(null, "hoge");
+        new App().startBBS(args, jungle);
+    }
+
+
+    public void startBBS(String[] args, Jungle jungle) throws Exception {
+        BrowsingBulletinBoard cassaBBS = new JungleBrowsingBulletinBoard(jungle);
+        String createBoardMessagePath = "/createBoardMessage";
+        String createBoardPath = "/createBoard";
+        String editMessagePath = "/editMessage";
+        String showBoardMessagePath = "/showBoardMessage";
+        String createChildPath = "/createChildMessage";
+        String findNodeMessagePath = "/findNode";
+        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, findNodeMessagePath);
+        Servlet find = new FindNodeServlet(cassaBBS, showBoardMessagePath);
+        Servlet board = new ShowBoardMessageServlet(cassaBBS, createBoardMessagePath, createChildPath, editMessagePath, showBoardMessagePath);
+        Server serv = new Server(8000);
+        ServletHandler context = new ServletHandler();
+        context.addServletWithMapping(new ServletHolder(find), findNodeMessagePath);
+        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.setHandler(context);
+        serv.start();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/BoardMessage.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,8 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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/local/browsing/BrowsingBulletinBoard.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,21 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.browsing;
+
+
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.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);
+	Iterator<TreeNode> findNode(String bname, String key, String value);
+	String getNodePath(String bname, TreeNode node);
+	boolean childMove(String bname, String path, String childNum, String move);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/browsing/CreateBoardMessageServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,39 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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/local/browsing/CreateBoardServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,32 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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/local/browsing/CreateChildServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,41 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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{
+			PrintWriter pw = _res.getWriter();
+			if (!nodeName.equals("")) {
+				bbs.createChild(boardName, nodeName, path);
+				pw.write("successfully written");
+			} else {
+				pw.write("faild");
+			}
+		}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/local/browsing/EditMessageServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,63 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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/local/browsing/GetAttributeImp.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,23 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.browsing;
+
+
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.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/local/browsing/IterableConverter.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,52 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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/local/browsing/JungleBrowsingBulletinBoard.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,230 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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.core.Children;
+import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.InterfaceTraverser;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.NulIterator;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.Default.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNodeChildren;
+import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.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");
+        jungle.createNewTree("boards");
+    }
+
+    public JungleBrowsingBulletinBoard(Jungle jungle) {
+        if (jungle.getTreeByName("boards") == null)
+            jungle.createNewTree("boards");
+        this.jungle = jungle;
+    }
+
+    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) {
+        createBoards(_name, new DefaultTreeNode());
+    }
+        public void createBoards(final String _name, TreeNode rootNode) {
+        if (null == jungle.createNewTree(_name, rootNode)) {
+            throw new IllegalStateException();
+        }
+        JungleTree tree = jungle.getTreeByName("boards");
+        JungleTreeEditor editor = tree.getJungleTreeEditor();
+        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.getJungleTreeEditor();
+        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.getJungleTreeEditor();
+            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.getJungleTreeEditor();
+            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.getJungleTreeEditor();
+
+            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();
+    }
+
+    @Override
+    public Iterator<TreeNode> findNode(String bname, String key, String value) {
+        JungleTree tree = jungle.getTreeByName(bname);
+        InterfaceTraverser traverser = tree.getTraverser(true);
+        return traverser.find((TreeNode node) -> {
+            return true;
+        },key,value);
+    }
+
+    @Override
+    public String getNodePath(String bname, TreeNode node) {
+        JungleTree tree = jungle.getTreeByName(bname);
+        NodePath path = tree.getNodePath(node);
+        return path.toString();
+    }
+
+    @Override
+    public boolean childMove(String bname, String pathString, String childNumString, String move) {
+        int childNum = Integer.parseInt(childNumString);
+        JungleTree tree = jungle.getTreeByName(bname);
+        DefaultNodePath path = createNodePath(pathString);
+        JungleTreeEditor editor = tree.getJungleTreeEditor();
+        editor = editor.moveChild(path,childNum,move).b();
+        return editor.success().isB();
+    }
+
+    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/local/browsing/ShowBoardMessageServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,104 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.browsing;
+
+
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.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";
+    private static final String PARAM_CHILDNUM = "childNum";
+    private static final String MOVE = "move";
+
+    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);
+        String childNum = _req.getParameter(PARAM_CHILDNUM);
+        boolean moveSuccess = true;
+        if (childNum != null) {
+            String move = _req.getParameter(MOVE);
+            moveSuccess = bbs.childMove(bname, path, childNum, move);
+        }
+        try {
+            if (moveSuccess)
+                printBoard(bname, path, _res.getWriter());
+            else {
+                PrintWriter pw =  _res.getWriter();
+                pw.write("</body></html>");
+                pw.flush();
+            }
+        } 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>" + " " +
+                    "<a href='" + showBoardMessagePath + "?bname=" + bname + "&path=" + path + "&move=" + "up" + "&childNum=" + childCount + "'>" + "&#9650;" + "</a>" + " " +
+                    "<a href='" + showBoardMessagePath + "?bname=" + bname + "&path=" + path + "&move=" + "down" + "&childNum=" + childCount + "'>" + "&#9660;" + "</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/local/browsing/ShowBoardsServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,56 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.local.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;
+	private final String findNodePath;
+	public ShowBoardsServlet(BrowsingBulletinBoard _bbs, String _createBoardPath,String _showBoardMessagePath, String _findNodePath)
+	{
+		bbs = _bbs;
+		findNodePath = _findNodePath;
+		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'/></form></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>  " +
+					"<a href='"+findNodePath+"?bname=" + bbs.sanitize(board) +"'>"+ "find</a>"
+					+ "</p>");
+		}
+		
+		_pw.write("</body></html>");
+		_pw.flush();
+	}
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/BoardRenewTime.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.network;
-
-public interface BoardRenewTime {
-
-	public String getboardName();
-	public Long getRenewTime();	
-	
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/BulletinBoardJungleManager.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.network;
-
-
-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.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.DefaultTraverser;
-import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
-import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.operations.NetworkTreeOperationLog;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.transaction.JungleUpdater;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class BulletinBoardJungleManager {
-	private static BulletinBoardJungleManager instance = new BulletinBoardJungleManager();
-	private Jungle jungle;
-	private static AtomicInteger requestCounter = new AtomicInteger(0);
-
-	private BulletinBoardJungleManager() {
-		jungle = new DefaultJungle(null,"default",new DefaultTreeEditor(new DefaultTraverser()));
-	}
-	
-	public static int requestGetAndIncrement() {
-		return requestCounter.getAndIncrement();
-	}
-	
-	public static int requestIncrementAndGet() {
-		return requestCounter.incrementAndGet();
-	}
-	
-	public static BulletinBoardJungleManager getInstantce() {
-		return instance;
-	}
-	
-	public static void setJungle(Jungle _j) {
-		instance.jungle = _j;
-	}
-	public static AtomicInteger getRequestCounter() {
-		return requestCounter;
-	}
-	
-	public static Jungle getJungle() {
-		return instance.jungle;
-	}
-	
-	public static JungleTree createNewTree(String name) {
-		return instance.jungle.createNewTree(name);	
-	}
-
-	public static Either<Error, JungleTreeEditor> update(NetworkTreeOperationLog netLog) {
-		String treeName = netLog.getTreeName();
-		Jungle jungle = BulletinBoardJungleManager.getJungle();
-		if (jungle.getTreeByName(treeName) == null) {
-			if(null == jungle.createNewTree(treeName)){
-				throw new IllegalStateException();
-			}
-		}
-		Either<Error, JungleTreeEditor> either = null;
-		JungleTree tree = jungle.getTreeByName(treeName);
-		
-		long timestamp = System.currentTimeMillis();
-		ByteBuffer tBuffer = ByteBuffer.allocate(16);
-		DefaultNodePath root = new DefaultNodePath();
-		tBuffer.putLong(timestamp);
-		do {
-			JungleTreeEditor editor = tree.getLocalTreeEditor();
-			/* 
-			 * Merge. 
-			 */
-			int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp());
-			either = JungleUpdater.edit(editor, netLog, pos);
-			if(either.isA()) {
-				throw new IllegalStateException();
-			}
-			editor = either.b();
-			either = editor.putAttribute(root, "renewtime", tBuffer);
-			if(either.isA()) {
-				throw new IllegalStateException();
-			}
-			editor = either.b();
-			either = editor.success();
-		}while(either.isA());
-		requestIncrementAndGet();
-		return either;
-	}
-	
-	private static int calculatePosition(TreeNode node, long newNodeTimeStamp) {
-		int count = 0;
-		long childTimeStamp = 0;
-		for(TreeNode n : node.getChildren()) {
-			ByteBuffer timestamp = n.getAttributes().get("timestamp");
-			if(timestamp == null) {
-				return count;
-			}
-			childTimeStamp = timestamp.getLong(0);
-			if (newNodeTimeStamp < childTimeStamp) {
-				break;
-			}
-			count++;
-		}
-		return count;
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/DistributeApp.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.network;
-
-import alice.topology.node.TopologyNode;
-import jp.ac.u_ryukyu.ie.cr.bbs.network.codesegment.StartBBSCodeSegment;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.remote.RemoteConfig;
-
-public class DistributeApp {
-    public static void main(String[] args) throws Exception {
-        RemoteConfig conf = new RemoteConfig(args);
-        System.out.println("test");
-        if (conf.getManagerHostName() == null) {
-            StartBBSCodeSegment cs1 = new StartBBSCodeSegment(args, conf.bbsPort);
-            cs1.ods.put("host", "node0");
-        } else {
-            new TopologyNode(conf, new StartBBSCodeSegment(args, conf.bbsPort));
-        }
-    }
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/NetworkBulletinBoard.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.network;
-
-
-import jp.ac.u_ryukyu.ie.cr.bbs.local.BulletinBoard;
-
-public interface NetworkBulletinBoard extends BulletinBoard {
-	public void init();
-	public int getRequestNum();
-	public long getRenewTime(String boardName);
-	public void createFolder(String boardName, String author, String msg, String key, String _nodeNum);
-	public void createAttribute(String boardName, String uuid, String author, String msg, String key);
-	public void editAttribute(String boardName, String path, String id, String message);
-	public void deleteAttribute(String _board, String _path, String id);
-	public void deleteNode(String _board, String _path, String id);
-
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/NetworkJungleBulletinBoard.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,684 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.network;
-
-
-import jp.ac.u_ryukyu.ie.cr.bbs.local.BoardMessage;
-import jp.ac.u_ryukyu.ie.cr.bbs.local.GetAttributeImp;
-import jp.ac.u_ryukyu.ie.cr.bbs.local.IterableConverter;
-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.persistent.ChangeList;
-import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListReader;
-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.logger.DefaultOperationLog;
-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;
-import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
-import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
-import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.core.NetworkDefaultJungle;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.AliceJournal;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.NetworkJournal;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.PersistentJournal;
-import jp.ac.u_ryukyu.ie.cr.jungleNetwork.transaction.JungleUpdater;
-import junit.framework.Assert;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class NetworkJungleBulletinBoard implements NetworkBulletinBoard {
-    protected final Jungle jungle;
-    private final NetworkJournal journal;
-    private final String LOG_DIR;
-    private Boolean persistentFlag;
-    private AtomicInteger requestCounter;
-    private long renewTime;
-
-    private NetworkJungleBulletinBoard(String _uuid, NetworkJournal _journal) {
-        journal = _journal;
-        jungle = new NetworkDefaultJungle(journal, _uuid, new DefaultTreeEditor(new DefaultTraverser()));
-        BulletinBoardJungleManager.setJungle(jungle);
-        persistentFlag = false;
-        requestCounter = BulletinBoardJungleManager.getRequestCounter();
-        LOG_DIR = "./log";
-        renewTime = 0;
-    }
-
-    public NetworkJungleBulletinBoard(String _uuid) {
-        this(_uuid, new AliceJournal());
-        jungle.createNewTree("boards");
-    }
-
-    public static NetworkBulletinBoard NewPersistentJungle(String _uuid) {
-        NetworkJungleBulletinBoard board = new NetworkJungleBulletinBoard(_uuid, new PersistentJournal());
-        board.persistentFlag = true;
-        return board;
-    }
-
-    public void init() {
-        if (!persistentFlag) {
-            return;
-        }
-        checkAndCreateLogDirectory();
-        try {
-            commitLogRecover();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void checkAndCreateLogDirectory() {
-        File logFile = new File(LOG_DIR);
-        if (!logFile.exists()) {
-            logFile.mkdir();
-            return;
-        }
-        if (logFile.isFile()) {
-            logFile.delete();
-            logFile.mkdir();
-        }
-    }
-
-    public void commitLogRecover() throws IOException {
-        File[] logFiles = new File(LOG_DIR).listFiles();
-        for (File logFile : logFiles) {
-            commitLogRecover(logFile);
-            logFile.delete();
-        }
-        if (jungle.getTreeByName("boards") == null) {
-            jungle.createNewTree("boards");
-        }
-    }
-
-    private void commitLogRecover(File logFile) throws IOException {
-        journal.setInputFile(logFile);
-        ChangeListReader reader = journal.getReader();
-        if (reader == null)
-            return;
-        for (ChangeList chList : reader) {
-            String treeName = chList.getTreeName();
-            JungleTree tree = jungle.getTreeByName(treeName);
-            if (tree == null) {
-                tree = jungle.createNewTree(treeName);
-            }
-            JungleTreeEditor editor = tree.getLocalTreeEditor();
-            Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, chList);
-            editor = either.b();
-            if (either.isA()) {
-                throw new IOException("Failed commit log recovery");
-            }
-            editor.success();
-        }
-    }
-
-    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");
-                System.out.println(new String(e.array()));
-                return new String(e.array());
-            }
-        };
-
-        return new IterableConverter<String, TreeNode>(chs, converter);
-    }
-
-    public long getRenewTime(String _boardName) {
-        return renewTime;
-    }
-
-    public void createBoards(final String _name, final String _author, final String _initMessage, final String _editKey) {
-        requestCounter.incrementAndGet();
-        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();
-        final long timestamp = System.currentTimeMillis();
-        ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        either = editor.putAttribute(root.add(0), "timestamp", tBuffer);
-        if (either.isA()) {
-            throw new IllegalStateException();
-        }
-        either = either.b().success();
-        if (either.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() {
-            ByteBuffer tBuffer2 = ByteBuffer.allocate(16);
-
-            public Either<Error, LoggingNode> edit(TreeNode node) {
-                LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
-                logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_initMessage.getBytes())).b();
-                logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
-                tBuffer2.putLong(timestamp);
-                logNode = logNode.getAttributes().put("timestamp", tBuffer2).b();
-                return DefaultEither.newB(logNode);
-            }
-
-            @Override
-            public LoggingNode wrap(TreeNode node, OperationLog op) {
-                return new LoggingNode(node, op);
-            }
-        };
-
-        either = editor.edit(root.add(0), e);
-        if (either.isA()) {
-            throw new IllegalStateException();
-        }
-        either.b().success();
-
-    }
-
-    public void createFolder(final String _board, final String _author, final String _message, final String _editKey,
-                             String _path) {
-        JungleTree tree = jungle.getTreeByName(_board);
-        if (tree == null) {
-            throw new IllegalStateException();
-        }
-
-        DefaultNodePath path = new DefaultNodePath();
-        String[] nums = _path.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-
-        requestCounter.incrementAndGet();
-        Either<Error, JungleTreeEditor> either;
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-
-        do {
-            TreeNode node = tree.getRootNode();
-            DefaultTraverser traverser = new DefaultTraverser();
-            DefaultEvaluator evaluator = new DefaultEvaluator(path);
-            Either<Error, Traversal> ret = traverser.traverse(node, evaluator);
-            if (ret.isA()) {
-                Assert.fail();
-            }
-
-            Traversal traversal = ret.b();
-            TreeNode target = traversal.destination();
-            int size = target.getChildren().size();
-            JungleTreeEditor editor = tree.getTreeEditor();
-            either = editor.addNewChildAt(path, size);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-
-            NodeEditor e = new NodeEditor() {
-
-                public Either<Error, LoggingNode> edit(TreeNode node) {
-                    LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
-                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
-                    return DefaultEither.newB(logNode);
-                }
-
-                @Override
-                public LoggingNode wrap(TreeNode node, OperationLog op) {
-                    return new LoggingNode(node, op);
-                }
-
-            };
-            path = path.add(size);
-            either = editor.edit(path, e);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-
-    }
-
-    public void createBoardMessage(final String _board, final String _author, final String _message, final String _editKey) {
-        requestCounter.incrementAndGet();
-        JungleTree tree = jungle.getTreeByName(_board);
-        if (tree == null) {
-            throw new IllegalStateException();
-        }
-
-        Either<Error, JungleTreeEditor> either;
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        do {
-
-            TreeNode node = tree.getRootNode();
-            int size = node.getChildren().size();
-            DefaultNodePath path = new DefaultNodePath();
-
-            JungleTreeEditor editor = tree.getTreeEditor();
-            either = editor.addNewChildAt(path, size);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-
-            NodeEditor e = new NodeEditor() {
-                public Either<Error, LoggingNode> edit(TreeNode node) {
-                    LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                    logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
-                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
-                    logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
-                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
-                    return DefaultEither.newB(logNode);
-                }
-
-                @Override
-                public LoggingNode wrap(TreeNode node, OperationLog op) {
-                    return new LoggingNode(node, op);
-                }
-            };
-            path = path.add(size);
-            either = editor.edit(path, e);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-
-    }
-
-    public void editMessage(String _board, String _path, final String _author, final String _message,
-                            final String _editKey) {
-        requestCounter.incrementAndGet();
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        JungleTree tree = jungle.getTreeByName(_board);
-        Either<Error, JungleTreeEditor> either = null;
-        DefaultNodePath path = new DefaultNodePath();
-        String[] nums = _path.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-        do {
-
-            JungleTreeEditor editor = tree.getTreeEditor();
-            NodeEditor e = new NodeEditor() {
-                public Either<Error, LoggingNode> edit(TreeNode node) {
-                    LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                    System.out.println(new String(node.getAttributes().get("mes").array()));
-                    logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
-                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
-                    logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
-                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
-                    System.out.println(new String(node.getAttributes().get("mes").array()));
-                    return DefaultEither.newB(logNode);
-                }
-
-                @Override
-                public LoggingNode wrap(TreeNode node, OperationLog op) {
-                    return new LoggingNode(node, op);
-                }
-            };
-            either = editor.edit(path, e);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-        renewTime = timestamp;
-    }
-
-    public void createAttribute(String _board, String _path, final String _author, final String _message,
-                                final String _editKey) {
-        requestCounter.incrementAndGet();
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        JungleTree tree = jungle.getTreeByName(_board);
-        Either<Error, JungleTreeEditor> either = null;
-        DefaultNodePath path = new DefaultNodePath();
-        String[] nums = _path.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-
-        do {
-            JungleTreeEditor editor = tree.getTreeEditor();
-            NodeEditor e = new NodeEditor() {
-                String str;
-
-                public Either<Error, LoggingNode> edit(TreeNode node) {
-                    LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                    str = "0";
-                    int count = 0;
-                    for (; logNode.getAttributes().get("mes" + String.valueOf(count)) != null; count++) {
-                    }
-                    str = String.valueOf(count);
-                    logNode = logNode.getAttributes().put("mes" + str, ByteBuffer.wrap(_message.getBytes())).b();
-                    logNode = logNode.getAttributes().put("timestamp" + str, tBuffer).b();
-                    return DefaultEither.newB(logNode);
-                }
-
-                @Override
-                public LoggingNode wrap(TreeNode node, OperationLog op) {
-                    return new LoggingNode(node, op);
-                }
-            };
-            either = editor.edit(path, e);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-    }
-
-    public void editAttribute(String _bname, String _path, final String id, final String _message) {
-        requestCounter.incrementAndGet();
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        JungleTree tree = jungle.getTreeByName(_bname);
-        Either<Error, JungleTreeEditor> either = null;
-        DefaultNodePath path = new DefaultNodePath();
-        String[] nums = _path.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-
-        do {
-            JungleTreeEditor editor = tree.getTreeEditor();
-            NodeEditor e = new NodeEditor() {
-                public Either<Error, LoggingNode> edit(TreeNode node) {
-                    LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                    logNode = logNode.getAttributes().put("mes" + id, ByteBuffer.wrap(_message.getBytes())).b();
-                    logNode = logNode.getAttributes().put("timestamp" + id, tBuffer).b();
-                    return DefaultEither.newB(logNode);
-                }
-
-                @Override
-                public LoggingNode wrap(TreeNode node, OperationLog op) {
-                    return new LoggingNode(node, op);
-                }
-            };
-            either = editor.edit(path, e);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-    }
-
-    public void deleteNode(String _board, String _path, String _id) {
-        requestCounter.incrementAndGet();
-        int id = Integer.parseInt(_id);
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        JungleTree tree = jungle.getTreeByName(_board);
-        Either<Error, JungleTreeEditor> either = null;
-        DefaultNodePath path = new DefaultNodePath();
-        String[] nums = _path.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-
-        do {
-            JungleTreeEditor editor = tree.getTreeEditor();
-
-            either = editor.deleteChildAt(path, id);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-
-    }
-
-    public void deleteAttribute(String _board, String _path, final String id) {
-        requestCounter.incrementAndGet();
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        JungleTree tree = jungle.getTreeByName(_board);
-        Either<Error, JungleTreeEditor> either = null;
-        DefaultNodePath path = new DefaultNodePath();
-        String[] nums = _path.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-
-        do {
-            JungleTreeEditor editor = tree.getTreeEditor();
-            NodeEditor e = new NodeEditor() {
-                public Either<Error, LoggingNode> edit(TreeNode node) {
-                    LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                    logNode = logNode.getAttributes().delete("mes" + id).b();
-                    logNode = logNode.getAttributes().delete("timestamp" + id).b();
-                    int count = Integer.parseInt(id);
-                    for (; logNode.getAttributes().get("mes" + String.valueOf(count + 1)) != null; ) {
-                        logNode = logNode.getAttributes()
-                                .put("mes" + count, node.getAttributes().get("mes" + String.valueOf(count + 1))).b();
-                        logNode = logNode.getAttributes().put("timestamp" + count, tBuffer).b();
-                        count++;
-                    }
-                    if (count != Integer.parseInt(id)) {
-                        logNode = logNode.getAttributes().delete("timestamp" + count).b();
-                        logNode = logNode.getAttributes().delete("mes" + count).b();
-                    }
-
-                    return DefaultEither.newB(logNode);
-                }
-
-                @Override
-                public LoggingNode wrap(TreeNode node, OperationLog op) {
-                    return new LoggingNode(node, op);
-                }
-            };
-            either = editor.edit(path, e);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-    }
-
-    public void editMatrixMessage(String _board, String _uuid, final String _author, final String _message,
-                                  final String _editKey) {
-        requestCounter.incrementAndGet();
-        final long timestamp = System.currentTimeMillis();
-        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
-        tBuffer.putLong(timestamp);
-        JungleTree tree = jungle.getTreeByName(_board);
-        Either<Error, JungleTreeEditor> either = null;
-        do {
-            DefaultNodePath path = new DefaultNodePath();
-            path = path.add(Integer.parseInt(_uuid));
-
-            JungleTreeEditor editor = tree.getTreeEditor();
-            NodeEditor e = new NodeEditor() {
-                public Either<Error, LoggingNode> edit(TreeNode node) {
-                    LoggingNode logNode = wrap(node, new DefaultOperationLog());
-                    logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
-                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
-                    logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
-                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
-                    return DefaultEither.newB(logNode);
-                }
-
-                @Override
-                public LoggingNode wrap(TreeNode node, OperationLog op) {
-                    return new LoggingNode(node, op);
-                }
-            };
-            either = editor.edit(path, e);
-            if (either.isA()) {
-                throw new IllegalStateException();
-            }
-            editor = either.b();
-            either = editor.success();
-        } while (either.isA());
-        renewTime = timestamp;
-    }
-
-    public Iterable<BoardMessage> getFolder(String _boardName, String _nodeNum) {
-        DefaultNodePath path = new DefaultNodePath();
-        System.out.println(_nodeNum.substring(0, 1));
-        String[] nums = _nodeNum.split(",");
-        for (String num : nums) {
-            if (!num.equals("-1"))
-                path = path.add(Integer.parseInt(num));
-        }
-        JungleTree tree = jungle.getTreeByName(_boardName);
-        TreeNode node = tree.getRootNode();
-        requestCounter.incrementAndGet();
-
-        DefaultTraverser traverser = new DefaultTraverser();
-        DefaultEvaluator evaluator = new DefaultEvaluator(path);
-        Either<Error, Traversal> ret = traverser.traverse(node, evaluator);
-        if (ret.isA()) {
-            Assert.fail();
-        }
-
-        Traversal traversal = ret.b();
-        TreeNode target = traversal.destination();
-        Children chs = target.getChildren();
-
-        final AtomicInteger counter = new AtomicInteger(0);
-        IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() {
-            public BoardMessage conv(TreeNode _b) {
-                String uuid = Integer.toString(counter.get());
-                String message = new String(_b.getAttributes().get("mes").array());
-                counter.incrementAndGet();
-                return new BoardMessageImpl(null, message, uuid);
-            }
-        };
-        return new IterableConverter<BoardMessage, TreeNode>(chs, converter);
-    }
-
-    public boolean compare(TreeNode compareNode, String compareAttribute) {
-        String labName = compareNode.getAttributes().getString("mes");
-        if (labName.equals(compareAttribute))
-            return true;
-
-        for (int loopCount = 0; compareNode.getAttributes().getString("mes" + loopCount) != null; loopCount++) {
-            labName = compareNode.getAttributes().getString("mes" + loopCount);
-            if (labName.equals(compareAttribute))
-                return true;
-        }
-
-        return false;
-    }
-
-    public int getRequestNum() {
-        return requestCounter.get();
-    }
-
-    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;
-        }
-
-    }
-
-    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,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);
-    }
-
-    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/network/RequestNumCheckServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.network;
-
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.PrintWriter;
-
-
-public class RequestNumCheckServlet extends HttpServlet
-{
-	private final NetworkBulletinBoard bbs;
-	private static final long serialVersionUID = 1L;
-	
-	public RequestNumCheckServlet(NetworkBulletinBoard _bbs)
-	{
-		bbs = _bbs;
-	}
-	
-	public void doGet(HttpServletRequest _req,HttpServletResponse _res)
-	{
-		int num = bbs.getRequestNum();
-		
-		try{
-			PrintWriter pw = _res.getWriter();
-			pw.write(Integer.toString(num));
-			pw.flush();
-		}catch(Exception _e){
-			_res.setStatus(500);
-		}
-		
-		
-	}
-
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/ShowMessageWithTimeStampServlet.java	Sat Nov 19 22:31:25 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.bbs.network;
-
-import jp.ac.u_ryukyu.ie.cr.bbs.local.GetAttributeImp;
-import org.eclipse.jetty.util.thread.ThreadPool;
-
-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 ShowMessageWithTimeStampServlet extends HttpServlet {
-    /**
-     *
-     */
-    private static final long serialVersionUID = 1L;
-    private final jp.ac.u_ryukyu.ie.cr.bbs.network.NetworkBulletinBoard bbs;
-    private final String createBoardMessagePath;
-
-    private static final String PARAM_BOARD_NAME = "bname";
-    private final String editMessagePath;
-
-    public ShowMessageWithTimeStampServlet(NetworkBulletinBoard _bbs,
-                                           String _createBoardMessagePath, String _editMessagePath, ThreadPool thp) {
-        bbs = _bbs;
-        createBoardMessagePath = _createBoardMessagePath;
-        editMessagePath = _editMessagePath;
-    }
-
-    public void doGet(HttpServletRequest _req, HttpServletResponse _res) {
-        final String bname = (_req.getParameter(PARAM_BOARD_NAME));
-        try {
-            _res.setCharacterEncoding("UTF-8");
-            printBoard(bname, _res.getWriter());
-        } catch (Exception _e) {
-            _res.setStatus(500);
-        }
-    }
-
-    private void printBoard(String _bname, PrintWriter _pw) throws Exception {
-        _pw.write("<html><body>\n");
-        _pw.write("<h1>" + bbs.sanitize(_bname) + "</h1>\n");
-        _pw.write("<p>Latest renew time : " + bbs.getRenewTime(_bname)
-                + "</p>\n");
-        ;
-
-        _pw.write("<form action='" + createBoardMessagePath + "' method='POST'\n");
-        _pw.write("<p>Author : <input type='text' name='author'/> <input type='hidden' name='bname' value='" + bbs.sanitize(_bname) + "'/> EditKey : <input type='textarea' 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");
-        Iterator<String> keys = attribute.getKeys();
-
-        while (keys.hasNext()) {
-            String key = keys.next();
-            String mesage = attribute.getMessage(key);
-            _pw.write("<p>" + key + " = " + mesage + "</p>\n");
-        }
-        _pw.write("<p><a href='" + editMessagePath + "?bname=" + bbs.sanitize(_bname) + "&uuid=-1,0" + "'>edit" + "</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/network/bbs/BoardRenewTime.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,8 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;
+
+public interface BoardRenewTime {
+
+	public String getboardName();
+	public Long getRenewTime();	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/BulletinBoardJungleManager.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,108 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;
+
+
+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.store.nodepath.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.operations.NetworkTreeOperationLog;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.transaction.JungleUpdater;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class BulletinBoardJungleManager {
+	private static BulletinBoardJungleManager instance = new BulletinBoardJungleManager();
+	private Jungle jungle;
+	private static AtomicInteger requestCounter = new AtomicInteger(0);
+
+	private BulletinBoardJungleManager() {
+		jungle = new DefaultJungle(null,"default");
+	}
+	
+	public static int requestGetAndIncrement() {
+		return requestCounter.getAndIncrement();
+	}
+	
+	public static int requestIncrementAndGet() {
+		return requestCounter.incrementAndGet();
+	}
+	
+	public static BulletinBoardJungleManager getInstantce() {
+		return instance;
+	}
+	
+	public static void setJungle(Jungle _j) {
+		instance.jungle = _j;
+	}
+	public static AtomicInteger getRequestCounter() {
+		return requestCounter;
+	}
+	
+	public static Jungle getJungle() {
+		return instance.jungle;
+	}
+	
+	public static JungleTree createNewTree(String name) {
+		return instance.jungle.createNewTree(name);	
+	}
+
+	public static Either<Error, JungleTreeEditor> update(NetworkTreeOperationLog netLog) {
+		String treeName = netLog.getTreeName();
+		Jungle jungle = BulletinBoardJungleManager.getJungle();
+		if (jungle.getTreeByName(treeName) == null) {
+			if(null == jungle.createNewTree(treeName)){
+				throw new IllegalStateException();
+			}
+		}
+		Either<Error, JungleTreeEditor> either = null;
+		JungleTree tree = jungle.getTreeByName(treeName);
+		
+		long timestamp = System.currentTimeMillis();
+		ByteBuffer tBuffer = ByteBuffer.allocate(16);
+		NodePath root = new DefaultNodePath();
+		tBuffer.putLong(timestamp);
+		do {
+			JungleTreeEditor editor = tree.getJungleTreeEditor();
+			/* 
+			 * Merge. 
+			 */
+			int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp());
+			either = JungleUpdater.edit(editor, netLog, pos);
+			if(either.isA()) {
+				throw new IllegalStateException();
+			}
+			editor = either.b();
+			either = editor.putAttribute(root, "renewtime", tBuffer);
+			if(either.isA()) {
+				throw new IllegalStateException();
+			}
+			editor = either.b();
+			either = editor.success();
+		}while(either.isA());
+		requestIncrementAndGet();
+		return either;
+	}
+	
+	private static int calculatePosition(TreeNode node, long newNodeTimeStamp) {
+		int count = 0;
+		long childTimeStamp = 0;
+		for(TreeNode n : node.getChildren()) {
+			ByteBuffer timestamp = n.getAttributes().get("timestamp");
+			if(timestamp == null) {
+				return count;
+			}
+			childTimeStamp = timestamp.getLong(0);
+			if (newNodeTimeStamp < childTimeStamp) {
+				break;
+			}
+			count++;
+		}
+		return count;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/DistributeApp.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,18 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;
+
+import alice.topology.node.TopologyNode;
+import jp.ac.u_ryukyu.ie.cr.bbs.network.codesegment.StartBBSCodeSegment;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.remote.RemoteConfig;
+
+public class DistributeApp {
+    public static void main(String[] args) throws Exception {
+        RemoteConfig conf = new RemoteConfig(args);
+        System.out.println("test");
+        if (conf.getManagerHostName() == null) {
+            StartBBSCodeSegment cs1 = new StartBBSCodeSegment(args, conf.bbsPort);
+            cs1.ods.put("host", "node0");
+        } else {
+            new TopologyNode(conf, new StartBBSCodeSegment(args, conf.bbsPort));
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/NetworkBulletinBoard.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,16 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;
+
+
+import jp.ac.u_ryukyu.ie.cr.bbs.local.bbs.BulletinBoard;
+
+public interface NetworkBulletinBoard extends BulletinBoard {
+	public void init();
+	public int getRequestNum();
+	public long getRenewTime(String boardName);
+	public void createFolder(String boardName, String author, String msg, String key, String _nodeNum);
+	public void createAttribute(String boardName, String uuid, String author, String msg, String key);
+	public void editAttribute(String boardName, String path, String id, String message);
+	public void deleteAttribute(String _board, String _path, String id);
+	public void deleteNode(String _board, String _path, String id);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/NetworkJungleBulletinBoard.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,751 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;
+
+
+import jp.ac.u_ryukyu.ie.cr.bbs.local.bbs.BoardMessage;
+import jp.ac.u_ryukyu.ie.cr.bbs.local.bbs.GetAttributeImp;
+import jp.ac.u_ryukyu.ie.cr.bbs.local.bbs.IterableConverter;
+import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.jungle.core.Children;
+import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList;
+import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListReader;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.logger.LoggingNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.logger.OperationLog;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.Default.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
+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;
+import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.core.NetworkDefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.AliceJournal;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.NetworkJournal;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.PersistentJournal;
+import jp.ac.u_ryukyu.ie.cr.jungleNetwork.transaction.JungleUpdater;
+import junit.framework.Assert;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class NetworkJungleBulletinBoard implements NetworkBulletinBoard {
+    protected final Jungle jungle;
+    private final NetworkJournal journal;
+    private final String LOG_DIR;
+    private Boolean persistentFlag;
+    private AtomicInteger requestCounter;
+    private long renewTime;
+
+    private NetworkJungleBulletinBoard(String _uuid, NetworkJournal _journal) {
+        journal = _journal;
+        jungle = new NetworkDefaultJungle(journal, _uuid);
+        BulletinBoardJungleManager.setJungle(jungle);
+        persistentFlag = false;
+        requestCounter = BulletinBoardJungleManager.getRequestCounter();
+        LOG_DIR = "./log";
+        renewTime = 0;
+    }
+
+    public NetworkJungleBulletinBoard(String _uuid) {
+        this(_uuid, new AliceJournal());
+        jungle.createNewTree("boards");
+    }
+
+    public static NetworkBulletinBoard NewPersistentJungle(String _uuid) {
+        NetworkJungleBulletinBoard board = new NetworkJungleBulletinBoard(_uuid, new PersistentJournal());
+        board.persistentFlag = true;
+        return board;
+    }
+
+    public void init() {
+        if (!persistentFlag) {
+            return;
+        }
+        checkAndCreateLogDirectory();
+        try {
+            commitLogRecover();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void checkAndCreateLogDirectory() {
+        File logFile = new File(LOG_DIR);
+        if (!logFile.exists()) {
+            logFile.mkdir();
+            return;
+        }
+        if (logFile.isFile()) {
+            logFile.delete();
+            logFile.mkdir();
+        }
+    }
+
+    public void commitLogRecover() throws IOException {
+        File[] logFiles = new File(LOG_DIR).listFiles();
+        for (File logFile : logFiles) {
+            commitLogRecover(logFile);
+            logFile.delete();
+        }
+        if (jungle.getTreeByName("boards") == null) {
+            jungle.createNewTree("boards");
+        }
+    }
+
+    private void commitLogRecover(File logFile) throws IOException {
+        journal.setInputFile(logFile);
+        ChangeListReader reader = journal.getReader();
+        if (reader == null)
+            return;
+        for (ChangeList chList : reader) {
+            String treeName = chList.getTreeName();
+            JungleTree tree = jungle.getTreeByName(treeName);
+            if (tree == null) {
+                tree = jungle.createNewTree(treeName);
+            }
+            JungleTreeEditor editor = tree.getLocalJungleTreeEditor();
+            Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, chList);
+            editor = either.b();
+            if (either.isA()) {
+                throw new IOException("Failed commit log recovery");
+            }
+            editor.success();
+        }
+    }
+
+    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");
+                System.out.println(new String(e.array()));
+                return new String(e.array());
+            }
+        };
+
+        return new IterableConverter<String, TreeNode>(chs, converter);
+    }
+
+    public long getRenewTime(String _boardName) {
+        return renewTime;
+    }
+
+    public void createBoards(final String _name, final String _author, final String _initMessage, final String _editKey) {
+        requestCounter.incrementAndGet();
+        if (null == jungle.createNewTree(_name)) {
+            throw new IllegalStateException();
+        }
+
+        JungleTree tree = jungle.getTreeByName("boards");
+        JungleTreeEditor editor = tree.getJungleTreeEditor();
+        NodePath 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();
+        final long timestamp = System.currentTimeMillis();
+        ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        either = editor.putAttribute(root.add(0), "timestamp", tBuffer);
+        if (either.isA()) {
+            throw new IllegalStateException();
+        }
+        either = either.b().success();
+        if (either.isA()) {
+            throw new IllegalStateException();
+        }
+
+        tree = jungle.getTreeByName(_name);
+        editor = tree.getJungleTreeEditor();
+        either = editor.addNewChildAt(root, 0);
+        if (either.isA()) {
+            throw new IllegalStateException();
+        }
+        editor = either.b();
+
+        NodeEditor e = new NodeEditor() {
+            ByteBuffer tBuffer2 = ByteBuffer.allocate(16);
+
+            Either<Error, LoggingNode> _edit(LoggingNode logNode) {
+                logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
+                logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_initMessage.getBytes())).b();
+                logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
+                tBuffer2.putLong(timestamp);
+                logNode = logNode.getAttributes().put("timestamp", tBuffer2).b();
+                return DefaultEither.newB(logNode);
+            }
+
+            @Override
+            public Either<Error, LoggingNode> edit(TreeNode _e) {
+                LoggingNode logNode = wrap(_e);
+                return _edit(logNode);
+            }
+
+            private LoggingNode wrap(TreeNode node) {
+                return new LoggingNode(node);
+            }
+
+            @Override
+            public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                return new LoggingNode(newRoot, editedNode, operationLog);
+            }
+
+        };
+
+        either = editor.edit(root.add(0), e);
+        if (either.isA()) {
+            throw new IllegalStateException();
+        }
+        either.b().success();
+
+    }
+
+    public void createFolder(final String _board, final String _author, final String _message, final String _editKey, String _path) {
+        JungleTree tree = jungle.getTreeByName(_board);
+        if (tree == null) {
+            throw new IllegalStateException();
+        }
+
+        DefaultNodePath path = new DefaultNodePath();
+        String[] nums = _path.split(",");
+        for (String num : nums) {
+            if (!num.equals("-1"))
+                path = path.add(Integer.parseInt(num));
+        }
+
+        requestCounter.incrementAndGet();
+        Either<Error, JungleTreeEditor> either;
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+
+        do {
+            TreeNode node = tree.getRootNode();
+            DefaultTraverser traverser = new DefaultTraverser();
+            DefaultEvaluator evaluator = new DefaultEvaluator(path);
+            Either<Error, Traversal> ret = traverser.traverse(node, evaluator);
+            if (ret.isA()) {
+                Assert.fail();
+            }
+
+            Traversal traversal = ret.b();
+            TreeNode target = traversal.destination();
+            int size = target.getChildren().size();
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+            either = editor.addNewChildAt(path, size);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+
+            NodeEditor e = new NodeEditor() {
+
+                Either<Error, LoggingNode> _edit(LoggingNode logNode) {
+                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
+                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
+                    return DefaultEither.newB(logNode);
+                }
+
+                @Override
+                public Either<Error, LoggingNode> edit(TreeNode _e) {
+                    LoggingNode logNode = wrap(_e);
+                    return _edit(logNode);
+                }
+
+                private LoggingNode wrap(TreeNode node) {
+                    return new LoggingNode(node);
+                }
+
+                @Override
+                public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                    return new LoggingNode(newRoot, editedNode, operationLog);
+                }
+
+            };
+            path = path.add(size);
+            either = editor.edit(path, e);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+
+    }
+
+    public void createBoardMessage(final String _board, final String _author, final String _message, final String _editKey) {
+        requestCounter.incrementAndGet();
+        JungleTree tree = jungle.getTreeByName(_board);
+        if (tree == null) {
+            throw new IllegalStateException();
+        }
+
+        Either<Error, JungleTreeEditor> either;
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        do {
+
+            TreeNode node = tree.getRootNode();
+            int size = node.getChildren().size();
+            DefaultNodePath path = new DefaultNodePath();
+
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+            either = editor.addNewChildAt(path, size);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+
+            NodeEditor e = new NodeEditor() {
+                Either<Error, LoggingNode> _edit(LoggingNode logNode) {
+                    logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
+                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
+                    logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
+                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
+                    return DefaultEither.newB(logNode);
+                }
+
+                @Override
+                public Either<Error, LoggingNode> edit(TreeNode _e) {
+                    LoggingNode logNode = wrap(_e);
+                    return _edit(logNode);
+                }
+
+                private LoggingNode wrap(TreeNode node) {
+                    return new LoggingNode(node);
+                }
+
+                @Override
+                public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                    return new LoggingNode(newRoot, editedNode, operationLog);
+                }
+            };
+            path = path.add(size);
+            either = editor.edit(path, e);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+
+    }
+
+    public void editMessage(String _board, String _path, final String _author, final String _message, final String _editKey) {
+        requestCounter.incrementAndGet();
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        JungleTree tree = jungle.getTreeByName(_board);
+        Either<Error, JungleTreeEditor> either = null;
+        DefaultNodePath path = new DefaultNodePath();
+        String[] nums = _path.split(",");
+        for (String num : nums) {
+            if (!num.equals("-1"))
+                path = path.add(Integer.parseInt(num));
+        }
+        do {
+
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+            NodeEditor e = new NodeEditor() {
+                Either<Error, LoggingNode> _edit(LoggingNode logNode) {
+                    logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
+                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
+                    logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
+                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
+                    return DefaultEither.newB(logNode);
+                }
+
+                @Override
+                public Either<Error, LoggingNode> edit(TreeNode _e) {
+                    LoggingNode logNode = wrap(_e);
+                    return _edit(logNode);
+                }
+
+                private LoggingNode wrap(TreeNode node) {
+                    return new LoggingNode(node);
+                }
+
+                @Override
+                public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                    return new LoggingNode(newRoot, editedNode, operationLog);
+                }
+
+            };
+            either = editor.edit(path, e);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+        renewTime = timestamp;
+    }
+
+    public void createAttribute(String _board, String _path, final String _author, final String _message, final String _editKey) {
+        requestCounter.incrementAndGet();
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        JungleTree tree = jungle.getTreeByName(_board);
+        Either<Error, JungleTreeEditor> either = null;
+        DefaultNodePath path = new DefaultNodePath();
+        String[] nums = _path.split(",");
+        for (String num : nums) {
+            if (!num.equals("-1"))
+                path = path.add(Integer.parseInt(num));
+        }
+
+        do {
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+            NodeEditor e = new NodeEditor() {
+                String str;
+
+                Either<Error, LoggingNode> _edit(LoggingNode logNode) {                    str = "0";
+                    int count = 0;
+                    for (; logNode.getAttributes().get("mes" + String.valueOf(count)) != null; count++) {
+                    }
+                    str = String.valueOf(count);
+                    logNode = logNode.getAttributes().put("mes" + str, ByteBuffer.wrap(_message.getBytes())).b();
+                    logNode = logNode.getAttributes().put("timestamp" + str, tBuffer).b();
+                    return DefaultEither.newB(logNode);
+                }
+
+                @Override
+                public Either<Error, LoggingNode> edit(TreeNode _e) {
+                    LoggingNode logNode = wrap(_e);
+                    return _edit(logNode);
+                }
+
+                private LoggingNode wrap(TreeNode node) {
+                    return new LoggingNode(node);
+                }
+
+                @Override
+                public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                    return new LoggingNode(newRoot, editedNode, operationLog);
+                }
+
+            };
+            either = editor.edit(path, e);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+    }
+
+    public void editAttribute(String _bname, String _path, final String id, final String _message) {
+        requestCounter.incrementAndGet();
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        JungleTree tree = jungle.getTreeByName(_bname);
+        Either<Error, JungleTreeEditor> either = null;
+        DefaultNodePath path = new DefaultNodePath();
+        String[] nums = _path.split(",");
+        for (String num : nums) {
+            if (!num.equals("-1"))
+                path = path.add(Integer.parseInt(num));
+        }
+
+        do {
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+            NodeEditor e = new NodeEditor() {
+                Either<Error, LoggingNode> _edit(LoggingNode logNode) {
+                    logNode = logNode.getAttributes().put("mes" + id, ByteBuffer.wrap(_message.getBytes())).b();
+                    logNode = logNode.getAttributes().put("timestamp" + id, tBuffer).b();
+                    return DefaultEither.newB(logNode);
+                }
+
+                @Override
+                public Either<Error, LoggingNode> edit(TreeNode _e) {
+                    LoggingNode logNode = wrap(_e);
+                    return _edit(logNode);
+                }
+
+                private LoggingNode wrap(TreeNode node) {
+                    return new LoggingNode(node);
+                }
+
+                @Override
+                public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                    return new LoggingNode(newRoot, editedNode, operationLog);
+                }
+
+            };
+            either = editor.edit(path, e);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+    }
+
+    public void deleteNode(String _board, String _path, String _id) {
+        requestCounter.incrementAndGet();
+        int id = Integer.parseInt(_id);
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        JungleTree tree = jungle.getTreeByName(_board);
+        Either<Error, JungleTreeEditor> either = null;
+        DefaultNodePath path = new DefaultNodePath();
+        String[] nums = _path.split(",");
+        for (String num : nums) {
+            if (!num.equals("-1"))
+                path = path.add(Integer.parseInt(num));
+        }
+
+        do {
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+
+            either = editor.deleteChildAt(path, id);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+
+    }
+
+    public void deleteAttribute(String _board, String _path, final String id) {
+        requestCounter.incrementAndGet();
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        JungleTree tree = jungle.getTreeByName(_board);
+        Either<Error, JungleTreeEditor> either = null;
+        DefaultNodePath path = new DefaultNodePath();
+        String[] nums = _path.split(",");
+        for (String num : nums) {
+            if (!num.equals("-1"))
+                path = path.add(Integer.parseInt(num));
+        }
+
+        do {
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+            NodeEditor e = new NodeEditor() {
+                Either<Error, LoggingNode> _edit(LoggingNode logNode) {
+                    TreeNode node = logNode.getWrap();
+                    logNode = logNode.getAttributes().delete("mes" + id).b();
+                    logNode = logNode.getAttributes().delete("timestamp" + id).b();
+                    int count = Integer.parseInt(id);
+                    for (; logNode.getAttributes().get("mes" + String.valueOf(count + 1)) != null; ) {
+                        logNode = logNode.getAttributes().put("mes" + count, node.getAttributes().get("mes" + String.valueOf(count + 1))).b();
+                        logNode = logNode.getAttributes().put("timestamp" + count, tBuffer).b();
+                        count++;
+                    }
+                    if (count != Integer.parseInt(id)) {
+                        logNode = logNode.getAttributes().delete("timestamp" + count).b();
+                        logNode = logNode.getAttributes().delete("mes" + count).b();
+                    }
+
+                    return DefaultEither.newB(logNode);
+                }
+
+                @Override
+                public Either<Error, LoggingNode> edit(TreeNode _e) {
+                    LoggingNode logNode = wrap(_e);
+                    return _edit(logNode);
+                }
+
+                private LoggingNode wrap(TreeNode node) {
+                    return new LoggingNode(node);
+                }
+
+                @Override
+                public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                    return new LoggingNode(newRoot, editedNode, operationLog);
+                }
+
+            };
+            either = editor.edit(path, e);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+    }
+
+    public void editMatrixMessage(String _board, String _uuid, final String _author, final String _message, final String _editKey) {
+        requestCounter.incrementAndGet();
+        final long timestamp = System.currentTimeMillis();
+        final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+        tBuffer.putLong(timestamp);
+        JungleTree tree = jungle.getTreeByName(_board);
+        Either<Error, JungleTreeEditor> either = null;
+        do {
+            DefaultNodePath path = new DefaultNodePath();
+            path = path.add(Integer.parseInt(_uuid));
+
+            JungleTreeEditor editor = tree.getJungleTreeEditor();
+            NodeEditor e = new NodeEditor() {
+                Either<Error, LoggingNode> _edit(LoggingNode logNode) {
+                    logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
+                    logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
+                    logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
+                    logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
+                    return DefaultEither.newB(logNode);
+                }
+
+                @Override
+                public Either<Error, LoggingNode> edit(TreeNode _e) {
+                    LoggingNode logNode = wrap(_e);
+                    return _edit(logNode);
+                }
+
+                private LoggingNode wrap(TreeNode node) {
+                    return new LoggingNode(node);
+                }
+
+                @Override
+                public LoggingNode wrap(TreeNode newRoot, TreeNode editedNode, OperationLog operationLog) {
+                    return new LoggingNode(newRoot, editedNode, operationLog);
+                }
+
+            };
+            either = editor.edit(path, e);
+            if (either.isA()) {
+                throw new IllegalStateException();
+            }
+            editor = either.b();
+            either = editor.success();
+        } while (either.isA());
+        renewTime = timestamp;
+    }
+
+    public Iterable<BoardMessage> getFolder(String _boardName, String _nodeNum) {
+        DefaultNodePath path = new DefaultNodePath();
+        System.out.println(_nodeNum.substring(0, 1));
+        String[] nums = _nodeNum.split(",");
+        for (String num : nums) {
+            if (!num.equals("-1"))
+                path = path.add(Integer.parseInt(num));
+        }
+        JungleTree tree = jungle.getTreeByName(_boardName);
+        TreeNode node = tree.getRootNode();
+        requestCounter.incrementAndGet();
+
+        DefaultTraverser traverser = new DefaultTraverser();
+        DefaultEvaluator evaluator = new DefaultEvaluator(path);
+        Either<Error, Traversal> ret = traverser.traverse(node, evaluator);
+        if (ret.isA()) {
+            Assert.fail();
+        }
+
+        Traversal traversal = ret.b();
+        TreeNode target = traversal.destination();
+        Children chs = target.getChildren();
+
+        final AtomicInteger counter = new AtomicInteger(0);
+        IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() {
+            public BoardMessage conv(TreeNode _b) {
+                String uuid = Integer.toString(counter.get());
+                String message = new String(_b.getAttributes().get("mes").array());
+                counter.incrementAndGet();
+                return new BoardMessageImpl(null, message, uuid);
+            }
+        };
+        return new IterableConverter<BoardMessage, TreeNode>(chs, converter);
+    }
+
+    public boolean compare(TreeNode compareNode, String compareAttribute) {
+        String labName = compareNode.getAttributes().getString("mes");
+        if (labName.equals(compareAttribute))
+            return true;
+
+        for (int loopCount = 0; compareNode.getAttributes().getString("mes" + loopCount) != null; loopCount++) {
+            labName = compareNode.getAttributes().getString("mes" + loopCount);
+            if (labName.equals(compareAttribute))
+                return true;
+        }
+
+        return false;
+    }
+
+    public int getRequestNum() {
+        return requestCounter.get();
+    }
+
+    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;
+        }
+
+    }
+
+    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, String revisionStr) {
+        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 node = either.b();
+        return new GetAttributeImp(node);
+    }
+
+    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/network/bbs/RequestNumCheckServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,35 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;
+
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+
+public class RequestNumCheckServlet extends HttpServlet
+{
+	private final NetworkBulletinBoard bbs;
+	private static final long serialVersionUID = 1L;
+	
+	public RequestNumCheckServlet(NetworkBulletinBoard _bbs)
+	{
+		bbs = _bbs;
+	}
+	
+	public void doGet(HttpServletRequest _req,HttpServletResponse _res)
+	{
+		int num = bbs.getRequestNum();
+		
+		try{
+			PrintWriter pw = _res.getWriter();
+			pw.write(Integer.toString(num));
+			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/network/bbs/ShowMessageWithTimeStampServlet.java	Thu Feb 02 23:05:59 2017 +0900
@@ -0,0 +1,64 @@
+package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;
+
+import jp.ac.u_ryukyu.ie.cr.bbs.local.bbs.GetAttributeImp;
+import org.eclipse.jetty.util.thread.ThreadPool;
+
+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 ShowMessageWithTimeStampServlet extends HttpServlet {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    private final NetworkBulletinBoard bbs;
+    private final String createBoardMessagePath;
+
+    private static final String PARAM_BOARD_NAME = "bname";
+    private final String editMessagePath;
+
+    public ShowMessageWithTimeStampServlet(NetworkBulletinBoard _bbs,
+                                           String _createBoardMessagePath, String _editMessagePath, ThreadPool thp) {
+        bbs = _bbs;
+        createBoardMessagePath = _createBoardMessagePath;
+        editMessagePath = _editMessagePath;
+    }
+
+    public void doGet(HttpServletRequest _req, HttpServletResponse _res) {
+        final String bname = (_req.getParameter(PARAM_BOARD_NAME));
+        try {
+            _res.setCharacterEncoding("UTF-8");
+            printBoard(bname, _res.getWriter());
+        } catch (Exception _e) {
+            _res.setStatus(500);
+        }
+    }
+
+    private void printBoard(String _bname, PrintWriter _pw) throws Exception {
+        _pw.write("<html><body>\n");
+        _pw.write("<h1>" + bbs.sanitize(_bname) + "</h1>\n");
+        _pw.write("<p>Latest renew time : " + bbs.getRenewTime(_bname)
+                + "</p>\n");
+        ;
+
+        _pw.write("<form action='" + createBoardMessagePath + "' method='POST'\n");
+        _pw.write("<p>Author : <input type='text' name='author'/> <input type='hidden' name='bname' value='" + bbs.sanitize(_bname) + "'/> EditKey : <input type='textarea' 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");
+        Iterator<String> keys = attribute.getKeys();
+
+        while (keys.hasNext()) {
+            String key = keys.next();
+            String mesage = attribute.getMessage(key);
+            _pw.write("<p>" + key + " = " + mesage + "</p>\n");
+        }
+        _pw.write("<p><a href='" + editMessagePath + "?bname=" + bbs.sanitize(_bname) + "&uuid=-1,0" + "'>edit" + "</a></p>");
+        _pw.write("</body></html>");
+        _pw.flush();
+    }
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/codesegment/LogUpdateCodeSegment.java	Sat Nov 19 22:31:25 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/codesegment/LogUpdateCodeSegment.java	Thu Feb 02 23:05:59 2017 +0900
@@ -3,10 +3,10 @@
 import alice.codesegment.CodeSegment;
 import alice.datasegment.CommandType;
 import alice.datasegment.Receiver;
-import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
-import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
-import jp.ac.u_ryukyu.ie.cr.bbs.network.BulletinBoardJungleManager;
+import jp.ac.u_ryukyu.ie.cr.bbs.network.bbs.BulletinBoardJungleManager;
+import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error;
 import jp.ac.u_ryukyu.ie.cr.jungleNetwork.operations.NetworkTreeOperationLog;
 
 import java.util.List;
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/codesegment/StartBBSCodeSegment.java	Sat Nov 19 22:31:25 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/codesegment/StartBBSCodeSegment.java	Thu Feb 02 23:05:59 2017 +0900
@@ -3,10 +3,10 @@
 import alice.codesegment.CodeSegment;
 import alice.datasegment.CommandType;
 import alice.datasegment.Receiver;
-import jp.ac.u_ryukyu.ie.cr.bbs.local.*;
-import jp.ac.u_ryukyu.ie.cr.bbs.network.NetworkBulletinBoard;
-import jp.ac.u_ryukyu.ie.cr.bbs.network.NetworkJungleBulletinBoard;
-import jp.ac.u_ryukyu.ie.cr.bbs.network.RequestNumCheckServlet;
+import jp.ac.u_ryukyu.ie.cr.bbs.local.bbs.EditMessageUseGetServlet;
+import jp.ac.u_ryukyu.ie.cr.bbs.network.bbs.NetworkBulletinBoard;
+import jp.ac.u_ryukyu.ie.cr.bbs.network.bbs.NetworkJungleBulletinBoard;
+import jp.ac.u_ryukyu.ie.cr.bbs.network.bbs.RequestNumCheckServlet;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.servlet.ServletHandler;
 import org.eclipse.jetty.servlet.ServletHolder;