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