| <?xml version="1.0" encoding="UTF-8"?> | 
 | <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> | 
 | <!-- This is a checkstyle configuration file. For descriptions of | 
 | what the following rules do, please see the checkstyle configuration | 
 | page at http://checkstyle.sourceforge.net/config.html --> | 
 | <!-- Checks with numbered comments refer to recommendations made | 
 | by Joshua Bloch in his book Effective Java --> | 
 | <module name="Checker"> | 
 |   <property name="charset" value="UTF-8"/> | 
 |   <module name="BeforeExecutionExclusionFileFilter"> | 
 |     <property name="fileNamePattern" value="module\-info\.java$"/> | 
 |   </module> | 
 |   <module name="FileTabCharacter"> | 
 |     <property name="eachLine" value="true"/> | 
 |     <!-- Checks that there are no tab characters in the file. | 
 | --> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <!-- Checks that FIXME is not used in comments.  TODO is preferred. | 
 | --> | 
 |     <property name="format" value="((//.*)|(\*.*))FIXME"/> | 
 |     <property name="message" value="TODO is preferred to FIXME.  e.g. "TODO(johndoe): Refactor when v2 is released.""/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <!-- Checks that TODOs have an owner or ticket and are formatted correctly: | 
 |   http://go/java-style#s4.8.6.2-todo-comments | 
 | --> | 
 |     <property name="format" value="TODO[^\(]."/> | 
 |     <property name="message" value="TODOs need to have an owner or ticket specified (see go/tott-486)"/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <!-- Bans the use of System.out.println and associated methods. | 
 | --> | 
 |     <property name="format" value="System\.[\a-z]+\.println"/> | 
 |     <property name="message" value="Use a logger, not System's println."/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <!-- Bans the use of System#currentTimeMillis. | 
 | --> | 
 |     <property name="format" value="System\.currentTimeMillis"/> | 
 |     <property name="message" value="System.currentTimeMillis is strongly discouraged. There is almost no situation where it is the correct choice. See the java.time libraries instead."/> | 
 |   </module> | 
 |   <!-- Other libraries from: | 
 | https://engdoc.corp.google.com/eng/doc/devguide/java/practices/javatime.md | 
 | --> | 
 |   <module name="RegexpSingleline"> | 
 |     <property name="format" value="LocalDate\.now"/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <property name="format" value="LocalDateTime\.now"/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <property name="format" value="LocalTime\.now"/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <property name="format" value="OffsetDateTime\.now"/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <property name="format" value="ZonedDateTime\.now"/> | 
 |   </module> | 
 |   <module name="RegexpSingleline"> | 
 |     <property name="format" value="Clock\.systemDefaultZone"/> | 
 |   </module> | 
 |   <!-- All Java AST specific tests live under TreeWalker module. --> | 
 |   <module name="TreeWalker"> | 
 |     <!-- | 
 | IMPORT CHECKS | 
 | --> | 
 |     <module name="RedundantImport"> | 
 |       <property name="severity" value="error"/> | 
 |     </module> | 
 |     <module name="AvoidStarImport"> | 
 |       <property name="severity" value="error"/> | 
 |     </module> | 
 |     <module name="IllegalImport"> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="illegalPkgs" value="com.sun, com.apache.beam.repackaged, jdk.internal, javax.annotation.concurrent, jdk.nashorn.internal, avro.shaded, jersey.repackaged"/> | 
 |       <property name="illegalClasses" value="javax.annotation.Nullable, edu.umd.cs.findbugs.annotations.Nullable, com.google.inject.Inject, com.google.inject.BindingAnnotation, com.google.inject.Named, com.google.inject.Singleton, com.google.inject.ScopeAnnotation, java.util.Date, java.util.Calendar, jdk.nashorn.internal.ir.annotations.Immutable"/> | 
 |     </module> | 
 |     <!-- ENCODING AND FORMAT CHECKS --> | 
 |     <module name="IllegalTokenText"> | 
 |       <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/> | 
 |       <property name="format" value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/> | 
 |       <property name="message" value="Consider using special escape sequence instead of octal value or Unicode escaped value."/> | 
 |     </module> | 
 |     <module name="AvoidEscapedUnicodeCharacters"> | 
 |       <property name="allowEscapesForControlCharacters" value="true"/> | 
 |       <property name="allowByTailComment" value="true"/> | 
 |       <property name="allowNonPrintableEscapes" value="true"/> | 
 |     </module> | 
 |     <module name="EmptyLineSeparator"> | 
 |       <!-- go/java-style#s4.6.1-vertical-whitespace --> | 
 |       <property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF"/> | 
 |       <property name="allowNoEmptyLineBetweenFields" value="true"/> | 
 |     </module> | 
 |     <!-- | 
 | JAVADOC CHECKS | 
 | --> | 
 |     <!-- FORK: This policy was edited to use open-source implementation. --> | 
 |     <!-- <module name="com.google.devtools.checkstyle.checks.javadoc.GoogleJavadocTypeCheck"> --> | 
 |     <module name="JavadocType"> | 
 |       <!-- Item 28 - Write doc comments for all exposed API elements. --> | 
 |       <!-- Ensure all classes with visibility greater than or equal to | 
 |   protected have class level documentation. --> | 
 |       <property name="scope" value="protected"/> | 
 |       <!-- Style guide doesn't prohibit custom tags. Typos will be caught by other tools. --> | 
 |       <property name="allowUnknownTags" value="true"/> | 
 |       <property name="allowMissingParamTags" value="true"/> | 
 |       <message key="javadoc.missing" value="Missing a Javadoc comment."/> | 
 |     </module> | 
 |     <module name="JavadocMethod"> | 
 |       <property name="scope" value="public"/> | 
 |       <property name="allowMissingParamTags" value="true"/> | 
 |       <property name="allowMissingThrowsTags" value="true"/> | 
 |       <property name="allowMissingReturnTag" value="true"/> | 
 |       <property name="allowUndeclaredRTE" value="true"/> | 
 |       <property name="allowMissingPropertyJavadoc" value="true"/> | 
 |       <property name="allowedAnnotations" value="Override, Test, Before, After, BeforeClass, AfterClass, "/> | 
 |       <property name="allowThrowsTagsForSubclasses" value="true"/> | 
 |     </module> | 
 |     <module name="MissingJavadocMethod"> | 
 |       <property name="severity" value="warning"/> | 
 |       <property name="scope" value="public"/> | 
 |       <property name="minLineCount" value="2"/> | 
 |       <property name="allowedAnnotations" value="Override, Test, Provides"/> | 
 |     </module> | 
 |     <module name="NonEmptyAtclauseDescription"/> | 
 |     <module name="SummaryJavadoc"> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="forbiddenSummaryFragments" value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/> | 
 |     </module> | 
 |     <module name="InvalidJavadocPosition"/> | 
 |     <module name="JavadocParagraph"/> | 
 |     <module name="AtclauseOrder"> | 
 |       <property name="tagOrder" value="@param, @return, @throws, @deprecated"/> | 
 |       <property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/> | 
 |     </module> | 
 |     <!-- | 
 | NAMING CHECKS | 
 | --> | 
 |     <!-- Item 38 - Adhere to generally accepted naming conventions --> | 
 |     <module name="PackageName"> | 
 |       <!-- Validates identifiers for package names against the | 
 |   supplied expression. --> | 
 |       <property name="format" value="^([a-z][a-z0-9]*)(\.[a-z][a-z0-9]*)*$"/> | 
 |       <property name="severity" value="error"/> | 
 |       <message key="name.invalidPattern" value="Package name ''{0}'' must match pattern ''{1}''."/> | 
 |     </module> | 
 |     <module name="TypeNameCheck"> | 
 |       <!-- Validates static, final fields against the supplied expression. --> | 
 |       <metadata name="altname" value="TypeName"/> | 
 |       <property name="format" value="^[A-Z][a-zA-Z0-9]*(_CustomFieldSerializer)?$"/> | 
 |     </module> | 
 |     <module name="MemberNameCheck"> | 
 |       <!-- Validates non-static members against the supplied expression. --> | 
 |       <metadata name="altname" value="MemberName"/> | 
 |       <property name="applyToPublic" value="true"/> | 
 |       <property name="applyToProtected" value="true"/> | 
 |       <property name="applyToPackage" value="true"/> | 
 |       <property name="applyToPrivate" value="true"/> | 
 |       <!-- allows for googles deprecated foo_ member naming scheme --> | 
 |       <property name="format" value="^[a-z][a-zA-Z0-9]*_?$"/> | 
 |     </module> | 
 |     <module name="MethodNameCheck"> | 
 |       <!-- Validates identifiers for method names. --> | 
 |       <metadata name="altname" value="MethodName"/> | 
 |       <property name="format" value="^([a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*|__constructor__|__staticInitializer__)$"/> | 
 |       <property name="severity" value="error"/> | 
 |     </module> | 
 |     <module name="ParameterName"> | 
 |       <!-- Validates identifiers for method parameters against the | 
 |   expression "^[a-z][a-zA-Z0-9]*$". --> | 
 |       <property name="severity" value="error"/> | 
 |     </module> | 
 |     <module name="LambdaParameterName"> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/> | 
 |       <message key="name.invalidPattern" value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/> | 
 |     </module> | 
 |     <module name="CatchParameterName"> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/> | 
 |       <message key="name.invalidPattern" value="Catch parameter name ''{0}'' must match pattern ''{1}''."/> | 
 |     </module> | 
 |     <module name="LocalFinalVariableName"> | 
 |       <!-- Validates identifiers for local final variables against the | 
 |   expression "^[a-z][a-zA-Z0-9]*$". --> | 
 |       <property name="severity" value="error"/> | 
 |     </module> | 
 |     <module name="LocalVariableName"> | 
 |       <!-- Validates identifiers for local variables against the | 
 |   expression "^[a-z][a-zA-Z0-9]*$". --> | 
 |       <property name="severity" value="error"/> | 
 |     </module> | 
 |     <module name="ClassTypeParameterName"> | 
 |       <!-- Class generic type. go/java-style/#s5.2.8-type-variable-names --> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> | 
 |       <message key="name.invalidPattern" value="Class type name ''{0}'' must match pattern ''{1}''."/> | 
 |     </module> | 
 |     <module name="MethodTypeParameterName"> | 
 |       <!-- Method generic type. go/java-style/#s5.2.8-type-variable-names --> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> | 
 |       <message key="name.invalidPattern" value="Method type name ''{0}'' must match pattern ''{1}''."/> | 
 |     </module> | 
 |     <module name="InterfaceTypeParameterName"> | 
 |       <!-- Interface generic type. go/java-style/#s5.2.8-type-variable-names --> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> | 
 |       <message key="name.invalidPattern" value="Interface type name ''{0}'' must match pattern ''{1}''."/> | 
 |     </module> | 
 |     <module name="AbbreviationAsWordInName"> | 
 |       <property name="ignoreFinal" value="false"/> | 
 |       <property name="allowedAbbreviationLength" value="1"/> | 
 |     </module> | 
 |     <module name="AnnotationLocation"> | 
 |       <property name="id" value="AnnotationLocationMostCases"/> | 
 |       <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/> | 
 |     </module> | 
 |     <module name="AnnotationLocation"> | 
 |       <property name="id" value="AnnotationLocationVariables"/> | 
 |       <property name="tokens" value="VARIABLE_DEF"/> | 
 |       <property name="allowSamelineMultipleAnnotations" value="true"/> | 
 |     </module> | 
 |     <!-- | 
 | LENGTH and CODING CHECKS | 
 | --> | 
 |     <module name="OperatorWrap"> | 
 |       <property name="option" value="NL"/> | 
 |       <property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,                  LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/> | 
 |     </module> | 
 |     <module name="OneTopLevelClass"/> | 
 |     <!-- Checks for braces around if and else blocks --> | 
 |     <module name="NeedBraces"> | 
 |       <property name="severity" value="error"/> | 
 |       <property name="tokens" value="LITERAL_IF, LITERAL_ELSE, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO"/> | 
 |     </module> | 
 |     <!-- Ensures the use of style arrays and not C++-style arrays: | 
 | http://go/java-style#s4.8.3.2-array-declarations --> | 
 |     <module name="ArrayTypeStyle"/> | 
 |     <module name="EmptyCatchBlock"> | 
 |       <property name="exceptionVariableName" value="expected"/> | 
 |     </module> | 
 |     <!-- Overloaded methods should always be grouped together. --> | 
 |     <module name="OverloadMethodsDeclarationOrder"/> | 
 |     <!-- http://go/java-style#s4.8.2.2-variables-limited-scope --> | 
 |     <module name="VariableDeclarationUsageDistance"/> | 
 |     <module name="EqualsAvoidNull"/> | 
 |     <!-- http://go/java-style#s6.4-finalizers --> | 
 |     <module name="NoFinalizer"/> | 
 |   </module> | 
 | </module> |