<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
	  "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
	  "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">

<module name="Checker">
    <property name="severity" value="error"/>
    <!--<module name="SuppressionFilter">-->
        <!--<property name="file" value="${checkstyle.suppressions.file}"/>-->
    <!--</module>-->
    <module name="Translation">
        <property name="severity" value="error"/>
    </module>
    <module name="PackageHtml"/>
    <!-- Duplicate Code -->
    <module name="StrictDuplicateCode">
        <property name="min" value="20"/>
    </module>
    <!--<module name="NewlineAtEndOfFile"/>-->


    <module name="TreeWalker">
        <!--<property name="cacheFile" value="checkstyle.cache}"/>-->

        <!-- javadoc -->
        <module name="JavadocType">
            <property name="scope" value="private"/>
            <property name="authorFormat" value=".+"/>
        </module>
        <module name="JavadocMethod">
            <property name="scope" value="package"/>
            <property name="allowMissingParamTags" value="true"/>
            <property name="allowMissingThrowsTags" value="true"/>
            <property name="allowMissingReturnTag" value="true"/>
        </module>
        <module name="JavadocVariable">
            <property name="scope" value="package"/>
        </module>
        <module name="JavadocStyle">
            <property name="scope" value="public"/>
            <property name="checkFirstSentence" value="false"/>
        </module>

        <!-- Naming Conventions -->
        <module name="ConstantName"/>
        <module name="MethodName"/>
        <module name="StaticVariableName"/>
        <module name="LocalFinalVariableName"/>
        <module name="LocalVariableName"/>
        <module name="MemberName"/>
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
        </module>
        <module name="ParameterName"/>
        <module name="TypeName"/>

        <!-- Header -->
        <module name="Header">
            <property name="headerFile" value="${checkstyle.header.file}"/>
        </module>

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

        <!-- Size Violations -->
        <module name="FileLength">
            <property name="max" value="1400"/>
        </module>
        <module name="LineLength">
            <property name="max" value="140"/>
            <property name="ignorePattern" value="^ *\* *"/>
        </module>
        <module name="MethodLength">
            <property name="max" value="200"/>
            <property name="tokens" value="METHOD_DEF"/>
        </module>
        <module name="MethodLength">
            <property name="max" value="60"/>
            <property name="tokens" value="CTOR_DEF"/>
        </module>
        <module name="ParameterNumber">
            <property name="max" value="10"/>
            <property name="tokens" value="METHOD_DEF"/>
        </module>
        <module name="ParameterNumber">
            <property name="max" value="10"/>
            <property name="tokens" value="CTOR_DEF"/>
        </module>
        <module name="AnonInnerLength">
            <property name="max" value="20"/>
        </module>
        <module name="ExecutableStatementCount">
            <property name="max" value="20"/>
            <property name="tokens" value="CTOR_DEF, INSTANCE_INIT, STATIC_INIT"/>
        </module>

        <!-- Whitespace -->
        <module name="EmptyForInitializerPad"/>
        <module name="EmptyForIteratorPad"/>
        <module name="MethodParamPad"/>



        <module name="NoWhitespaceAfter">
            <property name="allowLineBreaks" value="false"/>
        </module>
        <module name="NoWhitespaceBefore">
            <property name="allowLineBreaks" value="false"/>
        </module>
        <module name="ParenPad"/>
        <module name="WhitespaceAfter">
            <property name="tokens" value="COMMA, SEMI"/>
        </module>
        <module name="WhitespaceAround">
            <property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LCURLY, LE, LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN, STAR, STAR_ASSIGN"/>
            </module>
        <module name="OperatorWrap">
            <property name="tokens" value="ASSIGN, DIV_ASSIGN, PLUS_ASSIGN, MINUS_ASSIGN, STAR_ASSIGN, MOD_ASSIGN, SR_ASSIGN, BSR_ASSIGN, SL_ASSIGN, BXOR_ASSIGN, BOR_ASSIGN, BAND_ASSIGN"/>
            <property name="option" value="eol"/>
        </module>
        <module name="TabCharacter"/>

        <module name="ModifierOrder"/> 
        <module name="RedundantModifier"/>

        <!-- Blocks -->
        <module name="EmptyBlock">
            <property name="option" value="text"/>
            <property name="tokens" value="LITERAL_CATCH"/>
        </module>
        <module name="EmptyBlock">
            <property name="tokens" value="LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF, LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, STATIC_INIT"/>
        </module>
        <module name="RightCurly">
            <property name="option" value="same"/>
        </module>
        <module name="LeftCurly"/>
        <module name="NeedBraces"/>
        <module name="AvoidNestedBlocks">
            <property name="allowInSwitchCase" value="true"/>
        </module>

        <!-- Coding Problems -->
        <module name="ArrayTrailingComma"/>
        <module name="CovariantEquals"/>
        <module name="DeclarationOrder"/>
        <module name="ParameterAssignment"/>
        <module name="ExplicitInitialization"/>
        <module name="DefaultComesLast"/>
        <module name="FallThrough"/>
        <module name="MultipleVariableDeclarations"/>
        <module name="DoubleCheckedLocking"/>
        <module name="EmptyStatement"/>
        <module name="HiddenField">
            <property name="tokens" value="VARIABLE_DEF"/>
        </module>
        <module name="IllegalInstantiation">
            <property name="classes" value="java.lang.Boolean"/>
        </module>
        <module name="IllegalTokenText">
            <property name="tokens" value="NUM_INT,NUM_LONG"/>
            <property name="format" value="^0[^lx]"/>
            <property name="ignoreCase" value="true"/>
        </module>
        <module name="IllegalType">
            <property name="ignoredMethodNames" value="getInstance"/>
            <property name="tokens" value="PARAMETER_DEF, METHOD_DEF"/>
        </module>
        <module name="InnerAssignment"/>
        <module name="JUnitTestCase"/>
        <module name="ReturnCount">
            <property name="max" value="5"/>
        </module>
        <module name="NestedIfDepth">
            <property name="max" value="2"/>
        </module>
        <module name="NestedTryDepth">
            <property name="max" value="2"/>
        </module>
        <module name="PackageDeclaration"/>
        <!--<module name="RedundantThrows"> buggy
            <property name="allowUnchecked" value="true"/>
        </module> -->
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>
        <module name="StringLiteralEquality"/>
        <module name="SuperClone"/>
        <module name="SuperFinalize"/>
        <module name="MagicNumber"/>
        <module name="EqualsHashCode"/>
        <module name="IllegalInstantiation"/>
        <module name="InnerAssignment"/>


        <module name="MissingSwitchDefault"/>


        <!-- Class Design -->
        <module name="FinalClass"/>
        <module name="HideUtilityClassConstructor"/>
        <module name="InterfaceIsType"/>
        <module name="MutableException"/>
        <module name="ThrowsCount">
            <property name="max" value="3"/>
        </module>
        <module name="VisibilityModifier">
            <property name="protectedAllowed" value="true"/>
        </module>

        <!-- Metrics -->
        <module name="BooleanExpressionComplexity">
            <property name="max" value="4"/>
        </module>
        <module name="ClassDataAbstractionCoupling">
            <property name="max" value="10"/>
        </module>
        <module name="ClassFanOutComplexity">
            <property name="max" value="30"/>
        </module>
        <module name="CyclomaticComplexity">
            <property name="severity" value="error"/>
            <property name="max" value="10"/>
        </module>
        <module name="NPathComplexity">
            <property name="max" value="50"/>
        </module>

        <!-- Miscellaneous -->
        <module name="GenericIllegalRegexp">
            <!-- . matches any character, so we need to
                 escape it and use \. to match dots. -->
            <property name="format" value="System\.out\.println"/>
        </module>
        <!-- Make sure we are using safe element.get methods everywhere -->
        <module name="GenericIllegalRegexp">
            <!-- . matches any character, so we need to
                 escape it and use \. to match dots. -->
            <property name="format" value="[^entry]\\.getKey\\(\\)"/>
        </module>
        <module name="GenericIllegalRegexp">
            <!-- . matches any character, so we need to
                 escape it and use \. to match dots. -->
            <property name="format" value="[^entry]\\.getValue\\(\\)"/>
        </module>
        <module name="ArrayTypeStyle"/>
        <module name="TodoComment"/>
        <module name="TrailingComment"/>
        <module name="UpperEll"/>


    </module>
</module>
