Mercurial > hg > Members > tatsuki > bench > jungle-core
annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java @ 112:98e256d9fd57
treeAttribute add get String but has error
author | one |
---|---|
date | Mon, 15 Sep 2014 16:31:53 +0900 |
parents | f9a0e7069811 |
children | 74723b26ad96 |
rev | line source |
---|---|
10 | 1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; |
2 | |
28 | 3 import fj.data.List; |
12 | 4 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; |
10 | 5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; |
14 | 6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; |
28 | 7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator; |
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction; | |
23 | 9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; |
14 | 10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; |
23 | 11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; |
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; | |
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; | |
103 | 14 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Logging; |
10 | 15 |
49
e3a507fd57a4
modified TreeEditor and JungleTreeEditor (not done yet)
Shoshi TAMAKI
parents:
38
diff
changeset
|
16 public class DefaultTreeEditor implements TreeEditor |
10 | 17 { |
35 | 18 private final Traverser traverser; |
10 | 19 |
104 | 20 public DefaultTreeEditor(Traverser traverser) |
10 | 21 { |
104 | 22 this.traverser = traverser; |
35 | 23 } |
24 | |
10 | 25 @Override |
104 | 26 public Either<Error,Logging> edit(TreeNode root,NodePath path,NodeEditor editor) |
12 | 27 { |
104 | 28 DefaultEvaluator e = new DefaultEvaluator(path); |
29 Either<Error, Traversal> either = traverser.traverse(root,e); | |
18 | 30 |
28 | 31 if(either.isA()){ |
32 return DefaultEither.newA(either.a()); | |
16 | 33 } |
14 | 34 |
86 | 35 Traversal t = either.b(); |
104 | 36 Either<Error,Logging> ret = clone(t,editor); |
28 | 37 |
38 return ret; | |
12 | 39 } |
16 | 40 |
104 | 41 private Either<Error,Logging> clone(Traversal t,NodeEditor editor) |
25 | 42 { |
29 | 43 // copying nodes from bottom to root |
44 | |
86 | 45 List<Direction<TreeNode>> path = List.nil(); |
104 | 46 for(Direction<TreeNode> direction : t){ |
28 | 47 path = path.cons(direction); |
25 | 48 } |
28 | 49 |
50 // target | |
86 | 51 Direction<TreeNode> targetDirection = path.head(); |
52 TreeNode target = targetDirection.getTarget(); | |
78 | 53 //EditableNodeWrapper<T> wrapper = new EditableNodeWrapper<T>(target); |
104 | 54 Either<Error,Logging> either = editor.edit(target); |
31
418088ca2b30
added Generics parameters to EditableNode framework
Shoshi TAMAKI
parents:
29
diff
changeset
|
55 if(either.isA()){ |
418088ca2b30
added Generics parameters to EditableNode framework
Shoshi TAMAKI
parents:
29
diff
changeset
|
56 return DefaultEither.newA(either.a()); |
418088ca2b30
added Generics parameters to EditableNode framework
Shoshi TAMAKI
parents:
29
diff
changeset
|
57 } |
418088ca2b30
added Generics parameters to EditableNode framework
Shoshi TAMAKI
parents:
29
diff
changeset
|
58 |
103 | 59 Logging newWrap = either.b(); |
28 | 60 |
29 | 61 // top |
62 int pos = targetDirection.getPosition(); | |
96 | 63 TreeNode child = newWrap.getWrap(); |
86 | 64 for(Direction<TreeNode> parentDirection : path.tail()){ |
65 TreeNodeChildren chs = parentDirection.getTarget().getChildren(); | |
76 | 66 |
81 | 67 Either<Error,TreeNode> ret = chs.replaceNode(pos,child); |
31
418088ca2b30
added Generics parameters to EditableNode framework
Shoshi TAMAKI
parents:
29
diff
changeset
|
68 if(ret.isA()){ |
418088ca2b30
added Generics parameters to EditableNode framework
Shoshi TAMAKI
parents:
29
diff
changeset
|
69 return DefaultEither.newA(ret.a()); |
29 | 70 } |
71 | |
81 | 72 TreeNode newParent = ret.b(); |
29 | 73 child = newParent; |
74 pos = parentDirection.getPosition(); | |
75 } | |
76 | |
81 | 77 TreeNode newRoot = child; |
104 | 78 Logging logNode = editor.wrap(newRoot,newWrap.getOperationLog()); |
103 | 79 return DefaultEither.newB(logNode); |
29 | 80 } |
13 | 81 } |