mirror of https://github.com/apache/druid.git
307 lines
14 KiB
XML
307 lines
14 KiB
XML
<?xml version="1.0" ?>
|
|
|
|
<!--
|
|
~ Licensed to the Apache Software Foundation (ASF) under one
|
|
~ or more contributor license agreements. See the NOTICE file
|
|
~ distributed with this work for additional information
|
|
~ regarding copyright ownership. The ASF licenses this file
|
|
~ to you under the Apache License, Version 2.0 (the
|
|
~ "License"); you may not use this file except in compliance
|
|
~ with the License. You may obtain a copy of the License at
|
|
~
|
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
|
~
|
|
~ Unless required by applicable law or agreed to in writing,
|
|
~ software distributed under the License is distributed on an
|
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
~ KIND, either express or implied. See the License for the
|
|
~ specific language governing permissions and limitations
|
|
~ under the License.
|
|
-->
|
|
|
|
<!DOCTYPE module PUBLIC
|
|
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
|
|
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
|
|
|
|
<module name="Checker">
|
|
<module name="Header">
|
|
<property name="headerFile" value="${checkstyle.header.file}"/>
|
|
<property name="fileExtensions" value="java"/>
|
|
</module>
|
|
|
|
<module name="NewlineAtEndOfFile"/>
|
|
<module name="FileTabCharacter"/>
|
|
|
|
<module name="TreeWalker">
|
|
<module name="SuppressionCommentFilter">
|
|
<property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
|
|
<property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
|
|
<property name="checkFormat" value="$1"/>
|
|
</module>
|
|
|
|
<module name="RedundantModifier">
|
|
<property name="tokens" value="INTERFACE_DEF,ENUM_DEF,METHOD_DEF"/>
|
|
</module>
|
|
|
|
<!-- See http://checkstyle.sourceforge.net/checks.html for examples -->
|
|
|
|
<!--<module name="LineLength">-->
|
|
<!--<property name="max" value="120"/>-->
|
|
<!--</module>-->
|
|
<module name="AvoidStarImport"/>
|
|
<module name="AvoidStaticImport"/>
|
|
<module name="RedundantImport"/>
|
|
<module name="UnusedImports" />
|
|
<module name="NeedBraces"/>
|
|
<module name="LeftCurly">
|
|
<property name="option" value="nl"/>
|
|
<property name="tokens" value="INTERFACE_DEF,CLASS_DEF,ANNOTATION_DEF,ENUM_DEF,CTOR_DEF,METHOD_DEF"/>
|
|
</module>
|
|
<module name="LeftCurly">
|
|
<property name="option" value="eol"/>
|
|
<property name="tokens" value="LITERAL_WHILE,LITERAL_TRY,LITERAL_CATCH,LITERAL_FINALLY,LITERAL_SYNCHRONIZED,LITERAL_SWITCH,LITERAL_DO,LITERAL_IF,LITERAL_ELSE,LITERAL_FOR,STATIC_INIT,LAMBDA,ENUM_CONSTANT_DEF"/>
|
|
</module>
|
|
<module name="RightCurly">
|
|
<property name="option" value="same"/>
|
|
<property name="tokens" value="LITERAL_IF,LITERAL_ELSE,LITERAL_DO"/>
|
|
</module>
|
|
<module name="RightCurly">
|
|
<property name="option" value="alone"/>
|
|
<property name="tokens" value="LITERAL_TRY,LITERAL_CATCH,LITERAL_FINALLY,CLASS_DEF,METHOD_DEF,CTOR_DEF,LITERAL_FOR,LITERAL_WHILE,STATIC_INIT,INSTANCE_INIT"/>
|
|
</module>
|
|
|
|
<module name="WhitespaceAfter"/>
|
|
<module name="WhitespaceAround">
|
|
<property name="allowEmptyConstructors" value="true"/>
|
|
<property name="allowEmptyMethods" value="true"/>
|
|
<property name="allowEmptyLambdas" value="true"/>
|
|
<property name="allowEmptyTypes" value="true"/>
|
|
<property name="ignoreEnhancedForColon" value="false"/>
|
|
</module>
|
|
<module name="ParenPad"/>
|
|
<module name="SingleSpaceSeparator"/>
|
|
<module name="NoWhitespaceBefore">
|
|
<property name="tokens" value="COMMA,SEMI,POST_INC,POST_DEC,ELLIPSIS,METHOD_REF"/>
|
|
</module>
|
|
<module name="NoWhitespaceBefore">
|
|
<property name="tokens" value="DOT"/>
|
|
<property name="allowLineBreaks" value="true"/>
|
|
</module>
|
|
<module name="NoWhitespaceAfter"/>
|
|
<module name="NoWhitespaceAfter">
|
|
<property name="tokens" value="DOT"/>
|
|
<property name="allowLineBreaks" value="false"/>
|
|
</module>
|
|
<module name="GenericWhitespace"/>
|
|
|
|
<module name="EmptyLineSeparator">
|
|
<property name="tokens" value="PACKAGE_DEF,IMPORT,STATIC_IMPORT,INTERFACE_DEF,STATIC_INIT,INSTANCE_INIT,CTOR_DEF,VARIABLE_DEF"/>
|
|
<property name="allowNoEmptyLineBetweenFields" value="true"/>
|
|
<property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
|
|
</module>
|
|
|
|
<module name="Indentation">
|
|
<property name="basicOffset" value="2"/>
|
|
<property name="caseIndent" value="2"/>
|
|
</module>
|
|
|
|
<module name="MethodParamPad">
|
|
<property name="allowLineBreaks" value="true"/>
|
|
</module>
|
|
<module name="OneStatementPerLine"/>
|
|
<module name="EmptyStatement"/>
|
|
|
|
<module name="ModifierOrder" />
|
|
|
|
<module name="Regexp">
|
|
<property name="format" value="com\.google\.common\.io\.Closer"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use org.apache.druid.java.util.common.io.Closer instead of Guava's Closer"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="^// {2}"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Don't commit IntelliJ-style commented code lines"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="/\*[^\*].*?\n(\s*\*.*?\n)*\s+\*/[\s\n]*(transient|volatile|strictfp|synchronized|native|abstract|class|interface|enum|static|private|public|protected|default|void|byte|char|short|int|float|long|double|[A-Z])"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Comments to classes and methods must be Javadoc comments"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="natural\(\)[\s\n]*\.[\s\n]*nullsFirst\(\)"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use Comparators.naturalNullsFirst() instead of Ordering.natural().nullsFirst()"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="Enums\.getIfPresent\("/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use GuavaUtils.getEnumIfPresent() instead of Enums.getIfPresent()"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="(Byte|Character|Short|Integer|Long|Float|Double)\.TYPE"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use primitive.class instead. But check twice that you don't actually need BoxedPrimitive.class instead of BoxedPrimitive.TYPE"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="Float\.MAX_VALUE"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use Float.POSITIVE_INFINITY"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="Float\.MIN_VALUE"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use Float.NEGATIVE_INFINITY"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="Double\.MAX_VALUE"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use Double.POSITIVE_INFINITY"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="Double\.MIN_VALUE"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use Double.NEGATIVE_INFINITY"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="com\.metamx\.common\.logger"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use org.apache.druid.java.util.common.logger.Logger instead"/>
|
|
</module>
|
|
|
|
<module name="Regexp">
|
|
<!-- Couldn't check this in forbidden-apis, because javac replaces compile-time constants without refs. -->
|
|
<property name="format" value="(Shorts|Chars|Ints|Longs|Floats|Doubles)\.BYTES"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use java.lang.Primitive.BYTES instead."/>
|
|
</module>
|
|
<!-- This regex should be replaced with an IntelliJ inspection when teamcity.jetbrains.com updates to at least IntelliJ 2018.1 (currently it uses 2017.2) -->
|
|
<module name="Regexp">
|
|
<property name="format" value='[a-z][a-zA-Z0-9_]*\.equals\((\"|[A-Z_]+\))'/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value='Use "string".equals(javaVar) and STRING_CONSTANT.equals(javaVar) instead of javaVar.equals("string") and javaVar.equals(STRING_CONSTANT)'/>
|
|
</module>
|
|
|
|
<module name="Regexp">
|
|
<property name="format" value="toArray\([\s\n]*new [a-zA-Z0-9_]+\[[^0]"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value='Use toArray(new Object[0]) instead'/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="Strings.emptyToNull"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use org.apache.druid.common.config.NullHandling.emptyToNullIfNeeded instead"/>
|
|
</module>
|
|
<module name="Regexp">
|
|
<property name="format" value="Strings.nullToEmpty"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use org.apache.druid.common.config.NullHandling.nullToEmptyIfNeeded instead"/>
|
|
</module>
|
|
|
|
<module name="Regexp">
|
|
<property name="format" value='@Produces\(\"text/plain\"\)'/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Use org.apache.druid.server.http.HttpMediaType#TEXT_PLAIN_UTF8 instead"/>
|
|
</module>
|
|
|
|
<module name="Regexp">
|
|
<property name="format" value='^Throwables.propagate\('/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Throwables.propagate() shouldn't be used in new code"/>
|
|
</module>
|
|
|
|
<module name="PackageName">
|
|
<property name="format" value="^org.apache.druid.*$"/>
|
|
</module>
|
|
<module name="PackageDeclaration"/>
|
|
|
|
<!-- See https://github.com/checkstyle/checkstyle/issues/5510 and the ImportOrder suppression in
|
|
checkstyle-suppressions.xml -->
|
|
<module name="ImportOrder">
|
|
<property name="groups" value="*,javax,java"/>
|
|
<property name="ordered" value="true"/>
|
|
<property name="separated" value="true"/>
|
|
<property name="option" value="bottom"/>
|
|
<property name="sortStaticImportsAlphabetically" value="true"/>
|
|
</module>
|
|
|
|
<module name="Regexp">
|
|
<property name="format" value="instanceof\s+(ObjectColumnSelector|LongColumnSelector|FloatColumnSelector|DoubleColumnSelector)"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="ObjectColumnSelector, LongColumnSelector, FloatColumnSelector
|
|
and DoubleColumnSelector must not be used in an instanceof statement, see Javadoc of those interfaces."/>
|
|
</module>
|
|
|
|
<module name="Regexp">
|
|
<property name="id" value="argumentLineBreaking"/>
|
|
<property
|
|
name="format"
|
|
value='(?<!ImmutableMap.of|Types.mapOf|orderedMap|makeSelectResults|makeListOfPairs)\(\s*\n +([^,\n\(\{"</]+|[^,\n\(\{" /]+> [a-zA-Z0-9_]+)\, ++[^,\n/]+'
|
|
/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="
|
|
According to the Druid code style, if a method or constructor declaration or a call
|
|
doesn't fit a single line, each parameter or argument should be on it's own, e. g:
|
|
|
|
MyReturnType myMethodWithAVeryLongName(
|
|
MyParamTypeA myParamAWithAVeryLongName,
|
|
MyParamTypeB myParamBWithAVeryLongName
|
|
)
|
|
|
|
or
|
|
|
|
MyValueType myValue = myMethodWithAVeryLongName(
|
|
myVeryLongArgA,
|
|
myVeryLongArgB
|
|
)
|
|
|
|
The exceptions from this rule are map-like and pair-accepting constructors and methods,
|
|
for those it's preferred to put each pair on it's own line, e. g:
|
|
|
|
Map<MyKeyType, MyValueType> myMap = ImmutableMap.of(
|
|
myKey1, myValue1,
|
|
myKey2, myValue2
|
|
)
|
|
|
|
Always prefer to fit a declaration or a method or constructor call into a single line
|
|
(less than 120 cols), if possible.
|
|
|
|
Two things to note to avoid unnecessary breakdown:
|
|
|
|
1) Exceptions declared for a method could be broken to the next line separately, e. g:
|
|
|
|
MyReturnType myMethodWithAVeryLongName(MyParamTypeA myParamA, MyParamTypeB myParamB)
|
|
throws MyExceptionTypeAWithVeryLongName, MyExceptionTypeBWithVeryLongName
|
|
|
|
2) In a variable, field or constant assignment, it's often more readable to break the
|
|
whole right hand side expression to the next line, instead of breaking the expression
|
|
arguments, e. g:
|
|
|
|
MyTypeWithAVeryLongName myVariableWithAVeryLongName =
|
|
myMethodWithAVeryLongName(myArgA, myArgB);
|
|
|
|
Also note that this checkstyle rule (the one that caused this message to be printed)
|
|
doesn't spot all violations of the corresponding Druid code style rule. If you see
|
|
a place where method or constructor parameters or call arguments are not properly
|
|
located each on it's own line, but this checkstyle rule is silent, if doesn't mean
|
|
that the code is formatted correctly. Fix it anyway.
|
|
|
|
If you encouter a map-like or a pair-accepting method that is reported by this
|
|
checkstyle rule, you should add it as an exception in the corresponding rule in
|
|
codestyle/checkstyle.xml. "/>
|
|
</module>
|
|
|
|
<module name="Regexp">
|
|
<property name="id" value="duplicateLine"/>
|
|
<property name="format" value="^(.*;)(\r?\n\1)+$"/>
|
|
<property name="illegalPattern" value="true"/>
|
|
<property name="message" value="Duplicate line"/>
|
|
</module>
|
|
|
|
<!-- Added as per the issue #6936 - Prohibit method names starting with capital letters -->
|
|
<module name="MethodName">
|
|
<property name = "format" value = "^[a-z_]*[a-z0-9][a-zA-Z0-9_]*$"/>
|
|
</module>
|
|
</module>
|
|
</module>
|