Mercurial > hg > Members > kazuma > jungle-ormapper
view src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/IndexTreeEditor.java @ 0:44465893e8b8
first Commit
author | Kazuma |
---|---|
date | Wed, 30 Nov 2016 01:47:55 +0900 |
parents | |
children |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Direction; import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traverser; import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; public class IndexTreeEditor { private final Traverser traverser; public IndexTreeEditor(Traverser traverser) { this.traverser = traverser; } public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor editor) { DefaultEvaluator e = new DefaultEvaluator(path); Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, Traversal> either = traverser.traverse(root,e); if(either.isA()){ return DefaultEither.newA(either.a()); } Traversal t = either.b(); Either<Error,LoggingNode> ret = clone(t,editor); return ret; } private Either<Error,LoggingNode> clone(Traversal t,NodeEditor editor) { // copying nodes from bottom to root List<Direction<TreeNode>> path = new List(); for (Direction<TreeNode> direction : t) { path = path.addLast(direction); } // target Direction<TreeNode> targetDirection = path.head(); TreeNode target = targetDirection.getTarget(); Either<Error, LoggingNode> either = editor.edit(target); if (either.isA()) { return DefaultEither.newA(either.a()); } LoggingNode newWrap = either.b(); // top int pos = targetDirection.getPosition(); TreeNode child = newWrap.getWrap(); for (Direction<TreeNode> parentDirection : path.deleteLast()) { TreeNode updateTargetNode = parentDirection.getTarget(); TreeNodeChildren chs = updateTargetNode.getChildren(); Either<Error, TreeNode> ret = chs.replaceNode(pos, child); if (ret.isA()) { return DefaultEither.newA(ret.a()); } TreeNode newParent = ret.b(); child = newParent; pos = parentDirection.getPosition(); } TreeNode newRoot = child; LoggingNode logNode = editor.wrap(newRoot, newWrap.getOperationLog()); return DefaultEither.newB(logNode); } }