1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.puppycrawl.tools.checkstyle.xpath;
21
22 import com.puppycrawl.tools.checkstyle.api.DetailAST;
23 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
24 import net.sf.saxon.Configuration;
25 import net.sf.saxon.om.AxisInfo;
26 import net.sf.saxon.om.GenericTreeInfo;
27 import net.sf.saxon.om.NodeInfo;
28 import net.sf.saxon.tree.iter.ArrayIterator;
29 import net.sf.saxon.tree.iter.AxisIterator;
30 import net.sf.saxon.tree.iter.EmptyIterator;
31 import net.sf.saxon.tree.iter.SingleNodeIterator;
32 import net.sf.saxon.tree.util.Navigator;
33 import net.sf.saxon.type.Type;
34
35
36
37
38
39 public class RootNode extends AbstractNode {
40
41
42 private static final String ROOT_NAME = "ROOT";
43
44
45 private static final AbstractNode[] EMPTY_ABSTRACT_NODE_ARRAY = new AbstractNode[0];
46
47
48 private final DetailAST detailAst;
49
50
51
52
53
54
55 public RootNode(DetailAST detailAst) {
56 super(new GenericTreeInfo(Configuration.newConfiguration()));
57 this.detailAst = detailAst;
58
59 createChildren();
60 }
61
62
63
64
65
66 private void createChildren() {
67 DetailAST currentChild = detailAst;
68 while (currentChild != null) {
69 final ElementNode child = new ElementNode(this, this, currentChild);
70 addChild(child);
71 currentChild = currentChild.getNextSibling();
72 }
73 }
74
75
76
77
78
79
80
81
82 @Override
83 public String getAttributeValue(String namespace, String localPart) {
84 throw throwUnsupportedOperationException();
85 }
86
87
88
89
90
91
92
93 @Override
94 public String getLocalPart() {
95 return ROOT_NAME;
96 }
97
98
99
100
101
102 @Override
103 public int getNodeKind() {
104 return Type.DOCUMENT;
105 }
106
107
108
109
110
111 @Override
112 public NodeInfo getParent() {
113 return null;
114 }
115
116
117
118
119
120 @Override
121 public NodeInfo getRoot() {
122 return this;
123 }
124
125
126
127
128
129
130
131 @Override
132 public String getStringValue() {
133 return ROOT_NAME;
134 }
135
136
137
138
139
140
141
142 @Override
143 public AxisIterator iterateAxis(byte axisNumber) {
144 final AxisIterator result;
145 switch (axisNumber) {
146 case AxisInfo.ANCESTOR:
147 case AxisInfo.ATTRIBUTE:
148 case AxisInfo.PARENT:
149 result = EmptyIterator.OfNodes.THE_INSTANCE;
150 break;
151 case AxisInfo.ANCESTOR_OR_SELF:
152 case AxisInfo.SELF:
153 try (AxisIterator iterator = SingleNodeIterator.makeIterator(this)) {
154 result = iterator;
155 }
156 break;
157 case AxisInfo.CHILD:
158 if (hasChildNodes()) {
159 try (AxisIterator iterator = new ArrayIterator.OfNodes(
160 getChildren().toArray(EMPTY_ABSTRACT_NODE_ARRAY))) {
161 result = iterator;
162 }
163 }
164 else {
165 result = EmptyIterator.OfNodes.THE_INSTANCE;
166 }
167 break;
168 case AxisInfo.DESCENDANT:
169 if (hasChildNodes()) {
170 try (AxisIterator iterator =
171 new Navigator.DescendantEnumeration(this, false, true)) {
172 result = iterator;
173 }
174 }
175 else {
176 result = EmptyIterator.OfNodes.THE_INSTANCE;
177 }
178 break;
179 case AxisInfo.DESCENDANT_OR_SELF:
180 try (AxisIterator iterator =
181 new Navigator.DescendantEnumeration(this, true, true)) {
182 result = iterator;
183 }
184 break;
185 default:
186 throw throwUnsupportedOperationException();
187 }
188 return result;
189 }
190
191
192
193
194
195 @Override
196 public int getLineNumber() {
197 return detailAst.getLineNo();
198 }
199
200
201
202
203
204 @Override
205 public int getColumnNumber() {
206 return detailAst.getColumnNo();
207 }
208
209
210
211
212
213 @Override
214 public int getTokenType() {
215 return TokenTypes.EOF;
216 }
217
218
219
220
221
222
223
224 @Override
225 public DetailAST getUnderlyingNode() {
226 return detailAst;
227 }
228
229
230
231
232
233 private static UnsupportedOperationException throwUnsupportedOperationException() {
234 return new UnsupportedOperationException("Operation is not supported");
235 }
236
237 }