Mercurial > hg > Members > nobuyasu > jungle-network
comparison src/jungle/app/bbs/NetworkJungleBulletinBoard.java @ 66:29127ac788a6
move some files
author | one |
---|---|
date | Tue, 20 Aug 2013 17:38:09 +0900 |
parents | src/jungle/test/bbs/NetworkJungleBulletinBoard.java@ebf42371454b |
children | 87ec5dd0dc27 |
comparison
equal
deleted
inserted
replaced
65:ebf42371454b | 66:29127ac788a6 |
---|---|
1 package jungle.app.bbs; | |
2 | |
3 import java.io.IOException; | |
4 import java.nio.ByteBuffer; | |
5 import java.util.Date; | |
6 import java.util.concurrent.atomic.AtomicInteger; | |
7 | |
8 import alice.jungle.core.NetworkDefaultJungle; | |
9 import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer; | |
10 import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; | |
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; | |
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; | |
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; | |
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; | |
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; | |
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; | |
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; | |
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; | |
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; | |
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; | |
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; | |
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; | |
23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; | |
24 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; | |
25 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; | |
26 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; | |
27 import jungle.app.bbs.codesegment.HashLogUpdateCodeSegment; | |
28 | |
29 public class NetworkJungleBulletinBoard implements BulletinBoard | |
30 { | |
31 private final Jungle jungle; | |
32 | |
33 public NetworkJungleBulletinBoard(String _serverName) | |
34 { | |
35 jungle = new NetworkDefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()), _serverName); | |
36 jungle.createNewTree("boards"); | |
37 JungleManager.setJungle(jungle); | |
38 } | |
39 | |
40 public Iterable<String> getBoards() | |
41 { | |
42 JungleTree tree = jungle.getTreeByName("boards"); | |
43 Node node = tree.getRootNode(); | |
44 Children<Node> chs = node.getChildren(); | |
45 | |
46 IterableConverter.Converter<String,Node> converter = new IterableConverter.Converter<String,Node>(){ | |
47 public String conv(Node _b) { | |
48 ByteBuffer e = _b.getAttributes().get("name"); | |
49 return new String(e.array()); | |
50 } | |
51 }; | |
52 | |
53 return new IterableConverter<String,Node>(chs,converter); | |
54 } | |
55 | |
56 public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey) | |
57 { | |
58 if(null == jungle.createNewTree(_name)){ | |
59 throw new IllegalStateException(); | |
60 } | |
61 | |
62 JungleTree tree = jungle.getTreeByName("boards"); | |
63 JungleTreeEditor editor = tree.getTreeEditor(); | |
64 DefaultNodePath root = new DefaultNodePath(); | |
65 Either<Error,JungleTreeEditor> either = editor.addNewChildAt(root,0); | |
66 if(either.isA()){ | |
67 throw new IllegalStateException(); | |
68 } | |
69 editor = either.b(); | |
70 | |
71 either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes())); | |
72 if(either.isA()){ | |
73 throw new IllegalStateException(); | |
74 } | |
75 editor = either.b(); | |
76 Either<Error,JungleTreeEditor> result = editor.success(); | |
77 if(result.isA()){ | |
78 throw new IllegalStateException(); | |
79 } | |
80 final long timestamp = new Date().getTime(); | |
81 /* Put DataSegment */ | |
82 try { | |
83 putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, 0, timestamp); | |
84 } catch (IOException e1) { | |
85 e1.printStackTrace(); | |
86 } | |
87 | |
88 tree = jungle.getTreeByName(_name); | |
89 editor = tree.getTreeEditor(); | |
90 either = editor.addNewChildAt(root,0); | |
91 if(either.isA()){ | |
92 throw new IllegalStateException(); | |
93 } | |
94 editor = either.b(); | |
95 | |
96 NodeEditor e = new NodeEditor(){ | |
97 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){ | |
98 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); | |
99 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b(); | |
100 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); | |
101 ByteBuffer tBuffer = ByteBuffer.allocate(16); | |
102 _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); | |
103 return DefaultEither.newB(_e); | |
104 } | |
105 }; | |
106 | |
107 either = editor.edit(root.add(0),e); | |
108 if(either.isA()){ | |
109 throw new IllegalStateException(); | |
110 } | |
111 editor = either.b(); | |
112 editor.success(); | |
113 /* Put DataSegment */ | |
114 try { | |
115 putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, 0, timestamp); | |
116 } catch (IOException e1) { | |
117 e1.printStackTrace(); | |
118 } | |
119 | |
120 } | |
121 | |
122 public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey) | |
123 { | |
124 JungleTree tree = jungle.getTreeByName(_board); | |
125 if(tree == null){ | |
126 throw new IllegalStateException(); | |
127 } | |
128 | |
129 Either<Error, JungleTreeEditor> either; | |
130 do{ | |
131 Node node = tree.getRootNode(); | |
132 int size = node.getChildren().size(); | |
133 DefaultNodePath path = new DefaultNodePath(); | |
134 | |
135 JungleTreeEditor editor = tree.getTreeEditor(); | |
136 either = editor.addNewChildAt(path,size); | |
137 if(either.isA()){ | |
138 throw new IllegalStateException(); | |
139 } | |
140 editor = either.b(); | |
141 final long timestamp = new Date().getTime(); | |
142 NodeEditor e = new NodeEditor(){ | |
143 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){ | |
144 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); | |
145 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); | |
146 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); | |
147 ByteBuffer tBuffer = ByteBuffer.allocate(16); | |
148 _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); | |
149 return DefaultEither.newB(_e); | |
150 } | |
151 }; | |
152 path = path.add(size); | |
153 either = editor.edit(path,e); | |
154 if(either.isA()){ | |
155 throw new IllegalStateException(); | |
156 } | |
157 editor = either.b(); | |
158 either = editor.success(); | |
159 try { | |
160 NetworkDefaultJungleTreeEditor<DefaultTreeNode> netEditor = (NetworkDefaultJungleTreeEditor<DefaultTreeNode>) editor; | |
161 putTreeOperationLog(netEditor, size, timestamp); | |
162 } catch (IOException e1) { | |
163 e1.printStackTrace(); | |
164 } | |
165 }while(either.isA()); | |
166 /* Put DataSegment */ | |
167 } | |
168 | |
169 public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey) | |
170 { | |
171 for(;;) { | |
172 DefaultNodePath path = new DefaultNodePath(); | |
173 path = path.add(Integer.parseInt(_uuid)); | |
174 | |
175 JungleTree tree = jungle.getTreeByName(_board); | |
176 JungleTreeEditor editor = tree.getTreeEditor(); | |
177 final long timestamp = new Date().getTime(); | |
178 NodeEditor e = new NodeEditor(){ | |
179 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){ | |
180 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); | |
181 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); | |
182 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); | |
183 ByteBuffer tBuffer = ByteBuffer.allocate(16); | |
184 _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); | |
185 return DefaultEither.newB(_e); | |
186 } | |
187 }; | |
188 | |
189 Either<Error, JungleTreeEditor> either = editor.edit(path,e); | |
190 if(either.isA()){ | |
191 throw new IllegalStateException(); | |
192 } | |
193 editor = either.b(); | |
194 either = editor.success(); | |
195 try { | |
196 putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, Integer.parseInt(_uuid), timestamp); | |
197 } catch (IOException e1) { | |
198 e1.printStackTrace(); | |
199 } | |
200 if(!either.isA()) { | |
201 return; | |
202 } | |
203 } | |
204 | |
205 } | |
206 | |
207 public Iterable<BoardMessage> getMessages(String _boardName) | |
208 { | |
209 JungleTree tree = jungle.getTreeByName(_boardName); | |
210 Node node = tree.getRootNode(); | |
211 Children<Node> chs = node.getChildren(); | |
212 | |
213 final AtomicInteger counter = new AtomicInteger(0); | |
214 IterableConverter.Converter<BoardMessage,Node> converter = new IterableConverter.Converter<BoardMessage,Node>(){ | |
215 public BoardMessage conv(Node _b) { | |
216 String uuid = Integer.toString(counter.get()); | |
217 String author = new String(_b.getAttributes().get("author").array()); | |
218 String message = new String(_b.getAttributes().get("mes").array()); | |
219 counter.incrementAndGet(); | |
220 return new BoardMessageImpl(author,message,uuid); | |
221 } | |
222 }; | |
223 | |
224 return new IterableConverter<BoardMessage,Node>(chs,converter); | |
225 } | |
226 | |
227 private void putTreeOperationLog(NetworkDefaultJungleTreeEditor<DefaultTreeNode> editor, int pos, long timestamp) throws IOException { | |
228 String uuid = editor.getID(); | |
229 String treeName = editor.getTreeName(); | |
230 String updaterName = editor.getUpdaterName(); | |
231 String revision = editor.getRevision(); | |
232 Iterable<TreeOperation> log = editor.getTreeOperationLog(); | |
233 putDataSegment(uuid, treeName, updaterName, log, revision, pos,timestamp); | |
234 } | |
235 | |
236 private void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable<TreeOperation> _log, String nextRevision, int pos, long timestamp) throws IOException { | |
237 DefaultTreeOperationLogContainer container = new DefaultTreeOperationLogContainer(); | |
238 container.setTreeName(_treeName); | |
239 container.setUUID(_uuid); | |
240 container.setUpdaterName(_updaterName); | |
241 container.setRevision(nextRevision); | |
242 container.setPosition(pos); | |
243 container.unconvert(_log); | |
244 container.setTimeStamp(timestamp); | |
245 HashLogUpdateCodeSegment cs = new HashLogUpdateCodeSegment(); | |
246 cs.ods.put("log", container); | |
247 cs.ods.put("logString", container.getHashLogString()); | |
248 /* If this node is not Root node, push log to parent node's DS */ | |
249 if(!_updaterName.equals("node0")) { | |
250 cs.ods.put("parent", "childLog", container); | |
251 } | |
252 } | |
253 | |
254 | |
255 private static class BoardMessageImpl implements BoardMessage | |
256 { | |
257 private final String author; | |
258 private final String message; | |
259 private final String uuid; | |
260 | |
261 public BoardMessageImpl(String _author,String _message,String _uuid) | |
262 { | |
263 author = _author; | |
264 message = _message; | |
265 uuid = _uuid; | |
266 } | |
267 | |
268 public String getAuthor() | |
269 { | |
270 return author; | |
271 } | |
272 | |
273 public String getMessage() | |
274 { | |
275 return message; | |
276 } | |
277 | |
278 public String getUUID() | |
279 { | |
280 return uuid; | |
281 } | |
282 } | |
283 } |