<?xml version="1.0"?>
<ruleset name="erik"
         xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
    <description>Erik's Ruleset</description>
    <!-- BEST PRACTICES -->
    <rule ref="category/java/bestpractices.xml">
        <exclude name="AvoidPrintStackTrace"/>
        <exclude name="JUnit4TestShouldUseTestAnnotation"/>
        <exclude name="JUnitTestContainsTooManyAsserts"/>
        <exclude name="GuardLogStatement"/>
    </rule>

    <rule ref="category/java/bestpractices.xml/MissingOverride">
        <properties>
            <property name="violationSuppressXPath"
                      value="//MethodDeclaration[@Name='hashCode' or @Name='equals' or @Name='toString']"/>
        </properties>
    </rule>


    <!-- CODE STYLE -->
    <rule ref="category/java/codestyle.xml">
        <exclude name="AtLeastOneConstructor"/>
        <exclude name="ClassNamingConventions"/>
        <exclude name="ConfusingTernary"/>
        <exclude name="CommentDefaultAccessModifier"/>
        <exclude name="FieldNamingConventions"/>
        <exclude name="LocalVariableCouldBeFinal"/>
        <exclude name="LongVariable"/>
        <exclude name="MethodArgumentCouldBeFinal"/>
        <exclude name="OnlyOneReturn"/>
        <exclude name="PackageCase"/>
        <exclude name="ShortClassName"/>
        <exclude name="ShortMethodName"/>
        <exclude name="ShortVariable"/>
        <exclude name="UselessParentheses"/>
        <exclude name="UseUnderscoresInNumericLiterals"/>
    </rule>

    <rule ref="category/java/codestyle.xml/UnnecessaryImport">
        <properties>
            <property name="violationSuppressRegex" value="Unused (static|.*\.\*).*"/>
        </properties>
    </rule>

    <!-- DESIGN -->
    <rule ref="category/java/design.xml">
        <exclude name="AvoidCatchingGenericException"/>
        <exclude name="AvoidDeeplyNestedIfStmts"/>
        <exclude name="AvoidUncheckedExceptionsInSignatures"/>
        <exclude name="CognitiveComplexity"/>
        <exclude name="CyclomaticComplexity"/>
        <exclude name="ExcessiveClassLength"/>
        <exclude name="ExcessiveMethodLength"/>
        <exclude name="ExcessiveParameterList"/>
        <exclude name="ExcessivePublicCount"/>
        <exclude name="GodClass"/>
        <exclude name="LawOfDemeter"/>
        <exclude name="LoosePackageCoupling"/>
        <exclude name="NPathComplexity"/>
        <exclude name="NcssCount"/>
        <exclude name="TooManyFields"/>
        <exclude name="TooManyMethods"/>
        <exclude name="UseObjectForClearerAPI"/>
    </rule>

    <!-- DOCUMENTATION -->
    <rule ref="category/java/documentation.xml">
        <exclude name="CommentRequired"/>
        <exclude name="CommentSize"/>
    </rule>

    <!-- ERROR PRONE -->
    <rule ref="category/java/errorprone.xml">
        <exclude name="AssignmentInOperand"/>
        <exclude name="AvoidCatchingNPE"/>
        <exclude name="AvoidDuplicateLiterals"/>
        <exclude name="AvoidFieldNameMatchingMethodName"/>
        <exclude name="AvoidFieldNameMatchingTypeName"/>
        <exclude name="AvoidLiteralsInIfCondition"/>
        <exclude name="NullAssignment"/>
    </rule>

    <rule ref="category/java/errorprone.xml/AssignmentInOperand">
        <properties>
            <property name="allowWhile" value="true"/>
            <property name="allowFor" value="true"/>
            <property name="allowIf" value="true"/>
        </properties>
    </rule>
    <rule ref="category/java/errorprone.xml/AvoidDuplicateLiterals">
        <properties>
            <property name="skipAnnotations" value="true"/>
        </properties>
    </rule>

    <!-- MULTITHREADING -->
    <rule ref="category/java/multithreading.xml">
    </rule>

    <!-- PERFORMANCE -->
    <rule ref="category/java/performance.xml">
    </rule>

    <!-- SECURITY -->
    <rule ref="category/java/security.xml">
    </rule>
</ruleset>