comparison src/jungle/test/bbs/JungleBulletinBoard.java @ 38:d8ee57a1c2c6

add pom.xml and bbs
author one
date Mon, 08 Jul 2013 20:25:58 +0900
parents
children
comparison
equal deleted inserted replaced
37:ed4c2e6ab5d1 38:d8ee57a1c2c6
1 package jungle.test.bbs;
2
3 import java.nio.ByteBuffer;
4 import java.util.concurrent.atomic.AtomicInteger;
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
20
21 public class JungleBulletinBoard implements BulletinBoard
22 {
23 private final Jungle jungle;
24
25 public JungleBulletinBoard()
26 {
27 jungle = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()));
28 jungle.createNewTree("boards");
29 }
30
31 public Iterable<String> getBoards()
32 {
33 JungleTree tree = jungle.getTreeByName("boards");
34 Node node = tree.getRootNode();
35 Children<Node> chs = node.getChildren();
36
37 IterableConverter.Converter<String,Node> converter = new IterableConverter.Converter<String,Node>(){
38 public String conv(Node _b) {
39 ByteBuffer e = _b.getAttributes().get("name");
40 return new String(e.array());
41 }
42 };
43
44 return new IterableConverter<String,Node>(chs,converter);
45 }
46
47 public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey)
48 {
49 if(null == jungle.createNewTree(_name)){
50 throw new IllegalStateException();
51 }
52
53 JungleTree tree = jungle.getTreeByName("boards");
54 JungleTreeEditor editor = tree.getTreeEditor();
55 DefaultNodePath root = new DefaultNodePath();
56 Either<Error,JungleTreeEditor> either = editor.addNewChildAt(root,0);
57 if(either.isA()){
58 throw new IllegalStateException();
59 }
60 editor = either.b();
61
62 either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes()));
63 if(either.isA()){
64 throw new IllegalStateException();
65 }
66 editor = either.b();
67 Either<Error,JungleTreeEditor> result = editor.success();
68 if(result.isA()){
69 throw new IllegalStateException();
70 }
71
72 tree = jungle.getTreeByName(_name);
73 editor = tree.getTreeEditor();
74 either = editor.addNewChildAt(root,0);
75 if(either.isA()){
76 throw new IllegalStateException();
77 }
78 editor = either.b();
79
80 NodeEditor e = new NodeEditor(){
81 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
82 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
83 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b();
84 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
85 return DefaultEither.newB(_e);
86 }
87 };
88
89 either = editor.edit(root.add(0),e);
90 if(either.isA()){
91 throw new IllegalStateException();
92 }
93 editor = either.b();
94 editor.success();
95 }
96
97 public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey)
98 {
99 JungleTree tree = jungle.getTreeByName(_board);
100 if(tree == null){
101 throw new IllegalStateException();
102 }
103
104 JungleTreeEditor editor;
105 do{
106 Node node = tree.getRootNode();
107 int size = node.getChildren().size();
108 DefaultNodePath path = new DefaultNodePath();
109
110 editor = tree.getTreeEditor();
111 Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path,size);
112 if(either.isA()){
113 throw new IllegalStateException();
114 }
115 editor = either.b();
116
117 NodeEditor e = new NodeEditor(){
118 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
119 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
120 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
121 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
122 return DefaultEither.newB(_e);
123 }
124 };
125
126 path = path.add(size);
127 either = editor.edit(path,e);
128 if(either.isA()){
129 throw new IllegalStateException();
130 }
131 editor = either.b();
132 }while(editor.success().isA());
133 }
134
135 public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey)
136 {
137 JungleTreeEditor editor = null;
138 do{
139 DefaultNodePath path = new DefaultNodePath();
140 path = path.add(Integer.parseInt(_uuid));
141
142 JungleTree tree = jungle.getTreeByName(_board);
143 editor = tree.getTreeEditor();
144 NodeEditor e = new NodeEditor(){
145 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){
146 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b();
147 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b();
148 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b();
149 return DefaultEither.newB(_e);
150 }
151 };
152
153 Either<Error,JungleTreeEditor> either = editor.edit(path,e);
154 if(either.isA()){
155 throw new IllegalStateException();
156 }
157 editor = either.b();
158 }while(editor.success().isA());
159 }
160
161 public Iterable<BoardMessage> getMessages(String _boardName)
162 {
163 JungleTree tree = jungle.getTreeByName(_boardName);
164 Node node = tree.getRootNode();
165 Children<Node> chs = node.getChildren();
166
167 final AtomicInteger counter = new AtomicInteger(0);
168 IterableConverter.Converter<BoardMessage,Node> converter = new IterableConverter.Converter<BoardMessage,Node>(){
169 public BoardMessage conv(Node _b) {
170 String uuid = Integer.toString(counter.get());
171 String author = new String(_b.getAttributes().get("author").array());
172 String message = new String(_b.getAttributes().get("mes").array());
173 counter.incrementAndGet();
174 return new BoardMessageImpl(author,message,uuid);
175 }
176 };
177
178 return new IterableConverter<BoardMessage,Node>(chs,converter);
179 }
180
181 private static class BoardMessageImpl implements BoardMessage
182 {
183 private final String author;
184 private final String message;
185 private final String uuid;
186
187 public BoardMessageImpl(String _author,String _message,String _uuid)
188 {
189 author = _author;
190 message = _message;
191 uuid = _uuid;
192 }
193
194 public String getAuthor()
195 {
196 return author;
197 }
198
199 public String getMessage()
200 {
201 return message;
202 }
203
204 public String getUUID()
205 {
206 return uuid;
207 }
208 }
209 }