001///////////////////////////////////////////////////////////////////////////////////////////////
002// checkstyle: Checks Java source code and other text files for adherence to a set of rules.
003// Copyright (C) 2001-2025 the original author or authors.
004//
005// This library is free software; you can redistribute it and/or
006// modify it under the terms of the GNU Lesser General Public
007// License as published by the Free Software Foundation; either
008// version 2.1 of the License, or (at your option) any later version.
009//
010// This library is distributed in the hope that it will be useful,
011// but WITHOUT ANY WARRANTY; without even the implied warranty of
012// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013// Lesser General Public License for more details.
014//
015// You should have received a copy of the GNU Lesser General Public
016// License along with this library; if not, write to the Free Software
017// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018///////////////////////////////////////////////////////////////////////////////////////////////
019
020package com.puppycrawl.tools.checkstyle.xpath;
021
022import java.util.Collections;
023import java.util.List;
024
025import net.sf.saxon.Configuration;
026import net.sf.saxon.event.Receiver;
027import net.sf.saxon.om.AtomicSequence;
028import net.sf.saxon.om.NamespaceBinding;
029import net.sf.saxon.om.NamespaceMap;
030import net.sf.saxon.om.NamespaceUri;
031import net.sf.saxon.om.NodeInfo;
032import net.sf.saxon.om.TreeInfo;
033import net.sf.saxon.pattern.NodePredicate;
034import net.sf.saxon.s9api.Location;
035import net.sf.saxon.str.UnicodeString;
036import net.sf.saxon.tree.iter.AxisIterator;
037import net.sf.saxon.tree.util.Navigator;
038import net.sf.saxon.type.SchemaType;
039
040/**
041 * Represents general class for {@code ElementNode}, {@code RootNode} and {@code AttributeNode}.
042 */
043public abstract class AbstractNode implements NodeInfo {
044
045 /** The {@code TreeInfo} object. */
046 private final TreeInfo treeInfo;
047
048 /** The children. */
049 private List<AbstractNode> children;
050
051 /**
052 * Constructor of the abstract class {@code AbstractNode}.
053 *
054 * @param treeInfo {@code TreeInfo} object
055 */
056 protected AbstractNode(TreeInfo treeInfo) {
057 this.treeInfo = treeInfo;
058 }
059
060 /**
061 * Getter method for token type.
062 *
063 * @return token type
064 */
065 public abstract int getTokenType();
066
067 /**
068 * Returns underlying node.
069 *
070 * @return underlying node
071 */
072 public abstract Object getUnderlyingNode();
073
074 /**
075 * Getter method for node depth.
076 *
077 * @return depth
078 */
079 public abstract int getDepth();
080
081 /**
082 * Creates nodes for children.
083 *
084 * @return children list
085 */
086 protected abstract List<AbstractNode> createChildren();
087
088 /**
089 * Getter method for children.
090 *
091 * @return children list
092 */
093 protected List<AbstractNode> getChildren() {
094 if (children == null) {
095 children = createChildren();
096 }
097 return Collections.unmodifiableList(children);
098 }
099
100 /**
101 * Returns true if nodes are same, false otherwise.
102 *
103 * @param nodeInfo other node
104 * @return {@code TreeInfo}
105 */
106 @Override
107 public boolean isSameNodeInfo(NodeInfo nodeInfo) {
108 return this == nodeInfo;
109 }
110
111 /**
112 * Returns if implementation provides fingerprints.
113 *
114 * @return {@code boolean}
115 */
116 @Override
117 public boolean hasFingerprint() {
118 return false;
119 }
120
121 /**
122 * Get the URI part of the name of this node.
123 *
124 * @return The URI of the namespace of this node.
125 */
126 @Override
127 public NamespaceUri getNamespaceUri() {
128 return NamespaceUri.NULL;
129 }
130
131 /**
132 * Returns uri of the namespace for the current node.
133 *
134 * @return uri
135 */
136 @Override
137 public String getURI() {
138 return "";
139 }
140
141 /**
142 * Determines axis iteration algorithm.
143 *
144 * @param axisNumber element from {@code AxisInfo}
145 * @param nodeTest filter for iterator
146 * @return {@code AxisIterator} object
147 */
148 @Override
149 public AxisIterator iterateAxis(int axisNumber, NodePredicate nodeTest) {
150 AxisIterator axisIterator = iterateAxis(axisNumber);
151 if (nodeTest != null) {
152 axisIterator = new Navigator.AxisFilter(axisIterator, nodeTest);
153 }
154 return axisIterator;
155 }
156
157 /**
158 * Returns tree info.
159 *
160 * @return tree info
161 */
162 @Override
163 public final TreeInfo getTreeInfo() {
164 return treeInfo;
165 }
166
167 /**
168 * Returns string value. Throws {@code UnsupportedOperationException}, because no child
169 * class implements it and this method is not used for querying.
170 *
171 * @return string value
172 */
173 @Override
174 public String getStringValue() {
175 throw createUnsupportedOperationException();
176 }
177
178 /**
179 * Returns namespace array. Throws {@code UnsupportedOperationException}, because no child
180 * class implements it and this method is not used for querying.
181 *
182 * @param namespaceBindings namespace array
183 * @return namespace array
184 */
185 @Override
186 public final NamespaceBinding[] getDeclaredNamespaces(NamespaceBinding[] namespaceBindings) {
187 throw createUnsupportedOperationException();
188 }
189
190 /**
191 * Returns namespace array. Throws {@code UnsupportedOperationException}, because no child
192 * class implements it and this method is not used for querying.
193 *
194 * @return namespace map
195 */
196 @Override
197 public NamespaceMap getAllNamespaces() {
198 throw createUnsupportedOperationException();
199 }
200
201 /**
202 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child
203 * class implements it and this method is not used for querying.
204 *
205 * @return boolean
206 */
207 @Override
208 public final boolean isId() {
209 throw createUnsupportedOperationException();
210 }
211
212 /**
213 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child
214 * class implements it and this method is not used for querying.
215 *
216 * @return boolean
217 */
218 @Override
219 public final boolean isIdref() {
220 throw createUnsupportedOperationException();
221 }
222
223 /**
224 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child
225 * class implements it and this method is not used for querying.
226 *
227 * @return boolean
228 */
229 @Override
230 public final boolean isNilled() {
231 throw createUnsupportedOperationException();
232 }
233
234 /**
235 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child
236 * class implements it and this method is not used for querying.
237 *
238 * @return boolean
239 */
240 @Override
241 public final boolean isStreamed() {
242 throw createUnsupportedOperationException();
243 }
244
245 /**
246 * Returns configuration. Throws {@code UnsupportedOperationException}, because no child
247 * class implements it and this method is not used for querying.
248 *
249 * @return configuration
250 */
251 @Override
252 public final Configuration getConfiguration() {
253 throw createUnsupportedOperationException();
254 }
255
256 /**
257 * Sets system id. Throws {@code UnsupportedOperationException}, because no child
258 * class implements it and this method is not used for querying.
259 *
260 * @param systemId system id
261 */
262 @Override
263 public final void setSystemId(String systemId) {
264 throw createUnsupportedOperationException();
265 }
266
267 /**
268 * Returns system id. Throws {@code UnsupportedOperationException}, because no child
269 * class implements it and this method is not used for querying.
270 *
271 * @return system id
272 */
273 @Override
274 public final String getSystemId() {
275 throw createUnsupportedOperationException();
276 }
277
278 /**
279 * Returns public id. Throws {@code UnsupportedOperationException}, because no child
280 * class implements it and this method is not used for querying.
281 *
282 * @return public id
283 */
284 @Override
285 public final String getPublicId() {
286 throw createUnsupportedOperationException();
287 }
288
289 /**
290 * Returns base uri. Throws {@code UnsupportedOperationException}, because no child
291 * class implements it and this method is not used for querying.
292 *
293 * @return base uri
294 */
295 @Override
296 public final String getBaseURI() {
297 throw createUnsupportedOperationException();
298 }
299
300 /**
301 * Returns location. Throws {@code UnsupportedOperationException}, because no child
302 * class implements it and this method is not used for querying.
303 *
304 * @return location
305 */
306 @Override
307 public final Location saveLocation() {
308 throw createUnsupportedOperationException();
309 }
310
311 /**
312 * Returns the value of the item as a Unicode string.
313 * Throws {@code UnsupportedOperationException}, because no child class implements it and
314 * this method is not used for querying.
315 *
316 * @return CharSequence string value
317 */
318 @Override
319 public final UnicodeString getUnicodeStringValue() {
320 throw createUnsupportedOperationException();
321 }
322
323 /**
324 * Returns fingerprint. Throws {@code UnsupportedOperationException}, because no child
325 * class implements it and this method is not used for querying.
326 *
327 * @return fingerprint
328 */
329 @Override
330 public final int getFingerprint() {
331 throw createUnsupportedOperationException();
332 }
333
334 /**
335 * Returns display name. Throws {@code UnsupportedOperationException}, because no child
336 * class implements it and this method is not used for querying.
337 *
338 * @return display name
339 */
340 @Override
341 public final String getDisplayName() {
342 throw createUnsupportedOperationException();
343 }
344
345 /**
346 * Returns prefix. Throws {@code UnsupportedOperationException}, because no child
347 * class implements it and this method is not used for querying.
348 *
349 * @return prefix
350 */
351 @Override
352 public final String getPrefix() {
353 throw createUnsupportedOperationException();
354 }
355
356 /**
357 * Returns type of the schema. Throws {@code UnsupportedOperationException}, because no child
358 * class implements it and this method is not used for querying.
359 *
360 * @return type of the schema
361 */
362 @Override
363 public final SchemaType getSchemaType() {
364 throw createUnsupportedOperationException();
365 }
366
367 /**
368 * Returns AtomicSequence. Throws {@code UnsupportedOperationException}, because no child
369 * class implements it and this method is not used for querying.
370 *
371 * @return AtomicSequence
372 */
373 @Override
374 public final AtomicSequence atomize() {
375 throw createUnsupportedOperationException();
376 }
377
378 /**
379 * Generate id method. Throws {@code UnsupportedOperationException}, because no child
380 * class implements it and this method is not used for querying.
381 *
382 * @param buffer buffer
383 */
384 @Override
385 public final void generateId(StringBuilder buffer) {
386 throw createUnsupportedOperationException();
387 }
388
389 /**
390 * Copy method. Throws {@code UnsupportedOperationException}, because no child
391 * class implements it and this method is not used for querying.
392 *
393 * @param receiver receiver
394 * @param index index
395 * @param location location
396 */
397 @Override
398 public final void copy(Receiver receiver, int index, Location location) {
399 throw createUnsupportedOperationException();
400 }
401
402 /**
403 * Returns UnsupportedOperationException exception. Methods which throws this exception are
404 * not supported for all nodes.
405 *
406 * @return UnsupportedOperationException exception
407 */
408 private static UnsupportedOperationException createUnsupportedOperationException() {
409 return new UnsupportedOperationException("Operation is not supported");
410 }
411
412}