# HG changeset patch
# User Shoshi TAMAKI
# Date 1360164381 -32400
# Node ID e7a9b10dd84436ce194a9b564082d9720646736e
added cassandra bulletin board
diff -r 000000000000 -r e7a9b10dd844 README
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,6 @@
+launch App.class to run CassandraBBS
+
+requirements.
+
+Cassandra 1.2.1
+ and others are in pom.xml
\ No newline at end of file
diff -r 000000000000 -r e7a9b10dd844 pom.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pom.xml Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,51 @@
+
+ 4.0.0
+
+ jp.ac.u_ryukyu.ie.cr.shoshi.jungle
+ bulletinboard
+ 0.0.1-SNAPSHOT
+ jar
+
+ bulletinboard
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+ org.mortbay.jetty
+ jetty
+ 6.1.26
+
+
+ org.hectorclient
+ hector-core
+ 1.1-2
+
+
+ org.apache.cassandra
+ cassandra-all
+ 1.2.1
+
+
+ com.eaio.uuid
+ uuid
+ 3.3
+
+
+
+
+ eaio.com
+ http://eaio.com/maven2
+
+
+
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/App.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/App.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,40 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+import javax.servlet.Servlet;
+
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+
+/**
+ * Hello world!
+ *
+ */
+public class App
+{
+ public static void main( String[] args ) throws Exception
+ {
+ BulletinBoard cassaBBS = new CassandraBulletinBoard("test-cluster","localhost:9160","cassaBBS2");
+
+ String createBoardMessagePath = "/createBoardMessage";
+ String createBoardPath = "/createBoard";
+ String editMessagePath = "/editMessage";
+ String showBoardMessagePath = "/showBoardMessage";
+
+ Servlet createBoardMessage = new CreateBoardMessageServlet(cassaBBS);
+ Servlet createBoard = new CreateBoardServlet(cassaBBS);
+ Servlet editBoardMessage = new EditMessageServlet(cassaBBS);
+ Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath);
+ Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath);
+
+ Server serv = new Server(8080);
+ ServletHandler context = new ServletHandler();
+ context.addServletWithMapping(new ServletHolder(createBoardMessage),createBoardMessagePath);
+ context.addServletWithMapping(new ServletHolder(createBoard),createBoardPath);
+ context.addServletWithMapping(new ServletHolder(editBoardMessage),editMessagePath);
+ context.addServletWithMapping(new ServletHolder(index),"/");
+ context.addServletWithMapping(new ServletHolder(board),showBoardMessagePath);
+ serv.addHandler(context);
+ serv.start();
+ }
+}
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/BoardMessage.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/BoardMessage.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,8 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+public interface BoardMessage
+{
+ public String getUUID();
+ public String getAuthor();
+ public String getMessage();
+}
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/BulletinBoard.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/BulletinBoard.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,11 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+public interface BulletinBoard
+{
+ public Iterable 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 Iterable getMessages(String _boardName);
+}
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/CassandraBulletinBoard.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/CassandraBulletinBoard.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,192 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.cassandra.locator.SimpleStrategy;
+
+import me.prettyprint.cassandra.serializers.StringSerializer;
+import me.prettyprint.cassandra.serializers.UUIDSerializer;
+import me.prettyprint.cassandra.service.CassandraHost;
+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.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;
+
+public class CassandraBulletinBoard implements BulletinBoard
+{
+ private final String address;
+ private final String clusterName;
+ private final Cluster cluster;
+ private final String keyspace;
+
+ private static final String COLUMN_FAMILY_BOARD = "boards";
+
+ public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName)
+ {
+ address = _address;
+ clusterName = _clusterName;
+ keyspace = _keyspaceName;
+ cluster = HFactory.getOrCreateCluster(clusterName,address);
+
+ initialize();
+ }
+
+ private void initialize()
+ {
+ if(cluster.describeKeyspace(keyspace) == null){
+ KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace,
+ SimpleStrategy.class.getName(),1,Collections. emptyList());
+ cluster.addKeyspace(keyspaceDefinition,false);
+ ColumnFamilyDefinition columnFamilyDefinition = HFactory.createColumnFamilyDefinition(keyspace,COLUMN_FAMILY_BOARD,ComparatorType.UUIDTYPE);
+ columnFamilyDefinition.setColumnType(ColumnType.SUPER);
+ cluster.addColumnFamily(columnFamilyDefinition);
+ }
+ }
+
+ public Iterable getBoards()
+ {
+ Keyspace ksp = HFactory.createKeyspace(keyspace, cluster);
+ RangeSuperSlicesQuery 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> result = query.execute();
+ OrderedSuperRows rows = result.get();
+ List> list = rows.getList();
+
+ IterableConverter.Converter> converter
+ = new IterableConverter.Converter>(){
+ public String conv(SuperRow _b) {
+ return _b.getKey();
+ }
+ };
+
+ return new IterableConverter>(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);
+ ThriftSuperCfTemplate template =
+ new ThriftSuperCfTemplate(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
+ UUIDSerializer.get(),StringSerializer.get());
+
+ SuperCfUpdater 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 getMessages(String _boardName)
+ {
+ Keyspace ksp = HFactory.createKeyspace(keyspace,cluster);
+ SuperSliceQuery 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> result = query.execute();
+ SuperSlice ss = result.get();
+ List> list = ss.getSuperColumns();
+
+ IterableConverter.Converter> converter =
+ new IterableConverter.Converter>(){
+ public BoardMessage conv(HSuperColumn _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>(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);
+ UUID time = UUID.fromString(_uuid);
+ ThriftSuperCfTemplate template =
+ new ThriftSuperCfTemplate(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
+ UUIDSerializer.get(),StringSerializer.get());
+
+ SuperCfResult result = template.querySuperColumn(_board,time);
+ String editKey = result.getString(COLUMN_MESSAGE_EDIT_KEY);
+ if(!editKey.equals(editKey)){
+ return;
+ }
+
+ SuperCfUpdater 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);
+ }
+
+}
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/CreateBoardMessageServlet.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/CreateBoardMessageServlet.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,40 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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);
+ }
+ }
+}
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/CreateBoardServlet.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/CreateBoardServlet.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,39 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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 = _req.getParameter(PARAM_BOARD_NAME);
+ String author = _req.getParameter(PARAM_BOARD_AUTHOR);
+ String msg = _req.getParameter(PARAM_BOARD_INITMESSAGE);
+ String key = _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);
+ }
+ }
+}
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/EditMessageServlet.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/EditMessageServlet.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,64 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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);
+
+
+ try{
+ PrintWriter pw = _res.getWriter();
+ pw.write("edit message
");
+ pw.write("
\n");
+ _pw.write("Message
\n");
+ _pw.write("\n");
+
+ for(BoardMessage msg : bbs.getMessages(_bname)){
+ _pw.write("
");
+ _pw.write(""+msg.getAuthor()+"
");
+ _pw.write(""+msg.getMessage()+"
");
+ _pw.write("edit");
+ }
+
+ _pw.write("");
+ _pw.flush();
+ }
+}
diff -r 000000000000 -r e7a9b10dd844 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/ShowBoardsServlet.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/bbs/ShowBoardsServlet.java Thu Feb 07 00:26:21 2013 +0900
@@ -0,0 +1,55 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs;
+
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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{
+ printBoard(_res.getWriter());
+ }catch(Exception _e){
+ _res.setStatus(500);
+ }
+
+ }
+
+ private void printBoard(PrintWriter _pw) throws Exception
+ {
+ _pw.write("\n");
+ _pw.write("BBS
\n");
+ _pw.write("