Mercurial > hg > Members > shoshi > jungle > bbs
view src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java @ 4:5acde010c6db
add jungle browsing system
author | tatsuki |
---|---|
date | Tue, 28 Jun 2016 19:45:55 +0900 |
parents | 64a72a7a0491 |
children | 6e91ad317eb0 |
line wrap: on
line source
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.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; 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 nodePath,String revisionStr) { Long revision = Long.parseLong(revisionStr); DefaultNodePath path = createNodePath(nodePath); JungleTree tree = jungle.getTreeByName(_bname); JungleTree oldTree = tree.getOldTree(revision).b(); Either<Error, TreeNode> either = tree.getNodeOfPath(path); if (either.isA()) return new GetAttributeImp(new DefaultTreeNode()); TreeNode node = either.b(); return new GetAttributeImp(node); } private DefaultNodePath createNodePath(String nodePath) { DefaultNodePath path = new DefaultNodePath(); try { for (int count = 0; nodePath.substring(count, count + 1) != null; count++) { if (!nodePath.substring(count, count + 1).equals("/")) path = path.add(Integer.parseInt(nodePath.substring(count, count + 1))); } } catch (Exception _e) { } return path; } }