Mercurial > hg > Database > jungle-network
comparison src/main/java/app/bbs/thinks/NetworkMatrixBulletinBoard.java @ 187:f9b26747ef63
add matrixBullet in board
author | tatsuki |
---|---|
date | Sat, 27 Sep 2014 16:23:21 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
186:ef5045af0753 | 187:f9b26747ef63 |
---|---|
1 package app.bbs.thinks; | |
2 | |
3 import java.io.File; | |
4 import java.io.IOException; | |
5 import java.nio.ByteBuffer; | |
6 import java.text.SimpleDateFormat; | |
7 import java.util.Date; | |
8 import java.util.Iterator; | |
9 import java.util.concurrent.atomic.AtomicInteger; | |
10 | |
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.bbs.BoardMessage; | |
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; | |
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; | |
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader; | |
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; | |
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; | |
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; | |
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; | |
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; | |
23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; | |
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 jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; | |
28 import alice.jungle.core.NetworkDefaultJungle; | |
29 import alice.jungle.persistent.AliceJournal; | |
30 import alice.jungle.persistent.NetworkJournal; | |
31 import alice.jungle.persistent.PersistentJournal; | |
32 import alice.jungle.transaction.JungleUpdater; | |
33 import app.bbs.BulletinBoardJungleManager; | |
34 import app.bbs.NetworkBulletinBoard; | |
35 import app.bbs.NetworkJungleBulletinBoard; | |
36 | |
37 public class NetworkMatrixBulletinBoard implements NetworkBulletinBoard { | |
38 | |
39 private final Jungle jungle; | |
40 private final NetworkJournal journal; | |
41 private final String LOG_DIR; | |
42 private Boolean persistentFlag; | |
43 private AtomicInteger requestCounter; | |
44 private long renewTime; | |
45 | |
46 private NetworkMatrixBulletinBoard(String _uuid, NetworkJournal _journal) { | |
47 journal = _journal; | |
48 jungle = new NetworkDefaultJungle(journal, _uuid, | |
49 new DefaultTreeEditor(new DefaultTraverser())); | |
50 BulletinBoardJungleManager.setJungle(jungle); | |
51 persistentFlag = false; | |
52 requestCounter = BulletinBoardJungleManager.getRequestCounter(); | |
53 LOG_DIR = "./log"; | |
54 renewTime = 0; | |
55 } | |
56 | |
57 public NetworkMatrixBulletinBoard(String _uuid) { | |
58 this(_uuid, new AliceJournal()); | |
59 jungle.createNewTree("boards"); | |
60 } | |
61 | |
62 public static NetworkBulletinBoard NewPersistentJungle(String _uuid) { | |
63 NetworkMatrixBulletinBoard board = new NetworkMatrixBulletinBoard( _uuid, new PersistentJournal()); | |
64 board.persistentFlag = true; | |
65 return board; | |
66 } | |
67 | |
68 @Override | |
69 public void init() { | |
70 if (!persistentFlag) { | |
71 return; | |
72 } | |
73 checkAndCreateLogDirectory(); | |
74 try { | |
75 commitLogRecover(); | |
76 } catch (IOException e) { | |
77 e.printStackTrace(); | |
78 } | |
79 } | |
80 | |
81 public void checkAndCreateLogDirectory() { | |
82 File logFile = new File(LOG_DIR); | |
83 if (!logFile.exists()) { | |
84 logFile.mkdir(); | |
85 return; | |
86 } | |
87 if (logFile.isFile()) { | |
88 logFile.delete(); | |
89 logFile.mkdir(); | |
90 } | |
91 } | |
92 | |
93 public void commitLogRecover() throws IOException { | |
94 File[] logFiles = new File(LOG_DIR).listFiles(); | |
95 for (File logFile : logFiles) { | |
96 commitLogRecover(logFile); | |
97 logFile.delete(); | |
98 } | |
99 if (jungle.getTreeByName("boards") == null) { | |
100 jungle.createNewTree("boards"); | |
101 } | |
102 } | |
103 | |
104 private void commitLogRecover(File logFile) throws IOException { | |
105 journal.setInputFile(logFile); | |
106 ChangeListReader reader = journal.getReader(); | |
107 if (reader == null) | |
108 return; | |
109 for (ChangeList chList : reader) { | |
110 String treeName = chList.getTreeName(); | |
111 JungleTree tree = jungle.getTreeByName(treeName); | |
112 if (tree == null) { | |
113 tree = jungle.createNewTree(treeName); | |
114 } | |
115 JungleTreeEditor editor = tree.getLocalTreeEditor(); | |
116 Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, | |
117 chList); | |
118 editor = either.b(); | |
119 if (either.isA()) { | |
120 throw new IOException("Failed commit log recovery"); | |
121 } | |
122 editor.success(); | |
123 } | |
124 } | |
125 | |
126 @Override | |
127 public Iterable<String> getBoards() { | |
128 JungleTree tree = jungle.getTreeByName("boards"); | |
129 TreeNode node = tree.getRootNode(); | |
130 Children chs = node.getChildren(); | |
131 | |
132 IterableConverter.Converter<String, TreeNode> converter = new IterableConverter.Converter<String, TreeNode>() { | |
133 public String conv(TreeNode _b) { | |
134 ByteBuffer e = _b.getAttributes().get("name"); | |
135 System.out.println(new String(e.array())); | |
136 return new String(e.array()); | |
137 } | |
138 }; | |
139 | |
140 return new IterableConverter<String, TreeNode>(chs, converter); | |
141 } | |
142 | |
143 @Override | |
144 public long getRenewTime(String _boardName) { | |
145 return renewTime; | |
146 } | |
147 | |
148 @Override | |
149 public void createBoards(String _name, String _author, String _initMessage, | |
150 String _editKey) { | |
151 // TODO Auto-generated method stub | |
152 | |
153 } | |
154 | |
155 @Override | |
156 public void createBoardMessage(String _board, String _author, | |
157 String _message, String _editKey) { | |
158 // TODO Auto-generated method stub | |
159 | |
160 } | |
161 | |
162 @Override | |
163 public void editMessage(String _board, String _uuid, String _author, | |
164 String _message, String _editKey) { | |
165 // TODO Auto-generated method stub | |
166 | |
167 } | |
168 | |
169 @Override | |
170 public String sanitize(String str) { | |
171 if (str == null) { | |
172 return str; | |
173 } | |
174 str = str.replaceAll("&", "&"); | |
175 str = str.replaceAll("<", "<"); | |
176 str = str.replaceAll(">", ">"); | |
177 str = str.replaceAll("\"", """); | |
178 str = str.replaceAll("'", "'"); | |
179 return str; | |
180 } | |
181 | |
182 @Override | |
183 public Iterable<BoardMessage> getMessages(String _boardName) { | |
184 // TODO Auto-generated method stub | |
185 return null; | |
186 } | |
187 | |
188 @Override | |
189 public int getRequestNum() { | |
190 return requestCounter.get(); | |
191 } | |
192 | |
193 @Override | |
194 public Iterable<BoardMessage> getFolder(String _boardName, String nodeNum) { | |
195 // TODO Auto-generated method stub | |
196 return null; | |
197 } | |
198 | |
199 @Override | |
200 public void createFolder(String boardName, String author, String msg, | |
201 String key, String _nodeNum) { | |
202 // TODO Auto-generated method stub | |
203 | |
204 } | |
205 | |
206 @Override | |
207 public void createAttribute(String boardName, String uuid, String author, | |
208 String msg, String key) { | |
209 // TODO Auto-generated method stub | |
210 | |
211 } | |
212 | |
213 @Override | |
214 public getAttributeImp getAttribute(String _bname, String nodeNum) { | |
215 // TODO Auto-generated method stub | |
216 return null; | |
217 } | |
218 | |
219 @Override | |
220 public void editAttribute(String boardName, String path, String id, | |
221 String message) { | |
222 // TODO Auto-generated method stub | |
223 | |
224 } | |
225 | |
226 @Override | |
227 public void deleteAttribute(String _board, String _path, String id) { | |
228 // TODO Auto-generated method stub | |
229 | |
230 } | |
231 | |
232 @Override | |
233 public void deleteNode(String _board, String _path, String id) { | |
234 // TODO Auto-generated method stub | |
235 | |
236 } | |
237 | |
238 @Override | |
239 public void editMatrixMessage(String boardName, String path, String author, | |
240 String msg, String key) { | |
241 // TODO Auto-generated method stub | |
242 | |
243 } | |
244 | |
245 | |
246 private static class BoardMessageImpl implements BoardMessage { | |
247 private final String author; | |
248 private final String message; | |
249 private final String uuid; | |
250 | |
251 public BoardMessageImpl(String _author, String _message, String _uuid) { | |
252 author = _author; | |
253 message = _message; | |
254 uuid = _uuid; | |
255 } | |
256 | |
257 public String getAuthor() { | |
258 return author; | |
259 } | |
260 | |
261 public String getMessage() { | |
262 return message; | |
263 } | |
264 | |
265 public String getUUID() { | |
266 return uuid; | |
267 } | |
268 | |
269 } | |
270 | |
271 public TreeNode search(JungleTree tree ,String searchAttribute,String key){ | |
272 InterfaceTraverser ifTraverser = tree.getTraverser(); | |
273 Iterator<Pair<TreeNode, NodePath>> searchNode = ifTraverser.find( | |
274 (TreeNode node) -> { | |
275 ByteBuffer attribute = node.getAttributes().get(key); | |
276 if(attribute != null){ | |
277 byte[] byteAttribute = attribute.array(); | |
278 String str = new String(byteAttribute); | |
279 System.out.println(str); | |
280 return str.equals(searchAttribute); | |
281 } | |
282 return false; | |
283 } | |
284 ); | |
285 | |
286 if (!searchNode.hasNext()) | |
287 return null; | |
288 return searchNode.next().left(); | |
289 | |
290 } | |
291 | |
292 public boolean compare(TreeNode compareNode, String compareAttribute) { | |
293 String labName = compareNode.getAttributes().getString("mes"); | |
294 if (labName.equals(compareAttribute)) | |
295 return true; | |
296 | |
297 int loopCount = 0; | |
298 for (loopCount = 0 ;compareNode.getAttributes().getString("mes" + loopCount) != null; loopCount++ ) { | |
299 labName = compareNode.getAttributes().getString("mes" + loopCount); | |
300 if (labName.equals(compareAttribute)) | |
301 return true; | |
302 } | |
303 | |
304 return false; | |
305 } | |
306 | |
307 @Override | |
308 public String searchJungle(String requestName , String approvalName) { | |
309 JungleTree tree = jungle.getTreeByName("人物"); | |
310 | |
311 | |
312 TreeNode searchNode = search(tree , requestName,"mes"); | |
313 if (searchNode == null) | |
314 return "申請者がデータに無い人物です"; | |
315 | |
316 if (!compare(searchNode, "河野研")) | |
317 return "河野研以外に所属している人は、この申請をすることが出来ません"; | |
318 | |
319 | |
320 searchNode = search(tree , approvalName,"mes"); | |
321 if (searchNode == null) | |
322 return "承認者がデータに無い人物です"; | |
323 | |
324 String position = searchNode.getAttributes().getString("mes1"); | |
325 | |
326 JungleTree grantTree = jungle.getTreeByName("役職"); | |
327 searchNode = search(grantTree , position,"mes"); | |
328 | |
329 if (!compare(searchNode, "准教授権限") && !compare(searchNode, "教授権限")) | |
330 return "権限がありません(この申請の承認は助教授か、教授である必要があります"; | |
331 | |
332 | |
333 searchNode = search(tree , approvalName,"mes"); | |
334 if (searchNode == null) | |
335 return "申請者がデータに無い人物です"; | |
336 | |
337 if (!compare(searchNode, "上位申請権限")) | |
338 return "権限がありません(この申請の承認は上位申請者である必要があります"; | |
339 | |
340 | |
341 } | |
342 | |
343 } |