走自己的路

          路漫漫其修遠(yuǎn)兮,吾將上下而求索

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 4 文章 :: 118 評(píng)論 :: 0 Trackbacks
           

          前提:

          1.         了解XPathhttp://www.w3.org/TR/xpath

          2.         對(duì)PMD 的實(shí)現(xiàn)原理有一定的了解

          簡(jiǎn)單介紹一下pmd的實(shí)現(xiàn)原理:

          Pmd利用javaccEBNF文法產(chǎn)生一個(gè)分析器,用來分析java源代碼(文本)。又在JavaCC的基礎(chǔ)上加入了語義的概念也就是JJTree,這樣就把java source轉(zhuǎn)換成了一個(gè)抽象語法樹(AST),AST是一個(gè)結(jié)構(gòu)化的對(duì)象層次結(jié)構(gòu)。我們可以用訪問者模式訪問這個(gè)結(jié)構(gòu)上的每個(gè)節(jié)點(diǎn)。從而找出哪個(gè)節(jié)點(diǎn)違反了哪些規(guī)則。

          實(shí)現(xiàn)過程:

          l          首先傳一個(gè)文件名或者Rulesetpmd

          l          Pmd把該文件流傳給自己生成的javaCC分析器

          l          分析完畢后,pmd獲得了分析生成的AST的一個(gè)引用

          l          PMDAST處理成一個(gè)符號(hào)表,你可以在符號(hào)表里面查詢一些有用的信息

          l          每個(gè)pmd規(guī)則都會(huì)遍歷整個(gè)AST并檢驗(yàn)是否發(fā)生了錯(cuò)誤

          l          接著pmd產(chǎn)生一個(gè)報(bào)表,上面說明了有哪些地方違反了pmd規(guī)則

          編寫pmd規(guī)則有兩種方法:

                 java code,需要了解pmdapi,需要進(jìn)行深入研究,也常常用于一些比較復(fù)雜的pmd規(guī)則

                 xpath,對(duì)著產(chǎn)生的AST樹,寫就行了,上手比較快,寫起來也比較簡(jiǎn)單

          下面舉一個(gè)用XPath實(shí)現(xiàn)的一個(gè)PMD規(guī)則:

          在項(xiàng)目中,我們不希望Application的開發(fā)人員手動(dòng)的調(diào)用Toplink UnitOfWorkcommit,

          commitAndResume, commitAndResumeOnFailure'方法,因?yàn)槊看翁峤欢紩?huì)映像performa,我們的提交是放在自己編寫的framework里面,在指定的位置提交。所以我們把規(guī)則的優(yōu)先級(jí)設(shè)置為3. eclipsepmd plugin中,優(yōu)先級(jí)為3會(huì)產(chǎn)生一個(gè)警告。

          1首先將D:"local_lib"pmd-bin-4.2"bin 加到系統(tǒng)環(huán)境變量的path

          2打開cmd 運(yùn)行 designer 分析器

          3左上角source code可以把你寫好的java source copy過來主要就在這個(gè)java source code基礎(chǔ)上不斷修正你的pmd規(guī)則。

          4xpath query:用來編寫自定義的xpath expression(先不忙寫xpath expression

          5點(diǎn)擊go,就會(huì)在左下角的Abstract syntax Tree中產(chǎn)生AST,你可以選擇AST上的某個(gè)節(jié)點(diǎn),左下角的下面一個(gè)框中就會(huì)出現(xiàn)該節(jié)點(diǎn)的一些信息。是在符號(hào)表中查詢得到的。

          6DFApmd4的新功能,用于編寫更復(fù)雜的pmd規(guī)則,不光是某個(gè)source code級(jí)別了,pmd4使用了asm讀取字節(jié)碼,并作分析,處理類文件之間的依賴性。在實(shí)際使用中,特別是在特定應(yīng)用中,這個(gè)功能是相當(dāng)有用的。還可以用來簡(jiǎn)化一些現(xiàn)有的規(guī)則。

          7根據(jù)生成的AST編寫xpath expression。對(duì)于上文提到的source檢查規(guī)則編寫了一個(gè)xpath

          Expression,在編寫xpath expression的過程中需要反復(fù)的修改源代碼并且反復(fù)的修改xpath expression這樣才能滿足所有的需要,反復(fù)的點(diǎn)擊go

          最后寫好的規(guī)則大致如下:

          //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轉(zhuǎn)換成pmd ruleDesigner可以自動(dòng)生成點(diǎn)擊菜單actions下面的create rule xml

          9.最后將生成的rule添加到ruleset中,并最好在大批量的代碼中進(jìn)行驗(yàn)證。



          posted on 2008-05-05 18:46 叱咤紅人 閱讀(2896) 評(píng)論(0)  編輯  收藏 所屬分類: RUP Scrum and XPOther Java and J2EE frameworks
          主站蜘蛛池模板: 若尔盖县| 玉溪市| 石狮市| 周至县| 西昌市| 郎溪县| 靖西县| 镇安县| 双柏县| 文山县| 银川市| 个旧市| 通城县| 榆林市| 雷州市| 松溪县| 阿城市| 郎溪县| 中阳县| 水城县| 科技| 大悟县| 隆回县| 锡林郭勒盟| 阿尔山市| 马边| 余干县| 辛集市| 偃师市| 阿拉善盟| 喜德县| 西盟| 进贤县| 雷州市| 吴江市| 上饶县| 揭阳市| 泸州市| 绵阳市| 禄丰县| 永福县|