sabato 14 aprile 2012

Nuove rules PMD 4.2.6

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.

Nessun commento: