| <?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"/> |
| |
| <!-- Added as per the issue #7384 - Prohibit @author tags in Javadoc --> |
| <module name="RegexpSingleline"> |
| <property name="format" value="^\s*\*\s*@author" /> |
| <property name="minimum" value="0" /> |
| <property name="maximum" value="0" /> |
| <property name="message" value="Prohibit @author tags in Javadoc" /> |
| <property name="fileExtensions" value="java" /> |
| </module> |
| |
| <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> |
| |
| <!-- Added as per the issue #7609 - Local variable names shouldn't start with capital --> |
| <module name="LocalVariableName"> |
| <property name="format" value="^[a-z_]*[a-z0-9][a-zA-Z0-9_]*$"/> |
| </module> |
| <module name="LocalFinalVariableName"> |
| <property name="format" value="^[a-z_]*[a-z0-9][a-zA-Z0-9_]*$"/> |
| </module> |
| <module name="ConstantName"> |
| <property name="format" value="^log(ger)?$|^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/> |
| </module> |
| |
| <module name="StringLiteralEquality"/> |
| |
| </module> |
| </module> |