001////////////////////////////////////////////////////////////////////////////////
002// checkstyle: Checks Java source code for adherence to a set of rules.
003// Copyright (C) 2001-2017 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.checks.javadoc;
021
022import java.util.Arrays;
023import java.util.Objects;
024
025import com.puppycrawl.tools.checkstyle.api.DetailNode;
026import com.puppycrawl.tools.checkstyle.utils.JavadocUtils;
027
028/**
029 * Implementation of DetailNode interface that is mutable.
030 *
031 * @author Baratali Izmailov
032 *
033 */
034public class JavadocNodeImpl implements DetailNode {
035
036    /**
037     * Empty array of {@link DetailNode} type.
038     */
039    public static final JavadocNodeImpl[] EMPTY_DETAIL_NODE_ARRAY = new JavadocNodeImpl[0];
040
041    /**
042     * Node index among parent's children.
043     */
044    private int index;
045
046    /**
047     * Node type.
048     */
049    private int type;
050
051    /**
052     * Node's text content.
053     */
054    private String text;
055
056    /**
057     * Line number.
058     */
059    private int lineNumber;
060
061    /**
062     * Column number.
063     */
064    private int columnNumber;
065
066    /**
067     * Array of child nodes.
068     */
069    private DetailNode[] children;
070
071    /**
072     * Parent node.
073     */
074    private DetailNode parent;
075
076    @Override
077    public int getType() {
078        return type;
079    }
080
081    @Override
082    public String getText() {
083        return text;
084    }
085
086    @Override
087    public int getLineNumber() {
088        return lineNumber;
089    }
090
091    @Override
092    public int getColumnNumber() {
093        return columnNumber;
094    }
095
096    @Override
097    public DetailNode[] getChildren() {
098        DetailNode[] nodeChildren = EMPTY_DETAIL_NODE_ARRAY;
099        if (children != null) {
100            nodeChildren = Arrays.copyOf(children, children.length);
101        }
102        return nodeChildren;
103    }
104
105    @Override
106    public DetailNode getParent() {
107        return parent;
108    }
109
110    @Override
111    public int getIndex() {
112        return index;
113    }
114
115    /**
116     * Sets node's type.
117     * @param type Node's type.
118     */
119    public void setType(int type) {
120        this.type = type;
121    }
122
123    /**
124     * Sets node's text content.
125     * @param text Node's text content.
126     */
127    public void setText(String text) {
128        this.text = text;
129    }
130
131    /**
132     * Sets line number.
133     * @param lineNumber Line number.
134     */
135    public void setLineNumber(int lineNumber) {
136        this.lineNumber = lineNumber;
137    }
138
139    /**
140     * Sets column number.
141     * @param columnNumber Column number.
142     */
143    public void setColumnNumber(int columnNumber) {
144        this.columnNumber = columnNumber;
145    }
146
147    /**
148     * Sets array of child nodes.
149     * @param children Array of child nodes.
150     */
151    public void setChildren(DetailNode... children) {
152        this.children = Arrays.copyOf(children, children.length);
153    }
154
155    /**
156     * Sets parent node.
157     * @param parent Parent node.
158     */
159    public void setParent(DetailNode parent) {
160        this.parent = parent;
161    }
162
163    /**
164     * Sets node's index among parent's children.
165     * @param index Node's index among parent's children.
166     */
167    public void setIndex(int index) {
168        this.index = index;
169    }
170
171    @Override
172    public String toString() {
173        return "JavadocNodeImpl["
174                + "index=" + index
175                + ", type=" + JavadocUtils.getTokenName(type)
176                + ", text='" + text + '\''
177                + ", lineNumber=" + lineNumber
178                + ", columnNumber=" + columnNumber
179                + ", children=" + Objects.hashCode(children)
180                + ", parent=" + parent + ']';
181    }
182}