comparison 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
comparison
equal deleted inserted replaced
117:24fdf5126f4d 118:f64ff5bd66f5
1 package app.bbs; 1 package app.bbs;
2 2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.IOException;
3 import java.nio.ByteBuffer; 6 import java.nio.ByteBuffer;
4 import java.util.Date; 7 import java.util.Date;
5 import java.util.concurrent.atomic.AtomicInteger; 8 import java.util.concurrent.atomic.AtomicInteger;
6 9
7 import alice.jungle.core.NetworkDefaultJungle; 10 import alice.jungle.core.NetworkDefaultJungle;
8 import alice.jungle.persistent.AliceJournal; 11 import alice.jungle.persistent.PersistentJournal;
12 import alice.jungle.transaction.JungleUpdater;
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; 13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; 14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; 15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; 16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; 17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; 20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; 21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; 22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; 23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; 24 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; 28 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
23 29
24 public class NetworkJungleBulletinBoard implements BulletinBoard 30 public class NetworkJungleBulletinBoard implements BulletinBoard
25 { 31 {
26 private final Jungle jungle; 32 private final Jungle jungle;
27 33 private final PersistentJournal journal;
28 public NetworkJungleBulletinBoard(String _uuid) 34
29 { 35 public NetworkJungleBulletinBoard(String _uuid) throws FileNotFoundException
30 jungle = new NetworkDefaultJungle(new AliceJournal(), _uuid,new DefaultTreeEditor(new DefaultTraverser())); 36 {
31 jungle.createNewTree("boards"); 37 journal = new PersistentJournal();
38 jungle = new NetworkDefaultJungle(journal, _uuid,new DefaultTreeEditor(new DefaultTraverser()));
32 JungleManager.setJungle(jungle); 39 JungleManager.setJungle(jungle);
40 }
41
42 public void init() throws IOException {
43 commitLogRecover();
44 }
45
46 public void commitLogRecover() throws IOException {
47 File[] logFiles = new File("./log/").listFiles();
48 for(File logFile : logFiles) {
49 commitLogRecover(logFile);
50 logFile.delete();
51 }
52 if(jungle.getTreeByName("boards") == null) {
53 jungle.createNewTree("boards");
54 }
55 }
56
57 private void commitLogRecover(File logFile) throws IOException {
58 journal.setInputFile(logFile);
59 ChangeListReader reader = journal.getReader();
60 if (reader == null) return;
61 for (ChangeList chList : reader) {
62 String treeName = chList.getTreeName();
63 JungleTree tree = jungle.getTreeByName(treeName);
64 if(tree == null) {
65 tree = jungle.createNewTree(treeName);
66 }
67 JungleTreeEditor editor = tree.getLocalTreeEditor();
68 Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, chList);
69 editor = either.b();
70 if(either.isA()) {
71 throw new IOException("Failed commit log recovery");
72 }
73 editor.success();
74 }
33 } 75 }
34 76
35 public Iterable<String> getBoards() 77 public Iterable<String> getBoards()
36 { 78 {
37 JungleTree tree = jungle.getTreeByName("boards"); 79 JungleTree tree = jungle.getTreeByName("boards");