Мне нужна какая-то проверка для использования на Sonar, которая должна просматривать элементы JSF на страницах XHTML, проверяя, содержат ли входные элементы атрибут идентификатора. (пример:)Использование пользовательского правила JSP в PMD
Первоначально я пытаюсь сделать это с помощью PMD. Как я уже видел, PMD может интерпретировать страницы JSP. Правильно ли это? Способ сделать это - реализовать пользовательское правило, основанное на AbstractJspRule.
Проблема в том, что PMD пытается проанализировать страницу XHTML как Java-код. Он должен интерпретироваться как страница JSP.
Мои коды:
класс:
public class TestXhtmlRule extends AbstractJspRule {
@Override
public Object visit(final ASTElement node, final Object data) {
// ...
}
@Override
public Object visit(final ASTAttribute node, final Object data) {
// ...
}
}
XML:
<ruleset name="Basic JSF rules"
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 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<include-pattern>**/*.xhtml</include-pattern>
<rule name="idsJSF" language="jsp"
message="..."
class="pmd.rule.TestXhtmlRule">
<description>
...
</description>
<priority>3</priority>
<example>
<![CDATA[
<h:inputText id="itNome" label="Nome" value="#{pessoaBean.nome}" />;
]]>
</example>
</rule>
</ruleset>
Ошибка из журнала:
[pmd] net.sourceforge.pmd.lang.java.ast.ParseException: Encountered " "<" "< "" at line 1, column 1.
Was expecting one of:
<EOF>
"abstract" ...
"class" ...
"final" ...
"import" ...
"interface" ...
"native" ...
"private" ...
"protected" ...
"public" ...
"static" ...
"synchronized" ...
"transient" ...
"volatile" ...
"strictfp" ...
<IDENTIFIER> ...
";" ...
"@" ...
"\u001a" ...
"~[]" ...
"@" ...
"@" ...
"@" ...
at net.sourceforge.pmd.lang.java.ast.JavaParser.generateParseException(JavaParser.java:9867)
at net.sourceforge.pmd.lang.java.ast.JavaParser.jj_consume_token(JavaParser.java:9751)
at net.sourceforge.pmd.lang.java.ast.JavaParser.CompilationUnit(JavaParser.java:190)
at net.sourceforge.pmd.lang.java.AbstractJavaParser.parse(AbstractJavaParser.java:56)
at net.sourceforge.pmd.SourceCodeProcessor.parse(SourceCodeProcessor.java:90)
at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:136)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:75)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:42)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:75)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:22)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Как я могу заставить его работать?
Было бы проще проверить это правило с помощью checkstyle вместо PMD?
Спасибо.
Humm, возможно, вы правы. Мне не хватает «-jsp». Теперь я просто попытаюсь выяснить, как использовать этот параметр с Ant.Я забыл указать в вопросе, но я использую задачу Ant PMD для ее запуска. Благодарю. –
Я не вижу способа сделать это с помощью задачи Ant. Однако вы можете использовать задачу Ant exec для запуска PMD в качестве командной строки. Затем вы передаете аргументы в виде командной строки и не нуждаетесь в специальной поддержке. –
Мне еще не удалось запустить его, но мне придется оставить его на время и работать над другим спросом. Поэтому я буду принимать этот ответ, поскольку я думаю, что это путь. –