changeset 146:29734d7d6521

Added ShowMessageWithTimeStampServlet
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 28 Jan 2014 08:47:45 +0900
parents 0340a3321e6c
children 202ea963ec20
files src/main/java/app/bbs/BoardRenewTime.java src/main/java/app/bbs/BulletinBoardJungleManager.java src/main/java/app/bbs/NetworkBulletinBoard.java src/main/java/app/bbs/NetworkJungleBulletinBoard.java src/main/java/app/bbs/ShowMessageWithTimeStampServlet.java src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java
diffstat 6 files changed, 164 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/app/bbs/BoardRenewTime.java	Tue Jan 28 08:47:45 2014 +0900
@@ -0,0 +1,8 @@
+package app.bbs;
+
+public interface BoardRenewTime {
+
+	public String getboardName();
+	public Long getRenewTime();	
+	
+}
--- a/src/main/java/app/bbs/BulletinBoardJungleManager.java	Tue Jan 28 06:25:47 2014 +0900
+++ b/src/main/java/app/bbs/BulletinBoardJungleManager.java	Tue Jan 28 08:47:45 2014 +0900
@@ -1,6 +1,9 @@
 package app.bbs;
 
 import java.nio.ByteBuffer;
+import java.util.Date;
+
+import javax.naming.directory.Attribute;
 
 import alice.jungle.operations.NetworkTreeOperationLog;
 import alice.jungle.transaction.JungleUpdater;
@@ -8,7 +11,10 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
@@ -46,8 +52,11 @@
 				throw new IllegalStateException();
 			}
 		}
+
+
 		Either<Error, JungleTreeEditor> either = null;
 		JungleTree tree = jungle.getTreeByName(treeName);
+		
 		do {
 			JungleTreeEditor editor = tree.getLocalTreeEditor();
 			/* 
@@ -62,9 +71,27 @@
 			editor = either.b();
 			either = editor.success();
 		}while(either.isA());
+
+		renewBoardTimeStamp(tree);
 		return either;
 	}
 	
+	private static void renewBoardTimeStamp(JungleTree tree) {
+		JungleTreeEditor editor = tree.getLocalTreeEditor();
+		DefaultNodePath root = new DefaultNodePath();
+		long timestamp = new Date().getTime();
+		ByteBuffer tBuffer = ByteBuffer.allocate(16);
+		tBuffer.putLong(timestamp);
+		
+		Either<Error, JungleTreeEditor> either = null;
+		do {
+			either = editor.putAttribute(root, "renewtime", tBuffer);
+			editor = either.b();
+			either = editor.success();
+		}while(either.isA());
+
+	}
+	
 	private static int calculatePosition(Node node, long newNodeTimeStamp) {
 		int count = 0;
 		long childTimeStamp = 0;
--- a/src/main/java/app/bbs/NetworkBulletinBoard.java	Tue Jan 28 06:25:47 2014 +0900
+++ b/src/main/java/app/bbs/NetworkBulletinBoard.java	Tue Jan 28 08:47:45 2014 +0900
@@ -6,5 +6,6 @@
 public interface NetworkBulletinBoard extends BulletinBoard {
 	public void init();
 	public int getRequestNum();
+	public long getRenewTime(String boardName);
 
 }
--- a/src/main/java/app/bbs/NetworkJungleBulletinBoard.java	Tue Jan 28 06:25:47 2014 +0900
+++ b/src/main/java/app/bbs/NetworkJungleBulletinBoard.java	Tue Jan 28 08:47:45 2014 +0900
@@ -129,6 +129,19 @@
 		
 		return new IterableConverter<String,Node>(chs,converter);
 	}
+	
+	public long getRenewTime(String _boardName) {
+		JungleTree tree = jungle.getTreeByName(_boardName);
+		ByteBuffer b = tree.getRootNode().getAttributes().get("renewtime");
+		long timestamp;
+		if (b == null) {
+			timestamp = 0;
+		} else {
+			timestamp = b.getLong(0);
+		}
+		return timestamp;
+	}
+	
 
 	public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey)
 	{
@@ -153,16 +166,17 @@
 		editor = either.b();
 		final long timestamp = new Date().getTime();
 		ByteBuffer tBuffer = ByteBuffer.allocate(16);
-		either = editor.putAttribute(root.add(0),"timestamp", tBuffer.putLong(timestamp));		
+		tBuffer.putLong(timestamp);
+		either = editor.putAttribute(root.add(0),"timestamp", tBuffer);
 		if(either.isA()){
 			throw new IllegalStateException();
 		}
-		editor = either.b();
-		Either<Error,JungleTreeEditor> result = editor.success();
-		if(result.isA()){
+		either = either.b().success();
+		if(either.isA()){
 			throw new IllegalStateException();
 		}
 		
+		
 		tree = jungle.getTreeByName(_name);
 		editor = tree.getTreeEditor();
 		either = editor.addNewChildAt(root,0);
@@ -177,7 +191,8 @@
 				_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b();
 				_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
 				ByteBuffer tBuffer2 = ByteBuffer.allocate(16);
-				_e = _e.getAttributes().put("timestamp",tBuffer2.putLong(timestamp)).b();
+				tBuffer2.putLong(timestamp);
+				_e = _e.getAttributes().put("timestamp",tBuffer2).b();
 				return DefaultEither.newB(_e);
 			}
 		};
@@ -186,8 +201,12 @@
 		if(either.isA()){
 			throw new IllegalStateException();
 		}
-		editor = either.b();
-		editor.success();
+		either.b().success();
+		
+		editor = tree.getLocalTreeEditor();
+		either = editor.putAttribute(root, "renewtime", tBuffer);
+		either.b().success();
+		
 	}
 
 	public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey)
@@ -199,6 +218,9 @@
 		}
 		
 		Either<Error, JungleTreeEditor> either;
+		final long timestamp = new Date().getTime();
+		final ByteBuffer tBuffer = ByteBuffer.allocate(16);
+		tBuffer.putLong(timestamp);
 		do{
 			Node node = tree.getRootNode();
 			int size = node.getChildren().size();
@@ -210,14 +232,13 @@
 				throw new IllegalStateException();
 			}
 			editor = either.b();
-			final long timestamp = new Date().getTime();
+
 			NodeEditor e = new NodeEditor(){
 				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
 					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
 					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
 					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
-					ByteBuffer tBuffer = ByteBuffer.allocate(16);
-					_e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b();
+					_e = _e.getAttributes().put("timestamp",tBuffer).b();
 					return DefaultEither.newB(_e);
 				}
 			};
@@ -228,41 +249,60 @@
 			}
 			editor = either.b();
 			either = editor.success();
+		}while(either.isA());
 
+		/* 
+		 * Record latest renew time 
+		 */
+		DefaultNodePath root = new DefaultNodePath();
+		do {
+			JungleTreeEditor editor = tree.getLocalTreeEditor();
+			either = editor.putAttribute(root, "renewtime", tBuffer);
+			either = either.b().success();
 		}while(either.isA());
+		
+		
 	}
 
 	public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey)
 	{
 		requestCounter.incrementAndGet();
 		final long timestamp = new Date().getTime(); 
-		for(;;) {
+		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));
-		
-			JungleTree tree = jungle.getTreeByName(_board);
+
 			JungleTreeEditor editor = tree.getTreeEditor();
 			NodeEditor e = new NodeEditor(){
 				public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
 					_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
 					_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
 					_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
-					ByteBuffer tBuffer = ByteBuffer.allocate(16);
-					_e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b();
+					_e = _e.getAttributes().put("timestamp",tBuffer).b();
 				return DefaultEither.newB(_e);
 				}
 			};
