Skip to content

[java] ModifierOrder: wrong enum values documented, indirectly causing xml parse errors #6131

@stokpop

Description

@stokpop

Affects PMD Version: 7.17.0

Description:

In ModifierOrderRule for the typeAnnotations property the TypeAnnotationPosition enum is used. The ModifierOrder docs show as possible values: on type, on decl and anywhere (default). Note the space is the first two values.

When using these as values in a custom override, there is an xml exception during parsing:

[ERROR] Error at /.../pmd-main.xml:196:40
 194|     <priority>3</priority>
 195|     <properties>
 196|       <property name="typeAnnotations" value="on decl" />
                                             ^^^^^ Value should be one of ''ontype'', ''anywhere'', ''ondecl''

In the enum there is a label() to translate to ontype and ondecl (without space).

Exception Stacktrace:

java.lang.IllegalStateException: net.sourceforge.pmd.lang.rule.RuleSetLoadException: Cannot load ruleset /.../pmd-main.xml: 2 XML validation errors occurred
	at org.sonar.plugins.pmd.AbstractPmdExecutor.createRuleSet(AbstractPmdExecutor.java:202)
	at org.sonar.plugins.pmd.AbstractPmdExecutor.executeRules(AbstractPmdExecutor.java:176)
	at org.sonar.plugins.pmd.PmdJavaExecutor.executePmd(PmdJavaExecutor.java:68)
	at org.sonar.plugins.pmd.AbstractPmdExecutor.execute(AbstractPmdExecutor.java:90)
	at org.sonar.plugins.pmd.PmdSensor.execute(PmdSensor.java:97)
	at org.sonar.scanner.sensor.AbstractSensorWrapper.analyse(AbstractSensorWrapper.java:69)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:88)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.lambda$execute$1(ModuleSensorsExecutor.java:61)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.withModuleStrategy(ModuleSensorsExecutor.java:79)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:61)
	at org.sonar.scanner.scan.SpringModuleScanContainer.doAfterStart(SpringModuleScanContainer.java:80)
	at org.sonar.core.platform.SpringComponentContainer.startComponents(SpringComponentContainer.java:227)
	at org.sonar.core.platform.SpringComponentContainer.execute(SpringComponentContainer.java:206)
	at org.sonar.scanner.scan.SpringProjectScanContainer.scan(SpringProjectScanContainer.java:212)
	at org.sonar.scanner.scan.SpringProjectScanContainer.scanRecursively(SpringProjectScanContainer.java:208)
	at org.sonar.scanner.scan.SpringProjectScanContainer.doAfterStart(SpringProjectScanContainer.java:178)
	at org.sonar.core.platform.SpringComponentContainer.startComponents(SpringComponentContainer.java:227)
	at org.sonar.core.platform.SpringComponentContainer.execute(SpringComponentContainer.java:206)
	at org.sonar.scanner.bootstrap.SpringScannerContainer.doAfterStart(SpringScannerContainer.java:339)
	at org.sonar.core.platform.SpringComponentContainer.startComponents(SpringComponentContainer.java:227)
	at org.sonar.core.platform.SpringComponentContainer.execute(SpringComponentContainer.java:206)
	at org.sonar.scanner.bootstrap.SpringGlobalContainer.doAfterStart(SpringGlobalContainer.java:142)
	at org.sonar.core.platform.SpringComponentContainer.startComponents(SpringComponentContainer.java:227)
	at org.sonar.core.platform.SpringComponentContainer.execute(SpringComponentContainer.java:206)
	at org.sonar.scanner.bootstrap.ScannerMain.runScannerEngine(ScannerMain.java:157)
	at org.sonar.scanner.bootstrap.ScannerMain.run(ScannerMain.java:72)
	at org.sonar.scanner.bootstrap.ScannerMain.main(ScannerMain.java:56)
Caused by: net.sourceforge.pmd.lang.rule.RuleSetLoadException: Cannot load ruleset /.../pmd-main.xml: 2 XML validation errors occurred
	at net.sourceforge.pmd.lang.rule.RuleSetFactory.readDocument(RuleSetFactory.java:196)
	at net.sourceforge.pmd.lang.rule.RuleSetFactory.createRuleSet(RuleSetFactory.java:119)
	at net.sourceforge.pmd.lang.rule.RuleSetFactory.createRuleSet(RuleSetFactory.java:114)
	at net.sourceforge.pmd.lang.rule.RuleSetLoader.loadFromResource(RuleSetLoader.java:248)
	at net.sourceforge.pmd.lang.rule.RuleSetLoader.loadFromResource(RuleSetLoader.java:139)
	at org.sonar.plugins.pmd.AbstractPmdExecutor.parseRuleSetWithReporter(AbstractPmdExecutor.java:216)
	at org.sonar.plugins.pmd.AbstractPmdExecutor.createRuleSet(AbstractPmdExecutor.java:200)
	... 26 common frames omitted

Code Sample demonstrating the issue:

  <rule ref="category/java/codestyle.xml/ModifierOrder">
    <priority>3</priority>
    <properties>
      <property name="typeAnnotations" value="on decl" />
    </properties>
  </rule>

Steps to reproduce:

Please provide detailed steps for how we can reproduce the bug.

  1. pmd-bin-7.17.0/bin/pmd check -v -R /.../pmd-main.xml -d .

Running PMD through: CLI | Maven

Note:

Enums for properties seem not consistent in the display/label approach: other enums have toString() and getDisplayName() and also a comment that RuleDocGenerator uses the toString(). E.g. net.sourceforge.pmd.lang.java.rule.bestpractices.AvoidReassigningLoopVariablesRule.ForeachReassignOption. This might be the way for all enums?

Enum net.sourceforge.pmd.lang.java.rule.bestpractices.AvoidUsingHardCodedIPRule.AddressKinds also has a label, but implemented a bit different.

Metadata

Metadata

Assignees

Labels

a:bugPMD crashes or fails to analyse a file.in:documentationAffects the documentation [doc]

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions