Mercurial > hg > Database > jungle-network
view 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 |
line wrap: on
line source
package app.bbs.thinks; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.concurrent.atomic.AtomicInteger; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.BoardMessage; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; import alice.jungle.core.NetworkDefaultJungle; import alice.jungle.persistent.AliceJournal; import alice.jungle.persistent.NetworkJournal; import alice.jungle.persistent.PersistentJournal; import alice.jungle.transaction.JungleUpdater; import app.bbs.BulletinBoardJungleManager; import app.bbs.NetworkBulletinBoard; import app.bbs.NetworkJungleBulletinBoard; public class NetworkMatrixBulletinBoard implements NetworkBulletinBoard { private final Jungle jungle; private final NetworkJournal journal; private final String LOG_DIR; private Boolean persistentFlag; private AtomicInteger requestCounter; private long renewTime; private NetworkMatrixBulletinBoard(String _uuid, NetworkJournal _journal) { journal = _journal; jungle = new NetworkDefaultJungle(journal, _uuid, new DefaultTreeEditor(new DefaultTraverser())); BulletinBoardJungleManager.setJungle(jungle); persistentFlag = false; requestCounter = BulletinBoardJungleManager.getRequestCounter(); LOG_DIR = "./log"; renewTime = 0; } public NetworkMatrixBulletinBoard(String _uuid) { this(_uuid, new AliceJournal()); jungle.createNewTree("boards"); } public static NetworkBulletinBoard NewPersistentJungle(String _uuid) { NetworkMatrixBulletinBoard board = new NetworkMatrixBulletinBoard( _uuid, new PersistentJournal()); board.persistentFlag = true; return board; } @Override public void init() { if (!persistentFlag) { return; } checkAndCreateLogDirectory(); try { commitLogRecover(); } catch (IOException e) { e.printStackTrace(); } } public void checkAndCreateLogDirectory() { File logFile = new File(LOG_DIR); if (!logFile.exists()) { logFile.mkdir(); return; } if (logFile.isFile()) { logFile.delete(); logFile.mkdir(); } } public void commitLogRecover() throws IOException { File[] logFiles = new File(LOG_DIR).listFiles(); for (File logFile : logFiles) { commitLogRecover(logFile); logFile.delete(); } if (jungle.getTreeByName("boards") == null) { jungle.createNewTree("boards"); } } private void commitLogRecover(File logFile) throws IOException { journal.setInputFile(logFile); ChangeListReader reader = journal.getReader(); if (reader == null) return; for (ChangeList chList : reader) { String treeName = chList.getTreeName(); JungleTree tree = jungle.getTreeByName(treeName); if (tree == null) { tree = jungle.createNewTree(treeName); } JungleTreeEditor editor = tree.getLocalTreeEditor(); Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, chList); editor = either.b(); if (either.isA()) { throw new IOException("Failed commit log recovery"); } editor.success(); } } @Override public Iterable<String> getBoards() { JungleTree tree = jungle.getTreeByName("boards"); TreeNode node = tree.getRootNode(); Children chs = node.getChildren(); IterableConverter.Converter<String, TreeNode> converter = new IterableConverter.Converter<String, TreeNode>() { public String conv(TreeNode _b) { ByteBuffer e = _b.getAttributes().get("name"); System.out.println(new String(e.array())); return new String(e.array()); } }; return new IterableConverter<String, TreeNode>(chs, converter); } @Override public long getRenewTime(String _boardName) { return renewTime; } @Override public void createBoards(String _name, String _author, String _initMessage, String _editKey) { // TODO Auto-generated method stub } @Override public void createBoardMessage(String _board, String _author, String _message, String _editKey) { // TODO Auto-generated method stub } @Override public void editMessage(String _board, String _uuid, String _author, String _message, String _editKey) { // TODO Auto-generated method stub } @Override public String sanitize(String str) { if (str == null) { return str; } str = str.replaceAll("&", "&"); str = str.replaceAll("<", "<"); str = str.replaceAll(">", ">"); str = str.replaceAll("\"", """); str = str.replaceAll("'", "'"); return str; } @Override public Iterable<BoardMessage> getMessages(String _boardName) { // TODO Auto-generated method stub return null; } @Override public int getRequestNum() { return requestCounter.get(); } @Override public Iterable<BoardMessage> getFolder(String _boardName, String nodeNum) { // TODO Auto-generated method stub return null; } @Override public void createFolder(String boardName, String author, String msg, String key, String _nodeNum) { // TODO Auto-generated method stub } @Override public void createAttribute(String boardName, String uuid, String author, String msg, String key) { // TODO Auto-generated method stub } @Override public getAttributeImp getAttribute(String _bname, String nodeNum) { // TODO Auto-generated method stub return null; } @Override public void editAttribute(String boardName, String path, String id, String message) { // TODO Auto-generated method stub } @Override public void deleteAttribute(String _board, String _path, String id) { // TODO Auto-generated method stub } @Override public void deleteNode(String _board, String _path, String id) { // TODO Auto-generated method stub } @Override public void editMatrixMessage(String boardName, String path, String author, String msg, String key) { // TODO Auto-generated method stub } private static class BoardMessageImpl implements BoardMessage { private final String author; private final String message; private final String uuid; public BoardMessageImpl(String _author, String _message, String _uuid) { author = _author; message = _message; uuid = _uuid; } public String getAuthor() { return author; } public String getMessage() { return message; } public String getUUID() { return uuid; } } public TreeNode search(JungleTree tree ,String searchAttribute,String key){ InterfaceTraverser ifTraverser = tree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> searchNode = ifTraverser.find( (TreeNode node) -> { ByteBuffer attribute = node.getAttributes().get(key); if(attribute != null){ byte[] byteAttribute = attribute.array(); String str = new String(byteAttribute); System.out.println(str); return str.equals(searchAttribute); } return false; } ); if (!searchNode.hasNext()) return null; return searchNode.next().left(); } public boolean compare(TreeNode compareNode, String compareAttribute) { String labName = compareNode.getAttributes().getString("mes"); if (labName.equals(compareAttribute)) return true; int loopCount = 0; for (loopCount = 0 ;compareNode.getAttributes().getString("mes" + loopCount) != null; loopCount++ ) { labName = compareNode.getAttributes().getString("mes" + loopCount); if (labName.equals(compareAttribute)) return true; } return false; } @Override public String searchJungle(String requestName , String approvalName) { JungleTree tree = jungle.getTreeByName("人物"); TreeNode searchNode = search(tree , requestName,"mes"); if (searchNode == null) return "申請者がデータに無い人物です"; if (!compare(searchNode, "河野研")) return "河野研以外に所属している人は、この申請をすることが出来ません"; searchNode = search(tree , approvalName,"mes"); if (searchNode == null) return "承認者がデータに無い人物です"; String position = searchNode.getAttributes().getString("mes1"); JungleTree grantTree = jungle.getTreeByName("役職"); searchNode = search(grantTree , position,"mes"); if (!compare(searchNode, "准教授権限") && !compare(searchNode, "教授権限")) return "権限がありません(この申請の承認は助教授か、教授である必要があります"; searchNode = search(tree , approvalName,"mes"); if (searchNode == null) return "申請者がデータに無い人物です"; if (!compare(searchNode, "上位申請権限")) return "権限がありません(この申請の承認は上位申請者である必要があります"; } }