Mercurial > hg > Members > tatsuki > bbs
diff src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/browsing/JungleBrowsingBulletinBoard.java @ 4:5acde010c6db
add jungle browsing system
author | tatsuki |
---|---|
date | Tue, 28 Jun 2016 19:45:55 +0900 |
parents | |
children | 2b3542c5be34 |
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/browsing/JungleBrowsingBulletinBoard.java Tue Jun 28 19:45:55 2016 +0900 @@ -0,0 +1,197 @@ +package jp.ac.u_ryukyu.ie.cr.bbs.browsing; + + +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.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NulIterator; +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.store.impl.TreeNodeChildren; +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.Iterator; + +public class JungleBrowsingBulletinBoard implements + BrowsingBulletinBoard { + private final Jungle jungle; + + public JungleBrowsingBulletinBoard() { + 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) { + 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(); + either = editor.putAttribute(root, "NodeName", ByteBuffer.wrap("root".getBytes())); + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + editor.success(); + } + + public void createBoardMessage(final String boardName, final String key, + final String attribute, final String pathStr) { + if (key.equals("") | attribute.equals("")) + return ; + NodePath path = createNodePath(pathStr); + JungleTree tree = jungle.getTreeByName(boardName); + if (tree == null) { + throw new IllegalStateException(); + } + + JungleTreeEditor editor; + do { + editor = tree.getTreeEditor(); + Either<Error, JungleTreeEditor> either = editor.putAttribute(path, key, ByteBuffer.wrap(attribute.getBytes())); + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + } while (editor.success().isA()); + } + + @Override + public void createChild(String bname, String nodeName, String pathStr) { + NodePath path = createNodePath(pathStr); + JungleTree tree = jungle.getTreeByName(bname); + if (tree == null) { + throw new IllegalStateException(); + } + Either<Error,TreeNode> getNodeEither = tree.getNodeOfPath(path); + if (getNodeEither.isA()) + return ; + TreeNode currentNode = getNodeEither.b(); + int childCount = currentNode.getChildren().size(); + + JungleTreeEditor editor; + do { + editor = tree.getTreeEditor(); + Either<Error,JungleTreeEditor> either = editor.addNewChildAt(path, childCount); + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + + either = editor.putAttribute(path.add(childCount),"NodeName",ByteBuffer.wrap(nodeName.getBytes())); + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + + } while (editor.success().isA()); + } + + public void editMessage(String bname, String key, final String attribute, + final String pathStr) { + NodePath path = createNodePath(pathStr); + + JungleTreeEditor editor = null; + + do { + JungleTree tree = jungle.getTreeByName(bname); + editor = tree.getTreeEditor(); + + Either<Error, JungleTreeEditor> either = editor.putAttribute(path, key, ByteBuffer.wrap(attribute.getBytes())); + + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + } while (editor.success().isA()); + } + + 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) { + + DefaultNodePath path = createNodePath(nodePath); + JungleTree tree = jungle.getTreeByName(_bname); + Either<Error, TreeNode> either = tree.getNodeOfPath(path); + if (either.isA()) + return new GetAttributeImp(new DefaultTreeNode()); + TreeNode currentNode = either.b(); + return new GetAttributeImp(currentNode); + } + + @Override + public Iterator<TreeNode> getChildren(String bname, String nodePath) { + DefaultNodePath path = createNodePath(nodePath); + JungleTree tree = jungle.getTreeByName(bname); + Either<Error, TreeNode> either = tree.getNodeOfPath(path); + if (either.isA()) + return new NulIterator<TreeNode>(); + TreeNode currentNode = either.b(); + TreeNodeChildren children = currentNode.getChildren(); + return children.iterator(); + } + + private DefaultNodePath createNodePath(String nodePath) { + DefaultNodePath path = new DefaultNodePath(); + String[] nums = nodePath.split(","); + for (String num : nums) { + if (num.equals("-1")) + continue; + path = path.add(Integer.parseInt(num)); + } + return path; + } +}