changeset 118:f64ff5bd66f5

Implements persistent for bbs app and Fixed bug JungleUpdater
author one
date Wed, 25 Dec 2013 20:02:26 +0900
parents 24fdf5126f4d
children cfc6e8933965
files src/main/java/alice/jungle/persistent/PersistentChangeListReader.java src/main/java/alice/jungle/persistent/PersistentJournal.java src/main/java/alice/jungle/transaction/JungleUpdater.java src/main/java/app/bbs/NetworkJungleBulletinBoard.java src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java src/test/java/alice/jungle/PersistentJournalTest.java
diffstat 6 files changed, 90 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/alice/jungle/persistent/PersistentChangeListReader.java	Wed Dec 25 18:48:54 2013 +0900
+++ b/src/main/java/alice/jungle/persistent/PersistentChangeListReader.java	Wed Dec 25 20:02:26 2013 +0900
@@ -16,10 +16,6 @@
 	private InputStream in;
 	MessagePack msgpack = PersistentJournal.getMsgPackInstance();
 
-	public PersistentChangeListReader() {
-		in = null;
-	}
-	
 	public PersistentChangeListReader(InputStream _in) {
 		in = _in;
 	}
@@ -27,7 +23,7 @@
 	@Override
 	public ChangeListReader newReader()
 	{
-		return new PersistentChangeListReader();
+		return null;
 	}
 	
 	@Override 
