免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1752 | 回复: 0
打印 上一主题 下一主题

编写自定义的Pmd规则 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-05 18:40 |只看该作者 |倒序浏览

前提:
1.         了解XPath:http://www.w3.org/TR/xpath
2.         对PMD 的实现原理有一定的了解
简单介绍一下pmd的实现原理:
Pmd利用javacc和EBNF文法产生一个分析器,用来分析java源代码(文本)。又在JavaCC的基础上加入了语义的概念也就是JJTree,这样就把java source转换成了一个抽象语法树(AST),AST是一个结构化的对象层次结构。我们可以用访问者模式访问这个结构上的每个节点。从而找出哪个节点违反了哪些规则。
实现过程:
l          首先传一个文件名或者Ruleset给pmd
l          Pmd把该文件流传给自己生成的javaCC分析器
l          分析完毕后,pmd获得了分析生成的AST的一个引用
l          PMD把AST处理成一个符号表,你可以在符号表里面查询一些有用的信息
l          每个pmd规则都会遍历整个AST并检验是否发生了错误
l          接着pmd产生一个报表,上面说明了有哪些地方违反了pmd规则
编写pmd规则有两种方法:
       用java code,需要了解pmd的api,需要进行深入研究,也常常用于一些比较复杂的pmd规则
       用xpath,对着产生的AST树,写就行了,上手比较快,写起来也比较简单

下面举一个用XPath实现的一个PMD规则:
在项目中,我们不希望Application的开发人员手动的调用Toplink UnitOfWork的commit,
commitAndResume, commitAndResumeOnFailure'方法,因为每次提交都会映像performa,我们的提交是放在自己编写的framework里面,在指定的位置提交。所以我们把规则的优先级设置为3. 在eclipse的pmd plugin中,优先级为3会产生一个警告。

1首先将D:\local_lib\pmd-bin-4.2\bin 加到系统环境变量的path中
2打开cmd 运行 designer 分析器
3左上角source code可以把你写好的java source copy过来主要就在这个java source code基础上不断修正你的pmd规则。
4xpath query:用来编写自定义的xpath expression(先不忙写xpath expression)
5点击go,就会在左下角的Abstract syntax Tree中产生AST,你可以选择AST上的某个节点,左下角的下面一个框中就会出现该节点的一些信息。是在符号表中查询得到的。
6.DFA是pmd4的新功能,用于编写更复杂的pmd规则,不光是某个source code级别了,pmd4使用了asm读取字节码,并作分析,处理类文件之间的依赖性。在实际使用中,特别是在特定应用中,这个功能是相当有用的。还可以用来简化一些现有的规则。
7根据生成的AST编写xpath expression。对于上文提到的source检查规则编写了一个xpath
Expression,在编写xpath expression的过程中需要反复的修改源代码并且反复的修改xpath expression这样才能满足所有的需要,反复的点击go。
最后写好的规则大致如下:
//PrimaryExpression[
   (PrimaryPrefix/Name[ends-with(@Image, 'commit') or ends-with(@Image, 'commitAndResume') or ends-with(@Image, 'commitAndResumeOnFailure')] and substring-before(PrimaryPrefix/Name/@Image, '.') = //VariableDeclaratorId[../..//ClassOrInterfaceType[@Image =
'UnitOfWork']]/@Image) or (PrimarySuffix[ends-with(@Image, 'commit') or ends-with(@Image, 'commitAndResume') or ends-with(@Image, 'commitAndResumeOnFailure')] and (PrimarySuffix[ends-with(@Image, 'getActiveUnitOfWork')] or PrimarySuffix[ends-with(@Image, 'acquireUnitOfWork')]))   
       and  
         //ImportDeclaration/Name[
                                contains(@Image,'oracle.toplink.sessions.UnitOfWork') or contains(@Image, 'oracle.toplink.sessions')]
      
]

8.将写好的xpath expression转换成pmd rule。Designer可以自动生成点击菜单actions下面的create rule xml。
9.最后将生成的rule添加到ruleset中,并最好在大批量的代码中进行验证。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/19897/showart_674009.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP