These checks address miscellaneous problems.
The LocationReference check helps in cases where the name of the current method or class must be used as an argument to a method call or as initial value of a declared variable. It compares the actual argument to the current method or class name, and flags it if a mismatch is detected.
LogManager.getLogger
. This property or variableNames
must be set for
this check to do anything.
none (check is disabled)method
. If a variable of one of the names specified by this property is declared anywhere,
and its initial value is a String
or Class
literal, that literal is checked. This
property or methodCalls
must be set for this check to do anything.
none (check is disabled)method
, the value is
expected to be the exact name of the current method, or <init>
in constructors, and
<clinit>
in static initializers.
method
-1
being the last argument
in the list.
0
The following example checks that the current method name is passed as the first argument to certain log methods, or given as a String literal in initializations of variables named method
:
In the next example, the getLogger
method takes the current class as its first argument. The class shall be specified as a simple class object (e.g. MyClass.class
). Just getClass()
would not work. Calls where the argument is not a class object are ignored. Note the optional custom message, which allows tailoring the violation text to the particular use case:
The ModuleDirectoryLayout check enforces a configurable directory structure in all modules of a project. It also checks that certain content is located in particular source folders. This is especially useful for large multi-module projects. By default, it is configured for a basic Maven Standard Directory Layout.
For the purposes of this check, the absolute path of any file checked by Checkstyle is composed of four parts:
baseDir
moduleRegex
setting in directories.json. In a single-module project, the module path is the empty
String.baseDir
.The example is given as a Windows path, but the same would work for UNIX style paths. In fact, it does not matter whether you specify the separators as slashes or backslashes.
This check uses a directories.json config file via the configFile
property in order to list all possible MDL paths
and the specific content they may contain.
.
configFile
cannot be
found. When true
, a missing configFile
will simply disable the check with no warning.
When false
, a missing configFile
will throw an exception. Syntax errors in the config
file will always throw an exception.
false
Only these two properties are set in the check configuration. Everything else is configured via the directories.json file, which allows a central check definition (e.g. in SonarQube) to be used for many different projects, each of which features its own directories.json.
The configuration file is most easily understood by studying the default
configuration,
and using that as a starting point. The file must be UTF-8 encoded. It is composed of two mandatory sections: settings
and structure
.
settings:
formatVersion
: The version number of the config file format. Later versions of this check may change the format,
and use this field to stay backwards-compatible. For now, always put a 1
here.moduleRegex
: A regular expression to identify the module path in a file’s pathname. The file path passed to this
expression is the relative path to the file from the baseDir
. The default is the empty String, which means that
we have a single-module project.allowNestedSrcFolder
: Flag indicating if src
may be used as a package name fragment or subfolder anywhere. The
default is false
.structure:
The structure
section contains a map whose keys are the MDL paths which can be present in each module. The value
objects of the map may be empty, but they may also contain any of the following elements:
modules
: A regular expression applied to the module path. The expression matches all module paths for which
the current MDL path is valid. For example, in this way, the MDL path src/main/webapp
may be restricted to web
modules.whitelist
: A flag which tells us if the allow
list in this object is a whitelist. If so, only files which
explicitly match one of the conditions in the allow
list may be present on this MDL path. If whitelist
is
false
, then the allow
list is largely irrelevant, except where it is referenced from deny
lists or for the
TopLevelFolder
type element.allow
: List of conditions for allowed content of the MDL pathdeny
: List of conditions for forbidden content of the MDL pathThe allow
and deny
lists contain elements of the following form: { "type": "FileExtensions", "spec": "java" }
. The type
element may be one of the constants from
MdlContentSpecType.
The FromPath
type may only occur in deny
lists.
In order to be sure that your customized directories.json file is syntactically correct and does not violate any constraints, a small verification program is supplied for your convenience. Download a copy of checkstyle-addons-4.1.2-all.jar and checkstyle-6.4.1-all.jar (or any other compatible version), then run the validator from the command line:
java -cp checkstyle-addons-4.1.2-all.jar;checkstyle-6.4.1-all.jar com.thomasjensen.checkstyle.addons.checks.misc.MdlJsonConfigValidator path/to/my/directories.json
In the following example, the check is configured to ensure that a single-module project follows the Maven Directory Convention:
More typically, you will want to customize the check to allow for multi-module projects and specialized folder structures:
The above example is for IntelliJ and Eclipse, where ${workspace_loc}
may be used to refer to the file system location of the current workspace. For SonarQube, you may use relative file paths. For the other environments, you may define a custom module property, which you dynamically set to the project directory. Example for Gradle:
Important: This check goes directly under Checker, not under TreeWalker.
The PropertyCatalog check helps to keep a property file in sync with a piece of code that contains the property keys. That piece of code is called the “property catalog”, and may be:
The property catalog and the properties file are expected to be connected to each other by a configurable naming convention.
The property catalog code could look like this (other forms are possible, see below):
The constructor arguments of the enum constants are the keys to the property file, which in turn looks like this:
In this example, the property with key one
is orphaned, because it is not referenced by the property catalog. It would be flagged along with the duplicate reference to two
.
In a property catalog, the enum constants themselves may also be used as keys:
The property catalog can also consist of normal constants. Private constants are ignored.
Important: The keys in a property catalog must be simple literals of type String
, int
,
long
, or boolean
. No arithmetic allowed, no method calls, no references to other constants.
Just simple literals. Remember that Checkstyle works on source code.
The check roughly works like this:
selection
are checked.excludedFields
are ignored.propertyFile
, the corresponding property file is located.If the property catalog is a class or interface, the values of the defined constants are the property keys. If the property catalog is an enum, you can choose whether the enum constant itself shall be the key, or the first parameter passed to the enum constant’s constructor (via enumArgument
). In a class, private constants are never considered.
This check find duplicate keys in the Java code, but not in the property file. Use UniqueProperties for that. It also does not help keep the translations of your property files in sync (e.g. file.properties, file_de.properties, file_fr.properties, etc.). Use Translation for that, and configure this check only for one of the property files.
$
signs, for example
com.foo.Outer$Inner
.
^(?!x)x
(check is disabled)excludedFields
is applied to the name of the constant, not the key. With the
exception of an enum constant used as key, constant and key are two separate things (see examples above).
serialVersionUID
false
), or
the first argument of the enum constant's constructor (true
). When the property catalog is not an
enum, then this property is ignored.
false
.
baseDir
. In this template, the following placeholders may be
used (examples are for com.foo.Bar$Inner
):
{0}
com.foo.Bar$Inner
){1}
com/foo/Bar/Inner
){2}
com.foo.Bar
){3}
com/foo/Bar
){4}
..
's (../../..
){5}
com/foo
){6}
Bar
){7}
Inner
){8}
baseDir
on the path to the message catalog (subdir1
). This placeholder, as well as {9}
and {10}
are useful if your project being analyzed consists of submodules.{9}
subdir2
){10}
subdir3
){11}
{8}/
, {8}/{9}/
, and {8}/{9}/{10}/
(in that order). Once the property file is found, the location is used. If not, the next variation is checked. This is useful when the same Checkstyle configuration is used for multiple projects with different structures.{12}
baseDir
and the package directories (e.g. module1/src/main/java
)UTF-8
true
true
true
, the property keys are treated as case sensitive; if false
,
case is ignored.
true
In the following example, it is assumed that you have a naming convention which requires all property catalogs to have a type name that ends in Catalog
. The corresponding property file is assumed to share the name of the Java file and reside in the same package, but under src/main/resources:
The above example is for Eclipse, where ${workspace_loc}
may be used to refer to the file system location of the current workspace. For SonarQube, you may use relative file paths. For the other environments, you may define a custom module property, which you dynamically set to the project directory. Example for Gradle: