comparison src/main/java/app/bbs/NetworkJungleBulletinBoard.java @ 112:8f9811a1e00c

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