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("&", "&amp;");
+        str = str.replaceAll("<", "&lt;");
+        str = str.replaceAll(">", "&gt;");
+        str = str.replaceAll("\"", "&quot;");
+        str = str.replaceAll("'", "&#39;");
+        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;
+    }
+}