changeset 124:dacfa7eba841

To select persistent mode "-persistent"
author one
date Sat, 11 Jan 2014 06:33:54 +0900
parents 495ac60d7f5f
children 6104702a1880
files src/main/java/app/bbs/CassandraBulletinBoard.java src/main/java/app/bbs/DistributeApp.java src/main/java/app/bbs/NetworkBulletinBoard.java src/main/java/app/bbs/NetworkJungleBulletinBoard.java src/main/java/app/bbs/PersistentJungleBulletinBoard.java src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java
diffstat 6 files changed, 329 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/app/bbs/CassandraBulletinBoard.java	Fri Dec 27 20:13:37 2013 +0900
+++ b/src/main/java/app/bbs/CassandraBulletinBoard.java	Sat Jan 11 06:33:54 2014 +0900
@@ -8,7 +8,6 @@
 
 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;
--- a/src/main/java/app/bbs/DistributeApp.java	Fri Dec 27 20:13:37 2013 +0900
+++ b/src/main/java/app/bbs/DistributeApp.java	Sat Jan 11 06:33:54 2014 +0900
@@ -11,6 +11,6 @@
     public static void main( String[] args ) throws Exception
     {
    		RemoteConfig conf = new RemoteConfig(args);
-   		new TopologyNode(conf, new StartBBSCodeSegment(conf.bbsPort));
+   		new TopologyNode(conf, new StartBBSCodeSegment(args, conf.bbsPort));
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/app/bbs/NetworkBulletinBoard.java	Sat Jan 11 06:33:54 2014 +0900
@@ -0,0 +1,6 @@
+package app.bbs;
+
+
+public interface NetworkBulletinBoard extends BulletinBoard {
+	public void init();
+}
--- a/src/main/java/app/bbs/NetworkJungleBulletinBoard.java	Fri Dec 27 20:13:37 2013 +0900
+++ b/src/main/java/app/bbs/NetworkJungleBulletinBoard.java	Sat Jan 11 06:33:54 2014 +0900
@@ -1,22 +1,16 @@
 package app.bbs;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Date;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import alice.jungle.core.NetworkDefaultJungle;
-import alice.jungle.persistent.PersistentJournal;
-import alice.jungle.transaction.JungleUpdater;
+import alice.jungle.persistent.AliceJournal;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
@@ -27,65 +21,19 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
 
-public class NetworkJungleBulletinBoard implements BulletinBoard
+public class NetworkJungleBulletinBoard implements NetworkBulletinBoard
 {
 	private final Jungle jungle;
-	private final PersistentJournal journal;
-	private final String LOG_DIR = "./log"; 
-	
-	public NetworkJungleBulletinBoard(String _uuid) throws FileNotFoundException
+
+	public NetworkJungleBulletinBoard(String _uuid)
 	{
-		journal = new PersistentJournal();	
-		jungle = new NetworkDefaultJungle(journal, _uuid,new DefaultTreeEditor(new DefaultTraverser()));	
+		jungle = new NetworkDefaultJungle(new AliceJournal(), _uuid,new DefaultTreeEditor(new DefaultTraverser()));	
+		jungle.createNewTree("boards");
 		BullentInBoardJungleManager.setJungle(jungle);
 	}
 	
-	public void init() throws IOException {
-		checkAndCreateLogDirectory();
-		commitLogRecover();
-	}
-	
-	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 void init() {
+		
 	}
 
 	public Iterable<String> getBoards()
@@ -281,4 +229,5 @@
 			return uuid;
 		}
 	}
