001////////////////////////////////////////////////////////////////////////////////
002// checkstyle: Checks Java source code for adherence to a set of rules.
003// Copyright (C) 2001-2016 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    private static final DetailNode[] EMPTY_DETAIL_NODE_ARRAY = new DetailNode[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        if (children == null) {
098            return EMPTY_DETAIL_NODE_ARRAY;
099        }
100        else {
101            return Arrays.copyOf(children, children.length);
102        }
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 JavadocUtils.getTokenName(type)
174                + "[" + lineNumber + "x" + columnNumber + "]";
175    }
176}