annotate src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultTreeEditor.java @ 0:44465893e8b8

first Commit
author Kazuma
date Wed, 30 Nov 2016 01:47:55 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.jungle.store.impl;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
2
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
3
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
4 import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
5 import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
6 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
7 import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
8 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
9 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Direction;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
10 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
11 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traverser;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
12 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
13 import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
14 import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
15 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
16
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
17 public class DefaultTreeEditor implements TreeEditor
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
18 {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
19 private final Traverser traverser;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
20 public DefaultTreeEditor(Traverser traverser)
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
21 {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
22 this.traverser = traverser;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
23 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
24
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
25 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
26 public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor editor)
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
27 {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
28 DefaultEvaluator e = new DefaultEvaluator(path);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
29 Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, Traversal> either = traverser.traverse(root,e);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
30
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
31 if(either.isA()){
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
32 return DefaultEither.newA(either.a());
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
33 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
34 Traversal t = either.b();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
35 return clone(t,editor);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
36 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
37
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
38 private Either<Error,LoggingNode> clone(Traversal t,NodeEditor editor)
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
39 {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
40 // copying nodes from bottom to root
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
41
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
42 List<Direction<TreeNode>> path = new List<>();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
43 for(Direction<TreeNode> direction : t){
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
44 path = path.addLast(direction);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
45 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
46
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
47 // target
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
48 Direction<TreeNode> targetDirection = path.head();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
49 TreeNode target = targetDirection.getTarget();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
50 Either<Error,LoggingNode> either = editor.edit(target);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
51 if(either.isA()){
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
52 return DefaultEither.newA(either.a());
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
53 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
54
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
55 LoggingNode newWrap = either.b();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
56
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
57 // top
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
58 int pos = targetDirection.getPosition();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
59 TreeNode child = newWrap.getWrap();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
60
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
61
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
62 for(Direction<TreeNode> parentDirection : path.deleteHead()){
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
63
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
64 TreeNodeChildren chs = parentDirection.getTarget().getChildren();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
65
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
66 Either<Error,TreeNode> ret = chs.replaceNode(pos,child);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
67 if(ret.isA()){
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
68 return DefaultEither.newA(ret.a());
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
69 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
70
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
71 child = ret.b();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
72 pos = parentDirection.getPosition();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
73 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
74
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
75 TreeNode newRoot = child;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
76 LoggingNode logNode = editor.wrap(newRoot,newWrap.getOperationLog());
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
77 return DefaultEither.newB(logNode);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
78 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
79
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
80 }