001/////////////////////////////////////////////////////////////////////////////////////////////// 002// checkstyle: Checks Java source code and other text files for adherence to a set of rules. 003// Copyright (C) 2001-2026 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 @SuppressWarnings("ReferenceEquality") 108 public boolean isSameNodeInfo(NodeInfo nodeInfo) { 109 return this == nodeInfo; 110 } 111 112 /** 113 * Returns if implementation provides fingerprints. 114 * 115 * @return {@code boolean} 116 */ 117 @Override 118 public boolean hasFingerprint() { 119 return false; 120 } 121 122 /** 123 * Get the URI part of the name of this node. 124 * 125 * @return The URI of the namespace of this node. 126 */ 127 @Override 128 public NamespaceUri getNamespaceUri() { 129 return NamespaceUri.NULL; 130 } 131 132 /** 133 * Returns uri of the namespace for the current node. 134 * 135 * @return uri 136 */ 137 @Override 138 public String getURI() { 139 return ""; 140 } 141 142 /** 143 * Determines axis iteration algorithm. 144 * 145 * @param axisNumber element from {@code AxisInfo} 146 * @param nodeTest filter for iterator 147 * @return {@code AxisIterator} object 148 */ 149 @Override 150 public AxisIterator iterateAxis(int axisNumber, NodePredicate nodeTest) { 151 AxisIterator axisIterator = iterateAxis(axisNumber); 152 if (nodeTest != null) { 153 axisIterator = new Navigator.AxisFilter(axisIterator, nodeTest); 154 } 155 return axisIterator; 156 } 157 158 /** 159 * Returns tree info. 160 * 161 * @return tree info 162 */ 163 @Override 164 public final TreeInfo getTreeInfo() { 165 return treeInfo; 166 } 167 168 /** 169 * Returns string value. Throws {@code UnsupportedOperationException}, because no child 170 * class implements it and this method is not used for querying. 171 * 172 * @return string value 173 */ 174 @Override 175 public String getStringValue() { 176 throw createUnsupportedOperationException(); 177 } 178 179 /** 180 * Returns namespace array. Throws {@code UnsupportedOperationException}, because no child 181 * class implements it and this method is not used for querying. 182 * 183 * @param namespaceBindings namespace array 184 * @return namespace array 185 */ 186 @Override 187 public final NamespaceBinding[] getDeclaredNamespaces(NamespaceBinding[] namespaceBindings) { 188 throw createUnsupportedOperationException(); 189 } 190 191 /** 192 * Returns namespace array. Throws {@code UnsupportedOperationException}, because no child 193 * class implements it and this method is not used for querying. 194 * 195 * @return namespace map 196 */ 197 @Override 198 public NamespaceMap getAllNamespaces() { 199 throw createUnsupportedOperationException(); 200 } 201 202 /** 203 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child 204 * class implements it and this method is not used for querying. 205 * 206 * @return boolean 207 */ 208 @Override 209 public final boolean isId() { 210 throw createUnsupportedOperationException(); 211 } 212 213 /** 214 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child 215 * class implements it and this method is not used for querying. 216 * 217 * @return boolean 218 */ 219 @Override 220 public final boolean isIdref() { 221 throw createUnsupportedOperationException(); 222 } 223 224 /** 225 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child 226 * class implements it and this method is not used for querying. 227 * 228 * @return boolean 229 */ 230 @Override 231 public final boolean isNilled() { 232 throw createUnsupportedOperationException(); 233 } 234 235 /** 236 * Returns boolean. Throws {@code UnsupportedOperationException}, because no child 237 * class implements it and this method is not used for querying. 238 * 239 * @return boolean 240 */ 241 @Override 242 public final boolean isStreamed() { 243 throw createUnsupportedOperationException(); 244 } 245 246 /** 247 * Returns configuration. Throws {@code UnsupportedOperationException}, because no child 248 * class implements it and this method is not used for querying. 249 * 250 * @return configuration 251 */ 252 @Override 253 public final Configuration getConfiguration() { 254 throw createUnsupportedOperationException(); 255 } 256 257 /** 258 * Sets system id. Throws {@code UnsupportedOperationException}, because no child 259 * class implements it and this method is not used for querying. 260 * 261 * @param systemId system id 262 */ 263 @Override 264 public final void setSystemId(String systemId) { 265 throw createUnsupportedOperationException(); 266 } 267 268 /** 269 * Returns system id. Throws {@code UnsupportedOperationException}, because no child 270 * class implements it and this method is not used for querying. 271 * 272 * @return system id 273 */ 274 @Override 275 public final String getSystemId() { 276 throw createUnsupportedOperationException(); 277 } 278 279 /** 280 * Returns public id. Throws {@code UnsupportedOperationException}, because no child 281 * class implements it and this method is not used for querying. 282 * 283 * @return public id 284 */ 285 @Override 286 public final String getPublicId() { 287 throw createUnsupportedOperationException(); 288 } 289 290 /** 291 * Returns base uri. Throws {@code UnsupportedOperationException}, because no child 292 * class implements it and this method is not used for querying. 293 * 294 * @return base uri 295 */ 296 @Override 297 public final String getBaseURI() { 298 throw createUnsupportedOperationException(); 299 } 300 301 /** 302 * Returns location. Throws {@code UnsupportedOperationException}, because no child 303 * class implements it and this method is not used for querying. 304 * 305 * @return location 306 */ 307 @Override 308 public final Location saveLocation() { 309 throw createUnsupportedOperationException(); 310 } 311 312 /** 313 * Returns the value of the item as a Unicode string. 314 * Throws {@code UnsupportedOperationException}, because no child class implements it and 315 * this method is not used for querying. 316 * 317 * @return CharSequence string value 318 */ 319 @Override 320 public final UnicodeString getUnicodeStringValue() { 321 throw createUnsupportedOperationException(); 322 } 323 324 /** 325 * Returns fingerprint. Throws {@code UnsupportedOperationException}, because no child 326 * class implements it and this method is not used for querying. 327 * 328 * @return fingerprint 329 */ 330 @Override 331 public final int getFingerprint() { 332 throw createUnsupportedOperationException(); 333 } 334 335 /** 336 * Returns display name. Throws {@code UnsupportedOperationException}, because no child 337 * class implements it and this method is not used for querying. 338 * 339 * @return display name 340 */ 341 @Override 342 public final String getDisplayName() { 343 throw createUnsupportedOperationException(); 344 } 345 346 /** 347 * Returns prefix. Throws {@code UnsupportedOperationException}, because no child 348 * class implements it and this method is not used for querying. 349 * 350 * @return prefix 351 */ 352 @Override 353 public final String getPrefix() { 354 throw createUnsupportedOperationException(); 355 } 356 357 /** 358 * Returns type of the schema. Throws {@code UnsupportedOperationException}, because no child 359 * class implements it and this method is not used for querying. 360 * 361 * @return type of the schema 362 */ 363 @Override 364 public final SchemaType getSchemaType() { 365 throw createUnsupportedOperationException(); 366 } 367 368 /** 369 * Returns AtomicSequence. Throws {@code UnsupportedOperationException}, because no child 370 * class implements it and this method is not used for querying. 371 * 372 * @return AtomicSequence 373 */ 374 @Override 375 public final AtomicSequence atomize() { 376 throw createUnsupportedOperationException(); 377 } 378 379 /** 380 * Generate id method. Throws {@code UnsupportedOperationException}, because no child 381 * class implements it and this method is not used for querying. 382 * 383 * @param buffer buffer 384 */ 385 @Override 386 public final void generateId(StringBuilder buffer) { 387 throw createUnsupportedOperationException(); 388 } 389 390 /** 391 * Copy method. Throws {@code UnsupportedOperationException}, because no child 392 * class implements it and this method is not used for querying. 393 * 394 * @param receiver receiver 395 * @param index index 396 * @param location location 397 */ 398 @Override 399 public final void copy(Receiver receiver, int index, Location location) { 400 throw createUnsupportedOperationException(); 401 } 402 403 /** 404 * Returns UnsupportedOperationException exception. Methods which throws this exception are 405 * not supported for all nodes. 406 * 407 * @return UnsupportedOperationException exception 408 */ 409 private static UnsupportedOperationException createUnsupportedOperationException() { 410 return new UnsupportedOperationException("Operation is not supported"); 411 } 412 413}