Files
VV-ISTIC-TP2/exercises/extending-pmd.md
2025-12-12 12:03:46 +01:00

2.2 KiB

Extending PMD

Use XPath to define a new rule for PMD to prevent complex code. The rule should detect the use of three or more nested if statements in Java programs so it can detect patterns like the following:

if (...) {
    ...
    if (...) {
        ...
        if (...) {
            ....
        }
    }

}

Notice that the nested ifs may not be direct children of the outer ifs. They may be written, for example, inside a for loop or any other statement. Write below the XML definition of your rule.

You can find more information on extending PMD in the following link: https://pmd.github.io/latest/pmd_userdocs_extending_writing_rules_intro.html, as well as help for using pmd-designer here.

Use your rule with different projects and describe you findings below. See the instructions for suggestions on the projects to use.

Answer

<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="Nested If Ruleset"
         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>
        Ruleset pour détecter 3 niveaux (ou plus) de if imbriqués.
    </description>
    <rule name="nestedIfRule"
        language="java"
        message="nested If"
        class="net.sourceforge.pmd.lang.rule.xpath.XPathRule">
        <description>
            Three or more nested `if` !
        </description>
        <priority>3</priority>
        <properties>
            <property
                name="xpath"
                value ="    //IfStatement[
                                descendant::IfStatement[
                                    descendant::IfStatement
                                ]
                            ]"
            />
        </properties>
    </rule>
</ruleset>

en testant un programme Java, il détecte bien les imbrications de 'if' même s'ils ne sont pas directement imbriqués, séparés par un while par exemple