2013-04-15 2 views
2

Мне нужна какая-то проверка для использования на 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?

Спасибо.

ответ

1

Как я видел, PMD может интерпретировать страницы JSP. Правильно ли это?

Да, но только если у вас хорошо сформированный XHTML - что вы делаете.

Как я могу заставить его работать?

Проблема заключается в том, что PMD даже запускает ваше правило. Он анализирует файлы (будь то Java или jsp или что-то еще) в AST (абстрактное синтаксическое дерево), а затем запускает соответствующие правила против него. Вы передаете флаг -jsp при запуске PMD, как описано в разделе использования этого раздела at the bottom of the PMD JSP page? Я предполагаю, что вы не так PMD рассматривает все как Java.

+0

Humm, возможно, вы правы. Мне не хватает «-jsp». Теперь я просто попытаюсь выяснить, как использовать этот параметр с Ant.Я забыл указать в вопросе, но я использую задачу Ant PMD для ее запуска. Благодарю. –

+0

Я не вижу способа сделать это с помощью задачи Ant. Однако вы можете использовать задачу Ant exec для запуска PMD в качестве командной строки. Затем вы передаете аргументы в виде командной строки и не нуждаетесь в специальной поддержке. –

+0

Мне еще не удалось запустить его, но мне придется оставить его на время и работать над другим спросом. Поэтому я буду принимать этот ответ, поскольку я думаю, что это путь. –

1

Вы пытались использовать Sonar Web Plugin? Например, он должен позволять вам проверять идентификаторы на тегах.

+0

Спасибо за ответ. Я посмотрю на это. Но, если возможно, я предпочитаю PMD, как только у нас уже есть некоторые правила (для java), реализованные с его использованием. –

+0

Удачи с PMD ... –

0

В PMD есть ошибка (или пропущенная функция). Язык исходного файла определяется только именем файла. *.xml файлы, предположительно находящиеся на языке xml, *.jsp файлы - язык jsp. xhtml расширение не указано явно, поэтому *.xhtml файлы по умолчанию являются Java-языком и анализируются парсером Java.

Вот текущее расширение для отображения языка (жёстко в PMD): https://github.com/pmd/pmd/blob/master/pmd/src/main/java/net/sourceforge/pmd/lang/Language.java?source=cc

Вот запрос особенность, чтобы сделать его настраиваемым: http://sourceforge.net/p/pmd/feature-requests/568/