Mercurial > hg > Members > nobuyasu > jungle-network
diff src/main/java/app/bbs/BullentInBoardJungleManager.java @ 123:495ac60d7f5f
Modified JungleUpdater
author | one |
---|---|
date | Fri, 27 Dec 2013 20:13:37 +0900 |
parents | src/main/java/app/bbs/JungleManager.java@895ab2907db3 |
children | 292538b1de32 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/app/bbs/BullentInBoardJungleManager.java Fri Dec 27 20:13:37 2013 +0900 @@ -0,0 +1,81 @@ +package app.bbs; + +import java.nio.ByteBuffer; + +import alice.jungle.operations.NetworkTreeOperationLog; +import alice.jungle.transaction.JungleUpdater; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; +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.core.Node; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class BullentInBoardJungleManager { + private static BullentInBoardJungleManager instance = new BullentInBoardJungleManager(); + private Jungle jungle; + + private BullentInBoardJungleManager() { + jungle = new DefaultJungle(null,"default",new DefaultTreeEditor(new DefaultTraverser())); + } + + public static BullentInBoardJungleManager getInstantce() { + return instance; + } + + public static void setJungle(Jungle _j) { + instance.jungle = _j; + } + + public static Jungle getJungle() { + return instance.jungle; + } + + public static JungleTree createNewTree(String name) { + return instance.jungle.createNewTree(name); + } + + public static Either<Error, JungleTreeEditor> update(NetworkTreeOperationLog netLog) { + String treeName = netLog.getTreeName(); + Jungle jungle = BullentInBoardJungleManager.getJungle(); + if (jungle.getTreeByName(treeName) == null) { + if(null == jungle.createNewTree(treeName)){ + throw new IllegalStateException(); + } + } + JungleTree tree = jungle.getTreeByName(treeName); + JungleTreeEditor editor = tree.getLocalTreeEditor(); + + int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp()); + Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, netLog, pos); + if(either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + either = editor.success(); + if(either.isA()) { + throw new IllegalStateException(); + } + return either; + } + + private static int calculatePosition(Node node, long newNodeTimeStamp) { + int count = 0; + long childTimeStamp = 0; + for(Node n : node.getChildren()) { + ByteBuffer timestamp = n.getAttributes().get("timestamp"); + if(timestamp == null) { + return count; + } + childTimeStamp = timestamp.getLong(); + if (newNodeTimeStamp < childTimeStamp) { + break; + } + count++; + } + return count; + } +}