Mercurial > hg > Database > jungle-network
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() {