# HG changeset patch # User one # Date 1389389634 -32400 # Node ID dacfa7eba84167fff60d5f3959813b3646804626 # Parent 495ac60d7f5f6e96d92ec818aed28bb0b14619f9 To select persistent mode "-persistent" diff -r 495ac60d7f5f -r dacfa7eba841 src/main/java/app/bbs/CassandraBulletinBoard.java --- a/src/main/java/app/bbs/CassandraBulletinBoard.java Fri Dec 27 20:13:37 2013 +0900 +++ b/src/main/java/app/bbs/CassandraBulletinBoard.java Sat Jan 11 06:33:54 2014 +0900 @@ -8,7 +8,6 @@ import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.cassandra.serializers.UUIDSerializer; -import me.prettyprint.cassandra.service.CassandraHost; import me.prettyprint.cassandra.service.template.SuperCfResult; import me.prettyprint.cassandra.service.template.SuperCfUpdater; import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate; diff -r 495ac60d7f5f -r dacfa7eba841 src/main/java/app/bbs/DistributeApp.java --- a/src/main/java/app/bbs/DistributeApp.java Fri Dec 27 20:13:37 2013 +0900 +++ b/src/main/java/app/bbs/DistributeApp.java Sat Jan 11 06:33:54 2014 +0900 @@ -11,6 +11,6 @@ public static void main( String[] args ) throws Exception { RemoteConfig conf = new RemoteConfig(args); - new TopologyNode(conf, new StartBBSCodeSegment(conf.bbsPort)); + new TopologyNode(conf, new StartBBSCodeSegment(args, conf.bbsPort)); } } diff -r 495ac60d7f5f -r dacfa7eba841 src/main/java/app/bbs/NetworkBulletinBoard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/app/bbs/NetworkBulletinBoard.java Sat Jan 11 06:33:54 2014 +0900 @@ -0,0 +1,6 @@ +package app.bbs; + + +public interface NetworkBulletinBoard extends BulletinBoard { + public void init(); +} diff -r 495ac60d7f5f -r dacfa7eba841 src/main/java/app/bbs/NetworkJungleBulletinBoard.java --- a/src/main/java/app/bbs/NetworkJungleBulletinBoard.java Fri Dec 27 20:13:37 2013 +0900 +++ b/src/main/java/app/bbs/NetworkJungleBulletinBoard.java Sat Jan 11 06:33:54 2014 +0900 @@ -1,22 +1,16 @@ 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.PersistentJournal; -import alice.jungle.transaction.JungleUpdater; +import alice.jungle.persistent.AliceJournal; 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; @@ -27,65 +21,19 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; -public class NetworkJungleBulletinBoard implements BulletinBoard +public class NetworkJungleBulletinBoard implements NetworkBulletinBoard { private final Jungle jungle; - private final PersistentJournal journal; - private final String LOG_DIR = "./log"; - - public NetworkJungleBulletinBoard(String _uuid) throws FileNotFoundException + + public NetworkJungleBulletinBoard(String _uuid) { - journal = new PersistentJournal(); - jungle = new NetworkDefaultJungle(journal, _uuid,new DefaultTreeEditor(new DefaultTraverser())); + jungle = new NetworkDefaultJungle(new AliceJournal(), _uuid,new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("boards"); BullentInBoardJungleManager.setJungle(jungle); } - public void init() throws IOException { - checkAndCreateLogDirectory(); - commitLogRecover(); - } - - public void checkAndCreateLogDirectory() { - File logFile = new File(LOG_DIR); - if(!logFile.exists()) { - logFile.mkdir(); - return; - } - if (logFile.isFile()) { - logFile.delete(); - logFile.mkdir(); - } - } - - public void commitLogRecover() throws IOException { - File[] logFiles = new File(LOG_DIR).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 void init() { + } public Iterable getBoards() @@ -281,4 +229,5 @@ return uuid; } } + } diff -r 495ac60d7f5f -r dacfa7eba841 src/main/java/app/bbs/PersistentJungleBulletinBoard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/app/bbs/PersistentJungleBulletinBoard.java Sat Jan 11 06:33:54 2014 +0900 @@ -0,0 +1,291 @@ +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 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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; +import alice.jungle.core.NetworkDefaultJungle; +import alice.jungle.persistent.PersistentJournal; +import alice.jungle.transaction.JungleUpdater; + +public class PersistentJungleBulletinBoard implements NetworkBulletinBoard +{ + private final Jungle jungle; + private final PersistentJournal journal; + private final String LOG_DIR = "./log"; + + public PersistentJungleBulletinBoard(String _uuid) throws FileNotFoundException + { + journal = new PersistentJournal(); + jungle = new NetworkDefaultJungle(journal, _uuid,new DefaultTreeEditor(new DefaultTraverser())); + BullentInBoardJungleManager.setJungle(jungle); + } + + public void init() { + checkAndCreateLogDirectory(); + try { + commitLogRecover(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void checkAndCreateLogDirectory() { + File logFile = new File(LOG_DIR); + if(!logFile.exists()) { + logFile.mkdir(); + return; + } + if (logFile.isFile()) { + logFile.delete(); + logFile.mkdir(); + } + } + + public void commitLogRecover() throws IOException { + File[] logFiles = new File(LOG_DIR).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() + { + JungleTree tree = jungle.getTreeByName("boards"); + Node node = tree.getRootNode(); + Children chs = node.getChildren(); + + IterableConverter.Converter converter = new IterableConverter.Converter(){ + public String conv(Node _b) { + ByteBuffer e = _b.getAttributes().get("name"); + return new String(e.array()); + } + }; + + return new IterableConverter(chs,converter); + } + + public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey) + { + if(null == jungle.createNewTree(_name)){ + throw new IllegalStateException(); + } + + JungleTree tree = jungle.getTreeByName("boards"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath root = new DefaultNodePath(); + Either either = editor.addNewChildAt(root,0); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + + either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes())); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + Either result = editor.success(); + if(result.isA()){ + throw new IllegalStateException(); + } + final long timestamp = new Date().getTime(); + + + tree = jungle.getTreeByName(_name); + editor = tree.getTreeEditor(); + either = editor.addNewChildAt(root,0); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + + NodeEditor e = new NodeEditor(){ + public > Either edit(T _e){ + _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); + _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b(); + _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); + ByteBuffer tBuffer = ByteBuffer.allocate(16); + _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); + return DefaultEither.newB(_e); + } + }; + + either = editor.edit(root.add(0),e); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + editor.success(); + } + + public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey) + { + JungleTree tree = jungle.getTreeByName(_board); + if(tree == null){ + throw new IllegalStateException(); + } + + Either either; + do{ + Node node = tree.getRootNode(); + int size = node.getChildren().size(); + DefaultNodePath path = new DefaultNodePath(); + + JungleTreeEditor editor = tree.getTreeEditor(); + either = editor.addNewChildAt(path,size); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + final long timestamp = new Date().getTime(); + NodeEditor e = new NodeEditor(){ + public > Either edit(T _e){ + _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); + _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); + _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); + ByteBuffer tBuffer = ByteBuffer.allocate(16); + _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); + return DefaultEither.newB(_e); + } + }; + path = path.add(size); + either = editor.edit(path,e); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + either = editor.success(); + + }while(either.isA()); + } + + public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey) + { + for(;;) { + DefaultNodePath path = new DefaultNodePath(); + path = path.add(Integer.parseInt(_uuid)); + + JungleTree tree = jungle.getTreeByName(_board); + JungleTreeEditor editor = tree.getTreeEditor(); + final long timestamp = new Date().getTime(); + NodeEditor e = new NodeEditor(){ + public > Either edit(T _e){ + _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); + _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); + _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); + ByteBuffer tBuffer = ByteBuffer.allocate(16); + _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); + return DefaultEither.newB(_e); + } + }; + + Either either = editor.edit(path,e); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + either = editor.success(); + if(!either.isA()) { + return; + } + } + + } + + public Iterable getMessages(String _boardName) + { + JungleTree tree = jungle.getTreeByName(_boardName); + Node node = tree.getRootNode(); + Children chs = node.getChildren(); + + final AtomicInteger counter = new AtomicInteger(0); + IterableConverter.Converter converter = new IterableConverter.Converter(){ + public BoardMessage conv(Node _b) { + String uuid = Integer.toString(counter.get()); + String author = new String(_b.getAttributes().get("author").array()); + String message = new String(_b.getAttributes().get("mes").array()); + counter.incrementAndGet(); + return new BoardMessageImpl(author,message,uuid); + } + }; + return new IterableConverter(chs,converter); + } + + + + private static class BoardMessageImpl implements BoardMessage + { + private final String author; + private final String message; + private final String uuid; + + public BoardMessageImpl(String _author,String _message,String _uuid) + { + author = _author; + message = _message; + uuid = _uuid; + } + + public String getAuthor() + { + return author; + } + + public String getMessage() + { + return message; + } + + public String getUUID() + { + return uuid; + } + } + + + +} diff -r 495ac60d7f5f -r dacfa7eba841 src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java --- a/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java Fri Dec 27 20:13:37 2013 +0900 +++ b/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java Sat Jan 11 06:33:54 2014 +0900 @@ -1,7 +1,6 @@ package app.bbs.codesegment; import java.io.FileNotFoundException; -import java.io.IOException; import java.util.regex.Pattern; import java.util.regex.Matcher; @@ -17,7 +16,9 @@ import app.bbs.CreateBoardMessageServlet; import app.bbs.CreateBoardServlet; import app.bbs.EditMessageServlet; +import app.bbs.NetworkBulletinBoard; import app.bbs.NetworkJungleBulletinBoard; +import app.bbs.PersistentJungleBulletinBoard; import app.bbs.ShowBoardMessageServlet; import app.bbs.ShowBoardsServlet; @@ -27,13 +28,17 @@ int bbsPort = 8080; Receiver host = ids.create(CommandType.PEEK); private Pattern pattern = Pattern.compile("^(node|cli)([0-9]+)$"); + private String[] args; + boolean persistentFlag = false; - public StartBBSCodeSegment(int p) { + public StartBBSCodeSegment(String[] _args, int p) { + args = _args; bbsPort = p; host.setKey("host"); } public StartBBSCodeSegment() { + args = null; host.setKey("host"); } @@ -42,17 +47,23 @@ Matcher matcher = pattern.matcher(name); matcher.find(); // String type = matcher.group(1); - - System.out.println("log loading..."); - NetworkJungleBulletinBoard cassaBBS = null; - try { + for(String arg: args) { + if(arg.equals("-persistent")){ + persistentFlag = true; + } + } + NetworkBulletinBoard cassaBBS = null; + if(persistentFlag) { + System.out.println("log loading..."); + try { + cassaBBS = new PersistentJungleBulletinBoard(name); + cassaBBS.init(); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + } else { cassaBBS = new NetworkJungleBulletinBoard(name); cassaBBS.init(); - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - System.exit(0);; - } catch (IOException e) { - e.printStackTrace(); } System.out.println("StartBBSCodeSegment");