Mercurial > hg > Members > nobuyasu > jungle-network
comparison 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 |
comparison
equal
deleted
inserted
replaced
122:cef245f71053 | 123:495ac60d7f5f |
---|---|
1 package app.bbs; | |
2 | |
3 import java.nio.ByteBuffer; | |
4 | |
5 import alice.jungle.operations.NetworkTreeOperationLog; | |
6 import alice.jungle.transaction.JungleUpdater; | |
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; | |
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; | |
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; | |
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; | |
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; | |
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; | |
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; | |
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; | |
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; | |
16 | |
17 public class BullentInBoardJungleManager { | |
18 private static BullentInBoardJungleManager instance = new BullentInBoardJungleManager(); | |
19 private Jungle jungle; | |
20 | |
21 private BullentInBoardJungleManager() { | |
22 jungle = new DefaultJungle(null,"default",new DefaultTreeEditor(new DefaultTraverser())); | |
23 } | |
24 | |
25 public static BullentInBoardJungleManager getInstantce() { | |
26 return instance; | |
27 } | |
28 | |
29 public static void setJungle(Jungle _j) { | |
30 instance.jungle = _j; | |
31 } | |
32 | |
33 public static Jungle getJungle() { | |
34 return instance.jungle; | |
35 } | |
36 | |
37 public static JungleTree createNewTree(String name) { | |
38 return instance.jungle.createNewTree(name); | |
39 } | |
40 | |
41 public static Either<Error, JungleTreeEditor> update(NetworkTreeOperationLog netLog) { | |
42 String treeName = netLog.getTreeName(); | |
43 Jungle jungle = BullentInBoardJungleManager.getJungle(); | |
44 if (jungle.getTreeByName(treeName) == null) { | |
45 if(null == jungle.createNewTree(treeName)){ | |
46 throw new IllegalStateException(); | |
47 } | |
48 } | |
49 JungleTree tree = jungle.getTreeByName(treeName); | |
50 JungleTreeEditor editor = tree.getLocalTreeEditor(); | |
51 | |
52 int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp()); | |
53 Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, netLog, pos); | |
54 if(either.isA()) { | |
55 throw new IllegalStateException(); | |
56 } | |
57 editor = either.b(); | |
58 either = editor.success(); | |
59 if(either.isA()) { | |
60 throw new IllegalStateException(); | |
61 } | |
62 return either; | |
63 } | |
64 | |
65 private static int calculatePosition(Node node, long newNodeTimeStamp) { | |
66 int count = 0; | |
67 long childTimeStamp = 0; | |
68 for(Node n : node.getChildren()) { | |
69 ByteBuffer timestamp = n.getAttributes().get("timestamp"); | |
70 if(timestamp == null) { | |
71 return count; | |
72 } | |
73 childTimeStamp = timestamp.getLong(); | |
74 if (newNodeTimeStamp < childTimeStamp) { | |
75 break; | |
76 } | |
77 count++; | |
78 } | |
79 return count; | |
80 } | |
81 } |