--- a/src/main/java/alice/jungle/persistent/PersistentJournal.java	Wed Dec 25 18:48:54 2013 +0900
+++ b/src/main/java/alice/jungle/persistent/PersistentJournal.java	Wed Dec 25 20:02:26 2013 +0900
@@ -16,11 +16,11 @@
 
 public class PersistentJournal implements Journal {
 	
-	private static ChangeListWriter WRITER;
-	private static ChangeListReader READER;
+	private ChangeListWriter WRITER;
+	private ChangeListReader READER;
+	private OutputStream out;
+	private InputStream in;
 	private static MessagePack msgpack;
-	private static OutputStream out = null;
-	private static InputStream in = null;
 	
 	static {
 		msgpack = new MessagePack();
@@ -30,7 +30,7 @@
 	}
 	
 	public PersistentJournal(File file) throws FileNotFoundException {
-		out = new FileOutputStream(file);
+		out = new FileOutputStream(file,true);
 		in = new FileInputStream(file);
 		WRITER = new PersistentChangeListWriter(out);
 		READER = new PersistentChangeListReader(in);
@@ -43,26 +43,29 @@
 
 	@Override
 	public ChangeListWriter getWriter() {
-		return WRITER;
+		String timeStamp = Long.toString(System.currentTimeMillis());
+		String logFileName = timeStamp + ".log";
+		OutputStream outStream = null;
+		try {
+			outStream = new FileOutputStream(new File("./log/"+logFileName));
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		}
+		PersistentChangeListWriter writer = new PersistentChangeListWriter(outStream);
+		return writer; 
 	}
 	
 	public void setOutputFile(File file) throws FileNotFoundException {
-		out = new FileOutputStream(file);
-		WRITER = new PersistentChangeListWriter(out);
+		setOutputStream(new FileOutputStream(file, true));
 	}
 	
 	public void setInputFile(File file) throws FileNotFoundException {
-		in = new FileInputStream(file);
-		READER = new PersistentChangeListReader(in);
-	}
-	
-	public void close() throws IOException {
-		out.close();
-		in.close();
+		setInputStream(new FileInputStream(file));
 	}
 	
 	public void setOutputStream(OutputStream _out) {
 		out = _out;
+		WRITER = new PersistentChangeListWriter(out);		
 	}
 	
 	public OutputStream getOutputStream() {
@@ -71,8 +74,9 @@
 	
 	public void setInputStream(InputStream _in) {
 		in = _in;
+		READER = new PersistentChangeListReader(in);
 	}
-	
+
 	public InputStream getInputStream() {
 		return in;
 	}
@@ -80,5 +84,12 @@
 	public static MessagePack getMsgPackInstance() {
 		return msgpack;
 	}
+	
+	public void close() throws IOException {
+		out.close();
+		in.close();
+	}
+	
+
 
 }
--- a/src/main/java/alice/jungle/transaction/JungleUpdater.java	Wed Dec 25 18:48:54 2013 +0900
+++ b/src/main/java/alice/jungle/transaction/JungleUpdater.java	Wed Dec 25 20:02:26 2013 +0900
@@ -4,7 +4,7 @@
 
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
@@ -31,7 +31,7 @@
 	
 	private static Either<Error, JungleTreeEditor> _edit(JungleTreeEditor editor,
 			TreeOperation op) {
-		DefaultNodePath path = new DefaultNodePath();
+		NodePath path = op.getNodePath();
 		NodeOperation nodeOp = op.getNodeOperation();
 		int pos = nodeOp.getPosition();
 		Command c = nodeOp.getCommand();
--- a/src/main/java/app/bbs/NetworkJungleBulletinBoard.java	Wed Dec 25 18:48:54 2013 +0900
+++ b/src/main/java/app/bbs/NetworkJungleBulletinBoard.java	Wed Dec 25 20:02:26 2013 +0900
@@ -1,16 +1,22 @@
 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.AliceJournal;
+import alice.jungle.persistent.PersistentJournal;
+import alice.jungle.transaction.JungleUpdater;
 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;
@@ -24,13 +30,49 @@
 public class NetworkJungleBulletinBoard implements BulletinBoard
 {
 	private final Jungle jungle;
+	private final PersistentJournal journal;
 	
-	public NetworkJungleBulletinBoard(String _uuid)
+	public NetworkJungleBulletinBoard(String _uuid) throws FileNotFoundException
 	{
-		jungle = new NetworkDefaultJungle(new AliceJournal(), _uuid,new DefaultTreeEditor(new DefaultTraverser()));	
-		jungle.createNewTree("boards");
+		journal = new PersistentJournal();	
+		jungle = new NetworkDefaultJungle(journal, _uuid,new DefaultTreeEditor(new DefaultTraverser()));	
 		JungleManager.setJungle(jungle);
 	}
+	
+	public void init() throws IOException {
+		commitLogRecover();
+	}
+	
+	public void commitLogRecover() throws IOException {
+		File[] logFiles = new File("./log/").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()
 	{
--- a/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java	Wed Dec 25 18:48:54 2013 +0900
+++ b/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java	Wed Dec 25 20:02:26 2013 +0900
@@ -1,5 +1,7 @@
 package app.bbs.codesegment;
 
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
 
@@ -12,7 +14,6 @@
 import alice.codesegment.CodeSegment;
 import alice.datasegment.CommandType;
 import alice.datasegment.Receiver;
-import app.bbs.BulletinBoard;
 import app.bbs.CreateBoardMessageServlet;
 import app.bbs.CreateBoardServlet;
 import app.bbs.EditMessageServlet;
@@ -44,8 +45,18 @@
 		matcher.find();
 //		String type = matcher.group(1);
 		
+		NetworkJungleBulletinBoard cassaBBS = null;
+		try {
+			cassaBBS = new NetworkJungleBulletinBoard(name);
+			cassaBBS.init();
+		} catch (FileNotFoundException e1) {
+			e1.printStackTrace();
+			System.exit(0);;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
 		/* Jetty registration */
-		BulletinBoard cassaBBS = new NetworkJungleBulletinBoard(name);
     	String createBoardMessagePath = "/createBoardMessage";
     	String createBoardPath = "/createBoard";
     	String editMessagePath = "/editMessage";
--- a/src/test/java/alice/jungle/PersistentJournalTest.java	Wed Dec 25 18:48:54 2013 +0900
+++ b/src/test/java/alice/jungle/PersistentJournalTest.java	Wed Dec 25 20:02:26 2013 +0900
@@ -48,7 +48,7 @@
 		journal2.setOutputFile(new File("./log/commit2.log"));
 		Jungle jungle2 = new PersistentJungle(journal1, "uuid2", new DefaultTreeEditor(new DefaultTraverser()));
 		ChangeListReader reader = journal2.getReader();
-		for (ChangeList chList : reader) {//  != null; chList = reader.read()) {
+		for (ChangeList chList : reader) {
 			String treeName = chList.getTreeName();
 			JungleTree tree2 = jungle2.getTreeByName(treeName);
 			if(tree2 == null) {