<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://www.checkstyle.org/dtds/configuration_1_3.dtd">

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

    <module name="Header">
        <property name="header" value=""/>
    </module>

    <module name="SuppressionFilter">
        <property name="file" value="${config_loc}/suppressions.xml"/>
    </module>

    <module name="BeforeExecutionExclusionFileFilter">
        <property name="fileNamePattern" value="module\-info\.java$"/>
    </module>

    <module name="FileTabCharacter"/>
    <module name="NewlineAtEndOfFile"/>

    <!-- Prevent empty start and end of blocks - source: comments to https://stackoverflow.com/a/48027770/873282 -->
    <module name="RegexpMultiline">
        <property name="message" value="Blank line at start of block should be removed" />
        <property name="format" value="(\(.*\)|else)\s*\{\s*[\r]?\n\s*[\r]?\n" />
        <property name="fileExtensions" value="groovy,java" />
    </module>
    <module name="RegexpMultiline">
        <property name="message" value="Blank line at end of block should be removed" />
        <property name="format" value="[\r]?\n\s*[\r]?\n\s*\}" />
        <property name="fileExtensions" value="groovy,java" />
    </module>

    <!-- Prevent newline after catch opening parenthesis -->
    <module name="RegexpMultiline">
        <property name="message" value="No newline allowed after catch opening parenthesis" />
        <property name="format" value="catch\s*\(\s*[\r]?\n" />
        <property name="fileExtensions" value="groovy,java" />
    </module>

    <!-- Checks for size violations: https://checkstyle.sourceforge.io/config_sizes.html -->

    <!-- LineLength not in place as PreviewerViewer and RelatedArticlesTab have line length with more than 500 charachters -->

    <module name="TreeWalker">
        <!-- Checks for Javadoc comments: https://checkstyle.org/config_javadoc.html -->
        <module name="InvalidJavadocPosition"/>
        <module name="JavadocMethod">
            <property name="allowMissingParamTags" value="true"/>
            <property name="allowMissingReturnTag" value="true"/>
        </module>
        <module name="RequireEmptyLineBeforeBlockTagGroup"/>
        <module name="JavadocMissingLeadingAsteriskCheck"/>

        <!-- Checks for imports: https://checkstyle.org/config_import.html -->

        <module name="UnusedImports"/>
        <module name="RedundantImport"/>
        <module name="AvoidStarImport"/>
        <module name="IllegalImport"/>
        <module name="ImportOrder">
            <property name="groups" value="java,javax,javafx,org.jabref,*"/>
            <property name="ordered" value="true"/>
            <property name="separated" value="true"/>
            <property name="option" value="bottom"/>
            <property name="sortStaticImportsAlphabetically" value="true"/>
        </module>

        <!-- Checks for whitespace: https://checkstyle.org/config_whitespace.html -->

        <module name="EmptyForInitializerPad"/>
        <module name="EmptyLineSeparator">
            <!-- check all except variable declarations -->
            <property name="tokens"
                      value="IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF, STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF"/>
            <property name="allowMultipleEmptyLines" value="false"/>
            <property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
        </module>
        <module name="GenericWhitespace"/>
        <module name="MethodParamPad"/>
        <module name="NoLineWrap"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="ParenPad"/>
        <module name="SeparatorWrap">
            <property name="tokens" value="COMMA, SEMI, ELLIPSIS, ARRAY_DECLARATOR, RBRACK, METHOD_REF"/>
        </module>
        <module name="SingleSpaceSeparator"/>
        <module name="NoWhitespaceBeforeCaseDefaultColon"/>
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround">
            <!-- RCULRY causes issues if classes are nested within arrays, therefore not activated -->
            <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, 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,
                      SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
        </module>

        <!-- Checks for Naming Conventions: https://checkstyle.org/config_naming.html -->
        <module name="ConstantName">
            <property name="format" value="^log(ger)?|[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
        </module>
        <module name="PatternVariableName" />
        <module name="RecordComponentName"/>

        <!-- Checks for blocks: https://checkstyle.org/config_blocks.html -->

        <module name="AvoidNestedBlocks"/>

        <module name="NeedBraces"/>

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

        <!-- Disallows empty catch blocks (not even having a comment): https://checkstyle.sourceforge.io/config_blocks.html#EmptyCatchBlock -->
        <module name="EmptyCatchBlock"/>

        <!--
            following rule enforces that there are no one line statements such as

              public String getTabName() { return Localization.lang("XMP metadata"); }

        -->
        <module name="LeftCurly"/>

        <module name="RightCurly"/>

        <!-- coding - https://checkstyle.sourceforge.io/config_coding.html -->

        <module name="AvoidDoubleBraceInitialization"/>

        <module name="CovariantEquals"/>

        <module name="MultipleVariableDeclarations"/>

        <module name="OneStatementPerLine">
            <property name="treatTryResourcesAsStatement" value="true"/>
        </module>

        <module name="UnnecessarySemicolonInTryWithResources"/>

        <!-- Checks for common coding problems: https://checkstyle.org/config_coding.html -->

        <module name="DeclarationOrder"/>
        <module name="EmptyStatement"/>

        <module name="EqualsHashCode"/>

        <!-- force a space after // for comments -->
        <module name="TodoComment">
            <property name="id" value="commentStartWithSpace"/>
            <property name="format" value="^([^\s\/*])"/>
            <message key="todo.match" value="Comment text should start with space."/>
        </module>

        <module name="MissingDeprecated"/>

        <!-- Checks for illegal usage of reserved names as identifier names, such as "var", "record" - https://checkstyle.sourceforge.io/config_naming.html#IllegalIdentifierName -->
        <module name="IllegalIdentifierName"/>

        <module name="RecordTypeParameterNameCheck"/>
    </module>
</module>