Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PMD violationSuppressXPath for all REST @GET methods?

Tags:

pmd

I am trying to narrow down the PMD rules, how can I exclude all REST methods which are annotated with @GET from PMD checks?

like image 956
cilap Avatar asked Feb 04 '15 20:02

cilap


2 Answers

PMD provides several ways to suppress warnings: http://pmd.sourceforge.net/pmd-5.2.3/usage/suppressing.html

  • via Annotations: @SuppressWarnings("PMD.")
  • via Comments: //NOPMD ignore this
  • via Regex and XPath per Rules

You can also excluding complete files - see http://pmd.sourceforge.net/pmd-5.2.3/customizing/howtomakearuleset.html - Excluding files from a ruleset

For your case, violationSuppressXPath, this XPath expression should work:

./ancestor::ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name[@Image='GET']

This will go up (ancestor) from the current node (which might be inside a method) to the method declaration ("ClassOrInterfaceBodyDeclaration") and goes down the tree from there to check for the @GET annotation. However, I don't know about the performance impact.

Update:

Complete example:

<rule ref="rulesets/java/optimizations.xml/MethodArgumentCouldBeFinal">
  <properties>
    <!-- Ignore Rest resources -->
    <property name="violationSuppressXPath" value="
        ./ancestor::ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name
            [@Image='GET' or @Image='POST' or @Image='PUT' or @Image='DELETE']" />
  </properties>
</rule>
like image 186
adangel Avatar answered Dec 08 '22 18:12

adangel


We are using for example this rules to suppress checks on REST methods for final declaration. Maybe you need similar?

<rule ref="rulesets/java/optimizations.xml/MethodArgumentCouldBeFinal">
    <properties>
        <!-- Ignore Rest resources -->
        <property name="violationSuppressXPath" value="
            //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='GET'] | 
            //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='POST']|
            //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='PUT'] | 
            //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='DELETE']" />
    </properties>
</rule>
like image 43
David Schneider Avatar answered Dec 08 '22 18:12

David Schneider