Hoy vamos a ver un poco de PMD, una magnífica herramienta que nos permite medir la calidad de nuestro código. Es en general una herramienta imprescindible en nuestro día a día y muy completa si hablamos de código Java. Pero no tanto para otros lenguajes, aunque de soporte para ellos. Por tanto hoy hablaremos de cómo crear una regla, pero para XML.
Para empezar debemos tener un concepto claro: Abstract Syntax Tree, AST. Este es el árbol de elementos de los que se compone nuestro código. Es decir, a través de él, podremos identificar cada uno de los elementos de nuestro código y por tanto asociar una regla que nos indique si esta bien creado el código o no. Para ayudarnos en esta tarea, tenemos la herramienta PMD Rule Designer, con la cual tras pasarle un trozo de código, nos devolverá su AST asociado.
Una vez tenemos claro cual es la regla que queremos implementar y sobre qué elemento del código queremos implementarla, pasaremos a escribirla. La implementación de la regla la podemos realizarla en código Java o a través de XPath. Pero su definición, deberemos crearla siempre en XML.
Esta definición de la regla, se debe incluir en un fichero que contenga un conjunto de reglas o ruleset. Este ruleset puede ya existir (por ejemplo el básico para XML) o crearlo nosotros desde cero.
<?xml version="1.0"?> <ruleset name="XML Own Convention" 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 https://pmd.sourceforge.io/ruleset_2_0_0.xsd"> <description>Rules to detect if our XML is how we want.</description> </ruleset>
Ahora nos quedaría crear la regla o rule. En ella debemos indicar diferentes atributos informativos de la regla como pueden ser el nombre, mensaje asociado cuando se muestre al usuario que la regla está siendo violada o un ejemplo de cómo podemos evitar la violación de la misma.
Si quisiéramos generarla con Java, escribiríamos una clase que heredase de net.sourceforge.pmd.lang.java.rule.AbstractJavaRule. Y que recibiese el elemento sobre el cual queremos realizar el análisis. Esta clase debería ser indicada en la definición de la regla a través del atributo class.
<rule name="WhileLoopsMustUseBracesRule" message="Avoid using 'while' statements without curly braces" class="WhileLoopsMustUseBracesRule"> // description, priority or example properties </rule>
En el caso de querer hacerla a traves de XPath. En el atributo class debemos indicar net.sourceforge.pmd.lang.rule.XPathRule y posteriormente crear una propiedad denominada xpath que incluya la regla que queremos validar. Para nuestro ejemplo, queremos verificar por ejemplo que una secuencia de WSO2, termine siempre con el sufijo '_seq'. Para ello implementaremos una regla XPath que realice exactamente lo contrario, que busque si dado un elemento sequence, su atributo name no termine en '_seq'.
<rule name="sequenceBadNamed" language="xml" message="Incorrect sequence name." class="net.sourceforge.pmd.lang.rule.XPathRule"> <description>A sequence was wrongly named, it must end with _seq</description> <priority>3</priority> <properties> <property name="xpath"> <value> <![CDATA[/sequence[not(ends-with(@name, '_seq'))]]]> </value> </property> </properties> <example> <![CDATA[A sequence must be called: $Service_$SeqName_seq]]> </example> </rule>
Como se puede ver el uso de XPath te puede permitir realizar reglas muy potentes y de forma sencilla, sin la necesidad de crear más clases.
Por último nos queda configurar el plugin de maven para el uso de validaciones con XML y nuestro conjunto de reglas. Para ello debemos:
- Añadir como dependencia la librería específica de PMD para dicho lenguaje, en nuestro caso pmd-xml.
- Configurar correctamente el apartado configuración.
- Indicar que son validaciones para XML.
- Indicar nuestro conjunto de reglas.
- Indicar que los ficheros XML sean analizados.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.12.0</version> <dependencies> <dependency> <groupId>net.sourceforge.pmd</groupId> <artifactId>pmd-xml</artifactId> <version>6.3.0</version> </dependency> </dependencies> <configuration> <language>xml</language> <rulesets> <ruleset>${project.basedir}/src/test/resources/ownConvention.xml</ruleset> </rulesets> <includes> <include>**/*.xml</include> </includes> </configuration> </plugin>
No hay comentarios:
Publicar un comentario