<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
  "https://checkstyle.org/dtds/configuration_1_3.dtd">

<!--
    Checkstyle configuration that checks the OpenPDF coding conventions.

    This is based on the "Google Java Style", that can be found at https://google.github.io/styleguide/javaguide.html

    We have only 3 minor diferences (because of the existing code):
        1 - Indentation with 4 spaces (instead of 2)
        2 - Continuation Indentation of 8 spaces
        3 - Max. line length of 120 characters

    By now not all rules are active, as the legacy code is not compatible yet. The rules will be activated as the
    code is cleaned up.

    Checkstyle is very configurable. Be sure to read the documentation at
    http://checkstyle.org (or in your downloaded distribution).

    To completely disable a check, just comment it out or delete it from the file.
    To suppress certain violations please review suppression filters.
 -->

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

  <property name="fileExtensions" value="java, properties, xml"/>
  <!-- Excludes all 'module-info.java' files              -->
  <!-- See https://checkstyle.org/config_filefilters.html -->
  <module name="BeforeExecutionExclusionFileFilter">
    <property name="fileNamePattern" value="module\-info\.java$"/>
  </module>
  <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
  <module name="SuppressionFilter">
    <property name="file" value="${org.checkstyle.google.suppressionfilter.config}"
      default="checkstyle-suppressions.xml"/>
    <property name="optional" value="true"/>
  </module>

  <!-- Checks for whitespace                               -->
  <!-- See http://checkstyle.org/config_whitespace.html -->
  <module name="FileTabCharacter">
    <property name="eachLine" value="true"/>
  </module>

  <!-- <module name="LineLength">
    <property name="fileExtensions" value="java"/>
    // OpenPDF: Not fully possible yet due existing code
    <property name="max" value="180"/> // Should be slowly reduced to 120
    <property name="ignorePattern"
      value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
  </module> -->

  <module name="TreeWalker">
    <module name="UnusedImports">
      <property name="processJavadoc" value="true"/>
    </module>
    <module name="OuterTypeFilename"/>

    <!-- deactivated: 8 findings -->
    <!--
    <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>
    -->

    <!-- deactivated: 513 findings -->
    <!-- NOSONAR
        <module name="AvoidEscapedUnicodeCharacters">
          <property name="allowEscapesForControlCharacters" value="true"/>
          <property name="allowByTailComment" value="true"/>
          <property name="allowNonPrintableEscapes" value="true"/>
        </module>
    -->

    <!--<module name="AvoidStarImport"/>-->

    <!-- deactivated: 14 findings -->
    <!--
    <module name="OneTopLevelClass"/>
    -->
    <module name="NoLineWrap">
      <property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
    </module>
    <module name="EmptyBlock">
      <property name="option" value="TEXT"/>
      <property name="tokens"
        value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
    </module>
    <module name="NeedBraces">
      <property name="tokens"
        value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
    </module>

    <module name="LeftCurly">
      <property name="tokens"
        value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
                INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
                LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
                LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
                OBJBLOCK, STATIC_INIT, RECORD_DEF, COMPACT_CTOR_DEF"/>
    </module>
    <module name="RightCurly">
      <property name="id" value="RightCurlySame"/>
      <property name="tokens"
        value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO"/>
    </module>
    <module name="RightCurly">
      <property name="id" value="RightCurlyAlone"/>
      <property name="option" value="alone"/>
      <property name="tokens"
        value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
                        INSTANCE_INIT, ANNOTATION_DEF, ENUM_DEF, INTERFACE_DEF, RECORD_DEF,
                        COMPACT_CTOR_DEF"/>
    </module>

    <module name="SuppressionXpathSingleFilter">
      <!-- suppresion is required till https://github.com/checkstyle/checkstyle/issues/7541 -->
      <property name="id" value="RightCurlyAlone"/>
      <property name="query" value="//RCURLY[parent::SLIST[count(./*)=1]
                                     or preceding-sibling::*[last()][self::LCURLY]]"/>
    </module>

    <module name="WhitespaceAfter">
      <property name="tokens"
        value="COMMA, SEMI, TYPECAST, LITERAL_IF, LITERAL_ELSE, LITERAL_WHILE, LITERAL_DO, LITERAL_FOR, DO_WHILE"/>
    </module>
    <module name="WhitespaceAround">
      <property name="allowEmptyConstructors" value="true"/>
      <property name="allowEmptyLambdas" value="true"/>
      <property name="allowEmptyMethods" value="true"/>
      <property name="allowEmptyTypes" value="true"/>
      <property name="allowEmptyLoops" value="true"/>
      <property name="ignoreEnhancedForColon" value="false"/>
      <property name="tokens"
        value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN,
        DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND, LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
        LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, 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, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
      <message key="ws.notFollowed"
        value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}'
        when not part of a multi-block statement (4.1.3)"/>
      <message key="ws.notPreceded"
        value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
    </module>
    <module name="OneStatementPerLine"/>

    <!-- deactivated: 62 findings -->
    <!-- NOSONAR
        <module name="MultipleVariableDeclarations"/>
    -->

    <module name="ArrayTypeStyle"/>

    <!-- deactivated: 100 findings -->
    <!-- NOSONAR
        <module name="MissingSwitchDefault"/>
    -->

    <module name="FallThrough"/>
    <module name="UpperEll"/>

    <!-- deactivated: 41 findings -->
    <!-- NOSONAR
        <module name="ModifierOrder"/>
    -->

    <module name="EmptyLineSeparator">
      <property name="tokens"
        value="IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF, STATIC_INIT, INSTANCE_INIT, METHOD_DEF,
        CTOR_DEF, VARIABLE_DEF, RECORD_DEF, COMPACT_CTOR_DEF"/> <!-- PACKAGE_DEF should come first -->
      <property name="allowNoEmptyLineBetweenFields" value="true"/>
    </module>

    <module name="SeparatorWrap">
      <property name="id" value="SeparatorWrapDot"/>
      <property name="tokens" value="DOT"/>
      <property name="option" value="nl"/>
    </module>
    <module name="SeparatorWrap">
      <property name="id" value="SeparatorWrapComma"/>
      <property name="tokens" value="COMMA"/>
      <property name="option" value="EOL"/>
    </module>
    <module name="SeparatorWrap">
      <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
      <property name="id" value="SeparatorWrapEllipsis"/>
      <property name="tokens" value="ELLIPSIS"/>
      <property name="option" value="EOL"/>
    </module>
    <module name="SeparatorWrap">
      <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
      <property name="id" value="SeparatorWrapArrayDeclarator"/>
      <property name="tokens" value="ARRAY_DECLARATOR"/>
      <property name="option" value="EOL"/>
    </module>
    <module name="SeparatorWrap">
      <property name="id" value="SeparatorWrapMethodRef"/>
      <property name="tokens" value="METHOD_REF"/>
      <property name="option" value="nl"/>
    </module>
    <module name="PackageName">
      <!-- OpenPDF: Not possible yet due existing code. Exception: Accept _ -->
      <property name="format" value="^[a-z]+(\.[a-z][a-z0-9_]*)*$"/>
      <message key="name.invalidPattern"
        value="Package name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="TypeName">
      <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
                    ANNOTATION_DEF, RECORD_DEF"/>
      <message key="name.invalidPattern"
        value="Type name ''{0}'' must match pattern ''{1}''."/>
    </module>

    <!-- deactivated: 132 findings -->
    <!-- NOSONAR
        <module name="MemberName">
          <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
          <message key="name.invalidPattern"
            value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
    -->
    <!-- deactivated: 151 findings -->
    <!-- NOSONAR
        <module name="ParameterName">
          <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
          <message key="name.invalidPattern"
            value="Parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
    -->

    <module name="LambdaParameterName">
      <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="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>

    <!-- deactivated: 227 findings -->
    <!-- NOSONAR
        <module name="LocalVariableName">
          <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
          <message key="name.invalidPattern"
            value="Local variable name ''{0}'' must match pattern ''{1}''."/>
        </module>
    -->

    <module name="PatternVariableName">
      <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
      <message key="name.invalidPattern"
        value="Pattern variable name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="ClassTypeParameterName">
      <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="RecordTypeParameterName">
      <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
      <message key="name.invalidPattern"
        value="Record type name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="MethodTypeParameterName">
      <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">
      <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="NoFinalizer"/>

    <module name="GenericWhitespace">
      <message key="ws.followed"
        value="GenericWhitespace ''{0}'' is followed by whitespace."/>
      <message key="ws.preceded"
        value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
      <message key="ws.illegalFollow"
        value="GenericWhitespace ''{0}'' should followed by whitespace."/>
      <message key="ws.notPreceded"
        value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
    </module>

    <!-- deactivated: 84 findings -->
    <!-- NOSONAR
        <module name="Indentation">
          <property name="basicOffset" value="4"/>
          <property name="braceAdjustment" value="4"/>
          <property name="caseIndent" value="4"/>
          <property name="throwsIndent" value="8"/>
          <property name="lineWrappingIndentation" value="8"/>
          <property name="arrayInitIndent" value="4"/>
        </module>
    -->
    <!-- deactivated: 535 findings -->
    <!-- NOSONAR
            <module name="AbbreviationAsWordInName">
              <property name="ignoreFinal" value="false"/>
              <property name="allowedAbbreviationLength" value="0"/>
              <property name="tokens"
                value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, ANNOTATION_FIELD_DEF, PARAMETER_DEF,
                VARIABLE_DEF, METHOD_DEF, PATTERN_VARIABLE_DEF, RECORD_DEF, RECORD_COMPONENT_DEF"/>
            </module>
    -->
    <!-- deactivated: 104 findings -->
    <!-- NOSONAR
        <module name="OverloadMethodsDeclarationOrder"/>
    -->
    <!-- deactivated: 168 findings -->
    <!-- NOSONAR
        <module name="VariableDeclarationUsageDistance"/>
    -->

    <!--<module name="CustomImportOrder">
      <property name="sortImportsInGroupAlphabetically" value="true"/>
      <property name="separateLineBetweenGroups" value="true"/>
      <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
      <property name="tokens" value="IMPORT, STATIC_IMPORT, PACKAGE_DEF"/>
    </module>-->
    <module name="MethodParamPad">
      <property name="tokens"
        value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF,
                    SUPER_CTOR_CALL, ENUM_CONSTANT_DEF, RECORD_DEF"/>
    </module>
    <module name="NoWhitespaceBefore">
      <property name="tokens"
        value="COMMA, SEMI, POST_INC, POST_DEC, DOT, LABELED_STAT, METHOD_REF"/>
      <property name="allowLineBreaks" value="true"/>
    </module>
    <module name="ParenPad">
      <property name="tokens"
        value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF, EXPR, LITERAL_CATCH,
        LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE,
        METHOD_CALL, METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA, RECORD_DEF"/>
    </module>

    <!-- deactivated: 76 findings -->
    <!-- NOSONAR
        <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="AnnotationLocation">
      <property name="id" value="AnnotationLocationMostCases"/>
      <property name="tokens"
        value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF,
                                  RECORD_DEF, COMPACT_CTOR_DEF"/>
    </module>
    <module name="AnnotationLocation">
      <property name="id" value="AnnotationLocationVariables"/>
      <property name="tokens" value="VARIABLE_DEF"/>
      <property name="allowSamelineMultipleAnnotations" value="true"/>
    </module>

    <!-- deactivated: 57 findings -->
    <!-- NOSONAR
        <module name="NonEmptyAtclauseDescription"/>
    -->
    <!-- deactivated: 12 findings -->
    <!--
        <module name="InvalidJavadocPosition"/>
    -->
    <!-- deactivated: 121 findings -->
    <!--
        <module name="JavadocTagContinuationIndentation"/>
    -->
    <!-- deactivated: 2275 findings -->
    <!--
        <module name="SummaryJavadoc">
          <property name="forbiddenSummaryFragments"
            value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
        </module>
    -->
    <!-- deactivated: 941 findings -->
    <!-- NOSONAR
        <module name="JavadocParagraph"/>
    -->

    <module name="RequireEmptyLineBeforeBlockTagGroup"/>
    <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>
    <module name="JavadocMethod">
      <property name="accessModifiers" value="public"/>
      <property name="allowMissingParamTags" value="true"/>
      <property name="allowMissingReturnTag" value="true"/>
      <property name="allowedAnnotations" value="Override, Test"/>
      <property name="tokens"
        value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF, COMPACT_CTOR_DEF"/>
    </module>

    <!-- deactivated: 288 findings -->
    <!--
        <module name="MissingJavadocMethod">
          <property name="scope" value="public"/>
          <property name="minLineCount" value="2"/>
          <property name="allowedAnnotations" value="Override, Test"/>
          <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF, COMPACT_CTOR_DEF"/>
        </module>
    -->
    <!-- deactivated: 81 findings -->
    <!--
        <module name="MissingJavadocType">
          <property name="scope" value="protected"/>
          <property name="tokens"
            value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, RECORD_DEF, ANNOTATION_DEF"/>
          <property name="excludeScope" value="nothing"/>
        </module>
    -->
    <!-- deactivated: 53 findings -->
    <!-- NOSONAR
        <module name="MethodName">
          <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
          <message key="name.invalidPattern"
            value="Method name ''{0}'' must match pattern ''{1}''."/>
        </module>
    -->

    <module name="SingleLineJavadoc">
      <property name="ignoreInlineTags" value="false"/>
    </module>

    <!-- deactivated: 37 findings -->
    <!--
        <module name="EmptyCatchBlock">
          <property name="exceptionVariableName" value="expected"/>
        </module>
    -->
    <!-- deactivated: 94 findings -->
    <!--
        <module name="CommentsIndentation">
          <property name="tokens" value="SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN"/>
        </module>
    -->

    <!-- https://checkstyle.org/config_filters.html#SuppressionXpathFilter -->
    <module name="SuppressionXpathFilter">
      <property name="file" value="${org.checkstyle.google.suppressionxpathfilter.config}"
        default="checkstyle-xpath-suppressions.xml"/>
      <property name="optional" value="true"/>
    </module>
  </module>
</module>