001/////////////////////////////////////////////////////////////////////////////////////////////// 002// checkstyle: Checks Java source code and other text files for adherence to a set of rules. 003// Copyright (C) 2001-2024 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}