Mercurial > hg > Database > jungle-network
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/app/bbs/thinks/NetworkMatrixBulletinBoard.java Sat Sep 27 16:23:21 2014 +0900 @@ -0,0 +1,343 @@ +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 "権限がありません(この申請の承認は上位申請者である必要があります"; + + + } + +}