Пользовательские правила с PMD - Передача значений в правило во время выполнения - PullRequest
2 голосов
/ 31 июля 2010

Мое требование состоит в том, чтобы проанализировать файлы Java и найти классы или интерфейсы, которые реализуют определенный интерфейс.Поэтому я начал с реализации пользовательских правил в PMD.Я смог написать выражение XPath для поиска классов и интерфейсов, но не смог выяснить, как правильно передать имя интерфейса, для которого должен выполняться поиск, в правило XPath.Один из способов состоял в том, чтобы определить свойство и обновить XML-файл перед вызовом PMD.

<rule name="Implement or extend an interface"
    message="Implement or extend an interface"
    class="net.sourceforge.pmd.rules.XPathRule">
<description>
This rule will help us to find out all the classes/interface which implement a particular interface
</description>
<properties>
    <property name="xpath">
        <value>
        <![CDATA[
        //ImplementsList/ClassOrInterfaceType[@Image=$interfaceName] |
        //ExtendsList/ClassOrInterfaceType[@Image=$interfaceName]
        ]]>
        </value>
    </property>
    <property name="interfaceName">
        <value>Should be set at run time</value>
    </property>
</properties>
<example>

Проблема с вышеуказанным подходом состоит в том, что PMD не может быть вызван в потоках, так как XML будетshared.

Кто-нибудь сталкивался с такой проблемой с PMD, когда значения должны передаваться правилу во время выполнения?

1 Ответ

1 голос
/ 21 мая 2012

Если вы хотите использовать разные значения в правиле XPath, вам нужно иметь несколько копий правила - по одной для каждого значения.Альтернативой использования PMD является использование правила Java.Это может даже вызвать XPath.Разница в том, что Java - это среда выполнения, поэтому она может получать значения позже или перебирать набор значений.

...