+
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/app/bbs/PersistentJungleBulletinBoard.java	Sat Jan 11 06:33:54 2014 +0900
@@ -0,0 +1,291 @@
+package app.bbs;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
+import alice.jungle.core.NetworkDefaultJungle;
+import alice.jungle.persistent.PersistentJournal;
+import alice.jungle.transaction.JungleUpdater;
+
+public class PersistentJungleBulletinBoard implements NetworkBulletinBoard
+{
+	private final Jungle jungle;
+	private final PersistentJournal journal;
+	private final String LOG_DIR = "./log"; 
+	
+	public PersistentJungleBulletinBoard(String _uuid) throws FileNotFoundException
+	{
+		journal = new PersistentJournal();	
+		jungle = new NetworkDefaultJungle(journal, _uuid,new DefaultTreeEditor(new DefaultTraverser()));	
+		BullentInBoardJungleManager.setJungle(jungle);
+	}
+	
+	public void init() {
+		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");
+		Node node = tree.getRootNode();
+		Children<Node> chs = node.getChildren();
+		
+		IterableConverter.Converter<String,Node> converter = new IterableConverter.Converter<String,Node>(){
+			public String conv(Node _b) {
+				ByteBuffer e = _b.getAttributes().get("name");
+				return new String(e.array());
+			}
+		};
+		
+		return new IterableConverter<String,Node>(chs,converter);
+	}
+
+	public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey)
+	{
+		if(null == jungle.createNewTree(_name)){
+			throw new IllegalStateException();
+		}
+		
+		JungleTree tree = jungle.getTreeByName("boards");
+		JungleTreeEditor editor = tree.getTreeEditor();
+		DefaultNodePath root = new DefaultNodePath();
+		Either<Error,JungleTreeEditor> either = editor.addNewChildAt(root,0);
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		
+		either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes()));
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		Either<Error,JungleTreeEditor> result = editor.success();
+		if(result.isA()){
+			throw new IllegalStateException();
+		}
+		final long timestamp = new Date().getTime();
+
+		
+		tree = jungle.getTreeByName(_name);
+		editor = tree.getTreeEditor();
+		either = editor.addNewChildAt(root,0);
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		
+		NodeEditor e = new NodeEditor(){
+			public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
+				_e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
+				_e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b();
+				_e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
+				ByteBuffer tBuffer = ByteBuffer.allocate(16);
+				_e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b();
+				return DefaultEither.newB(_e);
+			}
+		};
+		
+		either = editor.edit(root.add(0),e);
+		if(either.isA()){
+			throw new IllegalStateException();
+		}
+		editor = either.b();
+		editor.success();
+	}
+
+	public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey)
+	{
+		JungleTree tree = jungle.getTreeByName(_board);
+		if(tree == null){
+			throw new IllegalStateException();
+		}
+		
+		Either<Error, JungleTreeEditor> either;
+		do{
+			Node 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();
+			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();
+					return DefaultEither.newB(_e);
+				}
+			};
+			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 _uuid,final String _author,final String _message,final String _editKey)
+	{
+		for(;;) {
+			DefaultNodePath path = new DefaultNodePath();
+			path = path.add(Integer.parseInt(_uuid));
+		
+			JungleTree tree = jungle.getTreeByName(_board);
+			JungleTreeEditor editor = tree.getTreeEditor();
+			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();
+				return DefaultEither.newB(_e);
+				}
+			};
+		
+			Either<Error, JungleTreeEditor> either = editor.edit(path,e);
+			if(either.isA()){
+				throw new IllegalStateException();
+			}
+			editor = either.b();
+			either = editor.success();
+			if(!either.isA()) {
+				return;
+			}
+		}
+
+	}
+
+	public Iterable<BoardMessage> getMessages(String _boardName)
+	{
+		JungleTree tree = jungle.getTreeByName(_boardName);
+		Node node = tree.getRootNode();
+		Children<Node> chs = node.getChildren();
+		
+		final AtomicInteger counter = new AtomicInteger(0);
+		IterableConverter.Converter<BoardMessage,Node> converter = new IterableConverter.Converter<BoardMessage,Node>(){
+			public BoardMessage conv(Node _b) {
+				String uuid = Integer.toString(counter.get());
+				String author = new String(_b.getAttributes().get("author").array());
+				String message = new String(_b.getAttributes().get("mes").array());
+				counter.incrementAndGet();
+				return new BoardMessageImpl(author,message,uuid);
+			}
+		};
+		return new IterableConverter<BoardMessage,Node>(chs,converter);
+	}
+	
+
+	
+	private static class BoardMessageImpl implements BoardMessage
+	{
+		private final String author;
+		private final String message;
+		private final String uuid;
+		
+		public BoardMessageImpl(String _author,String _message,String _uuid)
+		{
+			author = _author;
+			message = _message;
+			uuid = _uuid;
+		}
+
+		public String getAuthor()
+		{
+			return author;
+		}
+
+		public String getMessage()
+		{
+			return message;
+		}
+
+		public String getUUID()
+		{
+			return uuid;
+		}
+	}	
+
+	
+	
+}
--- a/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java	Fri Dec 27 20:13:37 2013 +0900
+++ b/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java	Sat Jan 11 06:33:54 2014 +0900
@@ -1,7 +1,6 @@
 package app.bbs.codesegment;
 
 import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
 
@@ -17,7 +16,9 @@
 import app.bbs.CreateBoardMessageServlet;
 import app.bbs.CreateBoardServlet;
 import app.bbs.EditMessageServlet;
+import app.bbs.NetworkBulletinBoard;
 import app.bbs.NetworkJungleBulletinBoard;
+import app.bbs.PersistentJungleBulletinBoard;
 import app.bbs.ShowBoardMessageServlet;
 import app.bbs.ShowBoardsServlet;
 
@@ -27,13 +28,17 @@
 	int bbsPort = 8080;
 	Receiver host = ids.create(CommandType.PEEK);
 	private Pattern pattern = Pattern.compile("^(node|cli)([0-9]+)$");
+	private String[] args;
+	boolean persistentFlag = false;
 	
-	public StartBBSCodeSegment(int p) {
+	public StartBBSCodeSegment(String[] _args, int p) {
+		args = _args;
 		bbsPort = p;
 		host.setKey("host");	
 	}
 
 	public StartBBSCodeSegment() {
+		args = null;
 		host.setKey("host");	
 	}
 	
@@ -42,17 +47,23 @@
 		Matcher matcher = pattern.matcher(name);
 		matcher.find();
 //		String type = matcher.group(1);
-		
-		System.out.println("log loading...");
-		NetworkJungleBulletinBoard cassaBBS = null;
-		try {
+		for(String arg: args) {
+			if(arg.equals("-persistent")){
+				persistentFlag = true;
+			}
+		}
+		NetworkBulletinBoard cassaBBS = null;
+		if(persistentFlag) {
+			System.out.println("log loading...");
+			try {
+				cassaBBS = new PersistentJungleBulletinBoard(name);
+				cassaBBS.init();
+			} catch (FileNotFoundException e1) {
+				e1.printStackTrace();
+			}
+		} else {
 			cassaBBS = new NetworkJungleBulletinBoard(name);
 			cassaBBS.init();
-		} catch (FileNotFoundException e1) {
-			e1.printStackTrace();
-			System.exit(0);;
-		} catch (IOException e) {
-			e.printStackTrace();
 		}
 		
 		System.out.println("StartBBSCodeSegment");