# HG changeset patch # User one # Date 1387969346 -32400 # Node ID f64ff5bd66f51094a07b7eae7e278221855548b8 # Parent 24fdf5126f4dbdcf167167059ddf3733f90d7968 Implements persistent for bbs app and Fixed bug JungleUpdater diff -r 24fdf5126f4d -r f64ff5bd66f5 src/main/java/alice/jungle/persistent/PersistentChangeListReader.java --- 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 diff -r 24fdf5126f4d -r f64ff5bd66f5 src/main/java/alice/jungle/persistent/PersistentJournal.java --- 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(); + } + + } diff -r 24fdf5126f4d -r f64ff5bd66f5 src/main/java/alice/jungle/transaction/JungleUpdater.java --- 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 _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(); diff -r 24fdf5126f4d -r f64ff5bd66f5 src/main/java/app/bbs/NetworkJungleBulletinBoard.java --- 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 either = JungleUpdater.edit(editor, chList); + editor = either.b(); + if(either.isA()) { + throw new IOException("Failed commit log recovery"); + } + editor.success(); + } + } public Iterable getBoards() { diff -r 24fdf5126f4d -r f64ff5bd66f5 src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java --- 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"; diff -r 24fdf5126f4d -r f64ff5bd66f5 src/test/java/alice/jungle/PersistentJournalTest.java --- 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) {