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