Mercurial > hg > Members > shoshi > jungle > bbs
diff src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java @ 1:64a72a7a0491
add local bbs
author | tatsuki |
---|---|
date | Mon, 27 Jun 2016 04:24:25 +0900 |
parents | |
children | 5acde010c6db |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java Mon Jun 27 04:24:25 2016 +0900 @@ -0,0 +1,219 @@ +package jp.ac.u_ryukyu.ie.cr.bbs.local; + + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; + +import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicInteger; + +public class JungleBulletinBoard implements + BulletinBoard { + private final Jungle jungle; + + public JungleBulletinBoard() { + jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor( + new DefaultTraverser())); + jungle.createNewTree("boards"); + } + + public Iterable<String> getBoards() { + JungleTree tree = jungle.getTreeByName("boards"); + TreeNode node = tree.getRootNode(); + Children chs = node.getChildren(); + + IterableConverter.Converter<String, TreeNode> converter = new IterableConverter.Converter<String, TreeNode>() { + public String conv(TreeNode _b) { + ByteBuffer e = _b.getAttributes().get("name"); + return new String(e.array()); + } + }; + + return new IterableConverter<String, TreeNode>(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<Error, JungleTreeEditor> 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<Error, JungleTreeEditor> result = editor.success(); + if (result.isA()) { + throw new IllegalStateException(); + } + + tree = jungle.getTreeByName(_name); + editor = tree.getTreeEditor(); + editor = editor.putAttribute(root,"author", ByteBuffer.wrap(_author.getBytes())).b(); + editor = editor.putAttribute(root,"key", ByteBuffer.wrap(_editKey.getBytes())).b(); + either = editor.putAttribute(root,"mes", ByteBuffer.wrap(_initMessage.getBytes())); + + 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(); + } + + JungleTreeEditor editor; + do { + TreeNode node = tree.getRootNode(); + int size = node.getChildren().size(); + DefaultNodePath path = new DefaultNodePath(); + + editor = tree.getTreeEditor(); + Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path, + size); + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + editor = editor.putAttribute(path.add(size),"author", ByteBuffer.wrap(_author.getBytes())).b(); + editor = editor.putAttribute(path.add(size),"key", ByteBuffer.wrap(_editKey.getBytes())).b(); + either = editor.putAttribute(path.add(size),"mes", ByteBuffer.wrap(_message.getBytes())); + + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + }while (editor.success().isA()); + } + + public void editMessage(String _board, String _uuid, final String _author, + final String _message, final String _editKey) { + JungleTreeEditor editor = null; + do { + DefaultNodePath path = new DefaultNodePath(); + path = path.add(Integer.parseInt(_uuid)); + + JungleTree tree = jungle.getTreeByName(_board); + editor = tree.getTreeEditor(); + + editor = editor.putAttribute(path,"author", ByteBuffer.wrap(_author.getBytes())).b(); + editor = editor.putAttribute(path,"key", ByteBuffer.wrap(_editKey.getBytes())).b(); + Either<Error, JungleTreeEditor> either = editor.putAttribute(path,"mes", ByteBuffer.wrap(_message.getBytes())); + + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + }while (editor.success().isA()); + } + + public Iterable<BoardMessage> getMessages(String _boardName) { + JungleTree tree = jungle.getTreeByName(_boardName); + TreeNode node = tree.getRootNode(); + Children chs = node.getChildren(); + + final AtomicInteger counter = new AtomicInteger(0); + IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() { + public BoardMessage conv(TreeNode _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<BoardMessage, TreeNode>(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; + } + } + + public String sanitize(String str) { + if (str == null) { + return str; + } + str = str.replaceAll("&", "&"); + str = str.replaceAll("<", "<"); + str = str.replaceAll(">", ">"); + str = str.replaceAll("\"", """); + str = str.replaceAll("'", "'"); + return str; + } + + public GetAttributeImp getAttribute(String _bname, String _nodeNum, String revisionStr) { + + DefaultNodePath path = new DefaultNodePath(); + try { + for (int count = 0; _nodeNum.substring(count, count + 1) != null; count++) { + if (!_nodeNum.substring(count, count + 1).equals("/")) + path = path.add(Integer.parseInt(_nodeNum.substring(count, count + 1))); + } + } catch (Exception _e) { + } + JungleTree tree = jungle.getTreeByName(_bname); + System.out.println(tree.revision()); + Long revision = Long.parseLong(revisionStr); + JungleTree oldTree = tree.getOldTree(revision).b(); + System.out.println(oldTree.revision()); + TreeNode node = oldTree.getRootNode(); + + DefaultTraverser traverser = new DefaultTraverser(); + DefaultEvaluator evaluator = new DefaultEvaluator(path); + Either<Error, Traversal> ret = traverser.traverse(node, evaluator); + if (ret.isA()) { + Assert.fail(); + } + + Traversal traversal = ret.b(); + TreeNode target = traversal.destination(); + return new GetAttributeImp(target); + } +}