Существует ли правило checkstyle для принудительного добавления аннотации к каждому полю в классе?

#checkstyle

#checkstyle

Вопрос:

Мы хотим упростить соответствие, и для FedRAMP требуется что-то подобное для всех полей в наших объектах базы данных

 @FedRamp(confidentiality=LOW, integrity=MODERATE, availability=HIGH)
  

Мы хотим, чтобы checkstyle прерывал сборки, если люди добавляют данные и забывают добавить их в «любое» поле в *Dbo.java класс. Затем мы можем сгенерировать соответствие FedRAMP для каждого элемента данных (и, следовательно, для всей системы). Мы запускаем checkstyle для каждого класса, но хотим, чтобы это правило выполнялось только для классов, заканчивающихся на *Dbo.java . Возможно ли это, когда мы импортируем какое-либо уже существующее правило или плагин checkstyle и добавляем к нему фильтр имени класса?

спасибо, Дин

Ответ №1:

Чтобы сообщать о нарушениях в таких случаях для любых классов, вы можете использовать MatchXpathCheck (вам нужен checkstyle 8.39 ), Конфигурация будет выглядеть следующим образом:

 <?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
          "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name = "Checker">

    <module name="TreeWalker">
        <module name="MatchXpath">
            <property name="id" value="fedramp_check"/>
            <property name="query" value="//CLASS_DEF/OBJBLOCK/VARIABLE_DEF/MODIFIERS/ANNOTATION/IDENT[not(@text='FedRamp')]"/>
            <message key="matchxpath.match"
                     value="Field should have 'FedRamp' annotation."/>
        </module>
    </module>
</module>
  

Это сообщит о нарушениях, подобных этому:

 $ cat Test.java
class Test {

 @FedRamp(confidentiality=LOW, integrity=MODERATE, availability=HIGH)
 private int withAnnotation = 11; // no violation

  @Fed(confidentiality=LOW, integrity=MODERATE, availability=HIGH)
 private int without = 11; // violation

  @NotNull
  int without = 11; // violation
}

$ java -jar checkstyle-8.42-all.jar -c config.xml Test.java
Starting audit...
[ERROR] C:workdirTest.java:6:4: Field should have FedRamp annotation. [fedramp_check]
[ERROR] C:workdirTest.java:9:4: Field should have FedRamp annotation. [fedramp_check]
Audit done.
Checkstyle ends with 2 errors.


  

Вторая часть вашего вопроса — ограничить выполнение только определенными классами — может быть решена несколькими способами.

  1. Используйте немного другой xpath для фильтрации имен классов (не файлов, поскольку в одном файле может быть много классов)
 <property name="query"
   value="//CLASS_DEF[./IDENT[ends-with(@text,
   'Dbo')]]/OBJBLOCK/VARIABLE_DEF/MODIFIERS/ANNOTATION/IDENT[not(@text='FedRamp')]"/>
  
  1. Используйте BeforeExecutionExclusionFileFilter — это фильтр для всей конфигурации, и он будет работать нормально, только если у вас есть отдельная конфигурация только для проверки аннотации.
  2. Подавлять нарушения для этой проверки (например, по идентификатору) для других файлов класса см. Документ