-		
-			Either<Error, JungleTreeEditor> either = editor.edit(path,e);
+			either = editor.edit(path,e);
 			if(either.isA()){
 				throw new IllegalStateException();
 			}
 			editor = either.b();
 			either = editor.success();
-			if(!either.isA()) {
-				return;
-			}
-		}
+		}while(either.isA());
+		/* 
+		 * Record latest renew time 
+		 */
+		DefaultNodePath root = new DefaultNodePath();
+		do {
+			JungleTreeEditor editor = tree.getLocalTreeEditor();
+			either = editor.putAttribute(root, "renewtime", tBuffer);
+			either = either.b().success();
+		}while(either.isA());
+		
 
 	}
 
@@ -289,6 +329,7 @@
 		return requestCounter.get();
 	}
 	
+
 	private static class BoardMessageImpl implements BoardMessage
 	{
 		private final String author;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/app/bbs/ShowMessageWithTimeStampServlet.java	Tue Jan 28 08:47:45 2014 +0900
@@ -0,0 +1,63 @@
+package app.bbs;
+
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.BoardMessage;
+
+public class ShowMessageWithTimeStampServlet extends HttpServlet
+{
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private final NetworkBulletinBoard bbs;
+	private final String createBoardMessagePath;
+	private final String editMessagePath;
+	
+	private static final String PARAM_BOARD_NAME = "bname";
+
+	public ShowMessageWithTimeStampServlet(NetworkBulletinBoard _bbs,String _createBoardMessagePath, String _editMessagePath)
+	{
+		bbs = _bbs;
+		createBoardMessagePath = _createBoardMessagePath;
+		editMessagePath = _editMessagePath;
+	}
+
+	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>"+_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='"+_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");
+		
+		for(BoardMessage msg : bbs.getMessages(_bname)){
+			_pw.write("<hr/>");
+			_pw.write("<p><b>"+msg.getAuthor()+"</b></p>");
+			_pw.write("<p>"+msg.getMessage()+"</p>");
+			_pw.write("<small><a href='"+editMessagePath+"?bname="+_bname+"&uuid="+msg.getUUID()+"'>edit</a></small>");
+		}
+		
+		_pw.write("</body></html>");
+		_pw.flush();
+	}
+}
--- a/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java	Tue Jan 28 06:25:47 2014 +0900
+++ b/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java	Tue Jan 28 08:47:45 2014 +0900
@@ -9,7 +9,6 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.CreateBoardServlet;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.EditMessageServlet;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.EditMessageUseGetServlet;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.ShowBoardMessageServlet;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.ShowBoardsServlet;
 
 import org.mortbay.jetty.Server;
@@ -22,6 +21,7 @@
 import app.bbs.NetworkBulletinBoard;
 import app.bbs.NetworkJungleBulletinBoard;
 import app.bbs.RequestNumCheckServlet;
+import app.bbs.ShowMessageWithTimeStampServlet;
 
 public class StartBBSCodeSegment extends CodeSegment {
 	
@@ -75,7 +75,8 @@
     	Servlet createBoard = new CreateBoardServlet(cassaBBS);
     	Servlet editBoardMessage = new EditMessageServlet(cassaBBS);
     	Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath);
-    	Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath);
+//    	Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath);
+    	Servlet board = new ShowMessageWithTimeStampServlet(cassaBBS,createBoardMessagePath,editMessagePath);
     	
     	Server serv = new Server(bbsPort);
     	ServletHandler context = new ServletHandler();