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}