//////////////////////////////////////////////////////////////////////////////// // checkstyle: Checks Java source code for adherence to a set of rules. // Copyright (C) 2001-2017 the original author or authors. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //////////////////////////////////////////////////////////////////////////////// package com.puppycrawl.tools.checkstyle.api; import java.util.Map; /** * Serves as an abstract base class for all modules that report inspection * findings. Such modules have a Severity level which is used for the * {@link LocalizedMessage localized messages} that are created by the module. * * @author lkuehne */ public abstract class AbstractViolationReporter extends AutomaticBean { /** The severity level of any violations found. */ private SeverityLevel severityLevel = SeverityLevel.ERROR; /** The identifier of the reporter. */ private String id; /** * Returns the severity level of the messages generated by this module. * @return the severity level * @see SeverityLevel * @see LocalizedMessage#getSeverityLevel */ public final SeverityLevel getSeverityLevel() { return severityLevel; } /** * Sets the severity level. The string should be one of the names * defined in the {@code SeverityLevel} class. * * @param severity The new severity level * @see SeverityLevel */ public final void setSeverity(String severity) { severityLevel = SeverityLevel.getInstance(severity); } /** * Get the severity level's name. * * @return the check's severity level name. */ public final String getSeverity() { return severityLevel.getName(); } /** * Returns the identifier of the reporter. Can be null. * @return the id */ public final String getId() { return id; } /** * Sets the identifier of the reporter. Can be null. * @param id the id */ public final void setId(final String id) { this.id = id; } /** * Returns an unmodifiable map instance containing the custom messages * for this configuration. * @return unmodifiable map containing custom messages */ protected Map<String, String> getCustomMessages() { return getConfiguration().getMessages(); } /** * Returns the message bundle name resource bundle that contains the messages * used by this module. * <p> * The default implementation expects the resource files to be named * messages.properties, messages_de.properties, etc. The file must * be placed in the same package as the module implementation. * </p> * <p> * Example: If you write com/foo/MyCoolCheck, create resource files * com/foo/messages.properties, com/foo/messages_de.properties, etc. * </p> * * @return name of a resource bundle that contains the messages * used by this module. */ protected String getMessageBundle() { final String className = getClass().getName(); return getMessageBundle(className); } /** * For unit tests, especially with a class with no package name. * @param className class name of the module. * @return name of a resource bundle that contains the messages * used by the module. */ private static String getMessageBundle(final String className) { final String messageBundle; final int endIndex = className.lastIndexOf('.'); final String messages = "messages"; if (endIndex < 0) { messageBundle = messages; } else { final String packageName = className.substring(0, endIndex); messageBundle = packageName + "." + messages; } return messageBundle; } /** * Helper method to log a LocalizedMessage. * * @param ast a node to get line id column numbers associated * with the message * @param key key to locale message format * @param args arguments to format */ protected final void log(DetailAST ast, String key, Object... args) { log(ast.getLineNo(), ast.getColumnNo(), key, args); } /** * Log a message that has no column information. * * @param line the line number where the error was found * @param key the message that describes the error * @param args the details of the message * * @see java.text.MessageFormat */ // -@cs[CustomDeclarationOrder] CustomDeclarationOrder does not treat groups of // overloaded methods. See https://github.com/sevntu-checkstyle/sevntu.checkstyle/issues/414 public abstract void log(int line, String key, Object... args); /** * Log a message that has column information. * * @param line the line number where the error was found * @param col the column number where the error was found * @param key the message that describes the error * @param args the details of the message * * @see java.text.MessageFormat */ // -@cs[CustomDeclarationOrder] CustomDeclarationOrder does not treat groups of // overloaded methods. See https://github.com/sevntu-checkstyle/sevntu.checkstyle/issues/414 public abstract void log(int line, int col, String key, Object... args); }