Mercurial > hg > Members > nobuyasu > jungle-network
annotate src/main/java/app/bbs/NetworkJungleBulletinBoard.java @ 123:495ac60d7f5f
Modified JungleUpdater
author | one |
---|---|
date | Fri, 27 Dec 2013 20:13:37 +0900 |
parents | cef245f71053 |
children | dacfa7eba841 |
rev | line source |
---|---|
112 | 1 package app.bbs; |
38 | 2 |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
3 import java.io.File; |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
4 import java.io.FileNotFoundException; |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
5 import java.io.IOException; |
38 | 6 import java.nio.ByteBuffer; |
56 | 7 import java.util.Date; |
38 | 8 import java.util.concurrent.atomic.AtomicInteger; |
39 | 9 |
10 import alice.jungle.core.NetworkDefaultJungle; | |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
11 import alice.jungle.persistent.PersistentJournal; |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
12 import alice.jungle.transaction.JungleUpdater; |
38 | 13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; |
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; | |
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; | |
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; | |
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; | |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader; |
38 | 20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; |
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; | |
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; | |
23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; | |
24 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; | |
25 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; | |
26 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; | |
27 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; | |
28 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; | |
29 | |
39 | 30 public class NetworkJungleBulletinBoard implements BulletinBoard |
38 | 31 { |
32 private final Jungle jungle; | |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
33 private final PersistentJournal journal; |
122
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
34 private final String LOG_DIR = "./log"; |
38 | 35 |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
36 public NetworkJungleBulletinBoard(String _uuid) throws FileNotFoundException |
38 | 37 { |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
38 journal = new PersistentJournal(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
39 jungle = new NetworkDefaultJungle(journal, _uuid,new DefaultTreeEditor(new DefaultTraverser())); |
123 | 40 BullentInBoardJungleManager.setJungle(jungle); |
38 | 41 } |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
42 |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
43 public void init() throws IOException { |
122
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
44 checkAndCreateLogDirectory(); |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
45 commitLogRecover(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
46 } |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
47 |
122
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
48 public void checkAndCreateLogDirectory() { |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
49 File logFile = new File(LOG_DIR); |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
50 if(!logFile.exists()) { |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
51 logFile.mkdir(); |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
52 return; |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
53 } |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
54 if (logFile.isFile()) { |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
55 logFile.delete(); |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
56 logFile.mkdir(); |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
57 } |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
58 } |
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
59 |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
60 public void commitLogRecover() throws IOException { |
122
cef245f71053
Implemented NetworkJungleBulletinBoard.checkAndCreateLogDirectory method
one
parents:
118
diff
changeset
|
61 File[] logFiles = new File(LOG_DIR).listFiles(); |
118
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
62 for(File logFile : logFiles) { |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
63 commitLogRecover(logFile); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
64 logFile.delete(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
65 } |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
66 if(jungle.getTreeByName("boards") == null) { |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
67 jungle.createNewTree("boards"); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
68 } |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
69 } |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
70 |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
71 private void commitLogRecover(File logFile) throws IOException { |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
72 journal.setInputFile(logFile); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
73 ChangeListReader reader = journal.getReader(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
74 if (reader == null) return; |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
75 for (ChangeList chList : reader) { |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
76 String treeName = chList.getTreeName(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
77 JungleTree tree = jungle.getTreeByName(treeName); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
78 if(tree == null) { |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
79 tree = jungle.createNewTree(treeName); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
80 } |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
81 JungleTreeEditor editor = tree.getLocalTreeEditor(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
82 Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, chList); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
83 editor = either.b(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
84 if(either.isA()) { |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
85 throw new IOException("Failed commit log recovery"); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
86 } |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
87 editor.success(); |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
88 } |
f64ff5bd66f5
Implements persistent for bbs app and Fixed bug JungleUpdater
one
parents:
112
diff
changeset
|
89 } |
38 | 90 |
91 public Iterable<String> getBoards() | |
92 { | |
93 JungleTree tree = jungle.getTreeByName("boards"); | |
94 Node node = tree.getRootNode(); | |
95 Children<Node> chs = node.getChildren(); | |
96 | |
97 IterableConverter.Converter<String,Node> converter = new IterableConverter.Converter<String,Node>(){ | |
98 public String conv(Node _b) { | |
99 ByteBuffer e = _b.getAttributes().get("name"); | |
100 return new String(e.array()); | |
101 } | |
102 }; | |
103 | |
104 return new IterableConverter<String,Node>(chs,converter); | |
105 } | |
106 | |
107 public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey) | |
108 { | |
109 if(null == jungle.createNewTree(_name)){ | |
110 throw new IllegalStateException(); | |
111 } | |
112 | |
113 JungleTree tree = jungle.getTreeByName("boards"); | |
114 JungleTreeEditor editor = tree.getTreeEditor(); | |
115 DefaultNodePath root = new DefaultNodePath(); | |
116 Either<Error,JungleTreeEditor> either = editor.addNewChildAt(root,0); | |
117 if(either.isA()){ | |
118 throw new IllegalStateException(); | |
119 } | |
120 editor = either.b(); | |
121 | |
122 either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes())); | |
123 if(either.isA()){ | |
124 throw new IllegalStateException(); | |
125 } | |
126 editor = either.b(); | |
127 Either<Error,JungleTreeEditor> result = editor.success(); | |
128 if(result.isA()){ | |
129 throw new IllegalStateException(); | |
130 } | |
56 | 131 final long timestamp = new Date().getTime(); |
93 | 132 |
38 | 133 |
134 tree = jungle.getTreeByName(_name); | |
135 editor = tree.getTreeEditor(); | |
136 either = editor.addNewChildAt(root,0); | |
137 if(either.isA()){ | |
138 throw new IllegalStateException(); | |
139 } | |
140 editor = either.b(); | |
141 | |
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(_initMessage.getBytes())).b(); | |
146 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); | |
56 | 147 ByteBuffer tBuffer = ByteBuffer.allocate(16); |
148 _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); | |
38 | 149 return DefaultEither.newB(_e); |
150 } | |
151 }; | |
152 | |
153 either = editor.edit(root.add(0),e); | |
154 if(either.isA()){ | |
155 throw new IllegalStateException(); | |
156 } | |
157 editor = either.b(); | |
158 editor.success(); | |
159 } | |
160 | |
161 public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey) | |
162 { | |
163 JungleTree tree = jungle.getTreeByName(_board); | |
164 if(tree == null){ | |
165 throw new IllegalStateException(); | |
166 } | |
167 | |
46 | 168 Either<Error, JungleTreeEditor> either; |
38 | 169 do{ |
170 Node node = tree.getRootNode(); | |
171 int size = node.getChildren().size(); | |
172 DefaultNodePath path = new DefaultNodePath(); | |
173 | |
65 | 174 JungleTreeEditor editor = tree.getTreeEditor(); |
46 | 175 either = editor.addNewChildAt(path,size); |
38 | 176 if(either.isA()){ |
177 throw new IllegalStateException(); | |
178 } | |
179 editor = either.b(); | |
56 | 180 final long timestamp = new Date().getTime(); |
38 | 181 NodeEditor e = new NodeEditor(){ |
182 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){ | |
183 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); | |
184 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); | |
185 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); | |
56 | 186 ByteBuffer tBuffer = ByteBuffer.allocate(16); |
187 _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); | |
38 | 188 return DefaultEither.newB(_e); |
189 } | |
190 }; | |
191 path = path.add(size); | |
192 either = editor.edit(path,e); | |
193 if(either.isA()){ | |
194 throw new IllegalStateException(); | |
195 } | |
196 editor = either.b(); | |
46 | 197 either = editor.success(); |
93 | 198 |
46 | 199 }while(either.isA()); |
38 | 200 } |
201 | |
202 public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey) | |
203 { | |
65 | 204 for(;;) { |
38 | 205 DefaultNodePath path = new DefaultNodePath(); |
206 path = path.add(Integer.parseInt(_uuid)); | |
207 | |
208 JungleTree tree = jungle.getTreeByName(_board); | |
65 | 209 JungleTreeEditor editor = tree.getTreeEditor(); |
56 | 210 final long timestamp = new Date().getTime(); |
38 | 211 NodeEditor e = new NodeEditor(){ |
212 public <T extends EditableNode<T>> Either<Error, T> edit(T _e){ | |
213 _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); | |
214 _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); | |
215 _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); | |
56 | 216 ByteBuffer tBuffer = ByteBuffer.allocate(16); |
217 _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); | |
38 | 218 return DefaultEither.newB(_e); |
219 } | |
220 }; | |
221 | |
65 | 222 Either<Error, JungleTreeEditor> either = editor.edit(path,e); |
38 | 223 if(either.isA()){ |
224 throw new IllegalStateException(); | |
225 } | |
226 editor = either.b(); | |
46 | 227 either = editor.success(); |
65 | 228 if(!either.isA()) { |
229 return; | |
230 } | |
231 } | |
232 | |
38 | 233 } |
234 | |
235 public Iterable<BoardMessage> getMessages(String _boardName) | |
236 { | |
237 JungleTree tree = jungle.getTreeByName(_boardName); | |
238 Node node = tree.getRootNode(); | |
239 Children<Node> chs = node.getChildren(); | |
240 | |
241 final AtomicInteger counter = new AtomicInteger(0); | |
242 IterableConverter.Converter<BoardMessage,Node> converter = new IterableConverter.Converter<BoardMessage,Node>(){ | |
243 public BoardMessage conv(Node _b) { | |
244 String uuid = Integer.toString(counter.get()); | |
245 String author = new String(_b.getAttributes().get("author").array()); | |
246 String message = new String(_b.getAttributes().get("mes").array()); | |
247 counter.incrementAndGet(); | |
248 return new BoardMessageImpl(author,message,uuid); | |
249 } | |
250 }; | |
251 return new IterableConverter<BoardMessage,Node>(chs,converter); | |
252 } | |
253 | |
46 | 254 |
255 | |
38 | 256 private static class BoardMessageImpl implements BoardMessage |
257 { | |
258 private final String author; | |
259 private final String message; | |
260 private final String uuid; | |
261 | |
262 public BoardMessageImpl(String _author,String _message,String _uuid) | |
263 { | |
264 author = _author; | |
265 message = _message; | |
266 uuid = _uuid; | |
267 } | |
268 | |
269 public String getAuthor() | |
270 { | |
271 return author; | |
272 } | |
273 | |
274 public String getMessage() | |
275 { | |
276 return message; | |
277 } | |
278 | |
279 public String getUUID() | |
280 { | |
281 return uuid; | |
282 } | |
283 } | |
284 } |