0
|
1 package jp.ac.u_ryukyu.ie.cr.jungle.transaction;
|
|
2
|
|
3
|
|
4 import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditorError;
|
|
5 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
|
|
6 import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List;
|
|
7 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
|
|
8 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren;
|
|
9 import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
|
|
10 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
|
|
11 import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap;
|
|
12
|
|
13 import java.nio.ByteBuffer;
|
|
14 import java.util.Iterator;
|
|
15
|
|
16 public class DefaultTreeNodeChildren implements TreeNodeChildren {
|
|
17
|
|
18 public List<TreeNode> children;
|
|
19 public TreeMap<String, ByteBuffer> attrs;
|
|
20
|
|
21 public DefaultTreeNodeChildren(List<TreeNode> _children, TreeMap<String, ByteBuffer> _attrs) {
|
|
22 children = _children;
|
|
23 attrs = _attrs;
|
|
24 }
|
|
25
|
|
26 private boolean boundaryCheck(int _pos) {
|
|
27 int size = children.length();
|
|
28 if (size < _pos) {
|
|
29 return false;
|
|
30 }
|
|
31
|
|
32 return true;
|
|
33 }
|
|
34
|
|
35 @Override
|
|
36 public List<TreeNode> getChildrenAsRawList() {
|
|
37 return children;
|
|
38 }
|
|
39
|
|
40 @Override
|
|
41 public Either<Error, TreeNode> addNewChildAt(int _pos) {
|
|
42 if (!boundaryCheck(_pos) || _pos < 0) {
|
|
43 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
44 }
|
|
45
|
|
46 List<TreeNode> newChildren = children.add(_pos, new DefaultTreeNode());
|
|
47 TreeNode newNode = new DefaultTreeNode(newChildren, attrs);
|
|
48 return DefaultEither.newB(newNode);
|
|
49 }
|
|
50
|
|
51 @Override
|
|
52 public Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, TreeNode> deleteChildAt(int _pos) {
|
|
53 if (!boundaryCheck(_pos) || _pos < 0 || size() == 0) {
|
|
54 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
55 }
|
|
56
|
|
57 List<TreeNode> newChildren = children.delete(_pos);
|
|
58 TreeNode newNode = new DefaultTreeNode(newChildren, attrs);
|
|
59
|
|
60 return DefaultEither.newB(newNode);
|
|
61 }
|
|
62
|
|
63 @Override
|
|
64 public int size() {
|
|
65 return children.length();
|
|
66 }
|
|
67
|
|
68 @Override
|
|
69 public Iterator<TreeNode> iterator() {
|
|
70 return children.iterator();
|
|
71 }
|
|
72
|
|
73 @Override
|
|
74 public Either<Error, TreeNode> replaceNode(int _pos, TreeNode _replacement) {
|
|
75 int size = children.length();
|
|
76 if (!(0 <= _pos && _pos < size)) {
|
|
77 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
78 }
|
|
79 TreeNode replacement = _replacement;
|
|
80
|
|
81 List<TreeNode> newChildren = children.replace(_pos, replacement);
|
|
82 TreeNode node = new DefaultTreeNode(newChildren, attrs);
|
|
83 return DefaultEither.newB(node);
|
|
84 }
|
|
85
|
|
86 @Override
|
|
87 public Either<Error, TreeNode> at(int _pos) {
|
|
88 if (children.length() < _pos + 1) {
|
|
89 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
90 }
|
|
91
|
|
92 TreeNode Node = children.index(_pos);
|
|
93
|
|
94 return DefaultEither.newB(Node);
|
|
95 }
|
|
96
|
|
97 @Override
|
|
98 public Either<Error, TreeNode> addNewChildAt(int _pos, TreeNode _newChild) {
|
|
99 if (!boundaryCheck(_pos) || _pos < 0) {
|
|
100 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
101 }
|
|
102 List<TreeNode> newChildren = children.add(_pos, _newChild);
|
|
103 TreeNode newNode = new DefaultTreeNode(newChildren, attrs);
|
|
104
|
|
105 return DefaultEither.newB(newNode);
|
|
106 }
|
|
107
|
|
108 }
|