走自己的路

          路漫漫其修遠兮,吾將上下而求索

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            50 隨筆 :: 4 文章 :: 118 評論 :: 0 Trackbacks
           

          前提:

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

          2.         PMD 的實現原理有一定的了解

          簡單介紹一下pmd的實現原理:

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

          實現過程:

          l          首先傳一個文件名或者Rulesetpmd

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

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

          l          PMDAST處理成一個符號表,你可以在符號表里面查詢一些有用的信息

          l          每個pmd規則都會遍歷整個AST并檢驗是否發生了錯誤

          l          接著pmd產生一個報表,上面說明了有哪些地方違反了pmd規則

          編寫pmd規則有兩種方法:

                 java code,需要了解pmdapi,需要進行深入研究,也常常用于一些比較復雜的pmd規則

                 xpath,對著產生的AST樹,寫就行了,上手比較快,寫起來也比較簡單

          下面舉一個用XPath實現的一個PMD規則:

          在項目中,我們不希望Application的開發人員手動的調用Toplink UnitOfWorkcommit,

          commitAndResume, commitAndResumeOnFailure'方法,因為每次提交都會映像performa,我們的提交是放在自己編寫的framework里面,在指定的位置提交。所以我們把規則的優先級設置為3. eclipsepmd 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上的某個節點,左下角的下面一個框中就會出現該節點的一些信息。是在符號表中查詢得到的。

          6DFApmd4的新功能,用于編寫更復雜的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 ruleDesigner可以自動生成點擊菜單actions下面的create rule xml

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



          posted on 2008-05-05 18:46 叱咤紅人 閱讀(2889) 評論(0)  編輯  收藏 所屬分類: RUP Scrum and XPOther Java and J2EE frameworks
          主站蜘蛛池模板: 凌海市| 本溪市| 师宗县| 理塘县| 静海县| 天镇县| 灵石县| 读书| 海城市| 大化| 津市市| 衡阳市| 封开县| 晋中市| 阿拉善左旗| 子长县| 玛多县| 永城市| 隆林| 宾川县| 南乐县| 明光市| 甘孜县| 榆林市| 嘉善县| 运城市| 获嘉县| 宁乡县| 巩留县| 安图县| 乾安县| 长阳| 磐安县| 吉林省| 唐山市| 游戏| 西乡县| 庆城县| 万源市| 邮箱| 潮州市|