Per creare una nuova rule in java, occorre seguire la guida pmd:
http://pmd.sourceforge.net/howtowritearule.html
In pratica la guida dice di scaricare i sorgenti di PMD, aggiungere la nuova classe secondo quanto indicato, e ricompilare il tutto.
I sorgenti di PMD si scaricano da qui (scaricando la alpha 5.o non c'è il file build.xml necessario per compilare con ANT):
http://sourceforge.net/projects/pmd/files/pmd/4.2.6/pmd-src-4.2.6.zip/download
Una volta scaricato lo zip, si decomprime in una cartella, ad es. C:\Users\Duccio\Lavori\pmd-src-4.2.6
Occorre aggiungere il jar di Junit al classpath (JUnit:
download)
Occorre quindi scaricare e configurare ANT per compilare.
Da qui si scarica ANT:
http://ant.apache.org/bindownload.cgi
Qui è descritto come installarlo:
http://ant.apache.org/manual/install.html#installing in particoalre fare attenzione a configurare el seguenti variabili di ambiente:
set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk-1.5.0.05
set PATH=%PATH%;%ANT_HOME%\bin
Nonostante questo, quando ho eseguito la verifica di installazione come indicato nella guida, su Windows7 ho incontrato questo problema:
Unable to locate tools.jar
risolto grazie a questo post:
http://stackoverflow.com/questions/2619584/how-to-set-java-home-on-windows-7
in cui si suggerisce:
What worked for me was adding the %JAVA_HOME%\bin to Path environment variable with the JAVA_HOME environment variable pointing to the jdk folder
A questo punto la verifica ha funzionato.
A questo punto, da cmd ci si sposta in:
cd C:\Users\Duccio\Lavori\pmd-src-4.2.6
e semplicemente si esegue:
ant
se nel folder è presente un file build.xml corretto il risultato dovrebbe essere:
jar:
[jar] Building jar: C:\Users\Duccio\Lavori\pmd-src-4.2.6\lib\pmd-4.2.6.jar
[jar] Building jar: C:\Users\Duccio\Lavori\pmd-src-4.2.6\lib\pmd-test-4.2.
6.jar
BUILD SUCCESSFUL
Total time: 31 seconds
A questo punto si può importare il progetto in un workspace Eclipse e seguire la guida di pmd.
Attenzione: la guida dice di derivare una classe da AbstractRule (), ma in realtà questo metodo è deprecato e si deve derivare da AbstractJavaRule come indicato in
http://pmd.sourceforge.net/apidocs/net/sourceforge/pmd/AbstractRule.html e in http://sourceforge.net/projects/pmd/forums/forum/188192/topic/5120216
Per scrivere una rule con xpath fare riferimento all'articolo:
http://onjava.com/pub/a/onjava/2003/04/09/pmd_rules.html
da cui si vede che basta agire sul ruleset.xml:
XPath is a new language, though, so why write PMD rules using XPath when you're already a whiz-bang Java programmer? The reason is that it's a whole lot easier to write simple rules using XPath. To illustrate, here's the "DontCreateThreadsRule" written as an XPath expression:
//AllocationExpression[Name/@Image='Thread'][not(ArrayDimsAndInits)]
Concise, eh? There's no Java class to track--you don't have to compile anything or put anything else on your CLASSPATH
. Just add the XPath expression to your rule definition like this:
<?xml version="1.0"?>
<ruleset name="My company's EJB checker rules">
<description>
The Design Ruleset contains a collection of rules that find questionable designs.
</description>
<rule name="DontCreateThreadsRule"
message="Don't create threads, use the MyCompanyThreadService instead"
class="org.mycompany.util.pmd.DontCreateThreadsRule">
<description>
Don't create Threads, use the MyCompanyThreadService instead.
</description>
<properties>
<property name="xpath">
<value>
<![CDATA[
//AllocationExpression[Name/@Image='Thread'][not(ArrayDimsAndInits)]>
]]>
</value>
</property>
</properties>
<example>
<![CDATA[
Thread t = new Thread(); // don't do this!
]]>
</example>
</rule>
</ruleset>
Refer to the rule as usual to run it on your source code.