<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    走自己的路

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

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

    前提:

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

    2.         PMD 的實現(xiàn)原理有一定的了解

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

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

    實現(xiàn)過程:

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

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

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

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

    l          每個pmd規(guī)則都會遍歷整個AST并檢驗是否發(fā)生了錯誤

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

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

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

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

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

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

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

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

    2打開cmd 運行 designer 分析器

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

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

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

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

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

    Expression,在編寫xpath expression的過程中需要反復(fù)的修改源代碼并且反復(fù)的修改xpath expression這樣才能滿足所有的需要,反復(fù)的點擊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可以自動生成點擊菜單actions下面的create rule xml

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



    posted on 2008-05-05 18:46 叱咤紅人 閱讀(2896) 評論(0)  編輯  收藏 所屬分類: RUP Scrum and XPOther Java and J2EE frameworks
    主站蜘蛛池模板: 亚洲字幕AV一区二区三区四区| 亚洲一区二区三区四区在线观看| 精品国产人成亚洲区| 亚洲色无码专区在线观看| 亚洲AV乱码久久精品蜜桃| 亚洲第一页在线观看| 亚洲欧美日韩中文字幕在线一区| 另类小说亚洲色图| A级毛片成人网站免费看| 2015日韩永久免费视频播放 | 国产成人1024精品免费| 成全高清在线观看免费| 最近2018中文字幕免费视频| 无码高潮少妇毛多水多水免费| 亚洲日本中文字幕一区二区三区| 久久亚洲国产精品| 亚洲综合无码无在线观看| 亚洲免费无码在线| 1000部夫妻午夜免费| 四虎永久免费影院| 亚洲精品免费视频| 国产精品亚洲专区无码WEB| 成人无码精品1区2区3区免费看| 3d动漫精品啪啪一区二区免费| 拔擦拔擦8x华人免费久久| 国产亚洲精品va在线| 亚洲精品第一综合99久久| 一区二区视频在线免费观看| 五月婷婷在线免费观看| 亚洲精品视频在线观看你懂的| 久久精品国产亚洲AV无码麻豆| 小说专区亚洲春色校园| 日韩精品久久久久久免费| 国产精品四虎在线观看免费| 久久精品亚洲中文字幕无码网站| 亚洲乱码av中文一区二区| 国产无遮挡裸体免费视频在线观看| 好爽…又高潮了毛片免费看| 亚洲VA中文字幕不卡无码| 久久久久亚洲精品无码网址色欲| 成人精品一区二区三区不卡免费看|