34
|
1 package alice.jungle.codesegment;
|
|
2
|
40
|
3 import java.io.IOException;
|
56
|
4 import java.util.Iterator;
|
40
|
5
|
|
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
|
|
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
|
56
|
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
|
40
|
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog;
|
56
|
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
|
|
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
|
40
|
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
|
|
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
|
|
14 import jungle.test.bbs.JungleManager;
|
34
|
15 import alice.codesegment.CodeSegment;
|
|
16 import alice.datasegment.CommandType;
|
|
17 import alice.datasegment.Receiver;
|
52
|
18 import alice.jungle.datasegment.HashSetDataSegment;
|
40
|
19 import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer;
|
46
|
20 import alice.jungle.transaction.NetworkDefaultJungleTreeEditor;
|
34
|
21
|
|
22 public class LogUpdateCodeSegment extends CodeSegment {
|
|
23
|
52
|
24 Receiver parentLog = ids.create(CommandType.PEEK);
|
|
25 Receiver host = ids.create(CommandType.PEEK);
|
|
26 Receiver hashLog = ids.create(CommandType.PEEK);
|
39
|
27
|
47
|
28 public LogUpdateCodeSegment() {
|
52
|
29 parentLog.setKey("parent", "log");
|
50
|
30 host.setKey("host");
|
52
|
31 hashLog.setKey("hashLog");
|
39
|
32 }
|
|
33
|
50
|
34 public LogUpdateCodeSegment(int index) {
|
52
|
35 parentLog.setKey("parent", "log", index);
|
50
|
36 host.setKey("host");
|
52
|
37 hashLog.setKey("hashLog");
|
49
|
38 }
|
|
39
|
34
|
40 public void run() {
|
51
|
41 System.out.println("--LogUpdateCodeSegment--");
|
52
|
42 int index = parentLog.index;
|
47
|
43 String h = host.asString();
|
52
|
44 DefaultTreeOperationLogContainer container = parentLog.asClass(DefaultTreeOperationLogContainer.class);
|
|
45 HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class);
|
|
46 if(ds.hash.contains(container.getHashLogString())) {
|
|
47 ods.update("hashLog", ds);
|
51
|
48 new LogUpdateCodeSegment(index);
|
42
|
49 return;
|
|
50 }
|
40
|
51 DefaultTreeOperationLog log = null;
|
|
52 try {
|
|
53 log = container.convert();
|
|
54 } catch (IOException e) {
|
|
55 e.printStackTrace();
|
|
56 }
|
51
|
57 String treeName = container.getTreeName();
|
|
58 if (JungleManager.getJungle().getTreeByName(treeName) == null) {
|
|
59 if(null == JungleManager.getJungle().createNewTree(treeName)){
|
|
60 throw new IllegalStateException();
|
|
61 }
|
|
62 }
|
|
63 JungleTree tree = JungleManager.getJungle().getTreeByName(treeName);
|
40
|
64 JungleTreeEditor editor = tree.getTreeEditor();
|
43
|
65 Either<Error, JungleTreeEditor> either = JungleManager.edit(editor, log);
|
40
|
66 if(either.isA()) {
|
|
67 throw new IllegalStateException();
|
|
68 }
|
|
69 editor = either.b();
|
46
|
70 either = editor.success();
|
|
71 if(either.isA()) {
|
|
72 throw new IllegalStateException();
|
|
73 }
|
52
|
74 ds.hash.add(container.getHashLogString());
|
|
75 ods.update("hashLog", ds);
|
|
76 System.out.println("ods.put log container");
|
49
|
77 ods.put("log", container);
|
51
|
78 new LogUpdateCodeSegment(index);
|
34
|
79 }
|
56
|
80
|
42
|
81
|
56
|
82 private DefaultEither<DefaultError, Integer> checkTimeStamp(Node node, long newNodeTimeStamp) {
|
|
83 int count = 0;
|
|
84 long childTimeStamp = 0;
|
|
85 for(Iterator<Node> iter = node.getChildren().iterator();iter.hasNext();) {
|
|
86 Node n = iter.next();
|
|
87 if(n.getAttributes().get("timestamp") == null) {
|
|
88 return DefaultEither.newA(new DefaultError());
|
|
89 }
|
|
90 if(n.getAttributes().get("timestamp") != null) {
|
|
91 childTimeStamp = n.getAttributes().get("timestamp").getLong();
|
|
92 if (newNodeTimeStamp < childTimeStamp) {
|
|
93 break;
|
|
94 }
|
|
95 }
|
|
96 count++;
|
|
97 }
|
|
98 return DefaultEither.newB(count);
|
42
|
99 }
|
56
|
100
|
|
101
|
|
102
|
34
|
103 }
|