187
|
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 }
|