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("&", "&amp;");
175 str = str.replaceAll("<", "&lt;");
176 str = str.replaceAll(">", "&gt;");
177 str = str.replaceAll("\"", "&quot;");
178 str = str.replaceAll("'", "&#39;");
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 }