<?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">

<module name="Checker">
    <property name="charset" value="UTF-8" />

    <!-- No tabs -->
    <module name="FileTabCharacter" />

    <module name="SuppressWarningsFilter" />

    <!-- copyright -->
    <module name="RegexpHeader">
        <property name="headerFile" value="${checkstyle.header.file}" />
        <property name="fileExtensions" value="java" />
    </module>

    <module name="LineLength">
        <property name="max" value="120" />
        <property name="ignorePattern" value="^ *\* *[^ ]+$|(\s+\/\/\$NON-NLS-\d+\$)+$"/>
    </module>

    <module name="SuppressWithPlainTextCommentFilter">
      <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
      <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
      <property name="checkFormat" value="$1"/>
    </module>

    <module name="TreeWalker">
        <module name="SuppressWarningsHolder" />

        <!-- imports -->
        <module name="UnusedImports" />
        <module name="AvoidStarImport" />
        <module name="RedundantImport" />

        <!-- naming conventions -->
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z_][a-z0-9_]*)*$"/>
        </module>
        <module name="AbbreviationAsWordInName">
            <property name="allowedAbbreviationLength" value="1" />
            <property name="allowedAbbreviations" value="IT" />
        </module>
        <module name="ConstantName" >
            <property name="format" value="^Messages?|[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$" />
        </module>
        <module name="LocalFinalVariableName" />
        <module name="LocalVariableName">
            <property name="allowOneCharVarInForLoop" value="true" />
        </module>
        <module name="MemberName" />
        <module name="ParameterName">
            <property name="format" value="^__?|^[a-z][a-zA-Z0-9]*$" />
            <property name="ignoreOverridden" value="true" />
        </module>
        <module name="TypeName">
            <property name="format" value="^I[a-zA-Z0-9]*$" />
            <property name="tokens" value="INTERFACE_DEF" />
        </module>
        <module name="TypeName">
            <property name="tokens" value="CLASS_DEF, ENUM_DEF, ANNOTATION_DEF" />
        </module>

        <!-- Annotations -->
        <module name="AnnotationUseStyle">
            <property name="elementStyle" value="compact" />
        </module>
        <module name="MissingDeprecated" />
        <module name="PackageAnnotation" />
        <module name="AnnotationLocation">
            <property name="allowSamelineMultipleAnnotations" value="false" />
            <property name="allowSamelineSingleParameterlessAnnotation" value="true" />
            <property name="allowSamelineParameterizedAnnotation" value="true" />
            <property name="tokens" value="VARIABLE_DEF" />
        </module>
        <module name="AnnotationLocation">
            <property name="allowSamelineMultipleAnnotations" value="false" />
            <property name="allowSamelineSingleParameterlessAnnotation" value="true" />
            <property name="allowSamelineParameterizedAnnotation" value="true" />
            <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF" />
        </module>

        <!-- Identifiers -->
        <module name="RedundantModifier" />
        <module name="ModifierOrder" />

        <module name="LeftCurly">
            <property name="option" value="nl" />
            <property name="tokens" value="INTERFACE_DEF, CLASS_DEF, ANNOTATION_DEF, ENUM_DEF, CTOR_DEF, METHOD_DEF, ENUM_CONSTANT_DEF, LITERAL_WHILE, LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_SYNCHRONIZED, LITERAL_SWITCH, LITERAL_DO, LITERAL_IF, LITERAL_ELSE, LITERAL_FOR, STATIC_INIT, OBJBLOCK" />
        </module>
        <module name="LeftCurly">
            <property name="option" value="eol" />
            <property name="tokens" value="LAMBDA" />
        </module>

        <module name="RightCurly">
            <property name="option" value="alone" />
        </module>

        <module name="AvoidNestedBlocks">
            <property name="allowInSwitchCase" value="true" />
        </module>
        <module name="EmptyBlock">
            <property name="option" value="text" />
        </module>

        <module name="GenericWhitespace" />
        <module name="MethodParamPad" />
        <module name="NoLineWrap" />
        <module name="NoWhitespaceAfter">
            <property name="tokens" value="INC, DEC, UNARY_MINUS, UNARY_PLUS, BNOT, LNOT, DOT, INDEX_OP, METHOD_REF" />
        </module>
        <module name="NoWhitespaceBefore">
            <property name="tokens" value="DOT" />
            <property name="allowLineBreaks" value="true" />
        </module>
        <module name="NoWhitespaceBefore">
            <property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, ELLIPSIS" />
            <property name="allowLineBreaks" value="false" />
        </module>
        <module name="SeparatorWrap">
            <property name="tokens" value="COMMA" />
            <property name="option" value="eol" />
        </module>
        <module name="SeparatorWrap">
            <property name="tokens" value="DOT" />
            <property name="option" value="nl" />
        </module>
        <module name="SingleSpaceSeparator" />
        <module name="TypecastParenPad" />
        <module name="WhitespaceAfter">
            <property name="tokens" value="COMMA, SEMI, LITERAL_IF, LITERAL_ELSE, LITERAL_WHILE, LITERAL_DO, LITERAL_FOR, DO_WHILE" />
        </module>
        <module name="WhitespaceAround">
            <property name="allowEmptyLambdas" value="true" />
        </module>
        <!--module name="ParenPad" /-->
        <module name="UnnecessaryParentheses" />
        <module name="Indentation">
            <property name="basicOffset" value="4" />
            <property name="lineWrappingIndentation" value="4" />
            <property name="caseIndent" value="0" />
            <property name="throwsIndent" value="4" />
            <property name="forceStrictCondition" value="false" />
        </module>

        <!-- Number format -->
        <module name="UpperEll" />

        <!-- design, coding, misc -->
        <module name="PackageDeclaration" />
        <module name="OneTopLevelClass" />
        <module name="InnerTypeLast" />
        <module name="InterfaceIsType" />
        <module name="HideUtilityClassConstructor" />
        <module name="FinalClass" />
        <module name="EmptyStatement" />
        <module name="CovariantEquals" />
        <module name="EqualsHashCode" />
        <module name="StringLiteralEquality" />
        <module name="InnerAssignment" />
        <module name="MultipleVariableDeclarations" />
        <module name="OneStatementPerLine" />
        <module name="ParameterAssignment" />
        <module name="HiddenField">
            <property name="tokens" value="VARIABLE_DEF" />
        </module>
        <module name="SuperClone" />
        <module name="SuperFinalize" />
        <module name="FallThrough" />
        <module name="MissingSwitchDefault" />
        <module name="NeedBraces" />

        <!-- var -->
        <module name="IllegalType">
            <property name="illegalClassNames" value="var"/>
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="id" value="IllegalVar"/>
        </module>
    </module>
</module>