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

<module name="Checker">
  <module name="Translation"/>
  <module name="SuppressionCommentFilter"/>
  <module name="TreeWalker">
    <property name="cacheFile" value="output/checkstyle.cache"/>
    <property name="tabWidth" value="4"/>

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

    <!-- Headers -->
    <module name="RegexpHeader">
      <property name="headerFile" value="${checkstyle.header.file}"/>
      <property name="multiLines" value="6"/>
    </module>

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

    <!-- Size violations -->
    <module name="ExecutableStatementCount">
      <property name="max" value="170"/> <!-- TODO reduce to 60 or even the default 30 -->
    </module>
    <module name="FileLength">
      <property name="max" value="2500"/> <!-- TODO reduce to default 2000 -->
    </module>
    <!--
    <module name="LineLength"/>
    -->
    <module name="MethodLength">
      <property name="max" value="250"/> <!-- TODO change back to default 150 after fixing process methods -->
    </module>
    <module name="AnonInnerLength">
      <property name="max" value="60"/> <!-- TODO reduce to 40 or even the default 20 -->
    </module>
    <module name="ParameterNumber">
      <property name="max" value="8"/> <!-- TODO change back to default 7 after fixing RoResponseGenerator -->
    </module>

    <!-- Whitespace -->
    <module name="EmptyForInitializerPad"/>
    <module name="EmptyForIteratorPad"/>
    <module name="MethodParamPad"/>
    <module name="NoWhitespaceAfter">
      <property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS"/>
    </module>
    <module name="NoWhitespaceBefore"/>
    <module name="OperatorWrap">
      <property name="option" value="eol"/>
      <property name="tokens" value="ASSIGN"/>
    </module>

    <module name="ParenPad"/>
    <module name="TypecastParenPad"/>
    <module name="TabCharacter"/>
    <module name="WhitespaceAfter"/>
    <module name="WhitespaceAround">
      <!-- all default values except from GENERIC_START and GENERIC_END -->
      <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, TYPE_EXTENSION_AND"/>
      <property name="allowEmptyConstructors" value="true"/>
      <property name="allowEmptyMethods " value="true"/>
    </module>

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

    <!-- Blocks -->
    <module name="AvoidNestedBlocks"/>
    <module name="EmptyBlock">
      <property name="tokens"
                value="LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, STATIC_INIT"/>
    </module>
    <module name="LeftCurly"/>
    <module name="NeedBraces"/>
    <module name="RightCurly"/>

    <!-- Checks for coding problems -->
    <module name="CovariantEquals"/>
    <module name="DoubleCheckedLocking"/>
    <module name="EmptyStatement"/>
    <module name="EqualsHashCode"/>
    <module name="HiddenField">
      <property name="tokens" value="VARIABLE_DEF"/>
    </module>
    <module name="IllegalInstantiation"/>
    <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="InnerAssignment"/>
    -->
    <module name="MissingSwitchDefault"/>
    <!--
    <module name="ModifiedControlVariable"/>
     -->
    <module name="SimplifyBooleanExpression"/>
    <module name="SimplifyBooleanReturn"/>
    <module name="NestedIfDepth">
      <property name="max" value="4"/> <!-- TODO reduce to 2 -->
    </module>
    <module name="NestedTryDepth">
      <property name="max" value="2"/>
    </module>
    <module name="SuperClone"/>
    <module name="SuperFinalize"/>
    <module name="IllegalCatch">
      <property name="illegalClassNames" value="java.lang.Error, java.lang.Throwable"/>
    </module>
    <module name="IllegalThrows">
      <property name="illegalClassNames" value="java.lang.Error, java.lang.RuntimeException"/>
    </module>
    <module name="PackageDeclaration"/>
    <!-- unfortunately, this module is broken because it checks for all methods setup not only for methods of the testcase
    <module name="JUnitTestCase"/>
    -->
    <!--
    <module name="IllegalType"/>  TODO fix the 53 issues caused by this setting!
    -->
    <!--
    <module name="DeclarationOrder"/>
    -->
    <module name="DefaultComesLast"/>
    <module name="FallThrough"/>

    <!-- Design checks -->
    <!--
    <module name="DesignForExtension"/>
    -->
    <module name="FinalClass"/>
    <module name="HideUtilityClassConstructor"/>
    <!-- we have a few "enum" interfaces :(
    <module name="InterfaceIsType"/>
    -->
    <module name="MutableException"/>
    <!-- TODO fix KeyStoreToolHelper, then re-enable
    <module name="ThrowsCount">
      <property name="max" value="3"/>
    </module>
    -->
    <module name="VisibilityModifier">
      <property name="publicMemberPattern" value="^[a-zA-Z0-9]*$"/>
      <property name="packageAllowed " value="true"/>
      <property name="protectedAllowed " value="true"/>
    </module>

    <!-- Miscellaneous -->
    <module name="ArrayTypeStyle"/>
    <!--
    <module name="FinalParameters"/>
    -->
    <!--
    <module name="Indentation">
      <property name="basicOffset" value="2"/>
      <property name="caseIndent" value="0"/>
    </module>
    -->
    <module name="UpperEll"/>

    <!-- Javadoc checks -->
    <module name="JavadocStyle">
      <property name="scope" value="private"/>
      <property name="checkEmptyJavadoc" value="true"/>
    </module>
    <module name="JavadocType">
      <property name="scope" value="protected"/>
      <!--
      <property name="authorFormat" value="\S"/>
      -->
    </module>
    <!-- TODO activate later
    <module name="JavadocMethod">
      <property name="scope" value="public"/>
      <property name="allowUndeclaredRTE " value="true"/>
      <property name="allowThrowsTagsForSubclasses" value="true"/>
      <property name="allowMissingParamTags " value="true"/>
      <property name="allowMissingThrowsTags " value="true"/>
      <property name="allowMissingReturnTag " value="true"/>
    </module>
    <module name="JavadocVariable">
      <property name="scope" value="public"/>
    </module>
    -->

    <module name="GenericIllegalRegexp">
      <property name="message" value="no TODO in JavaDoc"/>
      <property name="ignoreCase" value="true"/>
      <property name="format" value="(\/\*\*|\s+\*)\s*(TODO|HACK|FIXME)"/>
    </module>

    <module name="GenericIllegalRegexp">
      <property name="message" value="Default IDEA comment"/>
      <property name="ignoreCase" value="true"/>
      <property name="format" value="\*\s*Created by IntelliJ IDEA"/>
    </module>

    <module name="FileContentsHolder"/>
  </module>
</module>

