diff src/main/java/app/bbs/NetworkJungleBulletinBoard.java @ 118:f64ff5bd66f5

Implements persistent for bbs app and Fixed bug JungleUpdater
author one
date Wed, 25 Dec 2013 20:02:26 +0900
parents 8f9811a1e00c
children cef245f71053
line wrap: on
line diff
--- 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()
 	{